| 1: | <?php
|
| 2: | namespace Opencart\Catalog\Controller\Cron;
|
| 3: | |
| 4: | |
| 5: | |
| 6: | |
| 7: |
|
| 8: | class Subscription extends \Opencart\System\Engine\Controller {
|
| 9: | |
| 10: | |
| 11: | |
| 12: | |
| 13: | |
| 14: | |
| 15: | |
| 16: | |
| 17: | |
| 18: | |
| 19: |
|
| 20: | public function index(int $cron_id, string $code, string $cycle, string $date_added, string $date_modified): void {
|
| 21: | $this->load->language('cron/subscription');
|
| 22: |
|
| 23: |
|
| 24: | $filter_data = [
|
| 25: | 'filter_date_next' => date('Y-m-d H:i:s'),
|
| 26: | 'filter_subscription_status_id' => $this->config->get('config_subscription_active_status_id'),
|
| 27: | 'start' => 0,
|
| 28: | 'limit' => 10
|
| 29: | ];
|
| 30: |
|
| 31: |
|
| 32: | $this->load->model('checkout/subscription');
|
| 33: | $this->load->model('checkout/order');
|
| 34: |
|
| 35: | $results = $this->model_checkout_subscription->getSubscriptions($filter_data);
|
| 36: |
|
| 37: | foreach ($results as $result) {
|
| 38: | $order_info = $this->model_checkout_order->getOrder($result['order_id']);
|
| 39: |
|
| 40: | if (($result['trial_status'] && $result['trial_remaining']) || ($result['duration'] && $result['remaining'])) {
|
| 41: | $error = '';
|
| 42: |
|
| 43: |
|
| 44: | $this->load->model('localisation/language');
|
| 45: |
|
| 46: | $language_info = $this->model_localisation_language->getLanguage($result['language_id']);
|
| 47: |
|
| 48: | if (!$language_info) {
|
| 49: | $error = $this->language->get('error_language');
|
| 50: | }
|
| 51: |
|
| 52: |
|
| 53: | $this->load->model('localisation/currency');
|
| 54: |
|
| 55: | $currency_info = $this->model_localisation_currency->getCurrency($result['currency_id']);
|
| 56: |
|
| 57: | if (!$currency_info) {
|
| 58: | $error = $this->language->get('error_currency');
|
| 59: | }
|
| 60: |
|
| 61: |
|
| 62: | if (!$error) {
|
| 63: | $this->load->model('setting/store');
|
| 64: |
|
| 65: | $store = $this->model_setting_store->createStoreInstance($result['store_id'], $language_info['code']);
|
| 66: |
|
| 67: |
|
| 68: | $this->load->model('account/customer');
|
| 69: |
|
| 70: | $customer_info = $this->model_account_customer->getCustomer($result['customer_id']);
|
| 71: |
|
| 72: | if ($customer_info && $this->customer->login($customer_info['email'], '', true)) {
|
| 73: |
|
| 74: | $store->session->data['customer'] = $customer_info;
|
| 75: | } else {
|
| 76: | $error = $this->language->get('error_customer');
|
| 77: | }
|
| 78: | }
|
| 79: |
|
| 80: |
|
| 81: | if (!$error) {
|
| 82: | $this->load->model('catalog/product');
|
| 83: |
|
| 84: | $product_info = $this->model_catalog_product->getProduct($result['product_id']);
|
| 85: |
|
| 86: | if ($product_info) {
|
| 87: | $price = $result['price'];
|
| 88: |
|
| 89: | if ($result['trial_status'] && (!$result['trial_duration'] || $result['trial_remaining'])) {
|
| 90: | $price = $result['trial_price'];
|
| 91: | }
|
| 92: |
|
| 93: | $store->cart->add($result['product_id'], $result['quantity'], $result['option'], $result['subscription_plan_id'], true, $price);
|
| 94: | } else {
|
| 95: | $error = $this->language->get('error_product');
|
| 96: | }
|
| 97: | }
|
| 98: |
|
| 99: |
|
| 100: | if (!$error && $store->cart->hasShipping()) {
|
| 101: | $this->load->model('account/address');
|
| 102: |
|
| 103: | $shipping_address_info = $this->model_account_address->getAddress($result['customer_id'], $result['shipping_address_id']);
|
| 104: |
|
| 105: | if ($shipping_address_info) {
|
| 106: | $store->session->data['shipping_address'] = $shipping_address_info;
|
| 107: | } else {
|
| 108: | $error = $this->language->get('error_shipping_address');
|
| 109: | }
|
| 110: |
|
| 111: |
|
| 112: | if (!$error) {
|
| 113: | $this->load->model('checkout/shipping_method');
|
| 114: |
|
| 115: | $shipping_methods = $this->model_checkout_shipping_method->getMethods($shipping_address_info);
|
| 116: |
|
| 117: |
|
| 118: | if (isset($order_info['shipping_method']['code']) && $shipping_methods) {
|
| 119: | $shipping = explode('.', $order_info['shipping_method']['code']);
|
| 120: |
|
| 121: | if (isset($shipping[0]) && isset($shipping[1]) && isset($shipping_methods[$shipping[0]]['quote'][$shipping[1]])) {
|
| 122: | $store->session->data['shipping_method'] = $shipping_methods[$shipping[0]]['quote'][$shipping[1]];
|
| 123: | } else {
|
| 124: | $error = $this->language->get('error_shipping_method');
|
| 125: | }
|
| 126: | } else {
|
| 127: | $error = $this->language->get('error_shipping_method');
|
| 128: | }
|
| 129: | }
|
| 130: | }
|
| 131: |
|
| 132: |
|
| 133: | if (!$error) {
|
| 134: | if ($this->config->get('config_checkout_payment_address')) {
|
| 135: | $this->load->model('account/address');
|
| 136: |
|
| 137: | $payment_address_info = $this->model_account_address->getAddress($order_info['customer_id'], $result['payment_address_id']);
|
| 138: |
|
| 139: | if ($payment_address_info) {
|
| 140: | $store->session->data['payment_address'] = $payment_address_info;
|
| 141: | } else {
|
| 142: | $error = $this->language->get('error_payment_address');
|
| 143: | }
|
| 144: | } else {
|
| 145: | $payment_address_info = [];
|
| 146: | }
|
| 147: | }
|
| 148: |
|
| 149: |
|
| 150: | if (!$error) {
|
| 151: | $this->load->model('checkout/payment_method');
|
| 152: |
|
| 153: | $payment_methods = $this->model_checkout_payment_method->getMethods($store->session->data['payment_address']);
|
| 154: |
|
| 155: |
|
| 156: | if (isset($order_info['payment_method']['code']) && $payment_methods) {
|
| 157: | $payment = explode('.', $order_info['payment_method']['code']);
|
| 158: |
|
| 159: | if (isset($payment[0]) && isset($payment[1]) && isset($payment_methods[$payment[0]]['option'][$payment[1]])) {
|
| 160: | $store->session->data['payment_method'] = $payment_methods[$payment[0]]['option'][$payment[1]];
|
| 161: | } else {
|
| 162: | $error = $this->language->get('error_payment_method');
|
| 163: | }
|
| 164: | } else {
|
| 165: | $error = $this->language->get('error_payment_method');
|
| 166: | }
|
| 167: | }
|
| 168: |
|
| 169: | if (!$error) {
|
| 170: |
|
| 171: | $order_data = [];
|
| 172: |
|
| 173: | $order_data['subscription_id'] = $order_info['subscription_id'];
|
| 174: |
|
| 175: |
|
| 176: | $order_data['invoice_prefix'] = $order_info['invoice_prefix'];
|
| 177: | $order_data['store_id'] = $order_info['store_id'];
|
| 178: | $order_data['store_name'] = $order_info['store_name'];
|
| 179: | $order_data['store_url'] = $order_info['store_url'];
|
| 180: |
|
| 181: |
|
| 182: | $order_data['customer_id'] = $customer_info['customer_id'];
|
| 183: | $order_data['customer_group_id'] = $customer_info['customer_group_id'];
|
| 184: | $order_data['firstname'] = $customer_info['firstname'];
|
| 185: | $order_data['lastname'] = $customer_info['lastname'];
|
| 186: | $order_data['email'] = $customer_info['email'];
|
| 187: | $order_data['telephone'] = $customer_info['telephone'];
|
| 188: | $order_data['custom_field'] = $customer_info['custom_field'];
|
| 189: |
|
| 190: |
|
| 191: | if ($payment_address_info) {
|
| 192: | $order_data['payment_address_id'] = $payment_address_info['address_id'];
|
| 193: | $order_data['payment_firstname'] = $payment_address_info['firstname'];
|
| 194: | $order_data['payment_lastname'] = $payment_address_info['lastname'];
|
| 195: | $order_data['payment_company'] = $payment_address_info['company'];
|
| 196: | $order_data['payment_address_1'] = $payment_address_info['address_1'];
|
| 197: | $order_data['payment_address_2'] = $payment_address_info['address_2'];
|
| 198: | $order_data['payment_city'] = $payment_address_info['city'];
|
| 199: | $order_data['payment_postcode'] = $payment_address_info['postcode'];
|
| 200: | $order_data['payment_zone'] = $payment_address_info['zone'];
|
| 201: | $order_data['payment_zone_id'] = $payment_address_info['zone_id'];
|
| 202: | $order_data['payment_country'] = $payment_address_info['country'];
|
| 203: | $order_data['payment_country_id'] = $payment_address_info['country_id'];
|
| 204: | $order_data['payment_address_format'] = $payment_address_info['address_format'];
|
| 205: | $order_data['payment_custom_field'] = $payment_address_info['custom_field'];
|
| 206: | } else {
|
| 207: | $order_data['payment_address_id'] = 0;
|
| 208: | $order_data['payment_firstname'] = '';
|
| 209: | $order_data['payment_lastname'] = '';
|
| 210: | $order_data['payment_company'] = '';
|
| 211: | $order_data['payment_address_1'] = '';
|
| 212: | $order_data['payment_address_2'] = '';
|
| 213: | $order_data['payment_city'] = '';
|
| 214: | $order_data['payment_postcode'] = '';
|
| 215: | $order_data['payment_zone'] = '';
|
| 216: | $order_data['payment_zone_id'] = 0;
|
| 217: | $order_data['payment_country'] = '';
|
| 218: | $order_data['payment_country_id'] = 0;
|
| 219: | $order_data['payment_address_format'] = '';
|
| 220: | $order_data['payment_custom_field'] = [];
|
| 221: | }
|
| 222: |
|
| 223: | $order_data['payment_method'] = $store->session->data['payment_method'];
|
| 224: |
|
| 225: |
|
| 226: | if ($store->cart->hasShipping()) {
|
| 227: | $order_data['shipping_address_id'] = $shipping_address_info['address_id'];
|
| 228: | $order_data['shipping_firstname'] = $shipping_address_info['firstname'];
|
| 229: | $order_data['shipping_lastname'] = $shipping_address_info['lastname'];
|
| 230: | $order_data['shipping_company'] = $shipping_address_info['company'];
|
| 231: | $order_data['shipping_address_1'] = $shipping_address_info['address_1'];
|
| 232: | $order_data['shipping_address_2'] = $shipping_address_info['address_2'];
|
| 233: | $order_data['shipping_city'] = $shipping_address_info['city'];
|
| 234: | $order_data['shipping_postcode'] = $shipping_address_info['postcode'];
|
| 235: | $order_data['shipping_zone'] = $shipping_address_info['zone'];
|
| 236: | $order_data['shipping_zone_id'] = $shipping_address_info['zone_id'];
|
| 237: | $order_data['shipping_country'] = $shipping_address_info['country'];
|
| 238: | $order_data['shipping_country_id'] = $shipping_address_info['country_id'];
|
| 239: | $order_data['shipping_address_format'] = $shipping_address_info['address_format'];
|
| 240: | $order_data['shipping_custom_field'] = $shipping_address_info['custom_field'];
|
| 241: |
|
| 242: | $order_data['shipping_method'] = $store->session->data['shipping_method'];
|
| 243: | } else {
|
| 244: | $order_data['shipping_address_id'] = 0;
|
| 245: | $order_data['shipping_firstname'] = '';
|
| 246: | $order_data['shipping_lastname'] = '';
|
| 247: | $order_data['shipping_company'] = '';
|
| 248: | $order_data['shipping_address_1'] = '';
|
| 249: | $order_data['shipping_address_2'] = '';
|
| 250: | $order_data['shipping_city'] = '';
|
| 251: | $order_data['shipping_postcode'] = '';
|
| 252: | $order_data['shipping_zone'] = '';
|
| 253: | $order_data['shipping_zone_id'] = 0;
|
| 254: | $order_data['shipping_country'] = '';
|
| 255: | $order_data['shipping_country_id'] = 0;
|
| 256: | $order_data['shipping_address_format'] = '';
|
| 257: | $order_data['shipping_custom_field'] = [];
|
| 258: |
|
| 259: | $order_data['shipping_method'] = [];
|
| 260: | }
|
| 261: |
|
| 262: |
|
| 263: | $order_data['products'] = [];
|
| 264: |
|
| 265: | $products = $store->model_checkout_cart->getProducts();
|
| 266: |
|
| 267: | foreach ($products as $product) {
|
| 268: | $order_data['products'][] = [
|
| 269: | 'product_id' => $product['product_id'],
|
| 270: | 'master_id' => $product['master_id'],
|
| 271: | 'name' => $product['name'],
|
| 272: | 'model' => $product['model'],
|
| 273: | 'option' => $product['option'],
|
| 274: | 'subscription' => [],
|
| 275: | 'download' => $product['download'],
|
| 276: | 'quantity' => $product['quantity'],
|
| 277: | 'subtract' => $product['subtract'],
|
| 278: | 'price' => $product['price'],
|
| 279: | 'total' => $product['total'],
|
| 280: | 'tax' => $this->tax->getTax($price, $product['tax_class_id']),
|
| 281: | 'reward' => $product['reward']
|
| 282: | ];
|
| 283: | }
|
| 284: |
|
| 285: |
|
| 286: | $order_data['vouchers'] = [];
|
| 287: |
|
| 288: |
|
| 289: | $totals = [];
|
| 290: | $taxes = $store->cart->getTaxes();
|
| 291: | $total = 0;
|
| 292: |
|
| 293: | $store->load->model('checkout/cart');
|
| 294: |
|
| 295: | ($store->model_checkout_cart->getTotals)($totals, $taxes, $total);
|
| 296: |
|
| 297: | $total_data = [
|
| 298: | 'totals' => $totals,
|
| 299: | 'taxes' => $taxes,
|
| 300: | 'total' => $total
|
| 301: | ];
|
| 302: |
|
| 303: | $order_data = array_merge($order_data, $total_data);
|
| 304: |
|
| 305: | $order_data['affiliate_id'] = 0;
|
| 306: | $order_data['commission'] = 0;
|
| 307: | $order_data['marketing_id'] = 0;
|
| 308: | $order_data['tracking'] = '';
|
| 309: |
|
| 310: | if (isset($this->session->data['tracking'])) {
|
| 311: | $subtotal = $this->cart->getSubTotal();
|
| 312: |
|
| 313: |
|
| 314: | if ($this->config->get('config_affiliate_status')) {
|
| 315: | $this->load->model('account/affiliate');
|
| 316: |
|
| 317: | $affiliate_info = $this->model_account_affiliate->getAffiliateByTracking($this->session->data['tracking']);
|
| 318: |
|
| 319: | if ($affiliate_info) {
|
| 320: | $order_data['affiliate_id'] = $affiliate_info['customer_id'];
|
| 321: | $order_data['commission'] = ($subtotal / 100) * $affiliate_info['commission'];
|
| 322: | $order_data['tracking'] = $this->session->data['tracking'];
|
| 323: | }
|
| 324: | }
|
| 325: |
|
| 326: | $this->load->model('marketing/marketing');
|
| 327: |
|
| 328: | $marketing_info = $this->model_marketing_marketing->getMarketingByCode($this->session->data['tracking']);
|
| 329: |
|
| 330: | if ($marketing_info) {
|
| 331: | $order_data['marketing_id'] = $marketing_info['marketing_id'];
|
| 332: | }
|
| 333: | }
|
| 334: |
|
| 335: |
|
| 336: | $order_data['language_id'] = $language_info['language_id'];
|
| 337: | $order_data['language_code'] = $language_info['code'];
|
| 338: |
|
| 339: |
|
| 340: | $order_data['currency_id'] = $currency_info['currency_id'];
|
| 341: | $order_data['currency_code'] = $currency_info['code'];
|
| 342: | $order_data['currency_value'] = $currency_info['value'];
|
| 343: |
|
| 344: | $order_data['ip'] = $result['ip'];
|
| 345: | $order_data['forwarded_ip'] = $result['forwarded_ip'];
|
| 346: | $order_data['user_agent'] = $result['user_agent'];
|
| 347: | $order_data['accept_language'] = $result['accept_language'];
|
| 348: |
|
| 349: | $this->load->model('checkout/order');
|
| 350: |
|
| 351: | $store->session->data['order_id'] = $this->model_checkout_order->addOrder($order_data);
|
| 352: |
|
| 353: |
|
| 354: | $this->load->model('setting/extension');
|
| 355: |
|
| 356: | $extension_info = $this->model_setting_extension->getExtensionByCode('payment', $payment[0]);
|
| 357: |
|
| 358: |
|
| 359: | $this->load->model('extension/' . $extension_info['extension'] . '/payment/' . $extension_info['code']);
|
| 360: |
|
| 361: | $callable = [$this->{'model_extension_' . $extension_info['extension'] . '_payment_' . $extension_info['code']}, 'charge'];
|
| 362: |
|
| 363: | if (is_callable($callable)) {
|
| 364: |
|
| 365: | $response_info = $this->{'model_extension_' . $order_data['payment_method']['extension'] . '_payment_' . $order_data['payment_method']['code']}->charge($this->customer->getId(), $this->session->data['order_id'], $order_info['total'], $order_data['payment_method']['code']);
|
| 366: |
|
| 367: | if (isset($response_info['order_status_id'])) {
|
| 368: | $order_status_id = $response_info['order_status_id'];
|
| 369: | } else {
|
| 370: | $order_status_id = 0;
|
| 371: | }
|
| 372: |
|
| 373: | if ($response_info['message']) {
|
| 374: | $message = $response_info['message'];
|
| 375: | } else {
|
| 376: | $message = '';
|
| 377: | }
|
| 378: |
|
| 379: | $this->model_checkout_order->addHistory($store->session->data['order_id'], $order_status_id, $message, false);
|
| 380: | $this->model_checkout_order->addHistory($store->session->data['order_id'], $order_status_id);
|
| 381: |
|
| 382: |
|
| 383: | if (!in_array($order_status_id, (array)$this->config->get('config_processing_status') + (array)$this->config->get('config_complete_status'))) {
|
| 384: | $remaining = 0;
|
| 385: | $date_next = '';
|
| 386: |
|
| 387: | if ($result['trial_status'] && $result['trial_remaining'] > 1) {
|
| 388: | $remaining = $result['trial_remaining'] - 1;
|
| 389: | $date_next = date('Y-m-d', strtotime('+' . $result['trial_cycle'] . ' ' . $result['trial_frequency']));
|
| 390: |
|
| 391: | $this->model_account_subscription->editTrialRemaining($result['subscription_id'], $remaining);
|
| 392: | } elseif ($result['duration'] && $result['remaining']) {
|
| 393: | $remaining = $result['remaining'] - 1;
|
| 394: | $date_next = date('Y-m-d', strtotime('+' . $result['cycle'] . ' ' . $result['frequency']));
|
| 395: |
|
| 396: |
|
| 397: | $this->model_account_subscription->editRemaining($result['subscription_id'], $remaining);
|
| 398: | } elseif (!$result['duration']) {
|
| 399: |
|
| 400: | $date_next = date('Y-m-d', strtotime('+' . $result['cycle'] . ' ' . $result['frequency']));
|
| 401: | }
|
| 402: |
|
| 403: | if ($date_next) {
|
| 404: | $this->load->model('checkout/subscription');
|
| 405: | $this->model_checkout_subscription->editDateNext($result['subscription_id'], $date_next);
|
| 406: | }
|
| 407: |
|
| 408: | $this->model_checkout_subscription->addHistory($result['subscription_id'], $this->config->get('config_subscription_active_status_id'), $this->language->get('text_success'), true);
|
| 409: | } else {
|
| 410: |
|
| 411: | $this->model_checkout_subscription->addHistory($result['subscription_id'], $this->config->get('config_subscription_failed_status_id'), $message, true);
|
| 412: | }
|
| 413: | } else {
|
| 414: |
|
| 415: | $this->model_checkout_subscription->addHistory($result['subscription_id'], $this->config->get('config_subscription_failed_status_id'), $this->language->get('error_payment_method'), true);
|
| 416: | }
|
| 417: | } else {
|
| 418: |
|
| 419: | $this->model_checkout_subscription->addHistory($result['subscription_id'], $this->config->get('config_subscription_failed_status_id'), $error, true);
|
| 420: | }
|
| 421: | }
|
| 422: | }
|
| 423: | }
|
| 424: | }
|
| 425: | |