123 lines
3.1 KiB
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 = [];
|
|
}
|
|
}
|