public function initContent()
 {
     $this->display_column_left = false;
     $this->display_column_right = false;
     parent::initContent();
     global $smarty;
     if (isset($_GET['order_id'])) {
         $cart = Cart::getCartByOrderId($_GET['order_id']);
         if ($cart == null) {
             die;
         }
     } else {
         global $cart;
     }
     $address = new Address((int) $cart->id_address_invoice);
     $customer = new Customer((int) $cart->id_customer);
     $amount = $cart->getOrderTotal(true, Cart::BOTH);
     $przelewy24 = new Przelewy24();
     $currencies = $przelewy24->getCurrency(intval($cart->id_currency));
     $currency = $currencies[0];
     if (isset($currency['decimals']) && $currency['decimals'] == '0') {
         if (Configuration::get('PS_PRICE_ROUND_MODE') != null) {
             switch (Configuration::get('PS_PRICE_ROUND_MODE')) {
                 case 0:
                     $amount = ceil($amount);
                     break;
                 case 1:
                     $amount = floor($amount);
                     break;
                 case 2:
                     $amount = round($amount);
                     break;
             }
         }
     }
     $amount = number_format($amount, 2, '.', '') * 100;
     $s_sid = md5(time());
     Db::getInstance()->Execute('INSERT INTO `' . _DB_PREFIX_ . 'przelewy24_amount` ' . '(`s_sid`,`i_id_order`,`i_amount`) ' . 'VALUES("' . $s_sid . '",' . $cart->id . ',' . $amount . ')');
     $s_lang = new Country((int) $address->id_country);
     $order = Order::getOrderByCartId($cart->id);
     if ($order == null) {
         $s_descr = '';
         $validationRequired = true;
     } else {
         $s_descr = 'Zamówienie: ' . $order;
         $validationRequired = false;
     }
     $url = 'secure.przelewy24.pl';
     if (Configuration::get('P24_TEST_MODE') == 1) {
         if (Configuration::get('P24_TEST_MODE_TRANSACTION') == 1) {
             $url = 'sandbox.przelewy24.pl';
         } else {
             $url = 'sandbox.przelewy24.pl';
             $s_descr = 'TEST_ERR102';
         }
     }
     $smarty->assign(array('productsNumber' => $cart->nbProducts(), 'ps_version' => _PS_VERSION_, 'p24_url' => $url, 'p24_session_id' => $cart->id . '|' . $s_sid, 'p24_id_sprzedawcy' => Configuration::get('P24_ID_SPRZEDAWCY'), 'p24_kwota' => $amount, 'p24_opis' => $s_descr, 'p24_klient' => $customer->firstname . ' ' . $customer->lastname, 'p24_adres' => $address->address1 . " " . $address->address2, 'p24_kod' => $address->postcode, 'p24_miasto' => $address->city, 'p24_language' => strtolower($s_lang->iso_code), 'p24_kraj' => $s_lang->iso_code, 'p24_email' => $customer->email, 'p24_metoda' => Tools::getValue('payment_method'), 'p24_return_url_ok' => $this->context->link->getModuleLink('przelewy24', 'paymentSuccessful'), 'p24_return_url_error' => $this->context->link->getModuleLink('przelewy24', 'paymentFailed'), 'p24_validationRequired' => $validationRequired));
     $this->setTemplate('paymentConfirmation.tpl');
 }
Exemple #2
0
 /**
  * Display payment instruction for cash or transfer payments
  */
 public function initContent()
 {
     $this->display_column_left = false;
     parent::initContent();
     $errorMessage = NULL;
     if (Tools::getValue('order_id')) {
         $this->context->cart = Cart::getCartByOrderId(Tools::getValue('order_id'));
         $this->initPersonalData();
     }
     $channel = $this->context->cookie->dotpay_channel;
     unset($this->context->cookie->dotpay_channel);
     DotpayRegisterOrder::init($this);
     $payment = DotpayRegisterOrder::create($channel);
     if ($payment === NULL) {
         $instruction = DotpayInstruction::getByOrderId(Tools::getValue('order_id'));
         if (!empty($instruction) && $instruction->id == NULL) {
             $this->context->smarty->assign(array('isOk' => false));
         }
     } else {
         if (isset($payment['instruction']) && isset($payment['operation'])) {
             if ($this->api->isChannelInGroup($payment['operation']['payment_method']['channel_id'], array(DotpayApi::cashGroup))) {
                 $isCash = true;
             } else {
                 $isCash = false;
             }
             $instruction = new DotpayInstruction();
             $instruction->amount = $payment['instruction']['amount'];
             $instruction->currency = $payment['instruction']['currency'];
             $instruction->number = $payment['operation']['number'];
             $instruction->hash = DotpayInstruction::gethashFromPayment($payment);
             $instruction->is_cash = $isCash;
             $instruction->order_id = Tools::getValue('order_id');
             $instruction->channel = $payment['operation']['payment_method']['channel_id'];
             if (isset($payment['instruction']['recipient'])) {
                 $instruction->bank_account = $payment['instruction']['recipient']['bank_account_number'];
             }
             try {
                 $instruction->save();
             } catch (Exception $e) {
                 $this->context->smarty->assign(array('errorMessage' => $this->module->l("Unable to save instructions." . $e->getMessage())));
             }
         }
     }
     if (!empty($instruction) && $instruction->id != NULL) {
         if ($instruction->is_cash) {
             $template = 'cash.tpl';
             $address = $instruction->getPdfUrl($this->config->getDotpayTargetUrl());
             $bankImage = '';
         } else {
             $template = 'transfer.tpl';
             $address = $instruction->getBankPage($this->config->getDotpayTargetUrl());
         }
         $chData = $this->api->getChannelData($instruction->channel);
         $channelImage = $chData['logo'];
         $this->context->smarty->assign(array('meta_title' => $this->module->l('Complete payment'), 'isOk' => true, 'amount' => $instruction->amount, 'currency' => $instruction->currency, 'title' => $instruction->number, 'address' => $address, 'bankAccount' => $instruction->bank_account, 'recipient' => DotpayInstruction::DOTPAY_NAME, 'street' => DotpayInstruction::DOTPAY_STREET, 'city' => DotpayInstruction::DOTPAY_CITY, 'template' => './confirm/' . $template, 'channelImage' => $channelImage));
     }
     $this->setTemplate("confirm.tpl");
 }
Exemple #3
0
 /**
  * Preparing hidden form with payment data before sending it to Dotpay
  */
 public function initContent()
 {
     parent::initContent();
     $this->display_column_left = false;
     $this->display_header = false;
     $this->display_footer = false;
     $cartId = 0;
     if (Tools::getValue('order_id') == false) {
         $cartId = $this->context->cart->id;
         $exAmount = $this->api->getExtrachargeAmount(true);
         if ($exAmount > 0 && !$this->isExVPinCart()) {
             $productId = $this->config->getDotpayExchVPid();
             if ($productId != 0) {
                 $product = new Product($productId, true);
                 $product->price = $exAmount;
                 $product->save();
                 $product->flushPriceCache();
                 $this->context->cart->updateQty(1, $product->id);
                 $this->context->cart->update();
                 $this->context->cart->getPackageList(true);
             }
         }
         $discAmount = $this->api->getDiscountAmount();
         if ($discAmount > 0) {
             $discount = new CartRule($this->config->getDotpayDiscountId());
             $discount->reduction_amount = $this->api->getDiscountAmount();
             $discount->reduction_currency = $this->context->cart->id_currency;
             $discount->reduction_tax = 1;
             $discount->update();
             $this->context->cart->addCartRule($discount->id);
             $this->context->cart->update();
             $this->context->cart->getPackageList(true);
         }
         $result = $this->module->validateOrder($this->context->cart->id, (int) $this->config->getDotpayNewStatusId(), $this->getDotAmount(), $this->module->displayName, NULL, array(), NULL, false, $this->customer->secure_key);
     } else {
         $this->context->cart = Cart::getCartByOrderId(Tools::getValue('order_id'));
         $this->initPersonalData();
         $cartId = $this->context->cart->id;
     }
     $this->api->onPrepareAction(Tools::getValue('dotpay_type'), array('order' => Order::getOrderByCartId($cartId), 'customer' => $this->context->customer->id));
     $sa = new DotpaySellerApi($this->config->getDotpaySellerApiUrl());
     if ($this->config->isDotpayDispInstruction() && $this->config->isApiConfigOk() && $this->api->isChannelInGroup(Tools::getValue('channel'), array(DotpayApi::cashGroup, DotpayApi::transfersGroup)) && $sa->isAccountRight($this->config->getDotpayApiUsername(), $this->config->getDotpayApiPassword(), $this->config->getDotpayApiVersion())) {
         $this->context->cookie->dotpay_channel = Tools::getValue('channel');
         Tools::redirect($this->context->link->getModuleLink($this->module->name, 'confirm', array('order_id' => Order::getOrderByCartId($cartId))));
         die;
     }
     $this->context->smarty->assign(array('hiddenForm' => $this->api->getHiddenForm()));
     $cookie = new Cookie('lastOrder');
     $cookie->orderId = Order::getOrderByCartId($cartId);
     $cookie->write();
     $this->setTemplate("preparing.tpl");
 }
