VvebOIDC/system/cart/tax.php

123 lines
3.1 KiB
PHP

<?php
/**
* Vvveb
*
* Copyright (C) 2022 Ziadin Givan
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Vvveb\System\Cart;
use Vvveb\Sql\Tax_typeSQL;
use Vvveb\System\Cache;
class Tax {
private $taxRates = [];
public static function getInstance($options = []) {
static $inst = null;
if ($inst === null) {
$inst = new Tax($options);
}
return $inst;
}
public function __construct($options = []) {
}
public function setRegionRules($country_id, $region_id, $based = 'store') {
$cache = Cache::getInstance();
$rules = $cache->cache(APP,"tax_rates.$country_id.$region_id.$based",function () use ($country_id, $region_id, $based) {
$taxType = new Tax_typeSQL();
$taxRules = $taxType->getRegionRules(['country_id' => $country_id, 'region_id' => $region_id, 'based' => $based]);
return $taxRules['tax_rule'] ?? [];
}, 259200);
foreach ($rules as $rate) {
$this->taxRates[$rate['tax_type_id']][$rate['tax_rate_id']] = [
'tax_rate_id' => $rate['tax_rate_id'],
'name' => $rate['name'],
'rate' => $rate['rate'],
'type' => $rate['type'],
'priority' => $rate['priority'],
'based' => $based,
];
}
}
public function addTaxes($value, $taxTypeId, $onlyTax = false) {
$amount = 0;
if (isset($this->taxRates[$taxTypeId])) {
foreach ($this->taxRates[$taxTypeId] as $taxRate) {
$rate = (float)$taxRate['rate'];
if ($taxRate['type'] == 'f') {//fixed
$amount += $rate;
} elseif ($taxRate['type'] == 'p') {//percent
$amount += (($value / 100) * $rate);
}
}
}
if ($onlyTax) {
return $amount;
}
return $value + $amount;
}
public function getRates($value, $taxTypeId) {
$taxRate_data = [];
if (isset($this->taxRates[$taxTypeId])) {
foreach ($this->taxRates[$taxTypeId] as $taxRate) {
if (isset($taxRate_data[$taxRate['tax_rate_id']])) {
$amount = $taxRate_data[$taxRate['tax_rate_id']]['amount'];
} else {
$amount = 0;
}
$rate = (float)$taxRate['rate'];
$value = (float)$value;
if ($taxRate['type'] == 'f') {
$amount += $rate;
} elseif ($taxRate['type'] == 'p') {
$amount += (($value / 100) * $rate);
}
$taxRate_data[$taxRate['tax_rate_id']] = [
'tax_rate_id' => $taxRate['tax_rate_id'],
'name' => $taxRate['name'],
'rate' => $taxRate['rate'],
'type' => $taxRate['type'],
'amount' => $amount,
];
}
}
return $taxRate_data;
}
public function clear() {
$this->taxRates = [];
}
}