1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
<?php
namespace Cart;
final class Tax {
private $tax_rates = array();
public function __construct($registry) {
$this->config = $registry->get('config');
$this->db = $registry->get('db');
}
public function unsetRates() {
$this->tax_rates = array();
}
public function setShippingAddress($country_id, $zone_id) {
$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");
foreach ($tax_query->rows as $result) {
$this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = array(
'tax_rate_id' => $result['tax_rate_id'],
'name' => $result['name'],
'rate' => $result['rate'],
'type' => $result['type'],
'priority' => $result['priority']
);
}
}
public function setPaymentAddress($country_id, $zone_id) {
$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");
foreach ($tax_query->rows as $result) {
$this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = array(
'tax_rate_id' => $result['tax_rate_id'],
'name' => $result['name'],
'rate' => $result['rate'],
'type' => $result['type'],
'priority' => $result['priority']
);
}
}
public function setStoreAddress($country_id, $zone_id) {
$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");
foreach ($tax_query->rows as $result) {
$this->tax_rates[$result['tax_class_id']][$result['tax_rate_id']] = array(
'tax_rate_id' => $result['tax_rate_id'],
'name' => $result['name'],
'rate' => $result['rate'],
'type' => $result['type'],
'priority' => $result['priority']
);
}
}
public function calculate($value, $tax_class_id, $calculate = true) {
if ($tax_class_id && $calculate) {
$amount = 0;
$tax_rates = $this->getRates($value, $tax_class_id);
foreach ($tax_rates as $tax_rate) {
if ($calculate != 'P' && $calculate != 'F') {
$amount += $tax_rate['amount'];
} elseif ($tax_rate['type'] == $calculate) {
$amount += $tax_rate['amount'];
}
}
return $value + $amount;
} else {
return $value;
}
}
public function getTax($value, $tax_class_id) {
$amount = 0;
$tax_rates = $this->getRates($value, $tax_class_id);
foreach ($tax_rates as $tax_rate) {
$amount += $tax_rate['amount'];
}
return $amount;
}
public function getRateName($tax_rate_id) {
$tax_query = $this->db->query("SELECT name FROM " . DB_PREFIX . "tax_rate WHERE tax_rate_id = '" . (int)$tax_rate_id . "'");
if ($tax_query->num_rows) {
return $tax_query->row['name'];
} else {
return false;
}
}
public function getRates($value, $tax_class_id) {
$tax_rate_data = array();
if (isset($this->tax_rates[$tax_class_id])) {
foreach ($this->tax_rates[$tax_class_id] as $tax_rate) {
if (isset($tax_rate_data[$tax_rate['tax_rate_id']])) {
$amount = $tax_rate_data[$tax_rate['tax_rate_id']]['amount'];
} else {
$amount = 0;
}
if ($tax_rate['type'] == 'F') {
$amount += $tax_rate['rate'];
} elseif ($tax_rate['type'] == 'P') {
$amount += ($value / 100 * $tax_rate['rate']);
}
$tax_rate_data[$tax_rate['tax_rate_id']] = array(
'tax_rate_id' => $tax_rate['tax_rate_id'],
'name' => $tax_rate['name'],
'rate' => $tax_rate['rate'],
'type' => $tax_rate['type'],
'amount' => $amount
);
}
}
return $tax_rate_data;
}
}
|