public function process_order()
 {
     if ($this->config->get('amazon_checkout_mode') == 'sandbox') {
         $amazon_payment_js = 'https://static-eu.payments-amazon.com/cba/js/gb/sandbox/PaymentWidgets.js';
     } elseif ($this->config->get('amazon_checkout_mode') == 'live') {
         $amazon_payment_js = 'https://static-eu.payments-amazon.com/cba/js/gb/PaymentWidgets.js';
     }
     $this->document->addScript($amazon_payment_js);
     $this->load->library('cba');
     $this->load->model('checkout/order');
     $this->load->model('checkout/coupon');
     $this->load->model('setting/extension');
     $this->load->model('account/order');
     $this->load->model('payment/amazon_checkout');
     $this->language->load('payment/amazon_checkout');
     if (!isset($this->session->data['cba']['order_id'])) {
         $this->redirect($this->url->link('common/home'));
     }
     if (isset($this->session->data['coupon'])) {
         $coupon = $this->model_checkout_coupon->getCoupon($this->session->data['coupon']);
     } else {
         $coupon = array();
     }
     $order = $this->model_checkout_order->getOrder($this->session->data['cba']['order_id']);
     $parameters_items = array();
     $cba_marketplace = $this->config->get('amazon_checkout_marketplace');
     switch ($cba_marketplace) {
         case 'uk':
             $currency_code = 'GBP';
             break;
         case 'de':
             $currency_code = 'EUR';
             break;
     }
     $ordered_products = $this->model_account_order->getOrderProducts($order['order_id']);
     $total = 0;
     $free_shipping = $this->model_payment_amazon_checkout->hasFreeShipping($order['order_id']);
     $shipping_cost = $this->model_payment_amazon_checkout->getShippingPrice($order['order_id']);
     if (!$free_shipping) {
         $total += $shipping_cost;
     }
     foreach ($ordered_products as $product) {
         $parameters_items['products'][] = array('title' => html_entity_decode($product['name'], ENT_QUOTES, 'UTF-8'), 'model' => $product['order_product_id'], 'quantity' => $product['quantity'], 'price' => $this->currency->format($product['price'] + $product['tax'], $currency_code, '', false));
         $total += ($product['price'] + $product['tax']) * $product['quantity'];
     }
     $order_totals = $this->model_payment_amazon_checkout->getAdditionalCharges($order['order_id']);
     foreach ($order_totals as $order_total) {
         $parameters_items['products'][] = array('title' => $order_total['title'], 'model' => 'ot_' . $order_total['order_total_id'], 'quantity' => 1, 'price' => $this->currency->format($order_total['price'], $currency_code, '', false));
         $total += $order_total['price'];
     }
     $parameters_items['currency'] = $currency_code;
     $parameters_items['contract_id'] = $this->session->data['cba']['contract_id'];
     $cba = new CBA($this->config->get('amazon_checkout_merchant_id'), $this->config->get('amazon_checkout_access_key'), $this->config->get('amazon_checkout_access_secret'));
     $cba->setMode($this->config->get('amazon_checkout_mode'));
     if ($cba->setPurchaseItems($parameters_items) !== true) {
         $this->redirect($this->url->link('payment/amazon_checkout/failure', '', 'SSL'));
     }
     $order_discount = $order['total'] - $total;
     $parameters_charges = array();
     $parameters_charges['contract_id'] = $this->session->data['cba']['contract_id'];
     $parameters_charges['currency'] = $currency_code;
     if ($free_shipping) {
         $parameters_charges['shipping_price'] = '0.00';
     } else {
         $parameters_charges['shipping_price'] = $this->currency->format($shipping_cost, $currency_code, '', false);
     }
     if ($order_discount < 0) {
         $parameters_charges['discount'] = $this->currency->format(-$order_discount, $currency_code, '', false);
     }
     if (!$cba->setContractCharges($parameters_charges)) {
         $this->redirect($this->url->link('payment/amazon_checkout/failure', '', 'SSL'));
     }
     $complete_parameters = array();
     $complete_parameters['contract_id'] = $this->session->data['cba']['contract_id'];
     $amazon_order_ids = $cba->completePurchaseContracts($complete_parameters);
     unset($this->session->data['cba']);
     if ($amazon_order_ids) {
         $this->model_payment_amazon_checkout->addAmazonOrderId($order['order_id'], $amazon_order_ids[0]);
     } else {
         $this->redirect($this->url->link('payment/amazon_checkout/failure', '', 'SSL'));
     }
     $this->model_checkout_order->confirm($order['order_id'], $this->config->get('amazon_checkout_order_default_status'));
     $this->redirect($this->url->link('payment/amazon_checkout/success', 'amazon_order_id=' . $amazon_order_ids[0], 'SSL'));
 }