| 1: | <?php
|
| 2: | namespace Opencart\System\Library\Cart;
|
| 3: | |
| 4: | |
| 5: | |
| 6: | |
| 7: |
|
| 8: | class Tax {
|
| 9: | |
| 10: | |
| 11: |
|
| 12: | private object $db;
|
| 13: | |
| 14: | |
| 15: |
|
| 16: | private object $config;
|
| 17: | |
| 18: | |
| 19: |
|
| 20: | private array $tax_rates = [];
|
| 21: |
|
| 22: | |
| 23: | |
| 24: | |
| 25: | |
| 26: |
|
| 27: | public function __construct(\Opencart\System\Engine\Registry $registry) {
|
| 28: | $this->db = $registry->get('db');
|
| 29: | $this->config = $registry->get('config');
|
| 30: | }
|
| 31: |
|
| 32: | |
| 33: | |
| 34: | |
| 35: | |
| 36: | |
| 37: | |
| 38: | |
| 39: |
|
| 40: | public function setShippingAddress(int $country_id, int $zone_id): void {
|
| 41: | $tax_query = $this->db->query("SELECT `tr1`.`tax_class_id`, `tr2`.`tax_rate_id`, `tr2`.`name`, `tr2`.`rate`, `tr2`.`type`, `tr1`.`priority` FROM `" . DB_PREFIX . "tax_rule` `tr1` LEFT JOIN `" . DB_PREFIX . "tax_rate` `tr2` ON (`tr1`.`tax_rate_id` = `tr2`.`tax_rate_id`) INNER JOIN `" . DB_PREFIX . "tax_rate_to_customer_group` `tr2cg` ON (`tr2`.`tax_rate_id` = `tr2cg`.`tax_rate_id`) LEFT JOIN `" . DB_PREFIX . "zone_to_geo_zone` `z2gz` ON (`tr2`.`geo_zone_id` = `z2gz`.`geo_zone_id`) LEFT JOIN `" . DB_PREFIX . "geo_zone` `gz` ON (`tr2`.`geo_zone_id` = `gz`.`geo_zone_id`) WHERE `tr1`.`based` = 'shipping' AND `tr2cg`.`customer_group_id` = '" . (int)$this->config->get('config_customer_group_id') . "' AND `z2gz`.`country_id` = '" . (int)$country_id . "' AND (`z2gz`.`zone_id` = '0' OR `z2gz`.`zone_id` = '" . (int)$zone_id . "') ORDER BY `tr1`.`priority` ASC");
|
| 42: |
|
| 43: | foreach ($tax_query->rows as $result) {
|
| 44: | $this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = [
|
| 45: | 'tax_rate_id' => $result['tax_rate_id'],
|
| 46: | 'name' => $result['name'],
|
| 47: | 'rate' => $result['rate'],
|
| 48: | 'type' => $result['type'],
|
| 49: | 'priority' => $result['priority']
|
| 50: | ];
|
| 51: | }
|
| 52: | }
|
| 53: |
|
| 54: | |
| 55: | |
| 56: | |
| 57: | |
| 58: | |
| 59: | |
| 60: | |
| 61: |
|
| 62: | public function setPaymentAddress(int $country_id, int $zone_id): void {
|
| 63: | $tax_query = $this->db->query("SELECT `tr1`.`tax_class_id`, `tr2`.`tax_rate_id`, `tr2`.`name`, `tr2`.`rate`, `tr2`.`type`, `tr1`.`priority` FROM `" . DB_PREFIX . "tax_rule` `tr1` LEFT JOIN `" . DB_PREFIX . "tax_rate` `tr2` ON (`tr1`.`tax_rate_id` = `tr2`.`tax_rate_id`) INNER JOIN `" . DB_PREFIX . "tax_rate_to_customer_group` `tr2cg` ON (`tr2`.`tax_rate_id` = `tr2cg`.`tax_rate_id`) LEFT JOIN `" . DB_PREFIX . "zone_to_geo_zone` `z2gz` ON (`tr2`.`geo_zone_id` = `z2gz`.`geo_zone_id`) LEFT JOIN `" . DB_PREFIX . "geo_zone` `gz` ON (`tr2`.`geo_zone_id` = `gz`.`geo_zone_id`) WHERE `tr1`.`based` = 'payment' AND `tr2cg`.`customer_group_id` = '" . (int)$this->config->get('config_customer_group_id') . "' AND `z2gz`.`country_id` = '" . (int)$country_id . "' AND (`z2gz`.`zone_id` = '0' OR `z2gz`.`zone_id` = '" . (int)$zone_id . "') ORDER BY `tr1`.`priority` ASC");
|
| 64: |
|
| 65: | foreach ($tax_query->rows as $result) {
|
| 66: | $this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = [
|
| 67: | 'tax_rate_id' => $result['tax_rate_id'],
|
| 68: | 'name' => $result['name'],
|
| 69: | 'rate' => $result['rate'],
|
| 70: | 'type' => $result['type'],
|
| 71: | 'priority' => $result['priority']
|
| 72: | ];
|
| 73: | }
|
| 74: | }
|
| 75: |
|
| 76: | |
| 77: | |
| 78: | |
| 79: | |
| 80: | |
| 81: | |
| 82: | |
| 83: |
|
| 84: | public function setStoreAddress(int $country_id, int $zone_id): void {
|
| 85: | $tax_query = $this->db->query("SELECT `tr1`.`tax_class_id`, `tr2`.`tax_rate_id`, `tr2`.`name`, `tr2`.`rate`, `tr2`.`type`, `tr1`.`priority` FROM `" . DB_PREFIX . "tax_rule` `tr1` LEFT JOIN `" . DB_PREFIX . "tax_rate` `tr2` ON (`tr1`.`tax_rate_id` = `tr2`.`tax_rate_id`) INNER JOIN `" . DB_PREFIX . "tax_rate_to_customer_group` `tr2cg` ON (`tr2`.`tax_rate_id` = `tr2cg`.`tax_rate_id`) LEFT JOIN `" . DB_PREFIX . "zone_to_geo_zone` `z2gz` ON (`tr2`.`geo_zone_id` = `z2gz`.`geo_zone_id`) LEFT JOIN `" . DB_PREFIX . "geo_zone` `gz` ON (`tr2`.`geo_zone_id` = `gz`.`geo_zone_id`) WHERE `tr1`.`based` = 'store' AND `tr2cg`.`customer_group_id` = '" . (int)$this->config->get('config_customer_group_id') . "' AND `z2gz`.`country_id` = '" . (int)$country_id . "' AND (`z2gz`.`zone_id` = '0' OR `z2gz`.`zone_id` = '" . (int)$zone_id . "') ORDER BY `tr1`.`priority` ASC");
|
| 86: |
|
| 87: | foreach ($tax_query->rows as $result) {
|
| 88: | $this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = [
|
| 89: | 'tax_rate_id' => $result['tax_rate_id'],
|
| 90: | 'name' => $result['name'],
|
| 91: | 'rate' => $result['rate'],
|
| 92: | 'type' => $result['type'],
|
| 93: | 'priority' => $result['priority']
|
| 94: | ];
|
| 95: | }
|
| 96: | }
|
| 97: |
|
| 98: | |
| 99: | |
| 100: | |
| 101: | |
| 102: | |
| 103: | |
| 104: | |
| 105: | |
| 106: |
|
| 107: | public function calculate(float $value, int $tax_class_id, bool $calculate = true): float {
|
| 108: | if ($tax_class_id && $calculate) {
|
| 109: | $amount = 0;
|
| 110: |
|
| 111: | $tax_rates = $this->getRates($value, $tax_class_id);
|
| 112: |
|
| 113: | foreach ($tax_rates as $tax_rate) {
|
| 114: | $amount += $tax_rate['amount'];
|
| 115: | }
|
| 116: |
|
| 117: | return $value + $amount;
|
| 118: | } else {
|
| 119: | return $value;
|
| 120: | }
|
| 121: | }
|
| 122: |
|
| 123: | |
| 124: | |
| 125: | |
| 126: | |
| 127: | |
| 128: | |
| 129: | |
| 130: |
|
| 131: | public function getTax(float $value, int $tax_class_id): float {
|
| 132: | $amount = 0;
|
| 133: |
|
| 134: | $tax_rates = $this->getRates($value, $tax_class_id);
|
| 135: |
|
| 136: | foreach ($tax_rates as $tax_rate) {
|
| 137: | $amount += $tax_rate['amount'];
|
| 138: | }
|
| 139: |
|
| 140: | return $amount;
|
| 141: | }
|
| 142: |
|
| 143: | |
| 144: | |
| 145: | |
| 146: | |
| 147: | |
| 148: | |
| 149: |
|
| 150: | public function getRateName(int $tax_rate_id) {
|
| 151: | $tax_query = $this->db->query("SELECT `name` FROM `" . DB_PREFIX . "tax_rate` WHERE `tax_rate_id` = '" . (int)$tax_rate_id . "'");
|
| 152: |
|
| 153: | if ($tax_query->num_rows) {
|
| 154: | return $tax_query->row['name'];
|
| 155: | } else {
|
| 156: | return false;
|
| 157: | }
|
| 158: | }
|
| 159: |
|
| 160: | |
| 161: | |
| 162: | |
| 163: | |
| 164: | |
| 165: | |
| 166: | |
| 167: |
|
| 168: | public function getRates(float $value, int $tax_class_id): array {
|
| 169: | $tax_rate_data = [];
|
| 170: |
|
| 171: | if (isset($this->tax_rates[$tax_class_id])) {
|
| 172: | foreach ($this->tax_rates[$tax_class_id] as $tax_rate) {
|
| 173: | if (isset($tax_rate_data[$tax_rate['tax_rate_id']])) {
|
| 174: | $amount = $tax_rate_data[$tax_rate['tax_rate_id']]['amount'];
|
| 175: | } else {
|
| 176: | $amount = 0;
|
| 177: | }
|
| 178: |
|
| 179: | if ($tax_rate['type'] == 'F') {
|
| 180: | $amount += $tax_rate['rate'];
|
| 181: | } elseif ($tax_rate['type'] == 'P') {
|
| 182: | $amount += ($value / 100 * $tax_rate['rate']);
|
| 183: | }
|
| 184: |
|
| 185: | $tax_rate_data[$tax_rate['tax_rate_id']] = [
|
| 186: | 'tax_rate_id' => $tax_rate['tax_rate_id'],
|
| 187: | 'name' => $tax_rate['name'],
|
| 188: | 'rate' => $tax_rate['rate'],
|
| 189: | 'type' => $tax_rate['type'],
|
| 190: | 'amount' => $amount
|
| 191: | ];
|
| 192: | }
|
| 193: | }
|
| 194: |
|
| 195: | return $tax_rate_data;
|
| 196: | }
|
| 197: |
|
| 198: | |
| 199: | |
| 200: | |
| 201: | |
| 202: |
|
| 203: | public function clear(): void {
|
| 204: | $this->tax_rates = [];
|
| 205: | }
|
| 206: | }
|
| 207: | |