protected function _addAddress($step)
 {
     $id_address = (int) Tools::getValue('id_address', 0);
     if ($id_address && !Tools::getValue('address_update', 0)) {
         $address = new Address((int) $id_address);
         if (Validate::isLoadedObject($address) and Customer::customerHasAddress((int) self::$cookie->id_customer, (int) $id_address)) {
             if (Tools::isSubmit('delete')) {
                 if (self::$cart->id_address_invoice == $address->id) {
                     unset(self::$cart->id_address_invoice);
                 }
                 if (self::$cart->id_address_delivery == $address->id) {
                     unset(self::$cart->id_address_delivery);
                 }
                 if ($address->delete()) {
                     Tools::redirect('order.php?step=1');
                 }
                 $this->errors[] = Tools::displayError('This address cannot be deleted.');
             }
             self::$smarty->assign(array('address' => $address, 'id_address' => (int) $id_address));
             if (Tools::isSubmit('id_state') and Tools::getValue('id_state') != NULL and is_numeric(Tools::getValue('id_state'))) {
                 $selected_state = Tools::getValue('id_state');
             } elseif (isset($address) and isset($address->id_state) and !empty($address->id_state) and isset($address->id_state)) {
                 $selected_state = $address->id_state;
             } else {
                 $selected_state = false;
             }
             // default to karnataka.
             if (Tools::isSubmit('id_country') and Tools::getValue('id_country') != NULL and is_numeric(Tools::getValue('id_country'))) {
                 $selected_country = Tools::getValue('id_country');
             } elseif (isset($address) and isset($address->id_country) and !empty($address->id_country) and isset($address->id_state)) {
                 $selected_country = $address->id_country;
             } else {
                 $selected_country = false;
             }
             self::$smarty->assign('selected_country', $selected_country);
             self::$smarty->assign('selected_state', $selected_state);
         }
     }
     if (Tools::isSubmit('submitAddress')) {
         $address = new Address();
         $this->errors = $address->validateControler();
         $address->id_customer = (int) self::$cookie->id_customer;
         if (!Tools::getValue('phone') and !Tools::getValue('phone_mobile')) {
             $this->errors[] = Tools::displayError('Please add your mobile phone number.');
         }
         if (!($country = new Country((int) $address->id_country)) or !Validate::isLoadedObject($country)) {
             die(Tools::displayError());
         }
         //remove zipcode verification
         /*
          $zip_code_format = $country->zip_code_format;
          if ($country->need_zip_code)
          {
          if (($postcode = Tools::getValue('postcode')) AND $zip_code_format)
          {
          $zip_regexp = '/^'.$zip_code_format.'$/ui';
          $zip_regexp = str_replace(' ', '( |)', $zip_regexp);
          $zip_regexp = str_replace('-', '(-|)', $zip_regexp);
          $zip_regexp = str_replace('N', '[0-9]', $zip_regexp);
          $zip_regexp = str_replace('L', '[a-zA-Z]', $zip_regexp);
          $zip_regexp = str_replace('C', $country->iso_code, $zip_regexp);
          if (!preg_match($zip_regexp, $postcode))
          $this->errors[] = '<strong>'.Tools::displayError('Post/Zip Code mentioned is incorrect.').'</strong> ';
          }
          elseif ($zip_code_format)
          $this->errors[] = '<strong>'.Tools::displayError('Post/Zip Code mentioned is incorrect.').'</strong> ';
          elseif ($postcode AND !preg_match('/^[0-9a-zA-Z -]{4,9}$/ui', $postcode))
          $this->errors[] = '<strong>'.Tools::displayError('Post/Zip Code mentioned is incorrect.').'</strong> ';
          }
         */
         if (!Tools::isSubmit('order_add_address_billing')) {
             //validate pincode and assign possible payment options
             $op = 0;
             $op = Carrier::getPreferredCarriers($country->id);
             if ($op == 0) {
                 $this->errors[] = 'We are sorry but we do not provide service to this region as of now. However, we keep adding new locations with time and would request you to check our website a few weeks later. We apologise for the inconvenience caused. ';
             }
         }
         if (!$country->isNeedDni()) {
             $address->dni = NULL;
         }
         if (Configuration::get('PS_TOKEN_ENABLE') == 1 and strcmp(Tools::getToken(false), Tools::getValue('token')) and self::$cookie->isLogged(true) === true) {
             $this->errors[] = Tools::displayError('Invalid token');
         }
         if ((int) $country->contains_states and !(int) $address->id_state) {
             $this->errors[] = Tools::displayError('Please select a state.');
         }
         if (!sizeof($this->errors)) {
             if (isset($id_address)) {
                 $country = new Country((int) $address->id_country);
                 if (Validate::isLoadedObject($country) and !$country->contains_states) {
                     $address->id_state = 0;
                 }
                 $address_old = new Address((int) $id_address);
                 if (Validate::isLoadedObject($address_old) and Customer::customerHasAddress((int) self::$cookie->id_customer, (int) $address_old->id)) {
                     if ($address_old->isUsed()) {
                         $address_old->delete();
                         if (!Tools::isSubmit('ajax')) {
                             $to_update = false;
                             if (self::$cart->id_address_invoice == $address_old->id) {
                                 $to_update = true;
                                 self::$cart->id_address_invoice = 0;
                             }
                             if (self::$cart->id_address_delivery == $address_old->id) {
                                 $to_update = true;
                                 self::$cart->id_address_delivery = 0;
                             }
                             if ($to_update) {
                                 self::$cart->update();
                             }
                         }
                     } else {
                         $address->id = (int) $address_old->id;
                         $address->date_add = $address_old->date_add;
                     }
                 }
             }
             if ($result = $address->save()) {
                 if (Tools::isSubmit('order_add_address')) {
                     self::$cart->id_address_delivery = (int) $address->id;
                     self::$cart->update();
                     self::$smarty->assign(array('op' => $op));
                 } else {
                     if (Tools::isSubmit('order_add_address_billing')) {
                         self::$cart->id_address_invoice = (int) $address->id;
                         self::$cart->update();
                     }
                 }
             } else {
                 $this->errors[] = Tools::displayError('An error occurred while updating your address.');
             }
         }
         if (sizeof($this->errors)) {
             self::$smarty->assign('errors', $this->errors);
             $this->step = 1;
         }
     }
 }
 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" />';
     }
     if (sizeof($messages)) {
         echo '<h2 style="padding:10px;background:#FF9292;color:#A60000">Alert: There are messages in this order! </h2>';
     }
     // 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="overflow-y: scroll; height: 200px"' : '') . '>';
         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 expected shipping information */
     echo '
     <fieldset style="width:400px">
     <legend><img src="../img/admin/delivery.gif" /> ' . $this->l('Expected Shipping Date') . '</legend>
     ' . $this->l('Expected date of shipping:') . ' <b>' . Tools::displayDate($order->expected_shipping_date, (int) $cookie->id_lang, true) . '</b><br />' . 'Original Date of shipping: <b>' . Tools::displayDate($order->actual_expected_shipping_date, (int) $cookie->id_lang, true) . '</b><br />';
     /* Display shipping number field */
     echo '
         <form action="' . $currentIndex . '&view' . $this->table . '&token=' . $this->token . '" method="post" style="margin-top:10px;">
         <input type="text" id="expected_shipping_date" name="expected_shipping_date" value="' . $order->shipping_number . '" />
         <input type="hidden" name="id_order" value="' . $order->id . '" />
         <input type="submit" name="submitExpectedShippingDate" value="' . $this->l('Set expected shipping date') . '" class="button" />
         </form>';
     echo '
     <script type="text/javascript" src="../js/jquery/jquery-ui-1.8.10.custom.min.js"></script>
     <script type="text/javascript">
         $(function() {
         $("#expected_shipping_date").datepicker({
             prevText:"",
             nextText:"",
             dateFormat:"yy-mm-dd"});
         });
     </script>
     </fieldset>';
     /* 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>';
     }
     /* Display carrier field */
     echo '
             <form action="' . $currentIndex . '&view' . $this->table . '&token=' . $this->token . '" method="post" style="margin-top:10px;">
                 <select name="id_carrier">';
     $carriers = array();
     $op = $cod = false;
     Carrier::getPreferredCarriers($addressDelivery->id_country, $carriers);
     $orderCarriers = false;
     if (strpos($order->payment, 'COD') === false) {
         $orderCarriers = $carriers['service'];
     } else {
         $orderCarriers = $carriers['cod'];
     }
     foreach ($orderCarriers as $cid) {
         if ($cid == UPS) {
             echo '<option value="' . UPS . '" ' . ($order->id_carrier == UPS ? 'selected="selected"' : '') . ' >UPS</option>';
         }
         if ($cid == ARAMEX) {
             echo '<option value="' . ARAMEX . '" ' . ($order->id_carrier == ARAMEX ? 'selected="selected"' : '') . ' >Aramex</option>';
         }
         if ($cid == FEDEX) {
             echo '<option value="' . FEDEX . '" ' . ($order->id_carrier == FEDEX ? 'selected="selected"' : '') . ' >Fedex</option>';
         }
         if ($cid == BLUEDART) {
             echo '<option value="' . BLUEDART . '" ' . ($order->id_carrier == BLUEDART ? 'selected="selected"' : '') . ' >BlueDart</option>';
         }
     }
     echo '
                 </select>
                 <input type="hidden" name="id_order" value="' . $order->id . '" />
                 <input type="submit" name="submitCarrier" value="' . $this->l('Set Carrier') . '" 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><td>' . $this->l('COD Charge') . '</td><td align="right">' . Tools::displayPrice($order->total_cod, $currency, false) . '</td></tr>
                 <tr><td style="font-size:18px; color:red">' . $this->l('Donation Amount') . '</td><td align="right">' . Tools::displayPrice($order->total_donation, $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;">
                 <p style="color:red">Special Instructions: ' . $cart->gift_message . '</p>
                 <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']) {
             $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">' . ((int) $product['product_quantity'] - $product['customizationQuantityTotal']) . '</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:450px; 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>';
     $employee = new Employee((int) $cookie->id_employee);
     //Add Order update form if not delivered or returned
     if ($employee->id_profile == 1 && (!$order->hasBeenDelivered() or $order->hasBeenDelivered() and Configuration::get('PS_ORDER_RETURN'))) {
         echo '
     
         <fieldset style="width: 868px;margin-top:10px;">
             <legend><img src="../img/admin/cart.gif" alt="' . $this->l('Update Order') . '" />' . $this->l('Update Order') . '</legend>
             <div style="float:left;">';
         if ($order->total_shipping > 0) {
             echo '<p><input type="checkbox" id="waiveShipping" name="waiveShipping" class="button" />&nbsp;<label for="waiveShipping" style="float:none; font-weight:normal;">' . $this->l('Waive Shipping') . '</label></p>';
         }
         echo '
                     <p><label style="float:none; font-weight:normal;">' . $this->l('Add Product (ID) :') . '&nbsp;</label><input type="text" id="addProductID" name="addProductID"/></p>
                     <p><label for="addDiscount" style="float:none; font-weight:normal;">' . $this->l('Add Discount :') . '&nbsp;</label><input type="text" id="addDiscount" name="addDiscount"/></p>
                     <div style="text-align:center; margin-top:5px;"><input type="submit" name="updateOrder" value="Update Order" class="button" style="margin-top:8px;" /></div>
                 
             
             </div>
         </fieldset>';
     }
     echo '
     </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="' . $_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') . '">
                 <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="' . $_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 />';
 }
 public function preProcess()
 {
     parent::preProcess();
     if ($back = Tools::getValue('back')) {
         self::$smarty->assign('back', Tools::safeOutput($back));
     }
     if ($mod = Tools::getValue('mod')) {
         self::$smarty->assign('mod', Tools::safeOutput($mod));
     }
     if (Tools::isSubmit('ajax') and Tools::isSubmit('type')) {
         if (Tools::getValue('type') == 'delivery') {
             $id_address = isset(self::$cart->id_address_delivery) ? (int) self::$cart->id_address_delivery : 0;
         } elseif (Tools::getValue('type') == 'invoice') {
             $id_address = (isset(self::$cart->id_address_invoice) and self::$cart->id_address_invoice != self::$cart->id_address_delivery) ? (int) self::$cart->id_address_invoice : 0;
         } else {
             exit;
         }
     } else {
         $id_address = (int) Tools::getValue('id_address', 0);
     }
     if ($id_address) {
         $this->_address = new Address((int) $id_address);
         if (Validate::isLoadedObject($this->_address) and Customer::customerHasAddress((int) self::$cookie->id_customer, (int) $id_address)) {
             if (Tools::isSubmit('delete')) {
                 if (self::$cart->id_address_invoice == $this->_address->id) {
                     unset(self::$cart->id_address_invoice);
                 }
                 if (self::$cart->id_address_delivery == $this->_address->id) {
                     unset(self::$cart->id_address_delivery);
                 }
                 if ($this->_address->delete()) {
                     Tools::redirect('addresses.php');
                 }
                 $this->errors[] = Tools::displayError('This address cannot be deleted.');
             }
             self::$smarty->assign(array('address' => $this->_address, 'id_address' => (int) $id_address));
         } elseif (Tools::isSubmit('ajax')) {
             exit;
         } else {
             Tools::redirect('addresses.php');
         }
     }
     if (Tools::isSubmit('submitAddress')) {
         $address = new Address();
         $this->errors = $address->validateControler();
         $address->id_customer = (int) self::$cookie->id_customer;
         if (!Tools::getValue('phone') and !Tools::getValue('phone_mobile')) {
             $this->errors[] = Tools::displayError('You must register at least one phone number');
         }
         if (!($country = new Country((int) $address->id_country)) or !Validate::isLoadedObject($country)) {
             die(Tools::displayError());
         }
         /* US customer: normalize the address */
         if ($address->id_country == Country::getByIso('US')) {
             include_once _PS_TAASC_PATH_ . 'AddressStandardizationSolution.php';
             $normalize = new AddressStandardizationSolution();
             $address->address1 = $normalize->AddressLineStandardization($address->address1);
             $address->address2 = $normalize->AddressLineStandardization($address->address2);
         }
         //remove zipcode verification
         /*
         $zip_code_format = $country->zip_code_format;
         if ($country->need_zip_code)
         {
         	if (($postcode = Tools::getValue('postcode')) AND $zip_code_format)
         	{
         		$zip_regexp = '/^'.$zip_code_format.'$/ui';
         		$zip_regexp = str_replace(' ', '( |)', $zip_regexp);
         		$zip_regexp = str_replace('-', '(-|)', $zip_regexp);
         		$zip_regexp = str_replace('N', '[0-9]', $zip_regexp);
         		$zip_regexp = str_replace('L', '[a-zA-Z]', $zip_regexp);
         		$zip_regexp = str_replace('C', $country->iso_code, $zip_regexp);
         		if (!preg_match($zip_regexp, $postcode))
         			$this->errors[] = '<strong>'.Tools::displayError('Post/Zip Code mentioned is incorrect.').'</strong> ';
         	}
         	elseif ($zip_code_format)
         		$this->errors[] = '<strong>'.Tools::displayError('Post/Zip Code mentioned is incorrect.').'</strong> ';
         	elseif ($postcode AND !preg_match('/^[0-9a-zA-Z -]{4,9}$/ui', $postcode))
         			$this->errors[] = '<strong>'.Tools::displayError('Post/Zip Code mentioned is incorrect.').'</strong> ';
         }
         */
         //validate pincode and assign possible payment options
         $op = $cod = 0;
         Carrier::getPreferredCarriers($postcode, $cod, $op);
         if ($op == 0 && $cod == 0) {
             $this->errors[] = 'We are sorry but we do not provide service to this region as of now. However, we keep adding new locations with time and would request you to check our website a few weeks later. We apologise for the inconvenience caused. ';
         }
         if ($country->isNeedDni() and (!Tools::getValue('dni') or !Validate::isDniLite(Tools::getValue('dni')))) {
             $this->errors[] = Tools::displayError('Identification number is incorrect or has already been used.');
         } elseif (!$country->isNeedDni()) {
             $address->dni = NULL;
         }
         if (Configuration::get('PS_TOKEN_ENABLE') == 1 and strcmp(Tools::getToken(false), Tools::getValue('token')) and self::$cookie->isLogged(true) === true) {
             $this->errors[] = Tools::displayError('Invalid token');
         }
         if ((int) $country->contains_states and !(int) $address->id_state) {
             $this->errors[] = Tools::displayError('This country requires a state selection.');
         }
         if (!sizeof($this->errors)) {
             if (isset($id_address)) {
                 $country = new Country((int) $address->id_country);
                 if (Validate::isLoadedObject($country) and !$country->contains_states) {
                     $address->id_state = 0;
                 }
                 $address_old = new Address((int) $id_address);
                 if (Validate::isLoadedObject($address_old) and Customer::customerHasAddress((int) self::$cookie->id_customer, (int) $address_old->id)) {
                     if ($address_old->isUsed()) {
                         $address_old->delete();
                         if (!Tools::isSubmit('ajax')) {
                             $to_update = false;
                             if (self::$cart->id_address_invoice == $address_old->id) {
                                 $to_update = true;
                                 self::$cart->id_address_invoice = 0;
                             }
                             if (self::$cart->id_address_delivery == $address_old->id) {
                                 $to_update = true;
                                 self::$cart->id_address_delivery = 0;
                             }
                             if ($to_update) {
                                 self::$cart->update();
                             }
                         }
                     } else {
                         $address->id = (int) $address_old->id;
                         $address->date_add = $address_old->date_add;
                     }
                 }
             } elseif (self::$cookie->is_guest) {
                 Tools::redirect('addresses.php');
             }
             if ($result = $address->save()) {
                 /* In order to select this new address : order-address.tpl */
                 if ((bool) Tools::getValue('select_address', false) == true or Tools::isSubmit('ajax') and Tools::getValue('type') == 'invoice') {
                     /* This new adress is for invoice_adress, select it */
                     self::$cart->id_address_invoice = (int) $address->id;
                     self::$cart->update();
                 }
                 if (Tools::isSubmit('ajax')) {
                     $return = array('hasError' => !empty($this->errors), 'errors' => $this->errors, 'id_address_delivery' => self::$cart->id_address_delivery, 'id_address_invoice' => self::$cart->id_address_invoice);
                     die(Tools::jsonEncode($return));
                 }
                 if (Tools::isSubmit('order_add_address')) {
                     self::$cart->id_address_invoice = (int) $address->id;
                     self::$cart->id_address_delivery = (int) $address->id;
                     self::$cart->update();
                     $back = $back . '&id_address_delivery=' . $address->id . '&id_address_invoice=' . $address->id . '&id_carrier=' . Tools::getValue('id_carrier');
                 }
                 Tools::redirect($back ? $mod ? $back . '&back=' . $mod : $back : 'addresses.php');
             }
             $this->errors[] = Tools::displayError('An error occurred while updating your address.');
         }
     } elseif (!$id_address) {
         $customer = new Customer((int) self::$cookie->id_customer);
         if (Validate::isLoadedObject($customer)) {
             $_POST['firstname'] = $customer->firstname;
             $_POST['lastname'] = $customer->lastname;
         }
     }
     if (Tools::isSubmit('ajax') and sizeof($this->errors)) {
         $return = array('hasError' => !empty($this->errors), 'errors' => $this->errors);
         die(Tools::jsonEncode($return));
     }
 }
