File "factory.php"
Full Path: /home/romayxjt/public_html/wp-content/plugins/vikbooking/admin/helpers/src/einvoicing/factory.php
File size: 4.21 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* @package VikBooking
* @subpackage core
* @author E4J s.r.l.
* @copyright Copyright (C) 2024 E4J s.r.l. All Rights Reserved.
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
* @link https://vikwp.com
*/
// No direct access
defined('ABSPATH') or die('No script kiddies please!');
/**
* Factory class for the e-invoicing framework.
*
* @since 1.16.7 (J) - 1.6.7 (WP)
*/
final class VBOEinvoicingFactory
{
/**
* The singleton instance of the class.
*
* @var VBOEinvoicingFactory
*/
private static $instance = null;
/**
* List of loaded driver objects.
*
* @var array
*/
private $drivers = [];
/**
* Returns an instance of the class.
*
* @return VBOEinvoicingFactory
*/
public static function getInstance()
{
if (is_null(static::$instance)) {
static::$instance = new static();
}
return static::$instance;
}
/**
* Class constructor.
*/
public function __construct()
{
// load dependencies
$driver_base = VBO_ADMIN_PATH . DIRECTORY_SEPARATOR . 'helpers' . DIRECTORY_SEPARATOR . 'einvoicing' . DIRECTORY_SEPARATOR;
require_once $driver_base . 'einvoicing.php';
// load drivers
$this->drivers = $this->loadDrivers();
}
/**
* Returns the list of loaded drivers.
*
* @return array
*/
public function getDrivers()
{
return $this->drivers;
}
/**
* Loads the list of available e-invoicing drivers.
*
* @return array
*/
public function loadDrivers()
{
$loaded = [];
$dbo = JFactory::getDbo();
// always load all drivers, db and plugin based ones
$dbo->setQuery(
$dbo->getQuery(true)
->select('*')
->from($dbo->qn('#__vikbooking_einvoicing_config'))
->where($dbo->qn('automatic') . ' = 1')
);
$drivers = $dbo->loadAssocList();
/**
* Trigger event to let other plugins register additional drivers.
*
* @return array A list of supported drivers.
*/
$list = VBOFactory::getPlatform()->getDispatcher()->filter('onLoadEinvoicingDrivers');
foreach ($list as $chunk) {
// merge default driver files with the returned ones
$drivers = array_merge($drivers, (array)$chunk);
}
// drivers base path
$driver_base = implode(DIRECTORY_SEPARATOR, [VBO_ADMIN_PATH, 'helpers', 'einvoicing', 'drivers']) . DIRECTORY_SEPARATOR;
// invoke all drivers that should run automatically, or that were loaded by third-party plugins
foreach ($drivers as $driver) {
$driver_file = is_string($driver) ? $driver : $driver['driver'] . '.php';
$driver_path = $driver_base . $driver_file;
if (is_file($driver_path)) {
// require the driver sub-class
require_once $driver_path;
} elseif (is_file($driver_file)) {
// require the plugin-loaded driver
require_once $driver_file;
}
// build driver class name
$classname = 'VikBookingEInvoicing' . str_replace(' ', '', ucwords(str_replace('.php', '', str_replace('_', ' ', $driver_file))));
if (!class_exists($classname)) {
continue;
}
// instantiate the object
$loaded[] = new $classname;
}
return $loaded;
}
/**
* Returns a list of additional invoices available for a specific booking.
* For example, one e-invoicing driver like myDATA could generate one
* correlated invoice for the same reservation ID.
*
* @param int $bid the VikBooking reservation ID.
*
* @return array
*/
public function getBookingExtraInvoices($bid)
{
$extra_invoices = [];
foreach ($this->drivers as $driver) {
$extras = $driver->getBookingExtraInvoices($bid);
if ($extras) {
$extra_invoices = array_merge($extra_invoices, $extras);
}
}
return $extra_invoices;
}
}