Exemple #4
0
 /**
  * Displays template with Dotpay payment channels
  */
 public function initContent()
 {
     $this->display_column_left = false;
     parent::initContent();
     if (Tools::getValue('order_id')) {
         $cart = Cart::getCartByOrderId(Tools::getValue('order_id'));
         if (empty($cart)) {
             $cart = new Cart();
         }
         $this->context->cart = $cart;
         $this->context->cart->update();
     }
     $this->context->smarty->assign($this->getArrayForSmarty(true));
     $this->setTemplate("payment.tpl");
 }
 public function changeIdOrderState($new_order_state = NULL, $id_order)
 {
     if ($new_order_state != NULL) {
         Hook::updateOrderStatus(intval($new_order_state), intval($id_order));
         /* Best sellers */
         $newOS = new OrderState(intval($new_order_state));
         $oldOrderStatus = OrderHistory::getLastOrderState(intval($id_order));
         $cart = Cart::getCartByOrderId($id_order);
         $isValidated = $this->isValidated();
         if (Validate::isLoadedObject($cart)) {
             foreach ($cart->getProducts() as $product) {
                 /* If becoming logable => adding sale */
                 if ($newOS->logable and (!$oldOrderStatus or !$oldOrderStatus->logable)) {
                     ProductSale::addProductSale($product['id_product'], $product['cart_quantity']);
                 } elseif (!$newOS->logable and ($oldOrderStatus and $oldOrderStatus->logable)) {
                     ProductSale::removeProductSale($product['id_product'], $product['cart_quantity']);
                 }
                 if (!$isValidated and $newOS->logable and isset($oldOrderStatus) and $oldOrderStatus and $oldOrderStatus->id == _PS_OS_ERROR_) {
                     Product::updateQuantity($product);
                     Hook::updateQuantity($product, $order);
                 }
             }
         }
         $this->id_order_state = intval($new_order_state);
         /* Change invoice number of order ? */
         $newOS = new OrderState(intval($new_order_state));
         $order = new Order(intval($id_order));
         if (!Validate::isLoadedObject($newOS) or !Validate::isLoadedObject($order)) {
             die(Tools::displayError('Invalid new order state'));
         }
         /* The order is valid only if the invoice is available and the order is not cancelled */
         $order->valid = $newOS->logable;
         $order->update();
         if ($newOS->invoice and !$order->invoice_number) {
             $order->setInvoice();
         }
         if ($newOS->delivery and !$order->delivery_number) {
             $order->setDelivery();
         }
         Hook::postUpdateOrderStatus(intval($new_order_state), intval($id_order));
     }
 }
 public function ajaxProcessDuplicateOrder()
 {
     if ($this->tabAccess['edit'] === '1') {
         $errors = array();
         if (!($id_order = Tools::getValue('id_order'))) {
             $errors[] = Tools::displayError('Invalid order');
         }
         $cart = Cart::getCartByOrderId($id_order);
         $new_cart = $cart->duplicate();
         if (!$new_cart || !Validate::isLoadedObject($new_cart['cart'])) {
             $errors[] = Tools::displayError('The order cannot be renewed.');
         } elseif (!$new_cart['success']) {
             $errors[] = Tools::displayError('The order cannot be renewed.');
         } else {
             $this->context->cart = $new_cart['cart'];
             echo Tools::jsonEncode($this->ajaxReturnVars());
         }
     }
 }
 private function getSingleMapData($params)
 {
     $cart = Cart::getCartByOrderId((int) $params['id_order']);
     if (Validate::isLoadedObject($cart)) {
         $products = $cart->getProducts();
         if (count($products) == 0 && method_exists('Shop', 'getContextShopID') && Shop::getContextShopID() != (int) $cart->id_shop) {
             Shop::initialize();
             $products = $cart->getProducts(true);
         }
         $currency = Currency::getCurrencyInstance((int) $cart->id_currency);
         if (!is_null($products) && is_array($products) && Validate::isLoadedObject($currency)) {
             $data = array();
             $data['order_date'] = $params['date_add'];
             $data['email'] = $params['email'];
             $data['customer_name'] = $params['firstname'] . ' ' . $params['lastname'];
             $data['order_id'] = (int) $params['id_order'];
             $data['currency_iso'] = $currency->iso_code;
             $products_arr = array();
             foreach ($products as $product) {
                 $product_data = array();
                 $product_data['url'] = $this->getProductLink($product['id_product'], $product['link_rewrite']);
                 $product_data['name'] = $product['name'];
                 $product_data['image'] = $this->getProductImageUrl((int) $product['id_product']);
                 $product_data['description'] = $this->getDescritpion($product, (int) $params['id_lang']);
                 $product_data['price'] = $product['price'];
                 $products_arr[(int) $product['id_product']] = $product_data;
             }
             $data['products'] = $products_arr;
             return $data;
         }
     }
     return null;
 }
 public function confirm()
 {
     // Global vars
     $kccPath = Configuration::get(KCC_PATH);
     $kccLogPath = Configuration::get(KCC_LOG);
     // Order States
     $order_state_completed = (int) Configuration::get('PS_OS_PAYMENT');
     $order_state_failed = (int) Configuration::get('PS_OS_ERROR');
     $order_state_waiting_payment = (int) Configuration::get(KCC_WAITING_PAYMENT_STATE);
     // TBK Vars
     $tbk_session_id = isset($_POST['TBK_ID_SESION']) ? trim($_POST['TBK_ID_SESION']) : null;
     $tbk_order_id = isset($_POST['TBK_ORDEN_COMPRA']) ? trim($_POST['TBK_ORDEN_COMPRA']) : null;
     $tbk_response = isset($_POST['TBK_RESPUESTA']) ? trim($_POST['TBK_RESPUESTA']) : null;
     $tbk_total_amount = isset($_POST['TBK_MONTO']) ? trim($_POST['TBK_MONTO']) : null;
     // Log helper closure
     $logger = function ($message) {
         $today = date('Y-m-d');
         $now = date('Y-m-d H:i:s');
         $name = "validation.{$today}.log";
         $path = _PS_MODULE_DIR_ . 'webpaykcc/logs/';
         $logPath = Configuration::get(KCC_LOG);
         if ($logPath) {
             $path = $logPath;
         }
         $logFile = $path . $name;
         $log = fopen($logFile, 'a');
         $text = "{$now} : {$message}\n";
         fwrite($log, $text);
         fclose($log);
     };
     // Helper closure
     // for the total amount
     $getOrderTotalAmount = function ($cart) {
         $order_total = 0;
         if ($cart) {
             $order_total = Tools::ps_round(floatval($cart->getOrderTotal(true, Cart::BOTH)), 0);
         }
         return $order_total;
     };
     // Default Values
     $result = KCC_REJECTED_RESULT;
     $order = null;
     $cart = null;
     $isDone = false;
     // Start Validation Process
     $logger("Start Validation");
     $logger("#################");
     // Log Params Received
     if (count($_POST) > 0) {
         $logger("Params Received");
         foreach ($_POST as $key => $value) {
             $logger("{$key} => {$value}");
         }
     } else {
         $logger("Params Not Found");
     }
     // Get cart data
     if (isset($tbk_order_id)) {
         try {
             $order = new Order(Order::getOrderByCartId($tbk_order_id));
             $cart = Cart::getCartByOrderId($order->id);
         } catch (Exception $e) {
             $logger($e->getMessage());
         }
     } else {
         $logger("TBK_ORDEN_COMPRA Not Set");
     }
     // First we must check the tbk_response.
     if (isset($tbk_response)) {
         if ($tbk_response == KCC_OK_RESPONSE) {
             $logger("Response is OK");
             // Both order and cart must exist
             if (isset($order->id) && isset($cart->id)) {
                 $logger("Order Exists");
                 // Now we check the current state of the order and cart
                 if ($order->current_state == $order_state_waiting_payment) {
                     $logger("Order is Waiting Payment");
                     // The amounts must be equal
                     $total_order_amount = $getOrderTotalAmount($cart);
                     // Needed 00 at the end
                     $total_order_amount_formatted = $total_order_amount . '00';
                     if ($total_order_amount_formatted == $tbk_total_amount) {
                         $logger("Amounts are Equal");
                         // Now check the session log file
                         if (isset($tbk_session_id)) {
                             //  The log file was generated in front controller
                             $tbk_log_path = getKccLog($kccLogPath, $tbk_session_id);
                             if (file_exists($tbk_log_path)) {
                                 // Open the log file
                                 $tbk_log = fopen($tbk_log_path, 'r');
                                 // Put everything inside in a string
                                 $tbk_log_string = fgets($tbk_log);
                                 fclose($tbk_log);
                                 // $tbk_details is an array
                                 // separated by semicolon
                                 $tbk_details = explode(';', $tbk_log_string);
                                 // Details should exist
                                 if (isset($tbk_details) && isset($tbk_details[0]) && isset($tbk_details[1])) {
                                     $logger("Session File Exists");
                                     $tbk_session_total_amount = $tbk_details[0];
                                     $tbk_session_order_id = $tbk_details[1];
                                     // Session values and POST values must be equal
                                     if ($tbk_session_total_amount == $tbk_total_amount && $tbk_session_order_id == $tbk_order_id) {
                                         $logger("Session Values are Correct");
                                         // Check KCC Path
                                         if (!(is_null($kccPath) || $kccPath == '')) {
                                             // The cache file is needed for validation
                                             $tbk_cache_path = $tbk_log_path . '.cache';
                                             $tbk_cache = fopen($tbk_cache_path, 'w+');
                                             // Write all the vars to cache
                                             foreach ($_POST as $tbk_key => $tbk_value) {
                                                 fwrite($tbk_cache, "{$tbk_key}={$tbk_value}&");
                                             }
                                             fclose($tbk_cache);
                                             $logger("Cache file created");
                                             // Execute the CGI Check Script
                                             $logger("Start CGI Verification Process");
                                             if (KCC_USE_EXEC) {
                                                 $logger("Verify Using Exec");
                                                 // Store the result in $tbk_result
                                                 // executing the script with the log cache file
                                                 // as param
                                                 $command = $kccPath . KCC_CGI_CHECK . ' ' . $tbk_cache_path;
                                                 exec($command, $tbk_result);
                                             } else {
                                                 // Use perl
                                                 // TODO: Implement Perl Someday
                                                 $logger("Verify Using Perl");
                                             }
                                             // Check the result
                                             $logger("Checking the CGI Result");
                                             if (isset($tbk_result[0]) && $tbk_result[0] == KCC_VERIFICATION_OK) {
                                                 // Verification OK
                                                 // Change the order status
                                                 $logger("Transbank Verification Complete");
                                                 $current_state = $order->current_state;
                                                 try {
                                                     $order->setCurrentState($order_state_completed);
                                                     $logger("Order State Was Changed From ({$current_state}) to ({$order->current_state})");
                                                 } catch (Exception $e) {
                                                     $logger($e->getMessage());
                                                 }
                                                 // Last Check
                                                 if ($order->current_state == $order_state_completed) {
                                                     $result = KCC_ACCEPTED_RESULT;
                                                     $logger("Order state is Completed");
                                                     $isDone = true;
                                                 } else {
                                                     $result = KCC_REJECTED_RESULT;
                                                     $logger("Order State is not Completed.");
                                                 }
                                             } else {
                                                 $logger("Failed CGI Verification " . json_encode($tbk_result));
                                             }
                                         } else {
                                             $logger("KCC Path not Found");
                                         }
                                     } else {
                                         $logger("Session and Post Vars are different");
                                         $logger("Session Total : {$tbk_session_total_amount}");
                                         $logger("TBK Total: {$tbk_total_amount}");
                                         $logger("Session Order: {$tbk_session_order_id}");
                                         $logger("TBK Order Id: {$tbk_order_id}");
                                     }
                                 } else {
                                     $logger("{$tbk_log_path} does not contains valid data");
                                 }
                             } else {
                                 $logger("{$tbk_log_path} does not exist");
                             }
                         } else {
                             $logger("TBK_ID_SESION not set");
                         }
                     } else {
                         $logger("Amounts are different " . "{$total_order_amount_formatted} != {$tbk_total_amount}");
                     }
                 } else {
                     $logger("Order State is not Waiting Payment ({$order_state_waiting_payment})");
                     $logger("Current Order State is ({$order->current_state})");
                 }
             } else {
                 $logger("Order not found in DB");
             }
         } else {
             if ($tbk_response >= -8 && $tbk_response <= -1) {
                 $result = KCC_ACCEPTED_RESULT;
                 $logger("Accepted Result, but TBK_RESPUESTA != OK (0)");
             } else {
                 $logger("TBK_RESPUESTA has invalid value");
             }
         }
     } else {
         $logger("TBK_RESPUESTA not set");
     }
     // Set state to failed if not done
     if (!$isDone && isset($order->current_state)) {
         if ($order->current_state != $order_state_completed) {
             try {
                 $order->setCurrentState($order_state_failed);
                 $logger("Order State was set to Failed ({$order_state_failed})");
             } catch (Exception $e) {
                 $logger($e->getMessage());
             }
         }
     }
     // End Validation Process
     $logger("Final Result: {$result}");
     $logger("End Validation");
     $logger("#################");
     echo $result;
 }