Exemple #4
0
 /**
  * Attempts to finalize an accepted transaction
  *
  * @result string Should be 'accepted' unless something has gone quite wrong
  */
 public function finalizeOrder($response)
 {
     global $smarty, $cart, $cookie;
     require dirname(__FILE__) . '/Rc43.php';
     $DR = $response;
     $secret_key = Configuration::get('SECRET_KEY');
     //print_r($secret_key);
     if (isset($DR)) {
         $DR = preg_replace("/\\s/", "+", $DR);
         $rc4 = new Crypt_RC4($secret_key);
         $QueryString = base64_decode($DR);
         $rc4->decrypt($QueryString);
         $QueryString = split('&', $QueryString);
         $response = array();
         foreach ($QueryString as $param) {
             $param = split('=', $param);
             $response[$param[0]] = urldecode($param[1]);
         }
         //print_r($response);
     }
     $cartID = $response['MerchantRefNo'];
     $cart = new Cart($cartID);
     $deliveryAddress = new Address($cart->id_address_delivery);
     $op = $cod = 0;
     Carrier::getPreferredCarriers($deliveryAddress->postcode, $cod, $op);
     if ($op > 0) {
         $cart->id_carrier = (int) $op;
         $cart->update();
     }
     if ($response['ResponseCode'] == 0) {
         $responseMsg = "Your Order has Been Processed";
     } else {
         $responseMsg = "Transaction Failed, Retry!!";
     }
     $cart = new Cart(intval($response['MerchantRefNo']));
     //echo "<pre>";print_r($cart);
     //if (!$cart->id)
     //	return $this->l('Cart not found');
     if ($response['ResponseCode'] == 0) {
         $status = _PS_OS_PREPARATION_;
     } else {
         $status = Configuration::get('EBS_ID_ORDER_FAILED');
     }
     $this->validateOrder($response['MerchantRefNo'], $status, $response['Amount'], $this->displayName, $this->l('EBS transaction ID: ') . $response['PaymentID'], $response['ResponseMessage']);
     $customer = new Customer((int) $cart->id_customer);
     if ($response['ResponseCode'] == 0) {
         Tools::redirectLink(__PS_BASE_URI__ . 'order-confirmation.php?key=' . $customer->secure_key . '&id_cart=' . (int) $cart->id . '&id_module=' . (int) $this->id . '&id_order=' . (int) $this->currentOrder);
     }
     $smarty->assign(array('this_path' => $this->_path, 'responseMsg' => $responseMsg, 'this_path_ssl' => (Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://') . htmlspecialchars($_SERVER['HTTP_HOST'], ENT_COMPAT, 'UTF-8') . __PS_BASE_URI__ . 'modules/' . $this->name . '/'));
 }