Files
b2b.redline.com.pl/modules/pagecache/classes/JprestaUtilsTaxManager.php
2025-06-24 14:14:35 +02:00

141 lines
5.8 KiB
PHP

<?php
/**
* Page Cache Ultimate, Page Cache standard and Speed pack are powered by Jpresta (jpresta . com)
*
* @author Jpresta
* @copyright Jpresta
* @license See the license of this module in file LICENSE.txt, thank you.
*/
if (!defined('_PS_VERSION_')) {exit;}
if (!class_exists('JprestaUtilsTaxManager')) {
class JprestaUtilsTaxManager implements TaxManagerInterface
{
private $tax_calculator;
/**
* JprestaUtilsTaxManager constructor.
* @param string $json JSON generated by self::toJson
* @param int $id_tax_rules_group Also known as 'type'
* @throws Exception
*/
public function __construct($json, $id_tax_rules_group)
{
$infos = json_decode($json, true);
if (!is_array($infos)) {
throw new PrestaShopException('Cannot parse JSON to construct a JprestaUtilsTaxManager');
}
if (!array_key_exists($id_tax_rules_group, $infos)) {
$this->tax_calculator = new TaxCalculatorCore(array(), 0);
} else {
if (!is_array($infos[$id_tax_rules_group])
|| !array_key_exists('taxes', $infos[$id_tax_rules_group])
|| !array_key_exists('computation_method', $infos[$id_tax_rules_group])) {
throw new PrestaShopException('Error while parsing JSON to construct a JprestaUtilsTaxManager');
}
$infos_rule = $infos[$id_tax_rules_group];
$taxes = [];
foreach ($infos_rule['taxes'] as $id_tax) {
$tax = new Tax((int)$id_tax);
if ($tax) {
$taxes[] = $tax;
}
}
$this->tax_calculator = new TaxCalculatorCore($taxes, $infos_rule['computation_method']);
}
}
public static function toPrettyString($json)
{
$infos = json_decode($json, true);
if (!is_array($infos)) {
return 'Cannot parse JSON to construct a JprestaUtilsTaxManager';
}
$prettyString = '';
foreach ($infos as $id_tax_rules_group => $infos_rule) {
$taxRulesGroup = new TaxRulesGroup($id_tax_rules_group);
$prettyString .= '- ' . $taxRulesGroup->getFieldByLang('name') . " (#$id_tax_rules_group)\n";
if (count($infos_rule['taxes']) > 0) {
$idx = 1;
if ($infos_rule['computation_method'] === TaxCalculatorCore::COMBINE_METHOD) {
$prettyString .= " Computation method: COMBINE METHOD\n";
} elseif ($infos_rule['computation_method'] === TaxCalculatorCore::ONE_AFTER_ANOTHER_METHOD) {
$prettyString .= " Computation method: ONE AFTER ANOTHER METHOD\n";
} elseif ($infos_rule['computation_method'] === 0) {
$prettyString .= " Computation method: FIRST TAX ONLY\n";
} else {
$prettyString .= " Computation method: #" . $infos_rule['computation_method'] . "\n";
}
foreach ($infos_rule['taxes'] as $id_tax) {
$tax = new Tax((int)$id_tax);
$prettyString .= " $idx) " . $tax->getFieldByLang('name') . " (#$id_tax)\n";
$idx++;
}
} else {
$prettyString .= " (none)\n";
}
}
return $prettyString;
}
/**
* @param int $id_shop
* @param Address $address
* @return string
*/
public static function toJson($id_shop, $address)
{
$infos = [];
$sql = 'SELECT trgs.`id_tax_rules_group`
FROM `' . _DB_PREFIX_ . 'tax_rules_group_shop` as trgs
LEFT JOIN `' . _DB_PREFIX_ . 'tax_rules_group` as trg
ON trgs.id_tax_rules_group=trg.id_tax_rules_group
WHERE active=1 AND id_shop=' . (int)$id_shop;
if (Tools::version_compare(_PS_VERSION_,'1.6.0.9','>')) {
$sql .= ' AND deleted=0';
}
$rows = JprestaUtils::dbSelectRows($sql, true, false);
$cartWasEmpty = false;
$context = Context::getContext();
if (empty($context->cart) && $context->cookie->id_cart) {
// We need the cart to be initialized because usually, TaxManager uses it to check addresses
$cart = new Cart($context->cookie->id_cart);
$context->cart = $cart;
$cartWasEmpty = true;
}
foreach ($rows as $row) {
$id_tax_rules_group = $row['id_tax_rules_group'];
$tax_manager = TaxManagerFactory::getManager($address, $id_tax_rules_group);
if ($tax_manager) {
$tax_calculator = $tax_manager->getTaxCalculator();
$infos[$id_tax_rules_group] = [];
$infos[$id_tax_rules_group]['taxes'] = [];
$infos[$id_tax_rules_group]['computation_method'] = $tax_calculator->computation_method;
foreach ($tax_calculator->taxes as $tax) {
$infos[$id_tax_rules_group]['taxes']['id_tax'] = $tax->id;
}
}
}
if ($cartWasEmpty) {
// Restore empty cart to avoid different behavior
$context->cart = null;
}
return json_encode($infos);
}
public static function isAvailableForThisAddress(Address $address)
{
return true;
}
public function getTaxCalculator()
{
return $this->tax_calculator;
}
}
}