Exemple #9
0
 public function getRestToCapture($id_order)
 {
     $cart = Cart::getCartByOrderId($id_order);
     $total = Tools::ps_round($cart->getOrderTotal(), 2) - Tools::ps_round(self::getTotalAmountCapturedByIdOrder($id_order), 2);
     if ($total > Tools::ps_round(0, 2)) {
         return true;
     } else {
         return false;
     }
 }
 public function ajaxProcessDuplicateOrder()
 {
     if ($this->access('edit')) {
         $errors = array();
         if (!($id_order = Tools::getValue('id_order'))) {
             $errors[] = $this->trans('Invalid order', array(), 'Admin.OrdersCustomers.Notification');
         }
         $cart = Cart::getCartByOrderId($id_order);
         $new_cart = $cart->duplicate();
         if (!$new_cart || !Validate::isLoadedObject($new_cart['cart'])) {
             $errors[] = $this->trans('The order cannot be renewed.', array(), 'Admin.OrdersCustomers.Notification');
         } elseif (!$new_cart['success']) {
             $errors[] = $this->trans('The order cannot be renewed.', array(), 'Admin.OrdersCustomers.Notification');
         } else {
             $this->context->cart = $new_cart['cart'];
             echo json_encode($this->ajaxReturnVars());
         }
     }
 }
    public function viewDetails()
    {
        global $currentIndex, $cookie, $link;
        $irow = 0;
        if (!($order = $this->loadObject())) {
            return;
        }
        $customer = new Customer($order->id_customer);
        $customerStats = $customer->getStats();
        $addressInvoice = new Address($order->id_address_invoice, (int) $cookie->id_lang);
        if (Validate::isLoadedObject($addressInvoice) and $addressInvoice->id_state) {
            $invoiceState = new State((int) $addressInvoice->id_state);
        }
        $addressDelivery = new Address($order->id_address_delivery, (int) $cookie->id_lang);
        if (Validate::isLoadedObject($addressDelivery) and $addressDelivery->id_state) {
            $deliveryState = new State((int) $addressDelivery->id_state);
        }
        $carrier = new Carrier($order->id_carrier);
        $history = $order->getHistory($cookie->id_lang);
        $products = $order->getProducts();
        $customizedDatas = Product::getAllCustomizedDatas((int) $order->id_cart);
        Product::addCustomizationPrice($products, $customizedDatas);
        $discounts = $order->getDiscounts();
        $messages = Message::getMessagesByOrderId($order->id, true);
        $states = OrderState::getOrderStates((int) $cookie->id_lang);
        $currency = new Currency($order->id_currency);
        $currentLanguage = new Language((int) $cookie->id_lang);
        $currentState = OrderHistory::getLastOrderState($order->id);
        $sources = ConnectionsSource::getOrderSources($order->id);
        $cart = Cart::getCartByOrderId($order->id);
        $row = array_shift($history);
        if ($prevOrder = Db::getInstance()->getValue('SELECT id_order FROM ' . _DB_PREFIX_ . 'orders WHERE id_order < ' . (int) $order->id . ' ORDER BY id_order DESC')) {
            $prevOrder = '<a href="' . $currentIndex . '&token=' . Tools::getValue('token') . '&vieworder&id_order=' . $prevOrder . '"><img style="width:24px;height:24px" src="../img/admin/arrow-left.png" /></a>';
        }
        if ($nextOrder = Db::getInstance()->getValue('SELECT id_order FROM ' . _DB_PREFIX_ . 'orders WHERE id_order > ' . (int) $order->id . ' ORDER BY id_order ASC')) {
            $nextOrder = '<a href="' . $currentIndex . '&token=' . Tools::getValue('token') . '&vieworder&id_order=' . $nextOrder . '"><img style="width:24px;height:24px" src="../img/admin/arrow-right.png" /></a>';
        }
        if ($order->total_paid != $order->total_paid_real) {
            echo '<center><span class="warning" style="font-size: 16px">' . $this->l('Warning:') . ' ' . Tools::displayPrice($order->total_paid_real, $currency, false) . ' ' . $this->l('paid instead of') . ' ' . Tools::displayPrice($order->total_paid, $currency, false) . ' !</span></center><div class="clear"><br /><br /></div>';
        }
        // display bar code if module enabled
        $hook = Module::hookExec('invoice', array('id_order' => $order->id));
        if ($hook !== false) {
            echo '<div style="float: right; margin: -40px 40px 10px 0;">';
            echo $hook;
            echo '</div><br class="clear" />';
        }
        // display order header
        echo '
		<div style="float:left" style="width:440px">';
        echo '<h2>
				' . $prevOrder . '
				' . (Validate::isLoadedObject($customer) ? $customer->firstname . ' ' . $customer->lastname . ' - ' : '') . $this->l('Order #') . sprintf('%06d', $order->id) . '
				' . $nextOrder . '
			</h2>
			<div style="width:429px">
				' . ((($currentState->invoice or $order->invoice_number) and count($products)) ? '<a href="pdf.php?id_order=' . $order->id . '&pdf"><img src="../img/admin/charged_ok.gif" alt="' . $this->l('View invoice') . '" /> ' . $this->l('View invoice') . '</a>' : '<img src="../img/admin/charged_ko.gif" alt="' . $this->l('No invoice') . '" /> ' . $this->l('No invoice')) . ' -
				' . (($currentState->delivery or $order->delivery_number) ? '<a href="pdf.php?id_delivery=' . $order->delivery_number . '"><img src="../img/admin/delivery.gif" alt="' . $this->l('View delivery slip') . '" /> ' . $this->l('View delivery slip') . '</a>' : '<img src="../img/admin/delivery_ko.gif" alt="' . $this->l('No delivery slip') . '" /> ' . $this->l('No delivery slip')) . ' -
				<a href="javascript:window.print()"><img src="../img/admin/printer.gif" alt="' . $this->l('Print order') . '" title="' . $this->l('Print order') . '" /> ' . $this->l('Print page') . '</a>
			</div>
			<div class="clear">&nbsp;</div>';
        /* Display current status */
        echo '
			<table cellspacing="0" cellpadding="0" class="table" style="width: 429px">
				<tr>
					<th>' . Tools::displayDate($row['date_add'], (int) $cookie->id_lang, true) . '</th>
					<th><img src="../img/os/' . $row['id_order_state'] . '.gif" /></th>
					<th>' . stripslashes($row['ostate_name']) . '</th>
					<th>' . (!empty($row['employee_lastname']) ? '(' . stripslashes(Tools::substr($row['employee_firstname'], 0, 1)) . '. ' . stripslashes($row['employee_lastname']) . ')' : '') . '</th>
				</tr>';
        /* Display previous status */
        foreach ($history as $row) {
            echo '
				<tr class="' . ($irow++ % 2 ? 'alt_row' : '') . '">
					<td>' . Tools::displayDate($row['date_add'], (int) $cookie->id_lang, true) . '</td>
					<td><img src="../img/os/' . $row['id_order_state'] . '.gif" /></td>
					<td>' . stripslashes($row['ostate_name']) . '</td>
					<td>' . (!empty($row['employee_lastname']) ? '(' . stripslashes(Tools::substr($row['employee_firstname'], 0, 1)) . '. ' . stripslashes($row['employee_lastname']) . ')' : '') . '</td>
				</tr>';
        }
        echo '
			</table>
			<br />';
        /* Display status form */
        echo '
			<form action="' . $currentIndex . '&view' . $this->table . '&token=' . $this->token . '" method="post" style="text-align:center;">
				<select name="id_order_state">';
        $currentStateTab = $order->getCurrentStateFull($cookie->id_lang);
        foreach ($states as $state) {
            echo '<option value="' . $state['id_order_state'] . '"' . ($state['id_order_state'] == $currentStateTab['id_order_state'] ? ' selected="selected"' : '') . '>' . stripslashes($state['name']) . '</option>';
        }
        echo '
				</select>
				<input type="hidden" name="id_order" value="' . $order->id . '" />
				<input type="submit" name="submitState" value="' . $this->l('Change') . '" class="button" />
			</form>';
        /* Display customer information */
        if (Validate::isLoadedObject($customer)) {
            echo '<br />
			<fieldset style="width: 400px">
				<legend><img src="../img/admin/tab-customers.gif" /> ' . $this->l('Customer information') . '</legend>
				<span style="font-weight: bold; font-size: 14px;"><a href="?tab=AdminCustomers&id_customer=' . $customer->id . '&viewcustomer&token=' . Tools::getAdminToken('AdminCustomers' . (int) Tab::getIdFromClassName('AdminCustomers') . (int) $cookie->id_employee) . '"> ' . $customer->firstname . ' ' . $customer->lastname . '</a></span> (' . $this->l('#') . $customer->id . ')<br />
				(<a href="mailto:' . $customer->email . '">' . $customer->email . '</a>)<br /><br />';
            if ($customer->isGuest()) {
                echo '
				' . $this->l('This order has been placed by a') . ' <b>' . $this->l('guest') . '</b>';
                if (!Customer::customerExists($customer->email)) {
                    echo '<form method="POST" action="index.php?tab=AdminCustomers&id_customer=' . (int) $customer->id . '&token=' . Tools::getAdminTokenLite('AdminCustomers') . '">
						<input type="hidden" name="id_lang" value="' . (int) $order->id_lang . '" />
						<p class="center"><input class="button" type="submit" name="submitGuestToCustomer" value="' . $this->l('Transform to customer') . '" /></p>
						' . $this->l('This feature will generate a random password and send an e-mail to the customer') . '
					</form>';
                } else {
                    echo '<div><b style="color:red;">' . $this->l('A registered customer account exists with the same email address') . '</b></div>';
                }
            } else {
                echo $this->l('Account registered:') . ' ' . Tools::displayDate($customer->date_add, (int) $cookie->id_lang, true) . '<br />
				' . $this->l('Valid orders placed:') . ' <b>' . $customerStats['nb_orders'] . '</b><br />
				' . $this->l('Total paid since registration:') . ' <b>' . Tools::displayPrice(Tools::ps_round(Tools::convertPrice($customerStats['total_orders'], $currency), 2), $currency, false) . '</b><br />';
            }
            echo '</fieldset>';
        }
        /* Display sources */
        if (sizeof($sources)) {
            echo '<br />
			<fieldset style="width: 400px;"><legend><img src="../img/admin/tab-stats.gif" /> ' . $this->l('Sources') . '</legend><ul ' . (sizeof($sources) > 3 ? 'style="height: 200px; overflow-y: scroll; width: 360px;"' : '') . '>';
            foreach ($sources as $source) {
                echo '<li>
						' . Tools::displayDate($source['date_add'], (int) $cookie->id_lang, true) . '<br />
						<b>' . $this->l('From:') . '</b> <a href="' . $source['http_referer'] . '">' . preg_replace('/^www./', '', parse_url($source['http_referer'], PHP_URL_HOST)) . '</a><br />
						<b>' . $this->l('To:') . '</b> ' . $source['request_uri'] . '<br />
						' . ($source['keywords'] ? '<b>' . $this->l('Keywords:') . '</b> ' . $source['keywords'] . '<br />' : '') . '<br />
					</li>';
            }
            echo '</ul></fieldset>';
        }
        // display hook specified to this page : AdminOrder
        if (($hook = Module::hookExec('adminOrder', array('id_order' => $order->id))) !== false) {
            echo $hook;
        }
        echo '
		</div>
		<div style="float: left; margin-left: 40px">';
        /* Display invoice information */
        echo '<fieldset style="width: 400px">';
        if (($currentState->invoice or $order->invoice_number) and count($products)) {
            echo '<legend><a href="pdf.php?id_order=' . $order->id . '&pdf"><img src="../img/admin/charged_ok.gif" /> ' . $this->l('Invoice') . '</a></legend>
				<a href="pdf.php?id_order=' . $order->id . '&pdf">' . $this->l('Invoice #') . '<b>' . Configuration::get('PS_INVOICE_PREFIX', (int) $cookie->id_lang) . sprintf('%06d', $order->invoice_number) . '</b></a>
				<br />' . $this->l('Created on:') . ' ' . Tools::displayDate($order->invoice_date, (int) $cookie->id_lang, true);
        } else {
            echo '<legend><img src="../img/admin/charged_ko.gif" />' . $this->l('Invoice') . '</legend>
				' . $this->l('No invoice yet.');
        }
        echo '</fieldset><br />';
        /* Display shipping infos */
        echo '
		<fieldset style="width:400px">
			<legend><img src="../img/admin/delivery.gif" /> ' . $this->l('Shipping information') . '</legend>
			' . $this->l('Total weight:') . ' <b>' . number_format($order->getTotalWeight(), 3) . ' ' . Configuration::get('PS_WEIGHT_UNIT') . '</b><br />
			' . $this->l('Carrier:') . ' <b>' . ($carrier->name == '0' ? Configuration::get('PS_SHOP_NAME') : $carrier->name) . '</b><br />
			' . (($currentState->delivery or $order->delivery_number) ? '<br /><a href="pdf.php?id_delivery=' . $order->delivery_number . '">' . $this->l('Delivery slip #') . '<b>' . Configuration::get('PS_DELIVERY_PREFIX', (int) $cookie->id_lang) . sprintf('%06d', $order->delivery_number) . '</b></a><br />' : '');
        if ($order->shipping_number) {
            echo $this->l('Tracking number:') . ' <b>' . $order->shipping_number . '</b> ' . (!empty($carrier->url) ? '(<a href="' . str_replace('@', $order->shipping_number, $carrier->url) . '" target="_blank">' . $this->l('Track the shipment') . '</a>)' : '');
        }
        /* Carrier module */
        if ($carrier->is_module == 1) {
            $module = Module::getInstanceByName($carrier->external_module_name);
            if (method_exists($module, 'displayInfoByCart')) {
                echo call_user_func(array($module, 'displayInfoByCart'), $order->id_cart);
            }
        }
        /* Display shipping number field */
        if ($carrier->url && $order->hasBeenShipped()) {
            echo '
				<form action="' . $currentIndex . '&view' . $this->table . '&token=' . $this->token . '" method="post" style="margin-top:10px;">
					<input type="text" name="shipping_number" value="' . $order->shipping_number . '" />
					<input type="hidden" name="id_order" value="' . $order->id . '" />
					<input type="submit" name="submitShippingNumber" value="' . $this->l('Set shipping number') . '" class="button" />
				</form>';
        }
        echo '
		</fieldset>';
        /* Display summary order */
        echo '
		<br />
		<fieldset style="width: 400px">
			<legend><img src="../img/admin/details.gif" /> ' . $this->l('Order details') . '</legend>
			<label>' . $this->l('Original cart:') . ' </label>
			<div style="margin: 2px 0 1em 190px;"><a href="?tab=AdminCarts&id_cart=' . $cart->id . '&viewcart&token=' . Tools::getAdminToken('AdminCarts' . (int) Tab::getIdFromClassName('AdminCarts') . (int) $cookie->id_employee) . '">' . $this->l('Cart #') . sprintf('%06d', $cart->id) . '</a></div>
			<label>' . $this->l('Payment mode:') . ' </label>
			<div style="margin: 2px 0 1em 190px;">' . Tools::substr($order->payment, 0, 32) . ' ' . ($order->module ? '(' . $order->module . ')' : '') . '</div>
			<div style="margin: 2px 0 1em 50px;">
				<table class="table" width="300px;" cellspacing="0" cellpadding="0">
					<tr><td width="150px;">' . $this->l('Products') . '</td><td align="right">' . Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency, false) . '</td></tr>
					' . ($order->total_discounts > 0 ? '<tr><td>' . $this->l('Discounts') . '</td><td align="right">-' . Tools::displayPrice($order->total_discounts, $currency, false) . '</td></tr>' : '') . '
					' . ($order->total_wrapping > 0 ? '<tr><td>' . $this->l('Wrapping') . '</td><td align="right">' . Tools::displayPrice($order->total_wrapping, $currency, false) . '</td></tr>' : '') . '
					<tr><td>' . $this->l('Shipping') . '</td><td align="right">' . Tools::displayPrice($order->total_shipping, $currency, false) . '</td></tr>
					<tr style="font-size: 20px"><td>' . $this->l('Total') . '</td><td align="right">' . Tools::displayPrice($order->total_paid, $currency, false) . ($order->total_paid != $order->total_paid_real ? '<br /><font color="red">(' . $this->l('Paid:') . ' ' . Tools::displayPrice($order->total_paid_real, $currency, false, false) . ')</font>' : '') . '</td></tr>
				</table>
			</div>
			<div style="float: left; margin-right: 10px; margin-left: 42px;">
				<span class="bold">' . $this->l('Recycled package:') . '</span>
				' . ($order->recyclable ? '<img src="../img/admin/enabled.gif" />' : '<img src="../img/admin/disabled.gif" />') . '
			</div>
			<div style="float: left; margin-right: 10px;">
				<span class="bold">' . $this->l('Gift wrapping:') . '</span>
				 ' . ($order->gift ? '<img src="../img/admin/enabled.gif" />
			</div>
			<div style="clear: left; margin: 0px 42px 0px 42px; padding-top: 2px;">
				' . (!empty($order->gift_message) ? '<div style="border: 1px dashed #999; padding: 5px; margin-top: 8px;"><b>' . $this->l('Message:') . '</b><br />' . nl2br2($order->gift_message) . '</div>' : '') : '<img src="../img/admin/disabled.gif" />') . '
			</div>
		</fieldset>';
        echo '</div>
		<div class="clear">&nbsp;</div>';
        /* Display adresses : delivery & invoice */
        echo '<div class="clear">&nbsp;</div>
		<div style="float: left">
			<fieldset style="width: 400px;">
				<legend><img src="../img/admin/delivery.gif" alt="' . $this->l('Shipping address') . '" />' . $this->l('Shipping address') . '</legend>
				<div style="float: right">
					<a href="?tab=AdminAddresses&id_address=' . $addressDelivery->id . '&addaddress&realedit=1&id_order=' . $order->id . ($addressDelivery->id == $addressInvoice->id ? '&address_type=1' : '') . '&token=' . Tools::getAdminToken('AdminAddresses' . (int) Tab::getIdFromClassName('AdminAddresses') . (int) $cookie->id_employee) . '&back=' . urlencode($_SERVER['REQUEST_URI']) . '"><img src="../img/admin/edit.gif" /></a>
					<a href="http://maps.google.com/maps?f=q&hl=' . $currentLanguage->iso_code . '&geocode=&q=' . $addressDelivery->address1 . ' ' . $addressDelivery->postcode . ' ' . $addressDelivery->city . ($addressDelivery->id_state ? ' ' . $deliveryState->name : '') . '" target="_blank"><img src="../img/admin/google.gif" alt="" class="middle" /></a>
				</div>
				' . $this->displayAddressDetail($addressDelivery) . (!empty($addressDelivery->other) ? '<hr />' . $addressDelivery->other . '<br />' : '') . '</fieldset>
		</div>
		<div style="float: left; margin-left: 40px">
			<fieldset style="width: 400px;">
				<legend><img src="../img/admin/invoice.gif" alt="' . $this->l('Invoice address') . '" />' . $this->l('Invoice address') . '</legend>
				<div style="float: right"><a href="?tab=AdminAddresses&id_address=' . $addressInvoice->id . '&addaddress&realedit=1&id_order=' . $order->id . ($addressDelivery->id == $addressInvoice->id ? '&address_type=2' : '') . '&back=' . urlencode($_SERVER['REQUEST_URI']) . '&token=' . Tools::getAdminToken('AdminAddresses' . (int) Tab::getIdFromClassName('AdminAddresses') . (int) $cookie->id_employee) . '"><img src="../img/admin/edit.gif" /></a></div>
				' . $this->displayAddressDetail($addressInvoice) . (!empty($addressInvoice->other) ? '<hr />' . $addressInvoice->other . '<br />' : '') . '</fieldset>
		</div>
		<div class="clear">&nbsp;</div>';
        // List of products
        echo '
		<a name="products"><br /></a>
		<form action="' . $currentIndex . '&submitCreditSlip&vieworder&token=' . $this->token . '" method="post" onsubmit="return orderDeleteProduct(\'' . $this->l('Cannot return this product') . '\', \'' . $this->l('Quantity to cancel is greater than quantity available') . '\');">
			<input type="hidden" name="id_order" value="' . $order->id . '" />
			<fieldset style="width: 868px; ">
				<legend><img src="../img/admin/cart.gif" alt="' . $this->l('Products') . '" />' . $this->l('Products') . '</legend>
				<div style="float:left;">
					<table style="width: 868px;" cellspacing="0" cellpadding="0" class="table" id="orderProducts">
						<tr>
							<th align="center" style="width: 60px">&nbsp;</th>
							<th>' . $this->l('Product') . '</th>
							<th style="width: 80px; text-align: center">' . $this->l('UP') . ' <sup>*</sup></th>
							<th style="width: 20px; text-align: center">' . $this->l('Qty') . '</th>
							' . ($order->hasBeenPaid() ? '<th style="width: 20px; text-align: center">' . $this->l('Refunded') . '</th>' : '') . '
							' . ($order->hasBeenDelivered() ? '<th style="width: 20px; text-align: center">' . $this->l('Returned') . '</th>' : '') . '
							<th style="width: 30px; text-align: center">' . $this->l('Stock') . '</th>
							<th style="width: 90px; text-align: center">' . $this->l('Total') . ' <sup>*</sup></th>
							<th colspan="2" style="width: 120px;"><img src="../img/admin/delete.gif" alt="' . $this->l('Products') . '" /> ' . ($order->hasBeenDelivered() ? $this->l('Return') : ($order->hasBeenPaid() ? $this->l('Refund') : $this->l('Cancel'))) . '</th>';
        echo '
						</tr>';
        $tokenCatalog = Tools::getAdminToken('AdminCatalog' . (int) Tab::getIdFromClassName('AdminCatalog') . (int) $cookie->id_employee);
        foreach ($products as $k => $product) {
            if ($order->getTaxCalculationMethod() == PS_TAX_EXC) {
                $product_price = $product['product_price'] + $product['ecotax'];
            } else {
                $product_price = $product['product_price_wt'];
            }
            $image = array();
            if (isset($product['product_attribute_id']) and (int) $product['product_attribute_id']) {
                $image = Db::getInstance()->getRow('
								SELECT id_image
								FROM ' . _DB_PREFIX_ . 'product_attribute_image
								WHERE id_product_attribute = ' . (int) $product['product_attribute_id']);
            }
            if (!isset($image['id_image']) or !$image['id_image']) {
                $image = Db::getInstance()->getRow('
								SELECT id_image
								FROM ' . _DB_PREFIX_ . 'image
								WHERE id_product = ' . (int) $product['product_id'] . ' AND cover = 1');
            }
            $stock = Db::getInstance()->getRow('
							SELECT ' . ($product['product_attribute_id'] ? 'pa' : 'p') . '.quantity
							FROM ' . _DB_PREFIX_ . 'product p
							' . ($product['product_attribute_id'] ? 'LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute pa ON p.id_product = pa.id_product' : '') . '
							WHERE p.id_product = ' . (int) $product['product_id'] . '
							' . ($product['product_attribute_id'] ? 'AND pa.id_product_attribute = ' . (int) $product['product_attribute_id'] : ''));
            if (isset($image['id_image'])) {
                $target = _PS_TMP_IMG_DIR_ . 'product_mini_' . (int) $product['product_id'] . (isset($product['product_attribute_id']) ? '_' . (int) $product['product_attribute_id'] : '') . '.jpg';
                if (file_exists($target)) {
                    $products[$k]['image_size'] = getimagesize($target);
                }
            }
            // Customization display
            $this->displayCustomizedDatas($customizedDatas, $product, $currency, $image, $tokenCatalog, $k);
            // Normal display
            if ($product['product_quantity'] > $product['customizationQuantityTotal']) {
                $quantity = $product['product_quantity'] - $product['customizationQuantityTotal'];
                $imageObj = new Image($image['id_image']);
                echo '
								<tr' . ((isset($image['id_image']) and isset($products[$k]['image_size'])) ? ' height="' . ($products[$k]['image_size'][1] + 7) . '"' : '') . '>
									<td align="center">' . (isset($image['id_image']) ? cacheImage(_PS_IMG_DIR_ . 'p/' . $imageObj->getExistingImgPath() . '.jpg', 'product_mini_' . (int) $product['product_id'] . (isset($product['product_attribute_id']) ? '_' . (int) $product['product_attribute_id'] : '') . '.jpg', 45, 'jpg') : '--') . '</td>
									<td><a href="index.php?tab=AdminCatalog&id_product=' . $product['product_id'] . '&updateproduct&token=' . $tokenCatalog . '">
										<span class="productName">' . $product['product_name'] . '</span><br />
										' . ($product['product_reference'] ? $this->l('Ref:') . ' ' . $product['product_reference'] . '<br />' : '') . ($product['product_supplier_reference'] ? $this->l('Ref Supplier:') . ' ' . $product['product_supplier_reference'] : '') . '</a></td>
									<td align="center">' . Tools::displayPrice($product_price, $currency, false) . '</td>
									<td align="center" class="productQuantity" ' . ($quantity > 1 ? 'style="font-weight:700;font-size:1.1em;color:red"' : '') . '>' . (int) $quantity . '</td>
									' . ($order->hasBeenPaid() ? '<td align="center" class="productQuantity">' . (int) $product['product_quantity_refunded'] . '</td>' : '') . '
									' . ($order->hasBeenDelivered() ? '<td align="center" class="productQuantity">' . (int) $product['product_quantity_return'] . '</td>' : '') . '
									<td align="center" class="productQuantity">' . (int) $stock['quantity'] . '</td>
									<td align="center">' . Tools::displayPrice(Tools::ps_round($product_price, 2) * ((int) $product['product_quantity'] - $product['customizationQuantityTotal']), $currency, false) . '</td>
									<td align="center" class="cancelCheck">
										<input type="hidden" name="totalQtyReturn" id="totalQtyReturn" value="' . (int) $product['product_quantity_return'] . '" />
										<input type="hidden" name="totalQty" id="totalQty" value="' . (int) $product['product_quantity'] . '" />
										<input type="hidden" name="productName" id="productName" value="' . $product['product_name'] . '" />';
                if ((!$order->hasBeenDelivered() or Configuration::get('PS_ORDER_RETURN')) and (int) $product['product_quantity_return'] < (int) $product['product_quantity']) {
                    echo '
										<input type="checkbox" name="id_order_detail[' . $k . ']" id="id_order_detail[' . $k . ']" value="' . $product['id_order_detail'] . '" onchange="setCancelQuantity(this, ' . (int) $product['id_order_detail'] . ', ' . (int) ($product['product_quantity_in_stock'] - $product['customizationQuantityTotal'] - $product['product_quantity_reinjected']) . ')" ' . ((int) ($product['product_quantity_return'] + $product['product_quantity_refunded']) >= (int) $product['product_quantity'] ? 'disabled="disabled" ' : '') . '/>';
                } else {
                    echo '--';
                }
                echo '
									</td>
									<td class="cancelQuantity">';
                if ((int) ($product['product_quantity_return'] + $product['product_quantity_refunded']) >= (int) $product['product_quantity']) {
                    echo '<input type="hidden" name="cancelQuantity[' . $k . ']" value="0" />';
                } elseif (!$order->hasBeenDelivered() or Configuration::get('PS_ORDER_RETURN')) {
                    echo '
										<input type="text" id="cancelQuantity_' . (int) $product['id_order_detail'] . '" name="cancelQuantity[' . $k . ']" size="2" onclick="selectCheckbox(this);" value="" /> ';
                }
                echo $this->getCancelledProductNumber($order, $product) . '
									</td>
								</tr>';
            }
        }
        echo '
					</table>
					<div style="float:left; width:280px; margin-top:15px;"><sup>*</sup> ' . $this->l('According to the group of this customer, prices are printed:') . ' ' . ($order->getTaxCalculationMethod() == PS_TAX_EXC ? $this->l('tax excluded.') : $this->l('tax included.')) . (!Configuration::get('PS_ORDER_RETURN') ? '<br /><br />' . $this->l('Merchandise returns are disabled') : '') . '</div>';
        if (sizeof($discounts)) {
            echo '
					<div style="float:right; width:280px; margin-top:15px;">
					<table cellspacing="0" cellpadding="0" class="table" style="width:100%;">
						<tr>
							<th><img src="../img/admin/coupon.gif" alt="' . $this->l('Discounts') . '" />' . $this->l('Discount name') . '</th>
							<th align="center" style="width: 100px">' . $this->l('Value') . '</th>
						</tr>';
            foreach ($discounts as $discount) {
                echo '
						<tr>
							<td>' . $discount['name'] . '</td>
							<td align="center">' . ($discount['value'] != 0.0 ? '- ' : '') . Tools::displayPrice($discount['value'], $currency, false) . '</td>
						</tr>';
            }
            echo '
					</table></div>';
        }
        echo '
				</div>';
        // Cancel product
        echo '
				<div style="clear:both; height:15px;">&nbsp;</div>
				<div style="float: right; width: 160px;">';
        if ($order->hasBeenDelivered() and Configuration::get('PS_ORDER_RETURN')) {
            echo '
					<input type="checkbox" id="reinjectQuantities" name="reinjectQuantities" class="button" />&nbsp;<label for="reinjectQuantities" style="float:none; font-weight:normal;">' . $this->l('Re-stock products') . '</label><br />';
        }
        if (!$order->hasBeenDelivered() and $order->hasBeenPaid() or $order->hasBeenDelivered() and Configuration::get('PS_ORDER_RETURN')) {
            echo '
					<input type="checkbox" id="generateCreditSlip" name="generateCreditSlip" class="button" onclick="toogleShippingCost(this)" />&nbsp;<label for="generateCreditSlip" style="float:none; font-weight:normal;">' . $this->l('Generate a credit slip') . '</label><br />
					<input type="checkbox" id="generateDiscount" name="generateDiscount" class="button" onclick="toogleShippingCost(this)" />&nbsp;<label for="generateDiscount" style="float:none; font-weight:normal;">' . $this->l('Generate a voucher') . '</label><br />
					<span id="spanShippingBack" style="display:none;"><input type="checkbox" id="shippingBack" name="shippingBack" class="button" />&nbsp;<label for="shippingBack" style="float:none; font-weight:normal;">' . $this->l('Repay shipping costs') . '</label><br /></span>';
        }
        if (!$order->hasBeenDelivered() or $order->hasBeenDelivered() and Configuration::get('PS_ORDER_RETURN')) {
            echo '
					<div style="text-align:center; margin-top:5px;"><input type="submit" name="cancelProduct" value="' . ($order->hasBeenDelivered() ? $this->l('Return products') : ($order->hasBeenPaid() ? $this->l('Refund products') : $this->l('Cancel products'))) . '" class="button" style="margin-top:8px;" /></div>';
        }
        echo '
				</div>';
        echo '
			</fieldset>
		</form>
		<div class="clear" style="height:20px;">&nbsp;</div>';
        /* Display send a message to customer & returns/credit slip*/
        $returns = OrderReturn::getOrdersReturn($order->id_customer, $order->id);
        $slips = OrderSlip::getOrdersSlip($order->id_customer, $order->id);
        echo '
		<div style="float: left">
			<form action="' . Tools::safeOutput($_SERVER['REQUEST_URI']) . '&token=' . $this->token . '" method="post" onsubmit="if (getE(\'visibility\').checked == true) return confirm(\'' . $this->l('Do you want to send this message to the customer?', __CLASS__, true, false) . '\');">
			<fieldset style="width: 400px;">
				<legend style="cursor: pointer;" onclick="$(\'#message\').slideToggle();$(\'#message_m\').slideToggle();return false"><img src="../img/admin/email_edit.gif" /> ' . $this->l('New message') . '</legend>
				<div id="message_m" style="display: ' . (Tools::getValue('message') ? 'none' : 'block') . '; overflow: auto; width: 400px;">
					<a href="#" onclick="$(\'#message\').slideToggle();$(\'#message_m\').slideToggle();return false"><b>' . $this->l('Click here') . '</b> ' . $this->l('to add a comment or send a message to the customer') . '</a>
				</div>
				<div id="message" style="display: ' . (Tools::getValue('message') ? 'block' : 'none') . '">
					<select name="order_message" id="order_message" onchange="orderOverwriteMessage(this, \'' . $this->l('Do you want to overwrite your existing message?') . '\')">
						<option value="0" selected="selected">-- ' . $this->l('Choose a standard message') . ' --</option>';
        $orderMessages = OrderMessage::getOrderMessages((int) $order->id_lang);
        foreach ($orderMessages as $orderMessage) {
            echo '		<option value="' . htmlentities($orderMessage['message'], ENT_COMPAT, 'UTF-8') . '">' . $orderMessage['name'] . '</option>';
        }
        echo '		</select><br /><br />
					<b>' . $this->l('Display to consumer?') . '</b>
					<input type="radio" name="visibility" id="visibility" value="0" /> ' . $this->l('Yes') . '
					<input type="radio" name="visibility" value="1" checked="checked" /> ' . $this->l('No') . '
					<p id="nbchars" style="display:inline;font-size:10px;color:#666;"></p><br /><br />
					<textarea id="txt_msg" name="message" cols="50" rows="8" onKeyUp="var length = document.getElementById(\'txt_msg\').value.length; if (length > 600) length = \'600+\'; document.getElementById(\'nbchars\').innerHTML = \'' . $this->l('600 chars max') . ' (\' + length + \')\';">' . htmlentities(Tools::getValue('message'), ENT_COMPAT, 'UTF-8') . '</textarea><br /><br />
					<input type="hidden" name="id_order" value="' . (int) $order->id . '" />
					<input type="hidden" name="id_customer" value="' . (int) $order->id_customer . '" />
					<input type="submit" class="button" name="submitMessage" value="' . $this->l('Send') . '" />
				</div>
			</fieldset>
			</form>';
        /* Display list of messages */
        if (sizeof($messages)) {
            echo '
			<br />
			<fieldset style="width: 400px;">
			<legend><img src="../img/admin/email.gif" /> ' . $this->l('Messages') . '</legend>';
            foreach ($messages as $message) {
                echo '<div style="overflow:auto; width:400px;" ' . ($message['is_new_for_me'] ? 'class="new_message"' : '') . '>';
                if ($message['is_new_for_me']) {
                    echo '<a class="new_message" title="' . $this->l('Mark this message as \'viewed\'') . '" href="' . Tools::safeOutput($_SERVER['REQUEST_URI']) . '&token=' . $this->token . '&messageReaded=' . (int) $message['id_message'] . '"><img src="../img/admin/enabled.gif" alt="" /></a>';
                }
                echo $this->l('At') . ' <i>' . Tools::displayDate($message['date_add'], (int) $cookie->id_lang, true);
                echo '</i> ' . $this->l('from') . ' <b>' . ($message['elastname'] ? $message['efirstname'] . ' ' . $message['elastname'] : $message['cfirstname'] . ' ' . $message['clastname']) . '</b>';
                echo (int) $message['private'] == 1 ? '<span style="color:red; font-weight:bold;">' . $this->l('Private:') . '</span>' : '';
                echo '<p>' . nl2br2($message['message']) . '</p>';
                echo '</div>';
                echo '<br />';
            }
            echo '<p class="info">' . $this->l('When you read a message, please click on the green check.') . '</p>';
            echo '</fieldset>';
        }
        echo '</div>';
        /* Display return product */
        echo '<div style="float: left; margin-left: 40px">
			<fieldset style="width: 400px;">
				<legend><img src="../img/admin/return.gif" alt="' . $this->l('Merchandise returns') . '" />' . $this->l('Merchandise returns') . '</legend>';
        if (!sizeof($returns)) {
            echo $this->l('No merchandise return for this order.');
        } else {
            foreach ($returns as $return) {
                $state = new OrderReturnState($return['state']);
                echo '(' . Tools::displayDate($return['date_upd'], $cookie->id_lang) . ') :
				<b><a href="index.php?tab=AdminReturn&id_order_return=' . $return['id_order_return'] . '&updateorder_return&token=' . Tools::getAdminToken('AdminReturn' . (int) Tab::getIdFromClassName('AdminReturn') . (int) $cookie->id_employee) . '">' . $this->l('#') . sprintf('%06d', $return['id_order_return']) . '</a></b> -
				' . $state->name[$cookie->id_lang] . '<br />';
            }
        }
        echo '</fieldset>';
        /* Display credit slip */
        echo '
				<br />
				<fieldset style="width: 400px;">
					<legend><img src="../img/admin/slip.gif" alt="' . $this->l('Credit slip') . '" />' . $this->l('Credit slip') . '</legend>';
        if (!sizeof($slips)) {
            echo $this->l('No slip for this order.');
        } else {
            foreach ($slips as $slip) {
                echo '(' . Tools::displayDate($slip['date_upd'], $cookie->id_lang) . ') : <b><a href="pdf.php?id_order_slip=' . $slip['id_order_slip'] . '">' . $this->l('#') . sprintf('%06d', $slip['id_order_slip']) . '</a></b><br />';
            }
        }
        echo '</fieldset>
		</div>';
        echo '<div class="clear">&nbsp;</div>';
        echo '<br /><br /><a href="' . $currentIndex . '&token=' . $this->token . '"><img src="../img/admin/arrow2.gif" /> ' . $this->l('Back to list') . '</a><br />';
    }
 private function handleOK()
 {
     // Get Webpay Post Data
     // Check if the Post Data exists
     $session_id = isset($_POST['TBK_ID_SESION']) ? $_POST['TBK_ID_SESION'] : null;
     $cart_id = isset($_POST['TBK_ORDEN_COMPRA']) ? $_POST['TBK_ORDEN_COMPRA'] : null;
     $response = isset($_POST['TBK_RESPUESTA']) ? $_POST['TBK_RESPUESTA'] : null;
     $tbk_total_amount = isset($_POST['TBK_MONTO']) ? $_POST['TBK_MONTO'] : null;
     // log files
     $tbk_log_path = null;
     $tbk_cache_path = null;
     // Paths from Configuration
     $kccPath = Configuration::get(KCC_PATH);
     $kccLogPath = Configuration::get(KCC_LOG);
     $kccTocPage = Configuration::get(KCC_TOC_PAGE_URL);
     $cart = null;
     $order = null;
     $customer = null;
     $webpaykcc = new WebpayKcc();
     // Error vars
     $error = false;
     $error_message = null;
     // Set the log paths
     // and cart and order vars
     if (!is_null($cart_id) && !is_null($session_id)) {
         //  The log file was generated in front controller
         $tbk_log_path = getKccLog($kccLogPath, $session_id);
         // The cache file is needed for validation
         // was generated in validate.php
         $tbk_cache_path = $tbk_log_path . '.cache';
         // Get cart data
         // $cart_id is set in /controllers/front/payment.php
         // as the current cart id
         // this is called by transbank with those vars
         try {
             $order = new Order(Order::getOrderByCartId($cart_id));
             $cart = Cart::getCartByOrderId($order->id);
         } catch (Exception $e) {
             $error = true;
             $error_message = $e->getMessage();
         }
     } else {
         $error = true;
         $error_message = 'Session and Cart params not found';
     }
     // Start Checks for Success
     if (!$error) {
         // Check if log files are present
         if (file_exists($tbk_log_path) && file_exists($tbk_cache_path)) {
             // Check if order and cart exists
             if (isset($order->id) && isset($cart->id)) {
                 // Check for customer
                 $customer = $order->getCustomer();
                 if (isset($customer->id)) {
                     // Check Log Data
                     $tbk_cache = fopen($tbk_cache_path, 'r');
                     $tbk_cache_string = fgets($tbk_cache);
                     fclose($tbk_cache);
                     $tbk_data = explode('&', $tbk_cache_string);
                     // there must be at least 12 params
                     // response is the 2nd param
                     if (is_array($tbk_data) && isset($tbk_data[2]) && count($tbk_data) >= 12) {
                         // Check Response to be OK
                         $tbk_response = explode('=', $tbk_data[2]);
                         if (isset($tbk_response[1]) && $tbk_response[1] == KCC_OK_RESPONSE) {
                             // Check current order state
                             // must be completed
                             $order_state_completed = (int) Configuration::get('PS_OS_PAYMENT');
                             if ($order->current_state == $order_state_completed) {
                                 // Everything seems OK
                                 // should render the Success Page
                                 $error = false;
                                 $error_message = null;
                             } else {
                                 $error = true;
                                 $error_message = "Order state is not completed, current state {$order->current_state}";
                             }
                         } else {
                             $error = true;
                             $error_message = 'Response is not OK';
                         }
                     } else {
                         $error = true;
                         $error_message = 'Cache data is invalid';
                     }
                 } else {
                     $error = true;
                     $error_message = 'Customer not found';
                 }
             } else {
                 $error = true;
                 $error_message = 'Order or Cart Objects not Found';
             }
         } else {
             $error = true;
             $error_message = 'Log files not found';
         }
     }
     // Render the template
     if (!$error && is_null($error_message)) {
         // Init params var
         $params = array();
         // Get the active shop id if in multistore shop
         $activeShopID = (int) Context::getContext()->shop->id;
         // Parse Cache
         // $tbk_data and tbk_response are set in checks above
         $tbk_cart_id = explode('=', $tbk_data[0]);
         $tbk_transaction_type = explode('=', $tbk_data[1]);
         $tbk_amount = explode('=', $tbk_data[3]);
         $tbk_auth_code = explode('=', $tbk_data[4]);
         $tbk_card_last_digit = explode('=', $tbk_data[5]);
         $tbk_accounting_date = explode('=', $tbk_data[6]);
         $tbk_transaction_date = explode('=', $tbk_data[7]);
         $tbk_transaction_time = explode('=', $tbk_data[8]);
         $tbk_transaction_id = explode('=', $tbk_data[10]);
         $tbk_payment_type = explode('=', $tbk_data[11]);
         $tbk_installment_quantity = explode('=', $tbk_data[12]);
         $tbk_mac = explode('=', $tbk_data[13]);
         // Do some formatting for the Accounting Year
         $tbk_accounting_year = date('Y');
         if (substr($tbk_accounting_date[1], 0, 2) == '12' && date('d') == '01') {
             $tbk_accounting_year = date('Y') - 1;
         } else {
             if (substr($tbk_accounting_date[1], 0, 2) == '01' && date('d') == '12') {
                 $tbk_accounting_year = date('Y') + 1;
             }
         }
         // Do some formatting for the Transaction Year
         $tbk_transaction_year = date('Y');
         if (substr($tbk_transaction_date[1], 0, 2) == '12' && date('d') == '01') {
             $tbk_transaction_year = date('Y') - 1;
         } else {
             if (substr($tbk_transaction_date[1], 0, 2) == '01' && date('d') == '12') {
                 $tbk_transaction_year = date('Y') + 1;
             }
         }
         // Start Adding info to Params
         // Format transaction date
         $params['tbk_transaction_date'] = substr($tbk_transaction_date[1], 2, 2) . '-' . substr($tbk_transaction_date[1], 0, 2) . '-' . $tbk_transaction_year;
         // Format transaction time
         $params['tbk_transaction_time'] = substr($tbk_transaction_time[1], 0, 2) . ':' . substr($tbk_transaction_time[1], 2, 2) . ':' . substr($tbk_transaction_time[1], 4, 2);
         // Do some formatting for the payment type
         if ($tbk_payment_type[1] == 'VD') {
             $params['tbk_payment_type'] = $this->module->l('Redcompra');
         } else {
             $params['tbk_payment_type'] = $this->module->l("Crédito");
         }
         // Do some formatting for the Installment Type
         if ($tbk_payment_type[1] == 'VN') {
             $params['tbk_installment_type'] = $this->module->l('Sin cuotas');
         } else {
             if ($tbk_payment_type[1] == 'VC') {
                 $params['tbk_installment_type'] = $this->module->l('Cuotas normales');
             } else {
                 if ($tbk_payment_type[1] == 'SI') {
                     $params['tbk_installment_type'] = $this->module->l('Sin interés');
                 } else {
                     if ($tbk_payment_type[1] == 'S2') {
                         $params['tbk_installment_type'] = $this->module->l('Dos cuotas sin interés');
                     } else {
                         if ($tbk_payment_type[1] == 'CI') {
                             $params['tbk_installment_type'] = $this->module->l('Cuotas comercio');
                         } else {
                             if ($tbk_payment_type[1] == 'VD') {
                                 $params['tbk_installment_type'] = $this->module->l('Débito');
                             }
                         }
                     }
                 }
             }
         }
         // Check for Quantity of Installments
         if ($tbk_installment_quantity[1] == 0) {
             $params['tbk_installment_quantity'] = '00';
         } else {
             $params['tbk_installment_quantity'] = $tbk_installment_quantity[1];
         }
         // Add more info to params
         // General Info
         $base_url = Tools::getShopDomainSsl(true, true);
         $order_history_url = $base_url . __PS_BASE_URI__ . 'index.php?controller=order-detail&id_cart=' . $cart_id . '&id_module=' . (int) $webpaykcc->id . '&id_order=' . $order->id . '&key=' . $customer->secure_key . '&status=OPEN';
         $params['toc_page'] = $kccTocPage;
         $params['order_history'] = $order_history_url;
         $params['shop_name'] = Context::getContext()->shop->name;
         $params['shop_url'] = $base_url;
         $params['customer_name'] = $customer->firstname . ' ' . $customer->lastname;
         // Transbank Info
         $params['tbk_accounting_year'] = $tbk_accounting_year;
         $params['tbk_transaction_year'] = $tbk_transaction_year;
         $params['tbk_mac'] = $tbk_mac[1];
         $params['tbk_cart_id'] = $tbk_cart_id[1];
         // TODO: Should check tbk_transaction_type value
         // For now this will work
         $params['tbk_transaction_type'] = $this->module->l('Venta');
         $params['tbk_amount'] = $tbk_amount[1] / 100;
         $params['tbk_auth_code'] = $tbk_auth_code[1];
         $params['tbk_card_last_digit'] = '************' . $tbk_card_last_digit[1];
         $params['tbk_transaction_id'] = $tbk_transaction_id[1];
         $params['string'] = print_r($params, true);
         $params['logo'] = $this->logo;
         // Now we pass the data
         // to smarty and render
         // the template
         $this->context->smarty->assign($params);
         $this->setTemplate('success.tpl');
     } else {
         // for generating pages
         $base_url = Tools::getShopDomainSsl(true, true) . __PS_BASE_URI__;
         // Base URL for success
         // or failure pages
         $module_url = "index.php?fc=module&module=" . "{$webpaykcc->name}&controller=" . "validate" . "&cartId=" . $cart_id;
         $failure_page = $base_url . $module_url . "&return=error";
         // set the error message
         $this->error_message = $error_message;
         // Redirect to failure
         // $this->handleError();
         Tools::redirect($failure_page);
     }
 }
 public function getOrderData($order)
 {
     $xml = new DOMDocument('1.0', 'utf-8');
     $xml_root = $xml->createElement('OrderDetails');
     $xml->appendChild($xml_root);
     $cart = Cart::getCartByOrderId((int) $order->id);
     $products = $cart->getProducts();
     if (count($products)) {
         foreach ($products as $product) {
             $item_id = $product['id_product'];
             $order_id = (int) $order->id;
             //$product_id = $product['id_product'];
             $product_sku = $product['name'] . '_' . $product['id_product'];
             $product_name = $product['name'];
             $qty = $product['cart_quantity'];
             $price = $product['price'];
             $subtotal = '0';
             $taxtotal = '0';
             $grandtotal = '0';
             $xml_item = $xml->createElement('Item');
             $xml_item->appendChild($xml->createTextNode($product_name));
             $dom_attribute = $xml->createAttribute('MerchentOrderRecordRef');
             $dom_attribute->value = $order_id;
             $xml_item->appendChild($dom_attribute);
             $dom_attribute = $xml->createAttribute('MerchentOrderRecordLineRef');
             $dom_attribute->value = $item_id;
             $xml_item->appendChild($dom_attribute);
             $dom_attribute = $xml->createAttribute('Sku');
             $dom_attribute->value = $product_sku;
             $xml_item->appendChild($dom_attribute);
             $dom_attribute = $xml->createAttribute('Qty');
             $dom_attribute->value = $qty;
             $xml_item->appendChild($dom_attribute);
             $dom_attribute = $xml->createAttribute('Price');
             $dom_attribute->value = $price;
             $xml_item->appendChild($dom_attribute);
             $dom_attribute = $xml->createAttribute('LineSubTotal');
             $dom_attribute->value = $subtotal;
             $xml_item->appendChild($dom_attribute);
             $dom_attribute = $xml->createAttribute('LineTaxesTotal');
             $dom_attribute->value = $taxtotal;
             $xml_item->appendChild($dom_attribute);
             $dom_attribute = $xml->createAttribute('LineTotal');
             $dom_attribute->value = $grandtotal;
             $xml_item->appendChild($dom_attribute);
             $xml_root->appendChild($xml_item);
         }
     }
     $xml_order_details = $xml->saveXML();
     return $xml_order_details;
 }