Back to Opencart

File extension\opencart\catalog\model\total\coupon.php

docs/api/source-extension.opencart.catalog.model.total.coupon.html

4.1.0.311.3 KB
Original Source

Namespaces

Classes

| 1: | <?php | | 2: | namespace Opencart\Catalog\Model\Extension\Opencart\Total; | | 3: | /** | | 4: | * Class Coupon | | 5: | * | | 6: | * @package Opencart\Catalog\Model\Extension\Opencart\Total | | 7: | */ | | 8: | class Coupon extends \Opencart\System\Engine\Model { | | 9: | /** | | 10: | * Get Total | | 11: | * | | 12: | * @param array<int, array<string, mixed>> $totals | | 13: | * @param array<int, float> $taxes | | 14: | * @param float $total | | 15: | * | | 16: | * @return void | | 17: | */ | | 18: | public function getTotal(array &$totals, array &$taxes, float &$total): void { | | 19: | if (isset($this->session->data['coupon'])) { | | 20: | $this->load->language('extension/opencart/total/coupon', 'coupon'); | | 21: | | | 22: | $this->load->model('marketing/coupon'); | | 23: | | | 24: | $coupon_info = $this->model_marketing_coupon->getCoupon($this->session->data['coupon']); | | 25: | | | 26: | if ($coupon_info) { | | 27: | $discount_total = 0; | | 28: | | | 29: | $products = $this->cart->getProducts(); | | 30: | | | 31: | if (!$coupon_info['product']) { | | 32: | $sub_total = $this->cart->getSubTotal(); | | 33: | } else { | | 34: | $sub_total = 0; | | 35: | | | 36: | foreach ($products as $product) { | | 37: | if (in_array($product['product_id'], $coupon_info['product'])) { | | 38: | $sub_total += $product['total']; | | 39: | } | | 40: | } | | 41: | } | | 42: | | | 43: | if ($coupon_info['type'] == 'F') { | | 44: | $coupon_info['discount'] = min($coupon_info['discount'], $sub_total); | | 45: | } | | 46: | | | 47: | foreach ($products as $product) { | | 48: | $discount = 0; | | 49: | | | 50: | if (!$coupon_info['product']) { | | 51: | $status = true; | | 52: | } else { | | 53: | $status = in_array($product['product_id'], $coupon_info['product']); | | 54: | } | | 55: | | | 56: | if ($status) { | | 57: | if ($coupon_info['type'] == 'F') { | | 58: | $discount = $coupon_info['discount'] * ($product['total'] / $sub_total); | | 59: | } elseif ($coupon_info['type'] == 'P') { | | 60: | $discount = $product['total'] / 100 * $coupon_info['discount']; | | 61: | } | | 62: | | | 63: | if ($product['tax_class_id']) { | | 64: | $tax_rates = $this->tax->getRates($product['total'] - ($product['total'] - $discount), $product['tax_class_id']); | | 65: | | | 66: | foreach ($tax_rates as $tax_rate) { | | 67: | if ($tax_rate['type'] == 'P') { | | 68: | $taxes[$tax_rate['tax_rate_id']] -= $tax_rate['amount']; | | 69: | } | | 70: | } | | 71: | } | | 72: | } | | 73: | | | 74: | $discount_total += $discount; | | 75: | } | | 76: | | | 77: | if ($coupon_info['shipping'] && isset($this->session->data['shipping_method']['cost']) && isset($this->session->data['shipping_method']['tax_class_id'])) { | | 78: | if (!empty($this->session->data['shipping_method']['tax_class_id'])) { | | 79: | $tax_rates = $this->tax->getRates($this->session->data['shipping_method']['cost'], $this->session->data['shipping_method']['tax_class_id']); | | 80: | | | 81: | foreach ($tax_rates as $tax_rate) { | | 82: | if ($tax_rate['type'] == 'P') { | | 83: | $taxes[$tax_rate['tax_rate_id']] -= $tax_rate['amount']; | | 84: | } | | 85: | } | | 86: | } | | 87: | | | 88: | $discount_total += $this->session->data['shipping_method']['cost']; | | 89: | } | | 90: | | | 91: | // If discount greater than total | | 92: | if ($discount_total > $total) { | | 93: | $discount_total = $total; | | 94: | } | | 95: | | | 96: | if ($discount_total > 0) { | | 97: | $totals[] = [ | | 98: | 'extension' => 'opencart', | | 99: | 'code' => 'coupon', | | 100: | 'title' => sprintf($this->language->get('coupon_text_coupon'), $this->session->data['coupon']), | | 101: | 'value' => -$discount_total, | | 102: | 'sort_order' => (int)$this->config->get('total_coupon_sort_order') | | 103: | ]; | | 104: | | | 105: | $total -= $discount_total; | | 106: | } | | 107: | } | | 108: | } | | 109: | } | | 110: | | | 111: | /** | | 112: | * Confirm | | 113: | * | | 114: | * @param array<string, mixed> $order_info | | 115: | * @param array<string, mixed> $order_total | | 116: | * | | 117: | * @return int | | 118: | */ | | 119: | public function confirm(array $order_info, array $order_total): int { | | 120: | $code = ''; | | 121: | | | 122: | $start = strpos($order_total['title'], '('); | | 123: | $end = strrpos($order_total['title'], ')'); | | 124: | | | 125: | if ($start !== false && $end !== false) { | | 126: | $code = substr($order_total['title'], $start + 1, $end - ($start + 1)); | | 127: | } | | 128: | | | 129: | if ($code) { | | 130: | $this->load->model('marketing/coupon'); | | 131: | | | 132: | $status = true; | | 133: | | | 134: | $coupon_info = $this->model_marketing_coupon->getCouponByCode($code); | | 135: | | | 136: | if ($coupon_info) { | | 137: | $coupon_total = $this->model_marketing_coupon->getTotalHistories($coupon_info['coupon_id']); | | 138: | | | 139: | if ($coupon_info['uses_total'] > 0 && ($coupon_total >= $coupon_info['uses_total'])) { | | 140: | $status = false; | | 141: | } | | 142: | | | 143: | if ($order_info['customer_id']) { | | 144: | $customer_total = $this->model_marketing_coupon->getTotalHistoriesByCustomerId($coupon_info['coupon_id'], $order_info['customer_id']); | | 145: | | | 146: | if ($coupon_info['uses_customer'] > 0 && ($customer_total >= $coupon_info['uses_customer'])) { | | 147: | $status = false; | | 148: | } | | 149: | } | | 150: | } else { | | 151: | $status = false; | | 152: | } | | 153: | | | 154: | if ($status) { | | 155: | $this->model_marketing_coupon->addHistory($coupon_info['coupon_id'], $order_info['order_id'], $order_info['customer_id'], $order_total['value']); | | 156: | } else { | | 157: | return $this->config->get('config_fraud_status_id'); | | 158: | } | | 159: | } | | 160: | | | 161: | return 0; | | 162: | } | | 163: | | | 164: | /** | | 165: | * Unconfirm | | 166: | * | | 167: | * @param array<string, mixed> $order_info | | 168: | * | | 169: | * @return void | | 170: | */ | | 171: | public function unconfirm(array $order_info): void { | | 172: | $this->load->model('marketing/coupon'); | | 173: | | | 174: | $this->model_marketing_coupon->deleteHistoryByOrderId($order_info['order_id']); | | 175: | } | | 176: | } | | 177: | |

OpenCart API API documentation generated by ApiGen dev-master