public function main()
{
$this->load->language('extension/payment/klarna_checkout');
$this->load->model('extension/payment/klarna_checkout');
$this->load->model('localisation/country');
$redirect = false;
$html_snippet = '';
// Validate cart has products and has stock.
if (!$this->cart->hasProducts() && empty($this->session->data['vouchers']) || !$this->cart->hasStock() && !$this->config->get('config_stock_checkout')) {
$redirect = $this->url->link('checkout/cart');
}
// Validate minimum quantity requirements.
$products = $this->cart->getProducts();
foreach ($products as $product) {
$product_total = 0;
foreach ($products as $product_2) {
if ($product_2['product_id'] == $product['product_id']) {
$product_total += $product_2['quantity'];
}
}
if ($product['minimum'] > $product_total) {
$redirect = $this->url->link('checkout/cart');
}
}
// Validate cart has recurring products
if ($this->cart->hasRecurringProducts()) {
$redirect = $this->url->link('checkout/cart');
}
list($totals, $taxes, $total) = $this->model_extension_payment_klarna_checkout->getTotals();
if ($this->config->get('klarna_checkout_total') > 0 && $this->config->get('klarna_checkout_total') > $total) {
$redirect = $this->url->link('checkout/cart');
}
if (!$this->config->get('klarna_checkout_status')) {
$redirect = $this->url->link('checkout/cart');
}
if ($this->model_extension_payment_klarna_checkout->checkForPaymentTaxes($products)) {
$redirect = $this->url->link('checkout/cart');
}
$text_title = $this->language->get('text_title');
unset($this->session->data['success']);
$this->setPayment();
$this->setShipping();
$this->session->data['payment_method'] = array('code' => 'klarna_checkout', 'title' => $text_title, 'terms' => $this->url->link('information/information', 'information_id=' . $this->config->get('klarna_checkout_terms'), true), 'sort_order' => '1');
// Shipping
$unset_shipping_method = true;
if (isset($this->session->data['shipping_method']) && isset($this->session->data['shipping_methods'])) {
foreach ($this->session->data['shipping_methods'] as $shipping_method) {
if ($shipping_method['quote']) {
foreach ($shipping_method['quote'] as $quote) {
if ($quote['code'] == $this->session->data['shipping_method']['code']) {
$unset_shipping_method = false;
break 2;
}
}
}
}
}
if ($unset_shipping_method) {
unset($this->session->data['shipping_method']);
}
if ((!isset($this->session->data['shipping_method']) || empty($this->session->data['shipping_method'])) && (isset($this->session->data['shipping_methods']) && !empty($this->session->data['shipping_methods']))) {
$this->session->data['shipping_method'] = $this->model_extension_payment_klarna_checkout->getDefaultShippingMethod($this->session->data['shipping_methods']);
}
//Klarna Connector
list($klarna_account, $connector) = $this->model_extension_payment_klarna_checkout->getConnector($this->config->get('klarna_checkout_account'), $this->session->data['currency']);
if (!$klarna_account || !$connector) {
$redirect = $this->url->link('checkout/cart');
}
if (!$redirect) {
// Get currency code and currency value to use to calculate taxes
// Build order_lines
$create_order = true;
$klarna_checkout = false;
$this->createOrder();
list($klarna_order_data, $encrypted_order_data) = $this->klarnaOrderData($klarna_account);
if (isset($this->session->data['klarna_checkout_currency']) && $this->session->data['klarna_checkout_currency'] != $this->session->data['currency']) {
$this->model_extension_payment_klarna_checkout->log('Currency changed, unsetting kc order id');
unset($this->session->data['klarna_checkout_order_id']);
unset($this->session->data['klarna_checkout_data']);
}
$this->session->data['klarna_checkout_currency'] = $this->session->data['currency'];
// Fetch or create order
if (isset($this->session->data['klarna_checkout_order_id'])) {
$retrieve = $this->model_extension_payment_klarna_checkout->orderRetrieve($connector, $this->session->data['klarna_checkout_order_id']);
if ($retrieve) {
//If address has changed, unset klarna_checkout_order_id and create new order
$address_change = false;
if (isset($this->session->data['klarna_checkout_data']) && $this->session->data['klarna_checkout_data']) {
if (isset($this->session->data['klarna_checkout_data']['zone_code'])) {
$kc_region = $this->session->data['klarna_checkout_data']['zone_code'];
} else {
$kc_region = '';
}
if (isset($this->session->data['klarna_checkout_data']['iso_code_2'])) {
$kc_country = $this->session->data['klarna_checkout_data']['iso_code_2'];
} else {
$kc_country = '';
}
if (isset($this->session->data['shipping_address']['zone_code'])) {
$oc_region = $this->session->data['shipping_address']['zone_code'];
} else {
$oc_region = '';
}
if (isset($this->session->data['shipping_address']['iso_code_2'])) {
$oc_country = $this->session->data['shipping_address']['iso_code_2'];
} else {
$oc_country = '';
}
$kc_address = array('region' => $kc_region, 'country' => $kc_country);
$oc_address = array('region' => $oc_region, 'country' => $oc_country);
//If address has changed, dont use retrieved order, create new one instead
if (array_diff(array_map('strtolower', $kc_address), array_map('strtolower', $oc_address))) {
$address_change = true;
}
}
if (!$address_change) {
$this->model_extension_payment_klarna_checkout->log('Order Updated');
$this->model_extension_payment_klarna_checkout->log($klarna_order_data);
$create_order = false;
$update = $this->model_extension_payment_klarna_checkout->orderUpdate($connector, $this->session->data['klarna_checkout_order_id'], $klarna_order_data);
if ($update) {
$klarna_checkout = $update->fetch();
$this->model_extension_payment_klarna_checkout->updateOrder($this->session->data['order_id'], $klarna_checkout['order_id'], $encrypted_order_data);
}
}
}
}
if ($create_order) {
$this->model_extension_payment_klarna_checkout->log('Order Created');
$this->model_extension_payment_klarna_checkout->log($klarna_order_data);
unset($this->session->data['klarna_checkout_data']);
$create = $this->model_extension_payment_klarna_checkout->orderCreate($connector, $klarna_order_data);
if ($create) {
$klarna_checkout = $create->fetch();
$this->model_extension_payment_klarna_checkout->addOrder($this->session->data['order_id'], $klarna_checkout['order_id'], $encrypted_order_data);
}
}
if ($klarna_checkout) {
$this->session->data['klarna_checkout_order_id'] = $klarna_checkout['order_id'];
$html_snippet = $klarna_checkout['html_snippet'];
}
}
if (isset($this->request->post['response']) && $this->request->post['response'] == 'template') {
$data['redirect'] = $redirect;
$data['klarna_checkout'] = $html_snippet;
$this->response->setOutput($this->load->view('extension/payment/klarna_checkout_main', $data));
} elseif (isset($this->request->post['response']) && $this->request->post['response'] == 'json') {
$json['redirect'] = $redirect;
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}
}