Guest User

controller

a guest
Sep 30th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 57.31 KB | None | 0 0
  1. <?php
  2. class ControllerExtensionPaymentAuthorizeNetRecurring extends Controller {
  3.  
  4.   public function index() {
  5.     $this->language->load('extension/payment/authorizenet_recurring');
  6.  
  7.     $data['button_confirm']         = $this->language->get('button_confirm');
  8.  
  9.     $data['entry_cc_cvv2']        = $this->language->get('entry_cc_cvv2');
  10.     $data['entry_cc_expire_date'] = $this->language->get('entry_cc_expire_date');
  11.     $data['entry_cc_number']      = $this->language->get('entry_cc_number');
  12.     $data['entry_cc_owner']       = $this->language->get('entry_cc_owner');
  13.  
  14.     $data['text_credit_card']   = $this->language->get('text_credit_card');
  15.     $data['text_wait']          = $this->language->get('text_wait');
  16.  
  17.     $data['send'] = $this->url->link('extension/payment/authorizenet_recurring/send', '', true);
  18.  
  19.     $data['months'] = array();
  20.  
  21.     for ($i = 1; $i <= 12; $i++) {
  22.       $data['months'][] = array(
  23.         'text'  => strftime('%B', mktime(0, 0, 0, $i, 1, 2000)),
  24.         'value' => sprintf('%02d', $i)
  25.       );
  26.     }
  27.  
  28.     $today = getdate();
  29.  
  30.     $data['year_expire'] = array();
  31.  
  32.     for ($i = $today['year']; $i < $today['year'] + 11; $i++) {
  33.       $data['year_expire'][] = array(
  34.         'text'  => strftime('%Y', mktime(0, 0, 0, 1, 1, $i)),
  35.         'value' => strftime('%Y', mktime(0, 0, 0, 1, 1, $i))
  36.       );
  37.     }
  38.  
  39.     return $this->load->view('extension/payment/authorizenet_recurring', $data);
  40.  
  41.   }
  42.  
  43.   public function send() {
  44.     $json = array();
  45.  
  46.     $this->load->model('checkout/order');
  47.  
  48.     $order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
  49.  
  50.     require_once(DIR_SYSTEM . 'library/authorizenetcim.php');
  51.  
  52.     $login = $this->config->get('authorizenet_recurring_login');
  53.     $auth_key = $this->config->get('authorizenet_recurring_key');
  54.     $live_server = $this->config->get('authorizenet_recurring_server');
  55.     $auth_mode = $this->config->get('authorizenet_recurring_mode');
  56.     $debug_mode = $this->config->get('authorizenet_recurring_debug');
  57.  
  58.     $authorizenetcim = new AuthorizeNetCim($this->registry, $login, $auth_key, ($live_server == 'live' ? false : true), ($auth_mode == 'test' ? true : false), $debug_mode);
  59.  
  60.     $authorizenetcim->customer_ip = $order_info['ip'];
  61.     $authorizenetcim->firstname   = html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8');
  62.     $authorizenetcim->lastname    = html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
  63.     $authorizenetcim->email       = $order_info['email'];
  64.     $authorizenetcim->phone       = $order_info['telephone'];
  65.     $authorizenetcim->company     = html_entity_decode($order_info['payment_company'], ENT_QUOTES, 'UTF-8');
  66.     $authorizenetcim->address     = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8');
  67.     $authorizenetcim->city        = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8');
  68.     $authorizenetcim->state       = html_entity_decode($order_info['payment_zone'], ENT_QUOTES, 'UTF-8');
  69.     $authorizenetcim->zip         = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8');
  70.     $authorizenetcim->country     = html_entity_decode($order_info['payment_country'], ENT_QUOTES, 'UTF-8');
  71.  
  72.     if ($order_info['shipping_method']) {
  73.       $authorizenetcim->shipping_firstname  = html_entity_decode($order_info['shipping_firstname'], ENT_QUOTES, 'UTF-8');
  74.       $authorizenetcim->shipping_lastname   = html_entity_decode($order_info['shipping_lastname'], ENT_QUOTES, 'UTF-8');
  75.       $authorizenetcim->shipping_company    = html_entity_decode($order_info['shipping_company'], ENT_QUOTES, 'UTF-8');
  76.       $authorizenetcim->shipping_address    = html_entity_decode($order_info['shipping_address_1'], ENT_QUOTES, 'UTF-8') . ' ' . html_entity_decode($order_info['shipping_address_2'], ENT_QUOTES, 'UTF-8');
  77.       $authorizenetcim->shipping_city       = html_entity_decode($order_info['shipping_city'], ENT_QUOTES, 'UTF-8');
  78.       $authorizenetcim->shipping_state      = html_entity_decode($order_info['shipping_zone'], ENT_QUOTES, 'UTF-8');
  79.       $authorizenetcim->shipping_zip        = html_entity_decode($order_info['shipping_postcode'], ENT_QUOTES, 'UTF-8');
  80.       $authorizenetcim->shipping_country    = html_entity_decode($order_info['shipping_country'], ENT_QUOTES, 'UTF-8');
  81.     } else {
  82.       $authorizenetcim->shipping_firstname  = html_entity_decode($order_info['payment_firstname'], ENT_QUOTES, 'UTF-8');
  83.       $authorizenetcim->shipping_lastname   = html_entity_decode($order_info['payment_lastname'], ENT_QUOTES, 'UTF-8');
  84.       $authorizenetcim->shipping_company    = html_entity_decode($order_info['payment_company'], ENT_QUOTES, 'UTF-8');
  85.       $authorizenetcim->shipping_address    = html_entity_decode($order_info['payment_address_1'], ENT_QUOTES, 'UTF-8') . ' ' . html_entity_decode($order_info['payment_address_2'], ENT_QUOTES, 'UTF-8');
  86.       $authorizenetcim->shipping_city       = html_entity_decode($order_info['payment_city'], ENT_QUOTES, 'UTF-8');
  87.       $authorizenetcim->shipping_state      = html_entity_decode($order_info['payment_zone'], ENT_QUOTES, 'UTF-8');
  88.       $authorizenetcim->shipping_zip        = html_entity_decode($order_info['payment_postcode'], ENT_QUOTES, 'UTF-8');
  89.       $authorizenetcim->shipping_country    = html_entity_decode($order_info['payment_country'], ENT_QUOTES, 'UTF-8');
  90.     }
  91.  
  92.     $success = false;
  93.  
  94.     if (!empty($this->session->data['authnet_customer_recurring_id'])) {
  95.       $authorizenetcim->customer_recurring_id = $this->session->data['authnet_customer_recurring_id'];
  96.  
  97.       $authorizenetcim->updateCustomerProfile($order_info['customer_id'], $order_info['firstname'] . ' ' . $order_info['lastname'] . ' ' . date('Y-m-d H:i:s'));
  98.     } else {
  99.       $authorizenetcim_result = $authorizenetcim->createCustomerProfile($order_info['customer_id'], $order_info['firstname'] . ' ' . $order_info['lastname'] . ' ' . date('Y-m-d H:i:s'));
  100.  
  101.       if ($authorizenetcim_result) {
  102.         if ($authorizenetcim_result->messages->resultCode == 'Ok') {
  103.           $this->session->data['authnet_customer_recurring_id'] = (int)$authorizenetcim_result->customerProfileId;
  104.         } else if ($authorizenetcim_result->messages->message->code == 'E00039') {
  105.           $authorizenetcim->deleteCustomerProfile((int)preg_replace('/\D/', '', $authorizenetcim_result->messages->message->text));
  106.  
  107.           $authorizenetcim_result = $authorizenetcim->createCustomerProfile($order_info['customer_id'], $order_info['firstname'] . ' ' . $order_info['lastname'] . ' ' . date('Y-m-d H:i:s'));
  108.  
  109.           if ($authorizenetcim_result) {
  110.             $this->session->data['authnet_customer_recurring_id'] = (int)$authorizenetcim_result->customerProfileId;
  111.           } else {
  112.             $json['error'] = 'There was an error processing your request. Please try again, if the problem persists contact us.';
  113.           }
  114.         } else {
  115.           $json['error'] = (string)$authorizenetcim_result->messages->message->text;
  116.         }
  117.       } else {
  118.         $json['error'] = 'There was an error processing your request. Please try again, if the problem persists contact us.';
  119.       }
  120.     }
  121.  
  122.     if (!empty($this->session->data['authnet_customer_recurring_id']) && !empty($this->request->post['cc_number']) && !empty($this->request->post['cc_expire_date_month']) && !empty($this->request->post['cc_expire_date_year'])) {
  123.       if (!empty($this->session->data['authnet_customer_payment_recurring_id'])) {
  124.         $authorizenetcim_result = $authorizenetcim->updateCustomerPaymentProfile($this->session->data['authnet_customer_payment_recurring_id'], str_replace(' ', '', $this->request->post['cc_number']), $this->request->post['cc_expire_date_month'], $this->request->post['cc_expire_date_year']);
  125.  
  126.         if ($authorizenetcim_result->messages->resultCode == 'Ok') {
  127.           $this->session->data['last_four'] = substr(str_replace(' ', '', $this->request->post['cc_number']), -4);
  128.         } else {
  129.           $json['error'] = (string)$authorizenetcim_result->messages->message->text;
  130.         }
  131.       } else {
  132.         $authorizenetcim_result = $authorizenetcim->createCustomerPaymentProfile(str_replace(' ', '', $this->request->post['cc_number']), $this->request->post['cc_expire_date_month'], $this->request->post['cc_expire_date_year']);
  133.  
  134.         if ($authorizenetcim_result) {
  135.           if ($authorizenetcim_result->messages->resultCode == 'Ok') {
  136.             $this->session->data['authnet_customer_payment_recurring_id'] = (int)$authorizenetcim_result->customerPaymentProfileId;
  137.  
  138.             $this->session->data['last_four'] = substr(str_replace(' ', '', $this->request->post['cc_number']), -4);
  139.           } else {
  140.             $json['error'] = (string)$authorizenetcim_result->messages->message->text;
  141.           }
  142.         } else {
  143.           $json['error'] = 'There was an error processing your request. Please try again, if the problem persists contact us.';
  144.         }
  145.       }
  146.     }
  147.  
  148.     if (!empty($this->session->data['authnet_customer_payment_recurring_id']) && empty($this->session->data['last_four'])) {
  149.       $customer_payment_recurring = $authorizenetcim->getCustomerPaymentProfile($this->session->data['authnet_customer_payment_recurring_id']);
  150.  
  151.       if (isset($customer_payment_recurring->paymentProfile) && isset($customer_payment_recurring->paymentProfile->payment) && isset($customer_payment_recurring->paymentProfile->payment->creditCard)) {
  152.         $this->session->data['last_four'] = substr($customer_payment_recurring->paymentProfile->payment->creditCard->cardNumber, -4);
  153.       }
  154.     }
  155.  
  156.     if ($order_info['shipping_method']) {
  157.       if (!empty($this->session->data['authnet_customer_recurring_id']) && !empty($this->session->data['authnet_customer_payment_recurring_id'])) {
  158.         if (!empty($this->session->data['authnet_customer_shipping_address_id'])) {
  159.           $authorizenetcim->updateCustomerShippingAddress($this->session->data['authnet_customer_shipping_address_id']);
  160.         } else {
  161.           $authorizenetcim_result = $authorizenetcim->createCustomerShippingAddress();
  162.  
  163.           if ($authorizenetcim_result) {
  164.             if ($authorizenetcim_result->messages->resultCode == 'Ok') {
  165.               $this->session->data['authnet_customer_shipping_address_id'] = (int)$authorizenetcim_result->customerAddressId;
  166.             } else {
  167.               $json['error'] = (string)$authorizenetcim_result->messages->message->text;
  168.             }
  169.           } else {
  170.             $json['error'] = 'There was an error processing your request. Please try again, if the problem persists contact us.';
  171.           }
  172.         }
  173.       }
  174.     } else {
  175.       $this->session->data['authnet_customer_shipping_address_id'] = '';
  176.     }
  177.  
  178.     if (!empty($this->session->data['authnet_customer_recurring_id']) && !empty($this->session->data['authnet_customer_payment_recurring_id']) && isset($this->session->data['authnet_customer_shipping_address_id'])) {
  179.       $authorizenetcim_result = $authorizenetcim->createCustomerProfileTransaction($this->session->data['order_id'], $this->config->get('authorizenet_recurring_method'), $this->session->data['authnet_customer_payment_recurring_id'], $this->session->data['authnet_customer_shipping_address_id'], $this->currency->format($order_info['total'], $this->config->get('config_currency'), '', false), (isset($this->request->post['cc_cvv2']) ? $this->request->post['cc_cvv2'] : ''), 1);
  180.  
  181.       if ($authorizenetcim_result['success']) {
  182.         $this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $this->config->get('config_order_status_id'));
  183.  
  184.         $message = '';
  185.  
  186.         if (isset($authorizenetcim_result['data'][4])) {
  187.           $message .= 'Authorization Code: ' . $authorizenetcim_result['data'][4] . "\n";
  188.         }
  189.  
  190.         if (isset($authorizenetcim_result['data'][5])) {
  191.           $message .= 'AVS Response: ' . $authorizenetcim_result['data'][5] . "\n";
  192.         }
  193.  
  194.         if (isset($authorizenetcim_result['data'][6])) {
  195.           $message .= 'Transaction ID: ' . $authorizenetcim_result['data'][6] . "\n";
  196.         }
  197.  
  198.         if (isset($authorizenetcim_result['data'][38])) {
  199.           $message .= 'Card Code Response: ' . $authorizenetcim_result['data'][38] . "\n";
  200.         }
  201.  
  202.         if (isset($authorizenetcim_result['data'][39])) {
  203.           $message .= 'Cardholder Authentication Verification Response: ' . $authorizenetcim_result['data'][39] . "\n";
  204.         }
  205.  
  206.         if (!$this->config->get('authorizenet_recurring_hash') || (strtoupper($authorizenetcim_result['data'][37]) == strtoupper(md5($this->config->get('authorizenet_recurring_hash') . $this->config->get('authorizenet_recurring_login') . $authorizenetcim_result['data'][6] . $this->currency->format($order_info['total'], $this->config->get('config_currency'), '', false))))) {
  207.           sleep(1);
  208.           $this->model_checkout_order->addOrderHistory($this->session->data['order_id'], $this->config->get('authorizenet_recurring_order_status_id'), $message, false);
  209.  
  210.           if (file_exists(DIR_APPLICATION . 'model/checkout/order_transaction.php')) {
  211.             $this->load->model('localisation/currency');
  212.  
  213.             $currency_info = $this->model_localisation_currency->getCurrencyByCode($this->config->get('config_currency'));
  214.  
  215.             $this->load->model('checkout/order_transaction');
  216.  
  217.             $this->model_checkout_order_transaction->addOrderTransaction($this->session->data['order_id'], array(
  218.               'transaction_id'      => (isset($authorizenetcim_result['data'][6]) ? $authorizenetcim_result['data'][6] : ''),
  219.               'authorization_code'  => (isset($authorizenetcim_result['data'][4]) ? $authorizenetcim_result['data'][4] : ''),
  220.               'payment_method'      => 'Authorize.Net (Recurring)',
  221.               'payment_code'        => 'authorizenet_recurring',
  222.               'amount'              => $this->currency->format($order_info['total'], $this->config->get('config_currency'), '', false),
  223.               'currency_id'         => $currency_info['currency_id'],
  224.               'currency_code'       => $currency_info['code'],
  225.               'currency_value'      => $currency_info['value'],
  226.               'additional_details'  => array(
  227.                 'server'    => $this->config->get('authorizenet_recurring_server'),
  228.                 'login'     => $this->config->get('authorizenet_recurring_login'),
  229.                 'key'       => $this->config->get('authorizenet_recurring_key'),
  230.                 'last_four' => (isset($this->session->data['last_four']) ? $this->session->data['last_four'] : '')
  231.               ),
  232.               'status'  => (($this->config->get('authorizenet_recurring_method') == 'capture') ? 1 : 0)
  233.             ));
  234.           }
  235.  
  236.           $recurring_products = $this->cart->getRecurringProducts();
  237.  
  238.           foreach ($recurring_products as $recurring_product) {
  239.             if (is_array($recurring_product['recurring'])) {
  240.               $recurring_info = $recurring_product['recurring'];
  241.             } else {
  242.               $recurring_info = array(
  243.                 // Start Enhanced Recurring
  244.                 'profile_full_tax_initial_order'    => $recurring_product['profile_full_tax_initial_order'],
  245.                 'recurring_charge_shipping'         => $recurring_product['recurring_charge_shipping'],
  246.                 'recurring_trial_charge_shipping'   => $recurring_product['recurring_trial_charge_shipping'],
  247.                 // End Enhanced Recurring
  248.                 'recurring_id'      => $recurring_product['recurring_id'],
  249.                 'name'            => $recurring_product['recurring_name'],
  250.                 'frequency'       => $recurring_product['recurring_frequency'],
  251.                 'price'           => $recurring_product['recurring_price'],
  252.                 'cycle'           => $recurring_product['recurring_cycle'],
  253.                 'duration'        => $recurring_product['recurring_duration'],
  254.                 'trial'           => $recurring_product['recurring_trial'],
  255.                 'trial_frequency' => $recurring_product['recurring_trial_frequency'],
  256.                 'trial_price'     => $recurring_product['recurring_trial_price'],
  257.                 'trial_cycle'     => $recurring_product['recurring_trial_cycle'],
  258.                 'trial_duration'  => $recurring_product['recurring_trial_duration']
  259.               );
  260.             }
  261.  
  262.             $price        = $this->currency->format($recurring_info['price'], $this->config->get('config_currency'), '', false);
  263.             $trial_price  = $this->currency->format($recurring_info['trial_price'], $this->config->get('config_currency'), '', false);
  264.  
  265.             if ($recurring_info['trial'] && $recurring_info['trial_duration']) {
  266.               if ($recurring_info['trial_frequency'] == 'semi_month') {
  267.                 $days_per_cycle = date('t', strtotime('first day of next month')) / $recurring_info['trial_cycle'];
  268.  
  269.                 $date_recurring = date('Y-m-d', strtotime('+' . $days_per_cycle . ' days', strtotime('first day of next month')));
  270.               } else {
  271.                 $date_recurring = date('Y-m-d', strtotime('+' . $recurring_info['trial_cycle'] . ' ' . $recurring_info['trial_frequency']));
  272.               }
  273.             } else {
  274.               if ($recurring_info['frequency'] == 'semi_month') {
  275.                 $days_per_cycle = date('t', strtotime('first day of next month')) / $recurring_info['cycle'];
  276.  
  277.                 $date_recurring = date('Y-m-d', strtotime('+' . $days_per_cycle . ' days', strtotime('first day of next month')));
  278.               } else {
  279.                 $date_recurring = date('Y-m-d', strtotime('+' . $recurring_info['cycle'] . ' ' . $recurring_info['frequency']));
  280.               }
  281.             }
  282.  
  283.             $this->load->model('checkout/recurring');
  284.  
  285.             $item = array(
  286.               // Start Enhanced Recurring
  287.               'profile_full_tax_initial_order'      => $recurring_info['profile_full_tax_initial_order'],
  288.               'recurring_charge_shipping'           => $recurring_info['recurring_charge_shipping'],
  289.               'recurring_trial_charge_shipping'     => $recurring_info['recurring_trial_charge_shipping'],
  290.               // End Enhanced Recurring
  291.               'product_id'                          => $recurring_product['product_id'],
  292.               'name'                                => $recurring_product['name'],
  293.               'quantity'                            => $recurring_product['quantity'],
  294.               'recurring'                           => $recurring_info
  295.             );
  296.  
  297.             $order_recurring_id = $this->model_checkout_recurring->create($item, $this->session->data['order_id'], $recurring_info['name']);
  298.  
  299.             $this->load->model('extension/payment/authorizenet_recurring');
  300.  
  301.             $authorizenet_recurring_id = $this->model_extension_payment_authorizenet_recurring->addRecurringSubscription(array(
  302.               'order_id'                            => $this->session->data['order_id'],
  303.               'order_recurring_id'                  => $order_recurring_id,
  304.               'server'                              => $this->config->get('authorizenet_recurring_server'),
  305.               'login'                               => $this->config->get('authorizenet_recurring_login'),
  306.               'key'                                 => $this->config->get('authorizenet_recurring_key'),
  307.               'customer_recurring_id'               => $this->session->data['authnet_customer_recurring_id'],
  308.               'customer_payment_recurring_id'       => $this->session->data['authnet_customer_payment_recurring_id'],
  309.               'customer_shipping_address_id'        => $this->session->data['authnet_customer_shipping_address_id'],
  310.               'duration_remaining'                  => ($recurring_info['duration'] ? $recurring_info['duration'] : -1),
  311.               'trial_duration_remaining'            => $recurring_info['trial_duration'],
  312.               'date_recurring'                      => $date_recurring
  313.             ));
  314.  
  315.             $this->model_checkout_recurring->addReference($order_recurring_id, $authorizenet_recurring_id);
  316.  
  317.             $this->db->query("UPDATE `" . DB_PREFIX . "order_recurring` SET `status` = '2' WHERE order_recurring_id = '" . (int)$order_recurring_id . "'");
  318.           }
  319.         }
  320.  
  321.         $json['success'] = $this->url->link('checkout/success', '', true);
  322.       } else {
  323.         $json['error'] = $authorizenetcim_result['error'];
  324.       }
  325.  
  326.       $json['merchant_information'] = array(
  327.         'authnet_customer_recurring_id'             => $this->session->data['authnet_customer_recurring_id'],
  328.         'authnet_customer_payment_recurring_id'     => $this->session->data['authnet_customer_payment_recurring_id'],
  329.         'authnet_customer_shipping_address_id'      => $this->session->data['authnet_customer_shipping_address_id']
  330.       );
  331.     }
  332.  
  333.     $this->response->setOutput(json_encode($json));
  334.   }
  335.  
  336.   public function recurringCancel() {
  337.     if (!empty($this->request->get['recurring_id'])) {
  338.       $this->language->load('account/recurring');
  339.  
  340.       $this->load->model('extension/payment/authorizenet_recurring');
  341.       $this->load->model('account/recurring');
  342.  
  343.       $order_recurring_info = $this->model_account_recurring->getProfile($this->request->get['recurring_id']);
  344.  
  345.       if ($order_recurring_info) {
  346.         $this->db->query("UPDATE `" . DB_PREFIX . "order_recurring` SET `status` = '" . (int)$this->config->get('authorizenet_recurring_recurring_cancel_status') . "' WHERE order_recurring_id = '" . (int)$this->request->get['recurring_id'] . "'");
  347.  
  348.         $this->session->data['success'] = $this->language->get('success_cancelled');
  349.       } else {
  350.         $this->log->write($this->language->get('error_not_found'));
  351.       }
  352.     }
  353.  
  354.     $this->redirect($this->url->link('account/recurring/info', 'recurring_id=' . $this->request->get['recurring_id'], true));
  355.   }
  356.  
  357.   public function cron() {
  358.     if (isset($this->request->get['secret'])) {
  359.       $secret = $this->request->get['secret'];
  360.     } else if (isset($GLOBALS['argv'][1])) {
  361.       $secret = htmlspecialchars($GLOBALS['argv'][1], ENT_COMPAT, 'UTF-8');
  362.     }
  363.  
  364.     if (isset($secret) && $secret == $this->config->get('authorizenet_recurring_cron_secret')) {
  365.       $this->language->load('extension/payment/authorizenet_recurring');
  366.  
  367.       $this->load->model('account/customer');
  368.       $this->load->model('catalog/product');
  369.       $this->load->model('checkout/order');
  370.       $this->load->model('extension/payment/authorizenet_recurring');
  371.  
  372.     require_once(DIR_SYSTEM . 'library/authorizenetcim.php');
  373.  
  374.     $login = $this->config->get('authorizenet_recurring_login');
  375.     $auth_key = $this->config->get('authorizenet_recurring_key');
  376.     $live_server = $this->config->get('authorizenet_recurring_server');
  377.     $auth_mode = $this->config->get('authorizenet_recurring_mode');
  378.     $debug_mode = $this->config->get('authorizenet_recurring_debug');
  379.  
  380.       $filters = array(
  381.         //'filter_date_recurring_start' => date('Y-m-d'),
  382.         'filter_date_recurring_end'   => date('Y-m-d'),
  383.         'filter_status'               => 2                  // Active
  384.       );
  385.  
  386.       $recurring_orders = array();
  387.  
  388.       $results = $this->model_extension_payment_authorizenet_recurring->getRecurringSubscriptions($filters);
  389.  
  390.       foreach ($results as $result) {
  391.         if (isset($recurring_orders[$result['order_id']])) {
  392.           $recurring_orders[$result['order_id']]['subscriptions'][] = $result;
  393.  
  394.           if ($recurring_orders[$result['order_id']]['trials_only'] && !$result['trial_duration_remaining']) {
  395.             $recurring_orders[$result['order_id']]['trials_only'] = false;
  396.           }
  397.         } else {
  398.           $recurring_orders[$result['order_id']] = array(
  399.             'server'                            => $result['server'],
  400.             'login'                             => $result['login'],
  401.             'key'                               => $result['key'],
  402.             'customer_recurring_id'             => $result['customer_recurring_id'],
  403.             'customer_payment_recurring_id'     => $result['customer_payment_recurring_id'],
  404.             'customer_shipping_address_id'      => $result['customer_shipping_address_id'],
  405.             'trials_only'                       => ($result['trial_duration_remaining'] ? true : false),
  406.             'subscriptions'                     => array($result)
  407.           );
  408.         }
  409.       }
  410.  
  411.       foreach ($recurring_orders as $order_id => $recurring_order) {
  412.         $this->language->load('extension/payment/authorizenet_recurring');
  413.  
  414.         $this->cart->clear();
  415.  
  416.         $authorizenetcim = new AuthorizeNetCim($this->registry, $login, $auth_key, ($live_server == 'live' ? false : true), ($auth_mode == 'test' ? true : false), $debug_mode);
  417.  
  418.         $authorizenetcim->customer_recurring_id = $recurring_order['customer_recurring_id'];
  419.         $authorizenetcim->customer_profile_id = $recurring_order['customer_recurring_id'];
  420.  
  421.         $customer_recurring_results = $authorizenetcim->getCustomerProfile();
  422.        
  423.         $customer_recurring           = $customer_recurring_results->profile;
  424.         $customer_payment_recurring   = array();
  425.         $customer_shipping_address    = array();
  426.  
  427.         if ($customer_recurring) {
  428.           foreach ($customer_recurring->paymentProfiles as $payment_recurring) {
  429.             if ($payment_recurring->customerPaymentProfileId == $recurring_order['customer_payment_recurring_id']) {
  430.               $customer_payment_recurring = $payment_recurring;
  431.               break;
  432.             }
  433.           }
  434.  
  435.           if ($recurring_order['customer_shipping_address_id']) {
  436.             foreach ($customer_recurring->shipToList as $shipping_address) {
  437.               if ($shipping_address->customerAddressId == $recurring_order['customer_shipping_address_id']) {
  438.                 $customer_shipping_address = $shipping_address;
  439.                 break;
  440.               }
  441.             }
  442.           }
  443.         }
  444.  
  445.         if (!$customer_recurring || !$customer_payment_recurring || ($recurring_order['customer_shipping_address_id'] && !$customer_shipping_address)) {
  446.           foreach ($recurring_order['subscriptions'] as $recurring_subscription) {
  447.             $this->model_extension_payment_authorizenet_recurring->addSubscriptionFailedAttempt($recurring_subscription['authorizenet_recurring_id']);
  448.  
  449.             if ($recurring_subscription['failed_attempts'] < (3 - 1)) {
  450.               $this->model_extension_payment_authorizenet_recurring->editSubscriptionRecurringDate($recurring_subscription['authorizenet_recurring_id'], date('Y-m-d', strtotime('tomorrow')));
  451.             } else {
  452.               $this->db->query("UPDATE `" . DB_PREFIX . "order_recurring` SET `status` = '" . (int)$this->config->get('authorizenet_recurring_recurring_cancel_status') . "' WHERE order_recurring_id = '" . (int)$recurring_subscription['order_recurring_id'] . "'");
  453.             }
  454.           }
  455.  
  456.           continue;
  457.         }
  458.  
  459.         if (($order_info = $this->model_checkout_order->getOrder($order_id))) {
  460.           $this->model_extension_payment_authorizenet_recurring->useStoreConfig($order_info['store_id']);
  461.         } else {
  462.           $this->model_extension_payment_authorizenet_recurring->useStoreConfig(0);
  463.         }
  464.  
  465.         $data = array();
  466.  
  467.         $data['invoice_prefix'] = $this->config->get('config_invoice_prefix');
  468.         $data['store_id']       = $this->config->get('config_store_id');
  469.         $data['store_name']     = $this->config->get('config_name');
  470.  
  471.         if ($data['store_id']) {
  472.           $data['store_url'] = $this->config->get('config_url');
  473.         } else {
  474.           $data['store_url'] = HTTP_SERVER;
  475.         }
  476.  
  477.         if ($order_info && $order_info['customer_id']) {
  478.           $customer_info = $this->model_account_customer->getCustomer($order_info['customer_id']);
  479.  
  480.           $data['customer_id']        = $order_info['customer_id'];
  481.           $data['customer_group_id']  = $customer_info['customer_group_id'];
  482.           $data['firstname']          = $customer_info['firstname'];
  483.           $data['lastname']           = $customer_info['lastname'];
  484.           $data['email']              = $customer_info['email'];
  485.           $data['telephone']          = $customer_info['telephone'];
  486.           $data['fax']                = $customer_info['fax'];
  487.         } else {
  488.           $data['customer_id']        = 0;
  489.           $data['customer_group_id']  = $this->config->get('config_customer_group_id');
  490.           $data['firstname']          = $customer_payment_recurring->billTo->firstName;
  491.           $data['lastname']           = $customer_payment_recurring->billTo->lastName;
  492.           $data['email']              = $customer_recurring->email;
  493.           $data['telephone']          = $customer_payment_recurring->billTo->phoneNumber;
  494.           $data['fax']                = $customer_payment_recurring->billTo->faxNumber;
  495.         }
  496.  
  497.         // Payment Information
  498.         $payment_country_info = $this->model_extension_payment_authorizenet_recurring->getCountryByCode($customer_payment_recurring->billTo->country);
  499.  
  500.         if ($payment_country_info) {
  501.           $payment_country_id     = $payment_country_info['country_id'];
  502.           $payment_country        = $payment_country_info['name'];
  503.           $payment_address_format = $payment_country_info['address_format'];
  504.  
  505.           $payment_zone_info = $this->model_extension_payment_authorizenet_recurring->getZoneByCode($customer_payment_recurring->billTo->state, $payment_country_id);
  506.  
  507.           if ($payment_zone_info) {
  508.             $payment_zone_id  = $payment_zone_info['zone_id'];
  509.             $payment_zone     = $payment_zone_info['name'];
  510.           } else {
  511.             $payment_zone_id  = 0;
  512.             $payment_zone     = '';
  513.           }
  514.         } else {
  515.           $payment_country_id     = 0;
  516.           $payment_country        = '';
  517.           $payment_address_format = '';
  518.           $payment_zone_id        = 0;
  519.           $payment_zone           = '';
  520.         }
  521.  
  522.         $data['payment_firstname']      = $customer_payment_recurring->billTo->firstName;
  523.         $data['payment_lastname']       = $customer_payment_recurring->billTo->lastName;
  524.         $data['payment_company']        = $customer_payment_recurring->billTo->company;
  525.         $data['payment_company_id']     = '';
  526.         $data['payment_tax_id']         = '';
  527.         $data['payment_address_1']      = $customer_payment_recurring->billTo->address;
  528.         $data['payment_address_2']      = '';
  529.         $data['payment_city']           = $customer_payment_recurring->billTo->city;
  530.         $data['payment_postcode']       = $customer_payment_recurring->billTo->zip;
  531.         $data['payment_country']        = $payment_country;
  532.         $data['payment_country_id']     = $payment_country_id;
  533.         $data['payment_zone']           = $payment_zone;
  534.         $data['payment_zone_id']        = $payment_zone_id;
  535.         $data['payment_address_format'] = $payment_address_format;
  536.         $data['payment_method']         = $this->language->get('text_title');
  537.         $data['payment_code']           = 'authorizenet_recurring';
  538.  
  539.         // Shipping Information
  540.         if ($customer_shipping_address && $order_info && $order_info['shipping_code']) {
  541.           $shipping_country_info = $this->model_extension_payment_authorizenet_recurring->getCountryByCode($customer_shipping_address->country);
  542.  
  543.           if ($shipping_country_info) {
  544.             $shipping_country_id     = $shipping_country_info['country_id'];
  545.             $shipping_country        = $shipping_country_info['name'];
  546.             $shipping_iso_code_2     = $shipping_country_info['iso_code_2'];
  547.             $shipping_address_format = $shipping_country_info['address_format'];
  548.  
  549.             $shipping_zone_info = $this->model_extension_payment_authorizenet_recurring->getZoneByCode($customer_shipping_address->state, $shipping_country_id);
  550.  
  551.             if ($shipping_zone_info) {
  552.               $shipping_zone_id   = $shipping_zone_info['zone_id'];
  553.               $shipping_zone      = $shipping_zone_info['name'];
  554.               $shipping_zone_code = $shipping_zone_info['code'];
  555.             } else {
  556.               $shipping_zone_id   = 0;
  557.               $shipping_zone      = '';
  558.               $shipping_zone_code = '';
  559.             }
  560.           } else {
  561.             $shipping_country_id     = 0;
  562.             $shipping_country        = '';
  563.             $shipping_iso_code_2     = '';
  564.             $shipping_address_format = '';
  565.             $shipping_zone_id        = 0;
  566.             $shipping_zone           = '';
  567.             $shipping_zone_code      = '';
  568.           }
  569.  
  570.           $shipping_address = array();
  571.  
  572.           $shipping_address['firstname']      = $customer_shipping_address->firstName;
  573.           $shipping_address['lastname']       = $customer_shipping_address->lastName;
  574.           $shipping_address['company']        = $customer_shipping_address->company;
  575.           $shipping_address['address_1']      = $customer_shipping_address->address;
  576.           $shipping_address['address_2']      = '';
  577.           $shipping_address['city']           = $customer_shipping_address->city;
  578.           $shipping_address['postcode']       = $customer_shipping_address->zip;
  579.           $shipping_address['country']        = $shipping_country;
  580.           $shipping_address['country_id']     = $shipping_country_id;
  581.           $shipping_address['iso_code_2']     = $shipping_iso_code_2;
  582.           $shipping_address['zone']           = $shipping_zone;
  583.           $shipping_address['zone_id']        = $shipping_zone_id;
  584.           $shipping_address['zone_code']      = $shipping_zone_code;
  585.           $shipping_address['address_format'] = $shipping_address_format;
  586.         } else {
  587.           $shipping_address = array();
  588.         }
  589.  
  590.         if ($data['payment_country_id'] && $data['payment_zone_id']) {
  591.           $this->tax->setPaymentAddress($data['payment_country_id'], $data['payment_zone_id']);
  592.         } else if ($this->config->get('config_tax_default') == 'payment') {
  593.           $this->tax->setPaymentAddress($this->config->get('config_country_id'), $this->config->get('config_zone_id'));
  594.         }
  595.  
  596.         if ($shipping_address) {
  597.           $this->tax->setShippingAddress($shipping_address['country_id'], $shipping_address['zone_id']);
  598.         } else if ($this->config->get('config_tax_default') == 'shipping') {
  599.           $this->tax->setShippingAddress($this->config->get('config_country_id'), $this->config->get('config_zone_id'));
  600.         }
  601.  
  602.         // store all transactions regardless if successful or not, use this later to add order transactions, history, etc.
  603.         $transactions = array();
  604.  
  605.         // Products
  606.         $sub_total  = 0;
  607.         $taxes      = array();
  608.  
  609.         $data['products'] = array();
  610.  
  611.         foreach ($recurring_order['subscriptions'] as $recurring_subscription) {
  612.           $product_info = $this->model_catalog_product->getProduct($recurring_subscription['product_id']);
  613.  
  614.           $tax = ($product_info ? $this->tax->getTax($recurring_subscription['recurring_price'], $product_info['tax_class_id']) : 0);
  615.  
  616.           $add_product = false;
  617.  
  618.           if ($this->config->get('authorizenet_recurring_combine_transactions')) {
  619.             // combining transactions so always add the product to the cart
  620.             $add_product = true;
  621.           } else {
  622.             // only add product to cart if the transaction is successful
  623.             $total = ($recurring_subscription['recurring_price'] * $recurring_subscription['product_quantity']) + ($tax * $recurring_subscription['product_quantity']);
  624.  
  625.             $transaction_info = array(
  626.               'data'    => array(),
  627.               'total'   => $total,
  628.               'success' => false,
  629.               'error'   => ''
  630.             );
  631.             $authorizenetcim_result = $authorizenetcim->createCustomerProfileTransaction('', $this->config->get('authorizenet_recurring_method'), $recurring_order['customer_payment_recurring_id'], $recurring_order['customer_shipping_address_id'], $this->currency->format($total, $this->config->get('config_currency'), '', false), '', true);
  632.  
  633.             $transaction_info['data'] = $authorizenetcim_result['data'];
  634.             if ($authorizenetcim_result['success']) {
  635.               $transaction_info['success'] = true;
  636.  
  637.               $add_product = true;
  638.             } else {
  639.               $transaction_info['error'] = $authorizenetcim_result['error'];
  640.             }
  641.  
  642.             if ($transaction_info['success']) {
  643.               $this->addOrderRecurringTransaction($recurring_subscription, $total, 1);
  644.             } else {
  645.               $this->addOrderRecurringTransaction($recurring_subscription, $total, 4);
  646.             }
  647.  
  648.             $transactions[] = $transaction_info;
  649.           }
  650.  
  651.           if ($add_product) {
  652.               // Start Enhanced Recurring
  653.               if ($product_info && (($recurring_subscription['trial_duration_remaining'] && $recurring_subscription['trial_charge_shipping']) || (!$recurring_subscription['trial_duration_remaining'] && $recurring_subscription['recurring_charge_shipping']))) {
  654.                 $shipping = $product_info['shipping'];
  655.               } else {
  656.                 $shipping = 0;
  657.               }
  658.               // End Enhanced Recurring
  659.             $data['products'][] = array(
  660.               'product_id'  => $recurring_subscription['product_id'],
  661.               'name'        => ($product_info ? $product_info['name'] . ' - ' : '') . $recurring_subscription['recurring_name'],
  662.               'model'       => ($product_info ? $product_info['model'] : ''),
  663.               'option'      => array(),
  664.               'download'    => array(),
  665.               'quantity'    => $recurring_subscription['product_quantity'],
  666.               'subtract'    => ($product_info ? $product_info['subtract'] : 0),
  667.               'price'       => $recurring_subscription['recurring_price'],
  668.               'total'       => $recurring_subscription['recurring_price'] * $recurring_subscription['product_quantity'],
  669.               'tax'         => $tax,
  670.               'reward'      => ($product_info ? $product_info['points'] : 0),
  671.               // Start Enhanced Recurring
  672.               'shipping'    => $shipping
  673.               // End Enhanced Recurring
  674.             );
  675.  
  676.             // Start Enhanced Recurring
  677.             if ($shipping) {
  678.             // End Enhanced Recurring
  679.               $this->cart->add($recurring_subscription['product_id'], $recurring_subscription['product_quantity']);
  680.             }
  681.  
  682.             $sub_total += $recurring_subscription['recurring_price'] * $recurring_subscription['product_quantity'];
  683.  
  684.             // Start Enhanced Recurring
  685.             if (!$recurring_subscription['recurring_full_tax_initial_order'] && $product_info['tax_class_id']) {
  686.             // End Enhanced Recurring
  687.               $tax_rates = $this->tax->getRates($recurring_subscription['recurring_price'], $product_info['tax_class_id']);
  688.  
  689.               foreach ($tax_rates as $tax_rate) {
  690.                 if (!isset($taxes[$tax_rate['tax_rate_id']])) {
  691.                   $taxes[$tax_rate['tax_rate_id']] = ($tax_rate['amount'] * $recurring_subscription['product_quantity']);
  692.                 } else {
  693.                   $taxes[$tax_rate['tax_rate_id']] += ($tax_rate['amount'] * $recurring_subscription['product_quantity']);
  694.                 }
  695.               }
  696.             }
  697.           }
  698.         }
  699.  
  700.         if ($data['products']) {
  701.           // Shipping Methods
  702.           $shipping_cost = 0;
  703.  
  704.           if ($shipping_address && $this->cart->hasShipping()) {
  705.             $data['shipping_firstname']       = $shipping_address['firstname'];
  706.             $data['shipping_lastname']        = $shipping_address['lastname'];
  707.             $data['shipping_company']         = $shipping_address['company'];
  708.             $data['shipping_address_1']       = $shipping_address['address_1'];
  709.             $data['shipping_address_2']       = $shipping_address['address_2'];
  710.             $data['shipping_city']            = $shipping_address['city'];
  711.             $data['shipping_postcode']        = $shipping_address['postcode'];
  712.             $data['shipping_country']         = $shipping_address['country'];
  713.             $data['shipping_country_id']      = $shipping_address['country_id'];
  714.             $data['shipping_zone']            = $shipping_address['zone'];
  715.             $data['shipping_zone_id']         = $shipping_address['zone_id'];
  716.             $data['shipping_address_format']  = $shipping_address['address_format'];
  717.             $data['shipping_method']          = '';
  718.             $data['shipping_code']            = '';
  719.  
  720.             $this->load->model('extension/extension');
  721.  
  722.             $results = $this->model_extension_extension->getExtensions('shipping');
  723.  
  724.             foreach ($results as $result) {
  725.               if ($this->config->get($result['code'] . '_status')) {
  726.                 $this->load->model('extension/shipping/' . $result['code']);
  727.  
  728.                 $method_data = $this->{'model_extension_shipping_' . $result['code']}->getQuote($shipping_address);
  729.  
  730.                 if ($method_data) {
  731.                   foreach ($method_data['quote'] as $key => $quote) {
  732.                     if ($quote['code'] == $order_info['shipping_code']) {
  733.                       $data['shipping_method']  = $quote['title'];
  734.                       $data['shipping_code']    = $quote['code'];
  735.  
  736.                       $shipping_cost = $quote['cost'];
  737.  
  738.                       break 2;
  739.                     } else if (!$data['shipping_code'] || $quote['cost'] < $shipping_cost) {
  740.                       $data['shipping_method']  = $quote['title'];
  741.                       $data['shipping_code']    = $quote['code'];
  742.  
  743.                       $shipping_cost = $quote['cost'];
  744.                     }
  745.                   }
  746.                 }
  747.               }
  748.             }
  749.           } else {
  750.             $data['shipping_firstname']       = '';
  751.             $data['shipping_lastname']        = '';
  752.             $data['shipping_company']         = '';
  753.             $data['shipping_address_1']       = '';
  754.             $data['shipping_address_2']       = '';
  755.             $data['shipping_city']            = '';
  756.             $data['shipping_postcode']        = '';
  757.             $data['shipping_country']         = '';
  758.             $data['shipping_country_id']      = '';
  759.             $data['shipping_zone']            = '';
  760.             $data['shipping_zone_id']         = '';
  761.             $data['shipping_address_format']  = '';
  762.             $data['shipping_method']          = '';
  763.             $data['shipping_code']            = '';
  764.           }
  765.  
  766.           $data['vouchers'] = array();
  767.  
  768.           // Totals
  769.           $total = 0;
  770.  
  771.           $data['totals'] = array();
  772.  
  773.           $data['totals'][] = array(
  774.             'code'        => 'sub_total',
  775.             'title'       => $this->language->get('cron_sub_total'),
  776.             'text'        => $this->currency->format($sub_total, $order_info['currency_code'], $order_info['currency_value']),
  777.             'value'       => $sub_total,
  778.             'sort_order'  => $this->config->get('sub_total_sort_order')
  779.           );
  780.  
  781.           $total += $sub_total;
  782.  
  783.           if ($data['shipping_method']) {
  784.             $data['totals'][] = array(
  785.               'code'        => 'shipping',
  786.               'title'       => $data['shipping_method'],
  787.               'text'        => $this->currency->format($shipping_cost, $order_info['currency_code'], $order_info['currency_value']),
  788.               'value'       => $shipping_cost,
  789.               'sort_order'  => $this->config->get('shipping_sort_order')
  790.             );
  791.  
  792.             $total += $shipping_cost;
  793.           }
  794.  
  795.           foreach ($taxes as $key => $value) {
  796.             if ($value > 0) {
  797.               $data['totals'][] = array(
  798.                 'code'       => 'tax',
  799.                 'title'      => $this->tax->getRateName($key),
  800.                 'text'       => $this->currency->format($value, $order_info['currency_code'], $order_info['currency_value']),
  801.                 'value'      => $value,
  802.                 'sort_order' => $this->config->get('tax_sort_order')
  803.               );
  804.  
  805.               $total += $value;
  806.             }
  807.           }
  808.  
  809.           $data['totals'][] = array(
  810.             'code'        => 'total',
  811.             'title'       => $this->language->get('cron_total'),
  812.             'text'        => $this->currency->format($total, $order_info['currency_code'], $order_info['currency_value']),
  813.             'value'       => $total,
  814.             'sort_order'  => $this->config->get('total_sort_order')
  815.           );
  816.  
  817.           $data['total'] = $total;
  818.  
  819.           if ($order_info) {
  820.             $data['comment'] = sprintf($this->language->get('cron_comment_order'), $order_id);
  821.           } else {
  822.             $data['comment'] = $this->language->get('cron_comment');
  823.           }
  824.  
  825.           if ($this->config->get('authorizenet_recurring_affiliate_commission_status') && $order_info && $order_info['affiliate_id']) {
  826.             $data['tracking'] = $order_info['tracking'];
  827.             $this->load->model('affiliate/affiliate');
  828.  
  829.             $affiliate_info = $this->model_affiliate_affiliate->getAffiliate($order_info['affiliate_id']);
  830.             $subtotal       = $total;
  831.  
  832.             if ($affiliate_info) {
  833.               $data['affiliate_id'] = $affiliate_info['affiliate_id'];
  834.               $data['commission']   = ($subtotal / 100) * $affiliate_info['commission'];
  835.             } else {
  836.               $data['affiliate_id'] = 0;
  837.               $data['commission']   = 0;
  838.             }
  839.                 $this->load->model('checkout/marketing');
  840.  
  841.                 $marketing_info = $this->model_checkout_marketing->getMarketingByCode($order_info['tracking']);
  842.  
  843.                 if ($marketing_info) {
  844.                     $data['marketing_id'] = $marketing_info['marketing_id'];
  845.                 } else {
  846.                     $data['marketing_id'] = 0;
  847.                 }
  848.           } else {
  849.             $data['affiliate_id'] = 0;
  850.             $data['commission'] = 0;
  851.             $data['marketing_id'] = 0;
  852.             $data['tracking'] = '';
  853.           }
  854.  
  855.           if ($order_info) {
  856.             $data['language_id']    = $order_info['language_id'];
  857.             $data['currency_id']    = $order_info['currency_id'];
  858.             $data['currency_code']  = $order_info['currency_code'];
  859.             $data['currency_value'] = $order_info['currency_value'];
  860.           } else {
  861.             $data['language_id']    = $this->config->get('config_language_id');
  862.             $data['currency_id']    = $this->currency->getId($this->config->get('config_currency'));
  863.             $data['currency_code']  = $this->config->get('config_currency');
  864.             $data['currency_value'] = $this->currency->getValue($this->config->get('config_currency'));
  865.           }
  866.  
  867.           $data['ip']               = '';
  868.           $data['forwarded_ip']     = '';
  869.           $data['user_agent']       = '';
  870.           $data['accept_language']  = '';
  871.  
  872.           $new_order_id = $this->model_checkout_order->addOrder($data);
  873.          
  874.           $shipping_paid = ($shipping_cost > 0 ? false : true);
  875.  
  876.           if ($this->config->get('authorizenet_recurring_combine_transactions')) {
  877.             $transaction_info = array(
  878.               'data'    => array(),
  879.               'total'   => $total,
  880.               'success' => false,
  881.               'error'   => ''
  882.             );
  883.             $authorizenetcim_result = $authorizenetcim->createCustomerProfileTransaction($new_order_id, $this->config->get('authorizenet_recurring_method'), $recurring_order['customer_payment_recurring_id'], $recurring_order['customer_shipping_address_id'], $this->currency->format($total, $this->config->get('config_currency'), '', false), '', true);
  884.             $transaction_info['data'] = $authorizenetcim_result['data'];
  885.  
  886.             if ($authorizenetcim_result['success']) {
  887.               $transaction_info['success'] = true;
  888.  
  889.               $shipping_paid = true;
  890.  
  891.               foreach ($recurring_order['subscriptions'] as $recurring_subscription) {
  892.                 $this->addOrderRecurringTransaction($recurring_subscription, $total, 1, $new_order_id);
  893.               }
  894.             } else {
  895.               $transaction_info['error'] = $authorizenetcim_result['error'];
  896.  
  897.               foreach ($recurring_order['subscriptions'] as $recurring_subscription) {
  898.                 $this->addOrderRecurringTransaction($recurring_subscription, $total, 4, $new_order_id);
  899.               }
  900.             }
  901.  
  902.             $transactions[] = $transaction_info;
  903.           } else {
  904.             if (!$shipping_paid) {
  905.               $transaction_info = array(
  906.                 'data'    => array(),
  907.                 'total'   => $shipping_cost,
  908.                 'success' => false,
  909.                 'error'   => ''
  910.               );
  911.  
  912.               $authorizenetcim_result = $authorizenetcim->createCustomerProfileTransaction($new_order_id, $this->config->get('authorizenet_recurring_method'), $recurring_order['customer_payment_recurring_id'], $recurring_order['customer_shipping_address_id'], $this->currency->format($shipping_cost, $this->config->get('config_currency'), '', false), '', true);
  913.               $transaction_info['data'] = $authorizenetcim_result['data'];
  914.  
  915.               if ($authorizenetcim_result['success']) {
  916.                 $transaction_info['success'] = true;
  917.  
  918.                 $shipping_paid = true;
  919.               } else {
  920.                 $transaction_info['error'] = $authorizenetcim_result['error'];
  921.               }
  922.  
  923.               $transactions[] = $transaction_info;
  924.             }
  925.           }
  926.  
  927.           if ($transactions) {
  928.             $order_status_id = 0;
  929.  
  930.             $this->load->model('localisation/currency');
  931.  
  932.             $currency_info = $this->model_localisation_currency->getCurrencyByCode($this->config->get('config_currency'));
  933.  
  934.             if (file_exists(DIR_APPLICATION . 'model/checkout/order_transaction.php')) {
  935.               $this->load->model('checkout/order_transaction');
  936.             }
  937.  
  938.             foreach ($transactions as $transaction) {
  939.               if ($transaction['success']) {
  940.                 if (!$order_status_id) {
  941.                   if (!$recurring_order['trials_only']) {
  942.                     // create the order normally and send the receipt email
  943.                     $this->model_checkout_order->addOrderHistory($new_order_id, $this->config->get('config_order_status_id'));
  944.                     sleep(1);
  945.  
  946.                     if ($shipping_paid) {
  947.                       $order_status_id = $this->config->get('authorizenet_recurring_order_status_id');
  948.                     } else {
  949.                       $order_status_id = $this->config->get('config_order_status_id');
  950.                     }
  951.                   } else {
  952.                     // only trials so skip the normal confirm method and don't send an email
  953.                     $this->db->query("UPDATE `" . DB_PREFIX . "order` SET order_status_id = '" . (int)$this->config->get('config_order_status_id') . "', date_modified = NOW() WHERE order_id = '" . (int)$new_order_id . "'");
  954.  
  955.                     $this->db->query("INSERT INTO `" . DB_PREFIX . "order_history` SET order_id = '" . (int)$new_order_id . "', order_status_id = '" . (int)$this->config->get('config_order_status_id') . "', notify = '0', date_added = NOW()");
  956.  
  957.                     $order_status_id = $this->config->get('authorizenet_recurring_cron_trial_order_status_id');
  958.                   }
  959.                 }
  960.  
  961.                 $message = '';
  962.  
  963.                 if (isset($transaction['data'][4])) {
  964.                   $message .= 'Authorization Code: ' . $transaction['data'][4] . "\n";
  965.                 }
  966.  
  967.                 if (isset($transaction['data'][5])) {
  968.                   $message .= 'AVS Response: ' . $transaction['data'][5] . "\n";
  969.                 }
  970.  
  971.                 if (isset($transaction['data'][6])) {
  972.                   $message .= 'Transaction ID: ' . $transaction['data'][6] . "\n";
  973.                 }
  974.  
  975.                 if (isset($transaction['data'][38])) {
  976.                   $message .= 'Card Code Response: ' . $transaction['data'][38] . "\n";
  977.                 }
  978.  
  979.                 if (isset($transaction['data'][39])) {
  980.                   $message .= 'Cardholder Authentication Verification Response: ' . $transaction['data'][39] . "\n";
  981.                 }
  982.  
  983.                 if (!$this->config->get('authorizenet_recurring_hash') || (strtoupper($transaction['data'][37]) == strtoupper(md5($this->config->get('authorizenet_recurring_hash') . $this->config->get('authorizenet_recurring_login') . $transaction['data'][6] . $this->currency->format($transaction['total'], $this->config->get('config_currency'), '', false))))) {
  984.                   if (file_exists(DIR_APPLICATION . 'model/checkout/order_transaction.php')) {
  985.                     $this->model_checkout_order_transaction->addOrderTransaction($new_order_id, array(
  986.                       'transaction_id'      => (isset($transaction['data'][6]) ? $transaction['data'][6] : ''),
  987.                       'authorization_code'  => (isset($transaction['data'][4]) ? $transaction['data'][4] : ''),
  988.                       'payment_method'      => 'Authorize.Net (Recurring)',
  989.                       'payment_code'        => 'authorizenet_recurring',
  990.                       'amount'              => $this->currency->format($transaction['total'], $this->config->get('config_currency'), '', false),
  991.                       'currency_id'         => $currency_info['currency_id'],
  992.                       'currency_code'       => $currency_info['code'],
  993.                       'currency_value'      => $currency_info['value'],
  994.                       'additional_details'  => array(
  995.                         'server'    => $recurring_order['server'],
  996.                         'login'     => $recurring_order['login'],
  997.                         'key'       => $recurring_order['key'],
  998.                         'last_four' => substr($customer_payment_recurring->payment->creditCard->cardNumber, -4)
  999.                       ),
  1000.                       'status'  => (($this->config->get('authorizenet_recurring_method') == 'capture') ? 1 : 0)
  1001.                     ));
  1002.                   }
  1003.                 }
  1004.               } else {
  1005.                 $message = 'Failed ' . $this->currency->format($transaction['total'], $this->config->get('config_currency')) . ' || ' . $transaction['error'];
  1006.               }
  1007.  
  1008.               if ($order_status_id) {
  1009.                 $this->model_checkout_order->addOrderHistory($new_order_id, $order_status_id, $message, false);
  1010.               } else {
  1011.                 $this->db->query("INSERT INTO `" . DB_PREFIX . "order_history` SET order_id = '" . (int)$new_order_id . "', order_status_id = '0', notify = '0', comment = '" . $this->db->escape($message) . "', date_added = NOW()");
  1012.               }
  1013.             }
  1014.           }
  1015.         }
  1016.       }
  1017.  
  1018.       $this->cart->clear();
  1019.     }
  1020.   }
  1021.  
  1022.   private function addOrderRecurringTransaction($recurring_subscription, $total, $type, $order_id = 0) {
  1023.     $this->db->query("INSERT INTO `" . DB_PREFIX . "order_recurring_transaction` SET `order_recurring_id`  = '" . (int)$recurring_subscription['order_recurring_id'] . "', `date_added` = NOW(), `amount` = '" . (float)$total . "', `type` = '" . (int)$type . "', `order_id` = '" . (int)$order_id . "'");
  1024.  
  1025.     switch($type)
  1026.     {
  1027.     case 1:
  1028.       if ($recurring_subscription['trial_duration_remaining']) {
  1029.         $this->model_extension_payment_authorizenet_recurring->decrementSubscriptionTrialDurationRemaining($recurring_subscription['authorizenet_recurring_id']);
  1030.       }
  1031.  
  1032.       if ($recurring_subscription['trial_duration_remaining'] > 1) {
  1033.         if ($recurring_subscription['trial_frequency'] == 'semi_month') {
  1034.           $days_per_cycle = date('t', strtotime('first day of next month')) / $recurring_subscription['trial_cycle'];
  1035.  
  1036.           $date_recurring = date('Y-m-d', strtotime('+' . $days_per_cycle . ' days', strtotime('first day of next month')));
  1037.         } else {
  1038.           $date_recurring = date('Y-m-d', strtotime('+' . $recurring_subscription['trial_cycle'] . ' ' . $recurring_subscription['trial_frequency']));
  1039.         }
  1040.       } else {
  1041.         if ($recurring_subscription['recurring_frequency'] == 'semi_month') {
  1042.           $days_per_cycle = date('t', strtotime('first day of next month')) / $recurring_subscription['recurring_cycle'];
  1043.  
  1044.           $date_recurring = date('Y-m-d', strtotime('+' . $days_per_cycle . ' days', strtotime('first day of next month')));
  1045.         } else {
  1046.           $date_recurring = date('Y-m-d', strtotime('+' . $recurring_subscription['recurring_cycle'] . ' ' . $recurring_subscription['recurring_frequency']));
  1047.         }
  1048.  
  1049.         if ($recurring_subscription['duration_remaining'] > 0) {
  1050.           $this->model_extension_payment_authorizenet_recurring->decrementSubscriptionDurationRemaining($recurring_subscription['authorizenet_recurring_id']);
  1051.  
  1052.           if ($recurring_subscription['duration_remaining'] == 1) {
  1053.             // 5 = expired
  1054.             $this->db->query("UPDATE `" . DB_PREFIX . "order_recurring` SET `status` = '5' WHERE order_recurring_id = '" . (int)$recurring_subscription['order_recurring_id'] . "'");
  1055.           }
  1056.         }
  1057.       }
  1058.  
  1059.       $this->model_extension_payment_authorizenet_recurring->removeSubscriptionFailedAttempts($recurring_subscription['authorizenet_recurring_id']);
  1060.       $this->model_extension_payment_authorizenet_recurring->editSubscriptionRecurringDate($recurring_subscription['authorizenet_recurring_id'], $date_recurring);
  1061.  
  1062.       break;
  1063.     case 4:
  1064.       $this->model_extension_payment_authorizenet_recurring->addSubscriptionFailedAttempt($recurring_subscription['authorizenet_recurring_id']);
  1065.  
  1066.       if ($recurring_subscription['failed_attempts'] < (3 - 1)) {
  1067.         //$this->model_extension_payment_authorizenet_recurring->editSubscriptionRecurringDate($recurring_subscription['authorizenet_recurring_id'], date('Y-m-d', strtotime('tomorrow')));
  1068.       } else {
  1069.         $this->db->query("UPDATE `" . DB_PREFIX . "order_recurring` SET `status` = '" . (int)$this->config->get('authorizenet_recurring_recurring_cancel_status') . "' WHERE order_recurring_id = '" . (int)$recurring_subscription['order_recurring_id'] . "'");
  1070.       }
  1071.  
  1072.       break;
  1073.     }
  1074.   }
  1075. }
Advertisement
Add Comment
Please, Sign In to add comment