public function shipping_quotes()
 {
     $this->load->model('setting/extension');
     $this->load->library('cba');
     $this->load->model('payment/amazon_checkout');
     $this->language->load('payment/amazon_checkout');
     if (!isset($this->session->data['cba'])) {
         $this->redirect($this->url->link('common/home'));
     }
     $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'));
     $response = $cba->getPurchaseContract($contract_id);
     $xml = simplexml_load_string($response);
     $json = array();
     if (isset($xml->GetPurchaseContractResult->PurchaseContract->Destinations->Destination[0]->PhysicalDestinationAttributes->ShippingAddress)) {
         $address_xml = $xml->GetPurchaseContractResult->PurchaseContract->Destinations->Destination[0]->PhysicalDestinationAttributes->ShippingAddress;
         $result = $this->model_payment_amazon_checkout->getCountry((string) $address_xml->CountryCode);
         if (!empty($result)) {
             $iso_code2 = $result['iso_code_2'];
             $iso_code3 = $result['iso_code_3'];
             $address_format = $result['address_format'];
             $country_name = $result['name'];
             $country_id = (int) $result['country_id'];
             $zone = (string) $address_xml->StateOrProvinceCode;
             $result = $this->model_payment_amazon_checkout->getZone($zone, $country_id);
             if (isset($result['zone_id'])) {
                 $zone_id = $result['zone_id'];
                 $zone_code = $result['code'];
             } else {
                 $zone_id = 0;
                 $zone_code = '';
             }
         } else {
             $iso_code2 = '';
             $iso_code3 = '';
             $address_format = '';
             $country_name = '';
             $country_id = 0;
             $zone_id = 0;
             $zone_code = '';
             $zone = '';
         }
         $this->tax->setShippingAddress($country_id, $zone_id);
         $address = array('firstname' => (string) $address_xml->Name, 'lastname' => '', 'company' => '', 'company_id' => '', 'tax_id' => '', 'address_1' => '', 'address_2' => '', 'postcode' => (string) $address_xml->PostalCode, 'city' => (string) $address_xml->City, 'zone_id' => $zone_id, 'zone' => (string) $address_xml->StateOrProvinceCode, 'zone_code' => $zone_code, 'country_id' => $country_id, 'country' => $country_name, 'iso_code_2' => $iso_code2, 'iso_code_3' => $iso_code3, 'address_format' => $address_format);
         $quotes = array();
         $results = $this->model_setting_extension->getExtensions('shipping');
         foreach ($results as $result) {
             if (isset($result['code'])) {
                 $code = $result['code'];
             } else {
                 $code = $result['key'];
             }
             if ($this->config->get($code . '_status')) {
                 $this->load->model('shipping/' . $code);
                 $quote = $this->{'model_shipping_' . $code}->getQuote($address);
                 if ($quote && empty($quote['error'])) {
                     $quotes[$code] = array('title' => $quote['title'], 'quote' => $quote['quote'], 'sort_order' => $quote['sort_order'], 'error' => $quote['error']);
                 }
             }
         }
         $sort_order = array();
         foreach ($quotes as $key => $value) {
             $sort_order[$key] = $value['sort_order'];
         }
         array_multisort($sort_order, SORT_ASC, $quotes);
         $this->session->data['cba']['shipping_methods'] = $quotes;
         if (empty($quotes)) {
             $json['error'] = $this->language->get('error_no_shipping_methods');
         } else {
             $json['quotes'] = $quotes;
         }
         if (isset($this->session->data['cba']['shipping_method']) && !empty($this->session->data['cba']['shipping_method']) && isset($this->session->data['cba']['shipping_method']['code'])) {
             $json['selected'] = $this->session->data['cba']['shipping_method']['code'];
         } else {
             $json['selected'] = '';
         }
     } else {
         $json['error'] = $this->language->get('error_shipping_methods');
     }
     $this->response->addHeader('Content-Type: application/json');
     $this->response->setOutput(json_encode($json));
 }