ControllerExtensionPaymentKlarnaCheckout::main PHP Method

main() public method

public main ( )
    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));
        }
    }