1: | <?php
|
2: | namespace Opencart\System\Library\Cart;
|
3: | |
4: | |
5: | |
6: | |
7: |
|
8: | class Cart {
|
9: | |
10: | |
11: |
|
12: | private object $db;
|
13: | |
14: | |
15: |
|
16: | private object $config;
|
17: | |
18: | |
19: |
|
20: | private object $customer;
|
21: | |
22: | |
23: |
|
24: | private object $session;
|
25: | |
26: | |
27: |
|
28: | private object $tax;
|
29: | |
30: | |
31: |
|
32: | private object $weight;
|
33: | |
34: | |
35: |
|
36: | private array $data = [];
|
37: |
|
38: | |
39: | |
40: | |
41: | |
42: |
|
43: | public function __construct(\Opencart\System\Engine\Registry $registry) {
|
44: | $this->db = $registry->get('db');
|
45: | $this->config = $registry->get('config');
|
46: | $this->customer = $registry->get('customer');
|
47: | $this->session = $registry->get('session');
|
48: | $this->tax = $registry->get('tax');
|
49: | $this->weight = $registry->get('weight');
|
50: |
|
51: |
|
52: | $this->db->query("DELETE FROM `" . DB_PREFIX . "cart` WHERE (`api_id` > '0' OR `customer_id` = '0') AND `date_added` < DATE_SUB(NOW(), INTERVAL 1 HOUR)");
|
53: |
|
54: | if ($this->customer->isLogged()) {
|
55: |
|
56: | $this->db->query("UPDATE `" . DB_PREFIX . "cart` SET `session_id` = '" . $this->db->escape($this->session->getId()) . "' WHERE `api_id` = '0' AND `customer_id` = '" . (int)$this->customer->getId() . "'");
|
57: |
|
58: |
|
59: | $cart_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "cart` WHERE `api_id` = '0' AND `customer_id` = '0' AND `session_id` = '" . $this->db->escape($this->session->getId()) . "'");
|
60: |
|
61: | foreach ($cart_query->rows as $cart) {
|
62: | $this->db->query("DELETE FROM `" . DB_PREFIX . "cart` WHERE `cart_id` = '" . (int)$cart['cart_id'] . "'");
|
63: |
|
64: |
|
65: | $this->add($cart['product_id'], $cart['quantity'], json_decode($cart['option'], true), $cart['subscription_plan_id'], $cart['override'], $cart['price']);
|
66: | }
|
67: | }
|
68: |
|
69: |
|
70: | $this->data = $this->getProducts();
|
71: | }
|
72: |
|
73: | |
74: | |
75: | |
76: | |
77: |
|
78: | public function getProducts(): array {
|
79: | if (!$this->data) {
|
80: | $cart_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "cart` WHERE `api_id` = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND `customer_id` = '" . (int)$this->customer->getId() . "' AND `session_id` = '" . $this->db->escape($this->session->getId()) . "'");
|
81: |
|
82: | foreach ($cart_query->rows as $cart) {
|
83: | $stock = true;
|
84: |
|
85: | $product_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "product_to_store` `p2s` LEFT JOIN `" . DB_PREFIX . "product` `p` ON (`p2s`.`product_id` = `p`.`product_id`) LEFT JOIN `" . DB_PREFIX . "product_description` `pd` ON (`p`.`product_id` = `pd`.`product_id`) WHERE `p2s`.`store_id` = '" . (int)$this->config->get('config_store_id') . "' AND `p2s`.`product_id` = '" . (int)$cart['product_id'] . "' AND `pd`.`language_id` = '" . (int)$this->config->get('config_language_id') . "' AND `p`.`date_available` <= NOW() AND `p`.`status` = '1'");
|
86: |
|
87: | if ($product_query->num_rows && ($cart['quantity'] > 0)) {
|
88: | $option_price = 0;
|
89: | $option_points = 0;
|
90: | $option_weight = 0;
|
91: |
|
92: | $option_data = [];
|
93: |
|
94: | $product_options = (array)json_decode($cart['option'], true);
|
95: |
|
96: |
|
97: | $variant = json_decode($product_query->row['variant'], true);
|
98: |
|
99: | if ($variant) {
|
100: | foreach ($variant as $key => $value) {
|
101: | $product_options[$key] = $value;
|
102: | }
|
103: | }
|
104: |
|
105: | foreach ($product_options as $product_option_id => $value) {
|
106: | if (!$product_query->row['master_id']) {
|
107: | $product_id = $cart['product_id'];
|
108: | } else {
|
109: | $product_id = $product_query->row['master_id'];
|
110: | }
|
111: |
|
112: | $option_query = $this->db->query("SELECT `po`.`product_option_id`, `po`.`option_id`, `od`.`name`, `o`.`type` FROM `" . DB_PREFIX . "product_option` `po` LEFT JOIN `" . DB_PREFIX . "option` `o` ON (`po`.`option_id` = `o`.`option_id`) LEFT JOIN `" . DB_PREFIX . "option_description` `od` ON (`o`.`option_id` = `od`.`option_id`) WHERE `po`.`product_option_id` = '" . (int)$product_option_id . "' AND `po`.`product_id` = '" . (int)$product_id . "' AND `od`.`language_id` = '" . (int)$this->config->get('config_language_id') . "'");
|
113: |
|
114: | if ($option_query->num_rows) {
|
115: | if ($option_query->row['type'] == 'select' || $option_query->row['type'] == 'radio') {
|
116: | $option_value_query = $this->db->query("SELECT `pov`.`option_value_id`, `ovd`.`name`, `pov`.`quantity`, `pov`.`subtract`, `pov`.`price`, `pov`.`price_prefix`, `pov`.`points`, `pov`.`points_prefix`, `pov`.`weight`, `pov`.`weight_prefix` FROM `" . DB_PREFIX . "product_option_value` `pov` LEFT JOIN `" . DB_PREFIX . "option_value` `ov` ON (`pov`.`option_value_id` = `ov`.`option_value_id`) LEFT JOIN `" . DB_PREFIX . "option_value_description` `ovd` ON (`ov`.`option_value_id` = `ovd`.`option_value_id`) WHERE `pov`.`product_option_value_id` = '" . (int)$value . "' AND `pov`.`product_option_id` = '" . (int)$product_option_id . "' AND `ovd`.`language_id` = '" . (int)$this->config->get('config_language_id') . "'");
|
117: |
|
118: | if ($option_value_query->num_rows) {
|
119: | if ($option_value_query->row['price_prefix'] == '+') {
|
120: | $option_price += $option_value_query->row['price'];
|
121: | } elseif ($option_value_query->row['price_prefix'] == '-') {
|
122: | $option_price -= $option_value_query->row['price'];
|
123: | }
|
124: |
|
125: | if ($option_value_query->row['points_prefix'] == '+') {
|
126: | $option_points += $option_value_query->row['points'];
|
127: | } elseif ($option_value_query->row['points_prefix'] == '-') {
|
128: | $option_points -= $option_value_query->row['points'];
|
129: | }
|
130: |
|
131: | if ($option_value_query->row['weight_prefix'] == '+') {
|
132: | $option_weight += $option_value_query->row['weight'];
|
133: | } elseif ($option_value_query->row['weight_prefix'] == '-') {
|
134: | $option_weight -= $option_value_query->row['weight'];
|
135: | }
|
136: |
|
137: | if ($option_value_query->row['subtract'] && (!$option_value_query->row['quantity'] || ($option_value_query->row['quantity'] < $cart['quantity']))) {
|
138: | $stock = false;
|
139: | }
|
140: |
|
141: | $option_data[] = [
|
142: | 'product_option_id' => $product_option_id,
|
143: | 'product_option_value_id' => $value,
|
144: | 'option_id' => $option_query->row['option_id'],
|
145: | 'option_value_id' => $option_value_query->row['option_value_id'],
|
146: | 'name' => $option_query->row['name'],
|
147: | 'value' => $option_value_query->row['name'],
|
148: | 'type' => $option_query->row['type'],
|
149: | 'quantity' => $option_value_query->row['quantity'],
|
150: | 'subtract' => $option_value_query->row['subtract'],
|
151: | 'price' => $option_value_query->row['price'],
|
152: | 'price_prefix' => $option_value_query->row['price_prefix'],
|
153: | 'points' => $option_value_query->row['points'],
|
154: | 'points_prefix' => $option_value_query->row['points_prefix'],
|
155: | 'weight' => $option_value_query->row['weight'],
|
156: | 'weight_prefix' => $option_value_query->row['weight_prefix']
|
157: | ];
|
158: | }
|
159: | } elseif ($option_query->row['type'] == 'checkbox' && is_array($value)) {
|
160: | foreach ($value as $product_option_value_id) {
|
161: | $option_value_query = $this->db->query("SELECT `pov`.`option_value_id`, `pov`.`quantity`, `pov`.`subtract`, `pov`.`price`, `pov`.`price_prefix`, `pov`.`points`, `pov`.`points_prefix`, `pov`.`weight`, `pov`.`weight_prefix`, `ovd`.`name` FROM `" . DB_PREFIX . "product_option_value` `pov` LEFT JOIN `" . DB_PREFIX . "option_value_description` `ovd` ON (`pov`.`option_value_id` = `ovd`.option_value_id) WHERE `pov`.product_option_value_id = '" . (int)$product_option_value_id . "' AND `pov`.product_option_id = '" . (int)$product_option_id . "' AND `ovd`.language_id = '" . (int)$this->config->get('config_language_id') . "'");
|
162: |
|
163: | if ($option_value_query->num_rows) {
|
164: | if ($option_value_query->row['price_prefix'] == '+') {
|
165: | $option_price += $option_value_query->row['price'];
|
166: | } elseif ($option_value_query->row['price_prefix'] == '-') {
|
167: | $option_price -= $option_value_query->row['price'];
|
168: | }
|
169: |
|
170: | if ($option_value_query->row['points_prefix'] == '+') {
|
171: | $option_points += $option_value_query->row['points'];
|
172: | } elseif ($option_value_query->row['points_prefix'] == '-') {
|
173: | $option_points -= $option_value_query->row['points'];
|
174: | }
|
175: |
|
176: | if ($option_value_query->row['weight_prefix'] == '+') {
|
177: | $option_weight += $option_value_query->row['weight'];
|
178: | } elseif ($option_value_query->row['weight_prefix'] == '-') {
|
179: | $option_weight -= $option_value_query->row['weight'];
|
180: | }
|
181: |
|
182: | if ($option_value_query->row['subtract'] && (!$option_value_query->row['quantity'] || ($option_value_query->row['quantity'] < $cart['quantity']))) {
|
183: | $stock = false;
|
184: | }
|
185: |
|
186: | $option_data[] = [
|
187: | 'product_option_id' => $product_option_id,
|
188: | 'product_option_value_id' => $product_option_value_id,
|
189: | 'option_id' => $option_query->row['option_id'],
|
190: | 'option_value_id' => $option_value_query->row['option_value_id'],
|
191: | 'name' => $option_query->row['name'],
|
192: | 'value' => $option_value_query->row['name'],
|
193: | 'type' => $option_query->row['type'],
|
194: | 'quantity' => $option_value_query->row['quantity'],
|
195: | 'subtract' => $option_value_query->row['subtract'],
|
196: | 'price' => $option_value_query->row['price'],
|
197: | 'price_prefix' => $option_value_query->row['price_prefix'],
|
198: | 'points' => $option_value_query->row['points'],
|
199: | 'points_prefix' => $option_value_query->row['points_prefix'],
|
200: | 'weight' => $option_value_query->row['weight'],
|
201: | 'weight_prefix' => $option_value_query->row['weight_prefix']
|
202: | ];
|
203: | }
|
204: | }
|
205: | } elseif ($option_query->row['type'] == 'text' || $option_query->row['type'] == 'textarea' || $option_query->row['type'] == 'file' || $option_query->row['type'] == 'date' || $option_query->row['type'] == 'datetime' || $option_query->row['type'] == 'time') {
|
206: | $option_data[] = [
|
207: | 'product_option_id' => $product_option_id,
|
208: | 'product_option_value_id' => '',
|
209: | 'option_id' => $option_query->row['option_id'],
|
210: | 'option_value_id' => '',
|
211: | 'name' => $option_query->row['name'],
|
212: | 'value' => $value,
|
213: | 'type' => $option_query->row['type'],
|
214: | 'quantity' => '',
|
215: | 'subtract' => '',
|
216: | 'price' => '',
|
217: | 'price_prefix' => '',
|
218: | 'points' => '',
|
219: | 'points_prefix' => '',
|
220: | 'weight' => '',
|
221: | 'weight_prefix' => ''
|
222: | ];
|
223: | }
|
224: | }
|
225: | }
|
226: |
|
227: | $price = $product_query->row['price'];
|
228: |
|
229: |
|
230: | $discount_quantity = 0;
|
231: |
|
232: | foreach ($cart_query->rows as $cart_2) {
|
233: | if ($cart_2['product_id'] == $cart['product_id']) {
|
234: | $discount_quantity += $cart_2['quantity'];
|
235: | }
|
236: | }
|
237: |
|
238: | $product_discount_query = $this->db->query("SELECT `price` FROM `" . DB_PREFIX . "product_discount` WHERE `product_id` = '" . (int)$cart['product_id'] . "' AND `customer_group_id` = '" . (int)$this->config->get('config_customer_group_id') . "' AND `quantity` <= '" . (int)$discount_quantity . "' AND ((`date_start` = '0000-00-00' OR `date_start` < NOW()) AND (`date_end` = '0000-00-00' OR `date_end` > NOW())) ORDER BY `quantity` DESC, `priority` ASC, `price` ASC LIMIT 1");
|
239: |
|
240: | if ($product_discount_query->num_rows) {
|
241: | $price = $product_discount_query->row['price'];
|
242: | }
|
243: |
|
244: |
|
245: | $product_special_query = $this->db->query("SELECT `price` FROM `" . DB_PREFIX . "product_special` WHERE `product_id` = '" . (int)$cart['product_id'] . "' AND `customer_group_id` = '" . (int)$this->config->get('config_customer_group_id') . "' AND ((`date_start` = '0000-00-00' OR `date_start` < NOW()) AND (`date_end` = '0000-00-00' OR `date_end` > NOW())) ORDER BY `priority` ASC, `price` ASC LIMIT 1");
|
246: |
|
247: | if ($product_special_query->num_rows) {
|
248: | $price = $product_special_query->row['price'];
|
249: | }
|
250: |
|
251: | $product_total = 0;
|
252: |
|
253: | foreach ($cart_query->rows as $cart_2) {
|
254: | if ($cart_2['product_id'] == $cart['product_id']) {
|
255: | $product_total += $cart_2['quantity'];
|
256: | }
|
257: | }
|
258: |
|
259: | if ($product_query->row['minimum'] > $product_total) {
|
260: | $minimum = false;
|
261: | } else {
|
262: | $minimum = true;
|
263: | }
|
264: |
|
265: |
|
266: | $product_reward_query = $this->db->query("SELECT `points` FROM `" . DB_PREFIX . "product_reward` WHERE `product_id` = '" . (int)$cart['product_id'] . "' AND `customer_group_id` = '" . (int)$this->config->get('config_customer_group_id') . "'");
|
267: |
|
268: | if ($product_reward_query->num_rows) {
|
269: | $reward = $product_reward_query->row['points'];
|
270: | } else {
|
271: | $reward = 0;
|
272: | }
|
273: |
|
274: |
|
275: | $download_data = [];
|
276: |
|
277: | $download_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "product_to_download` `p2d` LEFT JOIN `" . DB_PREFIX . "download` `d` ON (`p2d`.`download_id` = `d`.`download_id`) LEFT JOIN `" . DB_PREFIX . "download_description` `dd` ON (`d`.`download_id` = `dd`.`download_id`) WHERE `p2d`.`product_id` = '" . (int)$cart['product_id'] . "' AND `dd`.`language_id` = '" . (int)$this->config->get('config_language_id') . "'");
|
278: |
|
279: | foreach ($download_query->rows as $download) {
|
280: | $download_data[] = [
|
281: | 'download_id' => $download['download_id'],
|
282: | 'name' => $download['name'],
|
283: | 'filename' => $download['filename'],
|
284: | 'mask' => $download['mask']
|
285: | ];
|
286: | }
|
287: |
|
288: |
|
289: | if (!$product_query->row['quantity'] || ($product_query->row['quantity'] < $cart['quantity'])) {
|
290: | $stock = false;
|
291: | }
|
292: |
|
293: | $subscription_data = [];
|
294: |
|
295: | $subscription_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "product_subscription` `ps` LEFT JOIN `" . DB_PREFIX . "subscription_plan` `sp` ON (`ps`.`subscription_plan_id` = `sp`.`subscription_plan_id`) LEFT JOIN `" . DB_PREFIX . "subscription_plan_description` `spd` ON (`sp`.`subscription_plan_id` = `spd`.`subscription_plan_id`) WHERE `ps`.`product_id` = '" . (int)$cart['product_id'] . "' AND `ps`.`subscription_plan_id` = '" . (int)$cart['subscription_plan_id'] . "' AND `ps`.`customer_group_id` = '" . (int)$this->config->get('config_customer_group_id') . "' AND `spd`.`language_id` = '" . (int)$this->config->get('config_language_id') . "' AND `sp`.`status` = '1'");
|
296: |
|
297: | if ($subscription_query->num_rows) {
|
298: | $price = $subscription_query->row['price'];
|
299: |
|
300: | if ($subscription_query->row['trial_status']) {
|
301: | $price = $subscription_query->row['trial_price'];
|
302: | }
|
303: |
|
304: | $subscription_data = [
|
305: | 'subscription_plan_id' => $subscription_query->row['subscription_plan_id'],
|
306: | 'name' => $subscription_query->row['name'],
|
307: | 'trial_price' => $subscription_query->row['trial_price'],
|
308: | 'trial_frequency' => $subscription_query->row['trial_frequency'],
|
309: | 'trial_cycle' => $subscription_query->row['trial_cycle'],
|
310: | 'trial_duration' => $subscription_query->row['trial_duration'],
|
311: | 'trial_remaining' => $subscription_query->row['trial_duration'],
|
312: | 'trial_status' => $subscription_query->row['trial_status'],
|
313: | 'price' => $subscription_query->row['price'],
|
314: | 'frequency' => $subscription_query->row['frequency'],
|
315: | 'cycle' => $subscription_query->row['cycle'],
|
316: | 'duration' => $subscription_query->row['duration'],
|
317: | 'remaining' => $subscription_query->row['duration']
|
318: | ];
|
319: | }
|
320: |
|
321: | if ($cart['override']) {
|
322: | $price = $cart['price'];
|
323: | }
|
324: |
|
325: | $this->data[$cart['cart_id']] = [
|
326: | 'cart_id' => $cart['cart_id'],
|
327: | 'product_id' => $product_query->row['product_id'],
|
328: | 'master_id' => $product_query->row['master_id'],
|
329: | 'name' => $product_query->row['name'],
|
330: | 'model' => $product_query->row['model'],
|
331: | 'shipping' => $product_query->row['shipping'],
|
332: | 'image' => $product_query->row['image'],
|
333: | 'option' => $option_data,
|
334: | 'subscription' => $subscription_data,
|
335: | 'download' => $download_data,
|
336: | 'quantity' => $cart['quantity'],
|
337: | 'minimum' => $minimum,
|
338: | 'subtract' => $product_query->row['subtract'],
|
339: | 'stock' => $stock,
|
340: | 'price' => ($price + $option_price),
|
341: | 'total' => ($price + $option_price) * $cart['quantity'],
|
342: | 'reward' => $reward * $cart['quantity'],
|
343: | 'points' => ($product_query->row['points'] ? ($product_query->row['points'] + $option_points) * $cart['quantity'] : 0),
|
344: | 'tax_class_id' => $product_query->row['tax_class_id'],
|
345: | 'weight' => ($product_query->row['weight'] + $option_weight) * $cart['quantity'],
|
346: | 'weight_class_id' => $product_query->row['weight_class_id'],
|
347: | 'length' => $product_query->row['length'],
|
348: | 'width' => $product_query->row['width'],
|
349: | 'height' => $product_query->row['height'],
|
350: | 'length_class_id' => $product_query->row['length_class_id']
|
351: | ];
|
352: | } else {
|
353: | $this->remove($cart['cart_id']);
|
354: | }
|
355: | }
|
356: | }
|
357: |
|
358: | return $this->data;
|
359: | }
|
360: |
|
361: | |
362: | |
363: | |
364: | |
365: | |
366: | |
367: | |
368: | |
369: | |
370: | |
371: | |
372: |
|
373: | public function add(int $product_id, int $quantity = 1, array $option = [], int $subscription_plan_id = 0, bool $override = false, float $price = 0): void {
|
374: | $query = $this->db->query("SELECT COUNT(*) AS `total` FROM `" . DB_PREFIX . "cart` WHERE `api_id` = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND `customer_id` = '" . (int)$this->customer->getId() . "' AND `session_id` = '" . $this->db->escape($this->session->getId()) . "' AND `product_id` = '" . (int)$product_id . "' AND `subscription_plan_id` = '" . (int)$subscription_plan_id . "' AND `option` = '" . $this->db->escape(json_encode($option)) . "'");
|
375: |
|
376: | if (!$query->row['total']) {
|
377: | $this->db->query("INSERT INTO `" . DB_PREFIX . "cart` SET `api_id` = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "', `customer_id` = '" . (int)$this->customer->getId() . "', `session_id` = '" . $this->db->escape($this->session->getId()) . "', `product_id` = '" . (int)$product_id . "', `subscription_plan_id` = '" . (int)$subscription_plan_id . "', `option` = '" . $this->db->escape(json_encode($option)) . "', `quantity` = '" . (int)$quantity . "', `override` = '" . (bool)$override . "', `price` = '" . (float)($override ? $price : 0) . "', `date_added` = NOW()");
|
378: | } else {
|
379: | $this->db->query("UPDATE `" . DB_PREFIX . "cart` SET `quantity` = (`quantity` + " . (int)$quantity . ") WHERE `api_id` = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND `customer_id` = '" . (int)$this->customer->getId() . "' AND `session_id` = '" . $this->db->escape($this->session->getId()) . "' AND `product_id` = '" . (int)$product_id . "' AND `subscription_plan_id` = '" . (int)$subscription_plan_id . "' AND `option` = '" . $this->db->escape(json_encode($option)) . "'");
|
380: | }
|
381: |
|
382: |
|
383: | $this->data = [];
|
384: |
|
385: |
|
386: | $this->data = $this->getProducts();
|
387: | }
|
388: |
|
389: | |
390: | |
391: | |
392: | |
393: | |
394: | |
395: | |
396: |
|
397: | public function update(int $cart_id, int $quantity): void {
|
398: | $this->db->query("UPDATE `" . DB_PREFIX . "cart` SET `quantity` = '" . (int)$quantity . "' WHERE `cart_id` = '" . (int)$cart_id . "' AND `api_id` = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND `customer_id` = '" . (int)$this->customer->getId() . "' AND `session_id` = '" . $this->db->escape($this->session->getId()) . "'");
|
399: |
|
400: |
|
401: | $this->data = [];
|
402: |
|
403: |
|
404: | $this->data = $this->getProducts();
|
405: | }
|
406: |
|
407: | |
408: | |
409: | |
410: | |
411: | |
412: | |
413: |
|
414: | public function has(int $cart_id): bool {
|
415: | return isset($this->data[$cart_id]);
|
416: | }
|
417: |
|
418: | |
419: | |
420: | |
421: | |
422: | |
423: | |
424: |
|
425: | public function remove(int $cart_id): void {
|
426: | $this->db->query("DELETE FROM `" . DB_PREFIX . "cart` WHERE `cart_id` = '" . (int)$cart_id . "' AND `api_id` = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND `customer_id` = '" . (int)$this->customer->getId() . "' AND `session_id` = '" . $this->db->escape($this->session->getId()) . "'");
|
427: |
|
428: | unset($this->data[$cart_id]);
|
429: | }
|
430: |
|
431: | |
432: | |
433: | |
434: | |
435: |
|
436: | public function clear(): void {
|
437: | $this->db->query("DELETE FROM `" . DB_PREFIX . "cart` WHERE `api_id` = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND `customer_id` = '" . (int)$this->customer->getId() . "' AND `session_id` = '" . $this->db->escape($this->session->getId()) . "'");
|
438: |
|
439: | $this->data = [];
|
440: | }
|
441: |
|
442: | |
443: | |
444: | |
445: | |
446: |
|
447: | public function getSubscriptions(): array {
|
448: | $product_data = [];
|
449: |
|
450: | foreach ($this->getProducts() as $value) {
|
451: | if ($value['subscription']) {
|
452: | $product_data[] = $value;
|
453: | }
|
454: | }
|
455: |
|
456: | return $product_data;
|
457: | }
|
458: |
|
459: | |
460: | |
461: | |
462: | |
463: |
|
464: | public function getWeight(): float {
|
465: | $weight = 0;
|
466: |
|
467: | foreach ($this->getProducts() as $product) {
|
468: | if ($product['shipping']) {
|
469: | $weight += $this->weight->convert($product['weight'], $product['weight_class_id'], $this->config->get('config_weight_class_id'));
|
470: | }
|
471: | }
|
472: |
|
473: | return $weight;
|
474: | }
|
475: |
|
476: | |
477: | |
478: | |
479: | |
480: |
|
481: | public function getSubTotal(): float {
|
482: | $total = 0;
|
483: |
|
484: | foreach ($this->getProducts() as $product) {
|
485: | $total += $product['total'];
|
486: | }
|
487: |
|
488: | return $total;
|
489: | }
|
490: |
|
491: | |
492: | |
493: | |
494: | |
495: |
|
496: | public function getTaxes(): array {
|
497: | $tax_data = [];
|
498: |
|
499: | foreach ($this->getProducts() as $product) {
|
500: | if ($product['tax_class_id']) {
|
501: | $tax_rates = $this->tax->getRates($product['price'], $product['tax_class_id']);
|
502: |
|
503: | foreach ($tax_rates as $tax_rate) {
|
504: | if (!isset($tax_data[$tax_rate['tax_rate_id']])) {
|
505: | $tax_data[$tax_rate['tax_rate_id']] = ($tax_rate['amount'] * $product['quantity']);
|
506: | } else {
|
507: | $tax_data[$tax_rate['tax_rate_id']] += ($tax_rate['amount'] * $product['quantity']);
|
508: | }
|
509: | }
|
510: | }
|
511: | }
|
512: |
|
513: | return $tax_data;
|
514: | }
|
515: |
|
516: | |
517: | |
518: | |
519: | |
520: |
|
521: | public function getTotal(): float {
|
522: | $total = 0;
|
523: |
|
524: | foreach ($this->getProducts() as $product) {
|
525: | $total += $this->tax->calculate($product['price'], $product['tax_class_id'], $this->config->get('config_tax')) * $product['quantity'];
|
526: | }
|
527: |
|
528: | return $total;
|
529: | }
|
530: |
|
531: | |
532: | |
533: | |
534: | |
535: |
|
536: | public function countProducts(): int {
|
537: | $product_total = 0;
|
538: |
|
539: | $products = $this->getProducts();
|
540: |
|
541: | foreach ($products as $product) {
|
542: | $product_total += $product['quantity'];
|
543: | }
|
544: |
|
545: | return $product_total;
|
546: | }
|
547: |
|
548: | |
549: | |
550: | |
551: | |
552: |
|
553: | public function hasProducts(): bool {
|
554: | return (bool)count($this->getProducts());
|
555: | }
|
556: |
|
557: | |
558: | |
559: | |
560: | |
561: |
|
562: | public function hasSubscription(): bool {
|
563: | return (bool)count($this->getSubscriptions());
|
564: | }
|
565: |
|
566: | |
567: | |
568: | |
569: | |
570: |
|
571: | public function hasStock(): bool {
|
572: | foreach ($this->getProducts() as $product) {
|
573: | if (!$product['stock']) {
|
574: | return false;
|
575: | }
|
576: | }
|
577: |
|
578: | return true;
|
579: | }
|
580: |
|
581: | |
582: | |
583: | |
584: | |
585: |
|
586: | public function hasShipping(): bool {
|
587: | foreach ($this->getProducts() as $product) {
|
588: | if ($product['shipping']) {
|
589: | return true;
|
590: | }
|
591: | }
|
592: |
|
593: | return false;
|
594: | }
|
595: |
|
596: | |
597: | |
598: | |
599: | |
600: |
|
601: | public function hasDownload(): bool {
|
602: | foreach ($this->getProducts() as $product) {
|
603: | if ($product['download']) {
|
604: | return true;
|
605: | }
|
606: | }
|
607: |
|
608: | return false;
|
609: | }
|
610: | }
|
611: | |