$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->setOutput(json_encode($json));