diff --git a/admin-dev/tabs/AdminOrders.php b/admin-dev/tabs/AdminOrders.php
deleted file mode 100644
index 600724fa2..000000000
--- a/admin-dev/tabs/AdminOrders.php
+++ /dev/null
@@ -1,1037 +0,0 @@
-
-* @copyright 2007-2011 PrestaShop SA
-* @version Release: $Revision: 7451 $
-* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
-* International Registered Trademark & Property of PrestaShop SA
-*/
-
-class AdminOrders extends AdminTab
-{
- public function __construct()
- {
- $this->context = Context::getContext();
- $this->table = 'order';
- $this->className = 'Order';
- $this->view = true;
- $this->colorOnBackground = true;
- $this->_select = '
- a.id_order AS id_pdf,
- CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`,
- osl.`name` AS `osname`,
- os.`color`,
- IF((SELECT COUNT(so.id_order) FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new,
- (SELECT COUNT(od.`id_order`) FROM `'._DB_PREFIX_.'order_detail` od WHERE od.`id_order` = a.`id_order` GROUP BY `id_order`) AS product_number';
- $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`)
- LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (oh.`id_order` = a.`id_order`)
- LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`)
- LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$this->context->language->id.')';
- $this->_where = 'AND oh.`id_order_history` = (SELECT MAX(`id_order_history`) FROM `'._DB_PREFIX_.'order_history` moh WHERE moh.`id_order` = a.`id_order` GROUP BY moh.`id_order`)';
-
- $statesArray = array();
- $states = OrderState::getOrderStates((int)$this->context->language->id);
-
- foreach ($states AS $state)
- $statesArray[$state['id_order_state']] = $state['name'];
- $this->fieldsDisplay = array(
- 'id_order' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25),
- 'new' => array('title' => $this->l('New'), 'width' => 25, 'align' => 'center', 'type' => 'bool', 'filter_key' => 'new', 'tmpTableFilter' => true, 'icon' => array(0 => 'blank.gif', 1 => 'news-new.gif'), 'orderby' => false),
- 'customer' => array('title' => $this->l('Customer'), 'widthColumn' => 160, 'width' => 140, 'filter_key' => 'customer', 'tmpTableFilter' => true),
- 'total_paid' => array('title' => $this->l('Total'), 'width' => 70, 'align' => 'right', 'prefix' => '', 'suffix' => ' ', 'price' => true, 'currency' => true),
- 'payment' => array('title' => $this->l('Payment'), 'width' => 100),
- 'osname' => array('title' => $this->l('Status'), 'widthColumn' => 230, 'type' => 'select', 'select' => $statesArray, 'filter_key' => 'os!id_order_state', 'filter_type' => 'int', 'width' => 200),
- 'date_add' => array('title' => $this->l('Date'), 'width' => 35, 'align' => 'right', 'type' => 'datetime', 'filter_key' => 'a!date_add'),
- 'id_pdf' => array('title' => $this->l('PDF'), 'callback' => 'printPDFIcons', 'orderby' => false, 'search' => false));
- $this->shopLinkType = 'shop';
- $this->shopShareDatas = Shop::SHARE_ORDER;
- parent::__construct();
- }
-
- public function postProcess()
- {
- /* Update shipping number */
- if (Tools::isSubmit('submitShippingNumber') AND ($id_order = (int)(Tools::getValue('id_order'))) AND Validate::isLoadedObject($order = new Order($id_order)))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- if (!$order->hasBeenShipped())
- die(Tools::displayError('The shipping number can only be set once the order has been shipped.'));
- $_GET['view'.$this->table] = true;
-
- $shipping_number = pSQL(Tools::getValue('shipping_number'));
- $order->shipping_number = $shipping_number;
- $order->update();
- if ($shipping_number)
- {
- global $_LANGMAIL;
- $customer = new Customer((int)($order->id_customer));
- $carrier = new Carrier((int)($order->id_carrier));
- if (!Validate::isLoadedObject($customer) OR !Validate::isLoadedObject($carrier))
- die(Tools::displayError());
- $templateVars = array(
- '{followup}' => str_replace('@', $order->shipping_number, $carrier->url),
- '{firstname}' => $customer->firstname,
- '{lastname}' => $customer->lastname,
- '{id_order}' => (int)($order->id)
- );
- @Mail::Send((int)($order->id_lang), 'in_transit', Mail::l('Package in transit'), $templateVars,
- $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL, NULL,
- _PS_MAIL_DIR_, true);
- }
- }
- else
- $this->_errors[] = Tools::displayError('You do not have permission to edit here.');
- }
-
- /* Change order state, add a new entry in order history and send an e-mail to the customer if needed */
- elseif (Tools::isSubmit('submitState') AND ($id_order = (int)(Tools::getValue('id_order'))) AND Validate::isLoadedObject($order = new Order($id_order)))
- {
- if ($this->tabAccess['edit'] === '1')
- {
- $_GET['view'.$this->table] = true;
- if (!$newOrderStatusId = (int)(Tools::getValue('id_order_state')))
- $this->_errors[] = Tools::displayError('Invalid new order status');
- else
- {
- $history = new OrderHistory();
- $history->id_order = (int)$id_order;
- $history->id_employee = (int)$this->context->employee->id;
- if (!(int)Tools::getValue('id_warehouse'))
- $this->_errors[] = Tools::displayError('An error occurred while changing the status.');
- else
- {
- $history->changeIdOrderState((int)($newOrderStatusId), (int)($id_order), (int)Tools::getValue('id_warehouse'));
- $order = new Order((int)$order->id);
- $carrier = new Carrier((int)($order->id_carrier), (int)($order->id_lang));
- $templateVars = array();
- if ($history->id_order_state == Configuration::get('PS_OS_SHIPPING') AND $order->shipping_number)
- $templateVars = array('{followup}' => str_replace('@', $order->shipping_number, $carrier->url));
- else if ($history->id_order_state == Configuration::get('PS_OS_CHEQUE'))
- $templateVars = array(
- '{cheque_name}' => (Configuration::get('CHEQUE_NAME') ? Configuration::get('CHEQUE_NAME') : ''),
- '{cheque_address_html}' => (Configuration::get('CHEQUE_ADDRESS') ? nl2br(Configuration::get('CHEQUE_ADDRESS')) : ''));
- elseif ($history->id_order_state == Configuration::get('PS_OS_BANKWIRE'))
- $templateVars = array(
- '{bankwire_owner}' => (Configuration::get('BANK_WIRE_OWNER') ? Configuration::get('BANK_WIRE_OWNER') : ''),
- '{bankwire_details}' => (Configuration::get('BANK_WIRE_DETAILS') ? nl2br(Configuration::get('BANK_WIRE_DETAILS')) : ''),
- '{bankwire_address}' => (Configuration::get('BANK_WIRE_ADDRESS') ? nl2br(Configuration::get('BANK_WIRE_ADDRESS')) : ''));
- if ($history->addWithemail(true, $templateVars))
- Tools::redirectAdmin(self::$currentIndex.'&id_order='.$id_order.'&vieworder'.'&token='.$this->token);
- $this->_errors[] = Tools::displayError('An error occurred while changing the status or was unable to send e-mail to the customer.');
- }
- }
- }
- else
- $this->_errors[] = Tools::displayError('You do not have permission to edit here.');
- }
-
- /* Add a new message for the current order and send an e-mail to the customer if needed */
- elseif (isset($_POST['submitMessage']))
- {
- $_GET['view'.$this->table] = true;
- if ($this->tabAccess['edit'] === '1')
- {
- if (!($id_order = (int)(Tools::getValue('id_order'))) OR !($id_customer = (int)(Tools::getValue('id_customer'))))
- $this->_errors[] = Tools::displayError('An error occurred before sending message');
- elseif (!Tools::getValue('message'))
- $this->_errors[] = Tools::displayError('Message cannot be blank');
- else
- {
- /* Get message rules and and check fields validity */
- $rules = call_user_func(array('Message', 'getValidationRules'), 'Message');
- foreach ($rules['required'] AS $field)
- if (($value = Tools::getValue($field)) == false AND (string)$value != '0')
- if (!Tools::getValue('id_'.$this->table) OR $field != 'passwd')
- $this->_errors[] = Tools::displayError('field').' '.$field.' '.Tools::displayError('is required.');
- foreach ($rules['size'] AS $field => $maxLength)
- if (Tools::getValue($field) AND Tools::strlen(Tools::getValue($field)) > $maxLength)
- $this->_errors[] = Tools::displayError('field').' '.$field.' '.Tools::displayError('is too long.').' ('.$maxLength.' '.Tools::displayError('chars max').')';
- foreach ($rules['validate'] AS $field => $function)
- if (Tools::getValue($field))
- if (!Validate::$function(htmlentities(Tools::getValue($field), ENT_COMPAT, 'UTF-8')))
- $this->_errors[] = Tools::displayError('field').' '.$field.' '.Tools::displayError('is invalid.');
- if (!sizeof($this->_errors))
- {
- $order = new Order((int)(Tools::getValue('id_order')));
- $customer = new Customer((int)$order->id_customer);
- //check if a thread already exist
- $id_customer_thread = CustomerThread::getIdCustomerThreadByEmailAndIdOrder($customer->email, $order->id);
- $cm = new CustomerMessage();
- if (!$id_customer_thread)
- {
- $ct = new CustomerThread();
- $ct->id_contact = 0;
- $ct->id_customer = (int)$order->id_customer;
- $ct->id_shop = (int)$this->context->shop->getId(true);
- $ct->id_order = (int)$order->id;
- $ct->id_lang = (int)$this->context->language->id;
- $ct->email = $customer->email;
- $ct->status = 'open';
- $ct->token = Tools::passwdGen(12);
- $ct->add();
- }
- else
- $ct = new CustomerThread((int)$id_customer_thread);
- $cm->id_customer_thread = $ct->id;
- $cm->id_employee = (int)$this->context->employee->id;
- $cm->message = htmlentities(Tools::getValue('message'), ENT_COMPAT, 'UTF-8');
- $cm->private = Tools::getValue('visibility');
- if (!$cm->add())
- $this->_errors[] = Tools::displayError('An error occurred while sending message.');
- elseif ($message->private)
- Tools::redirectAdmin($currentIndex.'&id_order='.$id_order.'&vieworder&conf=11'.'&token='.$this->token);
- elseif (Validate::isLoadedObject($customer = new Customer($id_customer)))
- {
- if (Validate::isLoadedObject($order))
- {
- $varsTpl = array(
- '{lastname}' => $customer->lastname,
- '{firstname}' => $customer->firstname,
- '{id_order}' => $order->id,
- '{message}' => (Configuration::get('PS_MAIL_TYPE') == 2 ? $cm->message : Tools::nl2br($cm->message))
- );
- if (@Mail::Send((int)($order->id_lang), 'order_merchant_comment',
- Mail::l('New message regarding your order'), $varsTpl, $customer->email,
- $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL, NULL, _PS_MAIL_DIR_, true))
- Tools::redirectAdmin(self::$currentIndex.'&id_order='.$id_order.'&vieworder&conf=11'.'&token='.$this->token);
- }
- }
- $this->_errors[] = Tools::displayError('An error occurred while sending e-mail to customer.');
- }
- }
- }
- else
- $this->_errors[] = Tools::displayError('You do not have permission to delete here.');
- }
-
- /* Cancel product from order */
- elseif (Tools::isSubmit('cancelProduct') AND Validate::isLoadedObject($order = new Order((int)(Tools::getValue('id_order')))))
- {
- if ($this->tabAccess['delete'] === '1')
- {
- $productList = Tools::getValue('id_order_detail');
- $customizationList = Tools::getValue('id_customization');
- $qtyList = Tools::getValue('cancelQuantity');
- $customizationQtyList = Tools::getValue('cancelCustomizationQuantity');
-
- $full_product_list = $productList;
- $full_quantity_list = $qtyList;
-
- if ($customizationList)
- {
- foreach ($customizationList as $key => $id_order_detail)
- {
- $full_product_list[$id_order_detail] = $id_order_detail;
- $full_quantity_list[$id_order_detail] = $customizationQtyList[$key];
- }
- }
-
- if ($productList OR $customizationList)
- {
- if ($productList)
- {
- $id_cart = Cart::getCartIdByOrderId($order->id);
- $customization_quantities = Customization::countQuantityByCart($id_cart);
-
- foreach ($productList AS $key => $id_order_detail)
- {
- $qtyCancelProduct = abs($qtyList[$key]);
- if (!$qtyCancelProduct)
- $this->_errors[] = Tools::displayError('No quantity selected for product.');
-
- // check actionable quantity
- $order_detail = new OrderDetail($id_order_detail);
- $customization_quantity = 0;
- if (array_key_exists($order_detail->product_id, $customization_quantities) && array_key_exists($order_detail->product_attribute_id, $customization_quantities[$order_detail->product_id]))
- $customization_quantity = (int) $customization_quantities[$order_detail->product_id][$order_detail->product_attribute_id];
-
- if (($order_detail->product_quantity - $customization_quantity - $order_detail->product_quantity_refunded - $order_detail->product_quantity_return) < $qtyCancelProduct)
- $this->_errors[] = Tools::displayError('Invalid quantity selected for product.');
-
- }
- }
- if ($customizationList)
- {
- $customization_quantities = Customization::retrieveQuantitiesFromIds(array_keys($customizationList));
-
- foreach ($customizationList AS $id_customization => $id_order_detail)
- {
- $qtyCancelProduct = abs($customizationQtyList[$id_customization]);
- $customization_quantity = $customization_quantities[$id_customization];
-
- if (!$qtyCancelProduct)
- $this->_errors[] = Tools::displayError('No quantity selected for product.');
-
- if ($qtyCancelProduct > ($customization_quantity['quantity'] - ($customization_quantity['quantity_refunded'] + $customization_quantity['quantity_returned'])))
- $this->_errors[] = Tools::displayError('Invalid quantity selected for product.');
- }
- }
-
- if (!sizeof($this->_errors) AND $productList)
- foreach ($productList AS $key => $id_order_detail)
- {
- $qtyCancelProduct = abs($qtyList[$key]);
- $orderDetail = new OrderDetail((int)($id_order_detail));
-
- // Reinject product
- if (!$order->hasBeenDelivered() OR ($order->hasBeenDelivered() AND Tools::isSubmit('reinjectQuantities')))
- {
- $reinjectableQuantity = (int)($orderDetail->product_quantity) - (int)($orderDetail->product_quantity_reinjected);
- $quantityToReinject = $qtyCancelProduct > $reinjectableQuantity ? $reinjectableQuantity : $qtyCancelProduct;
- if (!Product::reinjectQuantities($orderDetail, $quantityToReinject))
- $this->_errors[] = Tools::displayError('Cannot re-stock product').' '.$orderDetail->product_name.' ';
- else
- {
- $updProductAttributeID = !empty($orderDetail->product_attribute_id) ? (int)($orderDetail->product_attribute_id) : NULL;
- $newProductQty = Product::getQuantity($orderDetail->product_id, $updProductAttributeID);
- $product = get_object_vars(new Product($orderDetail->product_id, false, $this->context->language->id, $order->id_shop));
- if (!empty($orderDetail->product_attribute_id))
- {
- $updProduct['quantity_attribute'] = (int)($newProductQty);
- $product['quantity_attribute'] = $updProduct['quantity_attribute'];
- }
- else
- {
- $updProduct['stock_quantity'] = (int)($newProductQty);
- $product['stock_quantity'] = $updProduct['stock_quantity'];
- }
- Hook::updateQuantity($product, $order);
- }
- }
-
- // Delete product
- if (!$order->deleteProduct($order, $orderDetail, $qtyCancelProduct))
- $this->_errors[] = Tools::displayError('An error occurred during deletion of the product.').' '.$orderDetail->product_name.' ';
- Module::hookExec('cancelProduct', array('order' => $order, 'id_order_detail' => $id_order_detail));
- }
- if (!sizeof($this->_errors) AND $customizationList)
- foreach ($customizationList AS $id_customization => $id_order_detail)
- {
- $orderDetail = new OrderDetail((int)($id_order_detail));
- $qtyCancelProduct = abs($customizationQtyList[$id_customization]);
- if (!$order->deleteCustomization($id_customization, $qtyCancelProduct, $orderDetail))
- $this->_errors[] = Tools::displayError('An error occurred during deletion of product customization.').' '.$id_customization;
- }
- // E-mail params
- if ((isset($_POST['generateCreditSlip']) OR isset($_POST['generateDiscount'])) AND !sizeof($this->_errors))
- {
- $customer = new Customer((int)($order->id_customer));
- $params['{lastname}'] = $customer->lastname;
- $params['{firstname}'] = $customer->firstname;
- $params['{id_order}'] = $order->id;
- }
-
- // Generate credit slip
- if (isset($_POST['generateCreditSlip']) AND !sizeof($this->_errors))
- {
- if (!OrderSlip::createOrderSlip($order, $full_product_list, $full_quantity_list, isset($_POST['shippingBack'])))
- $this->_errors[] = Tools::displayError('Cannot generate credit slip');
- else
- {
- Module::hookExec('orderSlip', array('order' => $order, 'productList' => $full_product_list, 'qtyList' => $full_quantity_list));
- @Mail::Send((int)$order->id_lang, 'credit_slip', Mail::l('New credit slip regarding your order', $order->id_lang),
- $params, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL, NULL,
- _PS_MAIL_DIR_, true);
- }
- }
-
- // Generate voucher
- if (isset($_POST['generateDiscount']) AND !sizeof($this->_errors))
- {
- if (!$voucher = Discount::createOrderDiscount($order, $full_product_list, $full_quantity_list, $this->l('Credit Slip concerning the order #'), isset($_POST['shippingBack'])))
- $this->_errors[] = Tools::displayError('Cannot generate voucher');
- else
- {
- $currency = $this->context->currency;
- $params['{voucher_amount}'] = Tools::displayPrice($voucher->value, $currency, false);
- $params['{voucher_num}'] = $voucher->name;
- @Mail::Send((int)($order->id_lang), 'voucher', Mail::l('New voucher regarding your order'),
- $params, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL,
- NULL, _PS_MAIL_DIR_, true);
- }
- }
- }
- else
- $this->_errors[] = Tools::displayError('No product or quantity selected.');
-
- // Redirect if no errors
- if (!sizeof($this->_errors))
- Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=24&token='.$this->token);
- }
- else
- $this->_errors[] = Tools::displayError('You do not have permission to delete here.');
- }
- elseif (isset($_GET['messageReaded']))
- {
- Message::markAsReaded($_GET['messageReaded'], $this->context->employee->id);
- }
- parent::postProcess();
- }
-
- private function displayCustomizedDatas(&$customizedDatas, &$product, &$currency, &$image, $tokenCatalog, $id_order_detail)
- {
- if (!($order = $this->loadObject()))
- return;
-
- if (is_array($customizedDatas) AND isset($customizedDatas[(int)($product['product_id'])][(int)($product['product_attribute_id'])]))
- {
- $imageObj = new Image($image['id_image']);
- echo '
-
- '.(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') : '--').'
-
- '.$product['product_name'].' - '.$this->l('customized').'
- '.($product['product_reference'] ? $this->l('Ref:').' '.$product['product_reference'].' ' : '')
- .($product['product_supplier_reference'] ? $this->l('Ref Supplier:').' '.$product['product_supplier_reference'] : '')
- .'
- '.Tools::displayPrice($product['product_price_wt'], $currency, false).'
- '.$product['customizationQuantityTotal'].'
- '.($order->hasBeenPaid() ? ''.$product['customizationQuantityRefunded'].' ' : '').'
- '.($order->hasBeenDelivered() ? ''.$product['customizationQuantityReturned'].' ' : '').'
- -
- '.Tools::displayPrice(Tools::ps_round($order->getTaxCalculationMethod() == PS_TAX_EXC ? $product['product_price'] : $product['product_price_wt'], 2) * $product['customizationQuantityTotal'], $currency, false).'
- --
- ';
- foreach ($customizedDatas[(int)($product['product_id'])][(int)($product['product_attribute_id'])] AS $customizationId => $customization)
- {
- echo '
-
- ';
- foreach ($customization['datas'] AS $type => $datas)
- if ($type == Product::CUSTOMIZE_FILE)
- {
- $i = 0;
- echo '';
- foreach ($datas AS $data)
- echo '
-
- ';
- echo ' ';
- }
- elseif ($type == Product::CUSTOMIZE_TEXTFIELD)
- {
- $i = 0;
- echo '';
- foreach ($datas AS $data)
- echo ''.($data['name'] ? $data['name'] : $this->l('Text #').++$i).$this->l(':').' '.$data['value'].' ';
- echo ' ';
- }
- echo '
- -
- '.$customization['quantity'].'
- '.($order->hasBeenPaid() ? ''.$customization['quantity_refunded'].' ' : '').'
- '.($order->hasBeenDelivered() ? ''.$customization['quantity_returned'].' ' : '').'
- -
- '.Tools::displayPrice(Tools::ps_round($order->getTaxCalculationMethod() == PS_TAX_EXC ? $product['product_price'] : $product['product_price_wt'], 2) * $customization['quantity'], $currency, false).'
-
-
-
- ';
- if ((!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN')) AND (int)(($customization['quantity_returned']) < (int)($customization['quantity'])))
- echo '
- = (int)($customization['quantity'])) ? 'disabled="disabled" ' : '').'/>';
- else
- echo '--';
- echo '
-
- ';
- if ((int)($customization['quantity_returned'] + $customization['quantity_refunded']) >= (int)($customization['quantity']))
- echo ' ';
- elseif (!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN'))
- echo '
- ';
- echo ($order->hasBeenDelivered() ? (int)($customization['quantity_returned']).'/'.((int)($customization['quantity']) - (int)($customization['quantity_refunded'])) : ($order->hasBeenPaid() ? (int)($customization['quantity_refunded']).'/'.(int)($customization['quantity']) : '')).'
- ';
- echo '
- ';
- }
- }
- }
-
- private function getCancelledProductNumber(&$order, &$product)
- {
- $productQuantity = array_key_exists('customizationQuantityTotal', $product) ? $product['product_quantity'] - $product['customizationQuantityTotal'] : $product['product_quantity'];
- $productRefunded = $product['product_quantity_refunded'];
- $productReturned = $product['product_quantity_return'];
- $content = '0/'.$productQuantity;
- if ($order->hasBeenDelivered())
- $content = $productReturned.'/'.($productQuantity - $productRefunded);
- elseif ($order->hasBeenPaid())
- $content = $productRefunded.'/'.$productQuantity;
- return $content;
- }
-
- public function viewDetails()
- {
- $irow = 0;
- if (!($order = $this->loadObject()))
- return;
-
- $customer = new Customer($order->id_customer);
- $customerStats = $customer->getStats();
- $addressInvoice = new Address($order->id_address_invoice, $this->context->language->id);
- if (Validate::isLoadedObject($addressInvoice) AND $addressInvoice->id_state)
- $invoiceState = new State((int)($addressInvoice->id_state));
- $addressDelivery = new Address($order->id_address_delivery, $this->context->language->id);
- if (Validate::isLoadedObject($addressDelivery) AND $addressDelivery->id_state)
- $deliveryState = new State((int)($addressDelivery->id_state));
- $carrier = new Carrier($order->id_carrier);
- $history = $order->getHistory($this->context->language->id);
- $products = $order->getProducts();
- $customizedDatas = Product::getAllCustomizedDatas((int)($order->id_cart));
- if ($customizedDatas)
- Product::addCustomizationPrice($products, $customizedDatas);
- $discounts = $order->getDiscounts();
- $messages = Message::getMessagesByOrderId($order->id, true);
- $states = OrderState::getOrderStates($this->context->language->id);
- $currency = new Currency($order->id_currency);
- $currentLanguage = $this->context->language;
- $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 = ' ';
- if ($nextOrder = Db::getInstance()->getValue('SELECT id_order FROM '._DB_PREFIX_.'orders WHERE id_order > '.(int)$order->id.' ORDER BY id_order ASC'))
- $nextOrder = ' ';
-
-
- if ($order->total_paid != $order->total_paid_real)
- echo ''.$this->l('Warning:').' '.Tools::displayPrice($order->total_paid_real, $currency, false).' '.$this->l('paid instead of').' '.Tools::displayPrice($order->total_paid, $currency, false).' !
';
-
- // display bar code if module enabled
- $hook = Module::hookExec('invoice', array('id_order' => $order->id));
- if ($hook !== false)
- {
- echo '';
- echo $hook;
- echo '
';
- }
-
- // display order header
- echo '
- ';
- echo '
- '.$prevOrder.'
- '.(Validate::isLoadedObject($customer) ? $customer->firstname.' '.$customer->lastname.' - ' : '').$this->l('Order #').sprintf('%06d', $order->id).'
- '.$nextOrder.'
-
-
-
';
-
- /* Display current status */
- echo '
-
-
- '.Tools::displayDate($row['date_add'], $this->context->language->id, true).'
-
- '.stripslashes($row['ostate_name']).'
- '.((!empty($row['employee_lastname'])) ? '('.stripslashes(Tools::substr($row['employee_firstname'], 0, 1)).'. '.stripslashes($row['employee_lastname']).')' : '').'
- ';
- /* Display previous status */
- foreach ($history AS $row)
- {
- echo '
-
- '.Tools::displayDate($row['date_add'], $this->context->language->id, true).'
-
- '.stripslashes($row['ostate_name']).'
- '.((!empty($row['employee_lastname'])) ? '('.stripslashes(Tools::substr($row['employee_firstname'], 0, 1)).'. '.stripslashes($row['employee_lastname']).')' : '').'
- ';
- }
- echo '
-
-
';
-
- /* Display status form */
- echo '
-
';
-
- /* Display customer information */
- if (Validate::isLoadedObject($customer))
- {
- echo '
-
- '.$this->l('Customer information').'
- '.$customer->firstname.' '.$customer->lastname.' ('.$this->l('#').$customer->id.')
- ('.$customer->email.' ) ';
- if ($customer->isGuest())
- {
- echo '
- '.$this->l('This order has been placed by a').' '.$this->l('guest').' ';
- if (!Customer::customerExists($customer->email))
- {
- echo '';
- }
- else
- echo ''.$this->l('A registered customer account exists with the same email address').'
';
- }
- else
- {
- echo $this->l('Account registered:').' '.Tools::displayDate($customer->date_add, $this->context->language->id, true).'
- '.$this->l('Valid orders placed:').' '.$customerStats['nb_orders'].'
- '.$this->l('Total paid since registration:').' '.Tools::displayPrice(Tools::ps_round(Tools::convertPrice($customerStats['total_orders'], $currency), 2), $currency, false).' ';
- }
- echo ' ';
- }
-
- /* Display sources */
- if (sizeof($sources))
- {
- echo '
-
'.$this->l('Sources').' 3 ? 'style="height: 200px; overflow-y: scroll; width: 360px;"' : '').'>';
- foreach ($sources as $source)
- echo '
- '.Tools::displayDate($source['date_add'], $this->context->language->id, true).'
- '.$this->l('From:').' '.preg_replace('/^www./', '', parse_url($source['http_referer'], PHP_URL_HOST)).'
- '.$this->l('To:').' '.$source['request_uri'].'
- '.($source['keywords'] ? ''.$this->l('Keywords:').' '.$source['keywords'].' ' : '').'
- ';
- echo ' ';
- }
- // display hook specified to this page : AdminOrder
- if (($hook = Module::hookExec('adminOrder', array('id_order' => $order->id))) !== false)
- echo $hook;
-
- echo '
-
- ';
-
- /* Display invoice information */
- echo '
';
- if (($currentState->invoice OR $order->invoice_number) AND count($products))
- echo ' '.$this->l('Invoice').'
- '.$this->l('Invoice #').''.Configuration::get('PS_INVOICE_PREFIX', $this->context->language->id).sprintf('%06d', $order->invoice_number).'
- '.$this->l('Created on:').' '.Tools::displayDate($order->invoice_date, $this->context->language->id, true);
- else
- echo ' '.$this->l('Invoice').'
- '.$this->l('No invoice yet.');
- echo ' ';
-
- /* Display shipping infos */
- echo '
-
- '.$this->l('Shipping information').'
- '.$this->l('Total weight:').' '.number_format($order->getTotalWeight(), 3).' '.Configuration::get('PS_WEIGHT_UNIT').'
- '.$this->l('Carrier:').' '.($carrier->name == '0' ? Configuration::get('PS_SHOP_NAME') : $carrier->name).'
- '.(($currentState->delivery OR $order->delivery_number) ? ''.$this->l('Delivery slip #').''.Configuration::get('PS_DELIVERY_PREFIX', $this->context->language->id).sprintf('%06d', $order->delivery_number).' ' : '');
- if ($order->shipping_number)
- echo $this->l('Tracking number:').' '.$order->shipping_number.' '.(!empty($carrier->url) ? '('.$this->l('Track the shipment').' )' : '');
-
- /* 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 '
- ';
- echo '
- ';
-
- /* Display summary order */
- echo '
-
-
- '.$this->l('Order details').' ';
- if (Shop::isFeatureActive())
- {
- echo ''.$this->l('Shop:').'
- '.Shop::getInstance($order->id_shop)->name.'
';
- }
- echo '
- '.$this->l('Original cart:').'
-
- '.$this->l('Payment mode:').'
- '.Tools::substr($order->payment, 0, 32).' '.($order->module ? '('.$order->module.')' : '').'
-
-
- '.$this->l('Products').' '.Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency, false).'
- '.($order->total_discounts > 0 ? ''.$this->l('Discounts').' -'.Tools::displayPrice($order->total_discounts, $currency, false).' ' : '').'
- '.($order->total_wrapping > 0 ? ''.$this->l('Wrapping').' '.Tools::displayPrice($order->total_wrapping, $currency, false).' ' : '').'
- '.$this->l('Shipping').' '.Tools::displayPrice($order->total_shipping, $currency, false).'
- '.$this->l('Total').' '.Tools::displayPrice($order->total_paid, $currency, false).($order->total_paid != $order->total_paid_real ? '('.$this->l('Paid:').' '.Tools::displayPrice($order->total_paid_real, $currency, false, false).') ' : '').'
-
-
-
-
'.$this->l('Recycled package:').'
- '.($order->recyclable ? '
' : '
').'
-
-
-
'.$this->l('Gift wrapping:').'
- '.($order->gift ? '
-
-
- '.(!empty($order->gift_message) ? '
'.$this->l('Message:').' '.Tools::nl2br($order->gift_message).'
' : '') : '
').'
-
- ';
-
- echo '
-
';
-
- /* Display adresses : delivery & invoice */
- echo '
-
-
- '.$this->l('Shipping address').'
-
-
-
-
- '.$this->displayAddressDetail($addressDelivery)
- .(!empty($addressDelivery->other) ? ' '.$addressDelivery->other.' ' : '')
- .'
-
-
-
- '.$this->l('Invoice address').'
-
- '.$this->displayAddressDetail($addressInvoice)
- .(!empty($addressInvoice->other) ? ' '.$addressInvoice->other.' ' : '')
-
- .'
-
-
';
-
- // List of products
- echo '
-
-
-
';
-
- /* 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 '
-
-
';
- /* Display list of messages */
- if (sizeof($messages))
- {
- echo '
-
-
- '.$this->l('Messages').' ';
- foreach ($messages as $message)
- {
- echo '';
- if ($message['is_new_for_me'])
- echo '
';
- echo $this->l('At').'
'.Tools::displayDate($message['date_add'], $this->context->language->id, true);
- echo ' '.$this->l('from').'
'.(($message['elastname']) ? ($message['efirstname'].' '.$message['elastname']) : ($message['cfirstname'].' '.$message['clastname'])).' ';
- echo ((int)($message['private']) == 1 ? '
'.$this->l('Private:').' ' : '');
- echo '
'.Tools::nl2br($message['message']).'
';
- echo '
';
- echo ' ';
- }
- echo ''.$this->l('When you read a message, please click on the green check.').'
';
- echo ' ';
- }
- echo '
';
-
- /* Display return product */
- echo '
-
- '.$this->l('Merchandise returns').' ';
- 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'], $this->context->language->id).') :
- '.$this->l('#').sprintf('%06d', $return['id_order_return']).' -
- '.$state->name[$this->context->language->id].' ';
- }
- echo ' ';
-
- /* Display credit slip */
- echo '
-
-
- '.$this->l('Credit slip').' ';
- if (!sizeof($slips))
- echo $this->l('No slip for this order.');
- else
- foreach ($slips as $slip)
- echo '('.Tools::displayDate($slip['date_upd'], $this->context->language->id).') : '.$this->l('#').sprintf('%06d', $slip['id_order_slip']).' ';
- echo '
-
';
- echo '
';
- echo ' '.$this->l('Back to list').' ';
- }
-
- public function displayAddressDetail($addressDelivery)
- {
- // Allow to add specific rules
- $patternRules = array(
- 'avoid' => array()
- //'avoid' => array('address2')
- );
- return AddressFormat::generateAddress($addressDelivery, $patternRules, ' ');
- }
-
- public function display()
- {
- if (isset($_GET['view'.$this->table]))
- $this->viewDetails();
- else
- {
- $this->getList($this->context->language->id, !Tools::getValue($this->table.'Orderby') ? 'date_add' : NULL, !Tools::getValue($this->table.'Orderway') ? 'DESC' : NULL);
- $this->displayList();
- echo ''.$this->l('Total:').' '.Tools::displayPrice($this->getTotal(), $this->context->currency).' ';
- }
- }
-
- private function getTotal()
- {
- $total = 0;
- foreach($this->_list AS $item)
- if ($item['id_currency'] == Configuration::get('PS_CURRENCY_DEFAULT'))
- $total += (float)($item['total_paid']);
- else
- {
- $currency = new Currency((int)($item['id_currency']));
- $total += Tools::ps_round((float)($item['total_paid']) / (float)($currency->conversion_rate), 2);
- }
- return $total;
- }
-}
\ No newline at end of file
diff --git a/admin-dev/themes/template/home/content.tpl b/admin-dev/themes/template/home/content.tpl
index 59a1c3f26..3a113c1a7 100644
--- a/admin-dev/themes/template/home/content.tpl
+++ b/admin-dev/themes/template/home/content.tpl
@@ -1,3 +1,28 @@
+{*
+* 2007-2011 PrestaShop
+*
+* NOTICE OF LICENSE
+*
+* This source file is subject to the Academic Free License (AFL 3.0)
+* that is bundled with this package in the file LICENSE.txt.
+* It is also available through the world-wide-web at this URL:
+* http://opensource.org/licenses/afl-3.0.php
+* If you did not receive a copy of the license and are unable to
+* obtain it through the world-wide-web, please send an email
+* to license@prestashop.com so we can send you a copy immediately.
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
+* versions in the future. If you wish to customize PrestaShop for your
+* needs please refer to http://www.prestashop.com for more information.
+*
+* @author PrestaShop SA
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision$
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*}
{l s='Dashboard'}
diff --git a/admin-dev/themes/template/home/optimizationTips.tpl b/admin-dev/themes/template/home/optimizationTips.tpl
index a83279899..8a54e5c21 100644
--- a/admin-dev/themes/template/home/optimizationTips.tpl
+++ b/admin-dev/themes/template/home/optimizationTips.tpl
@@ -1,3 +1,28 @@
+{*
+* 2007-2011 PrestaShop
+*
+* NOTICE OF LICENSE
+*
+* This source file is subject to the Academic Free License (AFL 3.0)
+* that is bundled with this package in the file LICENSE.txt.
+* It is also available through the world-wide-web at this URL:
+* http://opensource.org/licenses/afl-3.0.php
+* If you did not receive a copy of the license and are unable to
+* obtain it through the world-wide-web, please send an email
+* to license@prestashop.com so we can send you a copy immediately.
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
+* versions in the future. If you wish to customize PrestaShop for your
+* needs please refer to http://www.prestashop.com for more information.
+*
+* @author PrestaShop SA
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision$
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*}
{l s='A good beginning...'}
@@ -12,7 +37,7 @@
{$i.title}
-
+
{/foreach}
diff --git a/admin-dev/themes/template/list_content.tpl b/admin-dev/themes/template/list_content.tpl
index d8441fb34..5b7128daf 100644
--- a/admin-dev/themes/template/list_content.tpl
+++ b/admin-dev/themes/template/list_content.tpl
@@ -86,6 +86,8 @@
{$tr.$key}
{elseif isset($params.type) && $params.type == 'datetime'}
{$tr.$key}
+ {elseif isset($params.callback)}
+ {$tr.$key}
{elseif isset($tr.$key)}
{$tr.$key|escape:'htmlall':'UTF-8'}
{else}
diff --git a/admin-dev/themes/template/orders/_customized_data.tpl b/admin-dev/themes/template/orders/_customized_data.tpl
new file mode 100755
index 000000000..139298c9e
--- /dev/null
+++ b/admin-dev/themes/template/orders/_customized_data.tpl
@@ -0,0 +1,106 @@
+{*
+* 2007-2011 PrestaShop
+*
+* NOTICE OF LICENSE
+*
+* This source file is subject to the Academic Free License (AFL 3.0)
+* that is bundled with this package in the file LICENSE.txt.
+* It is also available through the world-wide-web at this URL:
+* http://opensource.org/licenses/afl-3.0.php
+* If you did not receive a copy of the license and are unable to
+* obtain it through the world-wide-web, please send an email
+* to license@prestashop.com so we can send you a copy immediately.
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
+* versions in the future. If you wish to customize PrestaShop for your
+* needs please refer to http://www.prestashop.com for more information.
+*
+* @author PrestaShop SA
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision$
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*}
+
+{if ($product.customizedDatas)}
+
+ {if ($product.image->id)}{$product.image_tag}{else}'--'{/if}
+
+ {$product['product_name']} - {l s='customized'}
+ {if ($product['product_reference'])}{l s='Ref:'} {$product['product_reference']} {/if}
+ {if ($product['product_supplier_reference'])}{l s='Ref Supplier:'} {$product['product_supplier_reference']}{/if}
+ .'
+ {displayPrice price=$product['product_price_wt'] currency=$currency->id}
+ {$product['customizationQuantityTotal']}
+ {if ($order->hasBeenPaid())}{$product['customizationQuantityRefunded']} {/if}
+ {if ($order->hasBeenDelivered())}{$product['customizationQuantityReturned']} {/if}
+ -
+
+ {if ($order->getTaxCalculationMethod() == PS_TAX_EXC)}
+ {displayPrice price=Tools::ps_round($product['product_price'] * $product['customizationQuantityTotal'], 2) currency=$currency->id}
+ {else}
+ {displayPrice price=Tools::ps_round($product['product_price_wt'] * $product['customizationQuantityTotal'], 2) currency=$currency->id}
+ {/if}
+
+ --
+
+ {foreach from=$product.customizedDatas key=customizationId item=customization}
+
+
+ {foreach from=$customization.datas key=type item=datas}
+ {if ($type == Product::CUSTOMIZE_FILE)}
+
+ {foreach from=$datas item=data}
+
+
+
+ {/foreach}
+
+ {elseif ($type == Product::CUSTOMIZE_TEXTFIELD)}
+
+ {foreach from=$datas item=data}
+ {if $data['name']}{$data['name']}{else}{l s='Text #'}{$data@iteration}{/if}{l s=':'} {$data['value']}
+ {/foreach}
+
+ {/if}
+ {/foreach}
+
+ -
+ {$customization['quantity']}
+ {if ($order->hasBeenPaid())}{$customization['quantity_refunded']} {/if}
+ {if ($order->hasBeenDelivered())}{$customization['quantity_returned']} {/if}
+ -
+
+ {if ($order->getTaxCalculationMethod() == PS_TAX_EXC)}
+ {displayPrice price=Tools::ps_round($product['product_price'] * $customization['quantity'], 2) currency=$currency->id}
+ {else}
+ {displayPrice price=Tools::ps_round($product['product_price_wt'] * $customization['quantity'], 2) currency=$currency->id}
+ {/if}
+
+
+
+
+
+ {if ((!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN')) && (int)(($customization['quantity_returned']) < (int)($customization['quantity'])))}
+ = $customization['quantity'])}disabled="disabled"{/if} />
+ {else}
+ --
+ {/if}
+
+
+ {if (($customization['quantity_returned'] + $customization['quantity_refunded']) >= $customization['quantity'])}
+
+ {elseif (!$order->hasBeenDelivered() || Configuration::get('PS_ORDER_RETURN'))}
+
+ {/if}
+ {if ($order->hasBeenDelivered())}
+ {$customization['quantity_returned']}/{$customization['quantity']-$customization['quantity_refunded']}
+ {elseif ($order->hasBeenPaid())}
+ {$customization['quantity_returned']}/{$customization['quantity']}
+ {/if}
+
+
+ {/foreach}
+{/if}
\ No newline at end of file
diff --git a/admin-dev/themes/template/orders/_product_line.tpl b/admin-dev/themes/template/orders/_product_line.tpl
new file mode 100755
index 000000000..cd0ee33c9
--- /dev/null
+++ b/admin-dev/themes/template/orders/_product_line.tpl
@@ -0,0 +1,80 @@
+{*
+* 2007-2011 PrestaShop
+*
+* NOTICE OF LICENSE
+*
+* This source file is subject to the Academic Free License (AFL 3.0)
+* that is bundled with this package in the file LICENSE.txt.
+* It is also available through the world-wide-web at this URL:
+* http://opensource.org/licenses/afl-3.0.php
+* If you did not receive a copy of the license and are unable to
+* obtain it through the world-wide-web, please send an email
+* to license@prestashop.com so we can send you a copy immediately.
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
+* versions in the future. If you wish to customize PrestaShop for your
+* needs please refer to http://www.prestashop.com for more information.
+*
+* @author PrestaShop SA
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision$
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*}
+
+{* Assign product price *}
+{if ($order->getTaxCalculationMethod() == PS_TAX_EXC)}
+ {assign var=product_price value=($product['product_price'] + $product['ecotax'])}
+{else}
+ {assign var=product_price value=$product['product_price_wt']}
+{/if}
+
+{if ($product['product_quantity'] > $product['customizationQuantityTotal'])}
+id && isset($product.image_size))} height="{$product['image_size'][1] + 7}"{/if}>
+ {if $product.image->id}{$product.image_tag}{/if}
+
+ {$product['product_name']}
+ {if $product.product_reference}{l s='Ref:'} {$product.product_reference} {/if}
+ {if $product.product_supplier_reference}{l s='Ref Supplier:'} {$product.product_supplier_reference}{/if}
+
+ {displayPrice price=$product_price currency=$currency->id}
+ 1)}style="font-weight:700;font-size:1.1em;color:red"{/if}>{$product['product_quantity']}
+ {if ($order->hasBeenPaid())}{$product['product_quantity_refunded']} {/if}
+ {if ($order->hasBeenDelivered())}{$product['product_quantity_return']} {/if}
+ {StockManagerFactory::getManager()->getProductRealQuantities($product['product_id'], $product['product_attribute_id'], null, true)}
+ {displayPrice price=(Tools::ps_round($product_price, 2) * ($product['product_quantity'] - $product['customizationQuantityTotal'])) currency=$currency->id}
+
+
+
+
+ {if ((!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN')) AND (int)($product['product_quantity_return']) < (int)($product['product_quantity']))}
+ = $product['product_quantity'])}disabled="disabled" {/if}/>
+ {else}
+ --
+ {/if}
+
+
+ {if ($product['product_quantity_return'] + $product['product_quantity_refunded'] >= $product['product_quantity'])}
+
+ {elseif (!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN'))}
+
+ {/if}
+
+ {if $product['customizationQuantityTotal']}
+ {assign var=productQuantity value=($product['product_quantity']-$product['customizationQuantityTotal'])}
+ {else}
+ {assign var=productQuantity value=$product['product_quantity']}
+ {/if}
+
+ {if ($order->hasBeenDelivered())}
+ {$product['product_quantity_refunded']}/{$productQuantity-$product['product_quantity_refunded']}
+ {elseif ($order->hasBeenPaid())}
+ {$product['product_quantity_return']}/{$productQuantity}
+ {else}
+ 0/{$productQuantity}
+ {/if}
+
+
+{/if}
\ No newline at end of file
diff --git a/admin-dev/themes/template/orders/view.tpl b/admin-dev/themes/template/orders/view.tpl
new file mode 100755
index 000000000..dc35bf19c
--- /dev/null
+++ b/admin-dev/themes/template/orders/view.tpl
@@ -0,0 +1,458 @@
+{*
+* 2007-2011 PrestaShop
+*
+* NOTICE OF LICENSE
+*
+* This source file is subject to the Academic Free License (AFL 3.0)
+* that is bundled with this package in the file LICENSE.txt.
+* It is also available through the world-wide-web at this URL:
+* http://opensource.org/licenses/afl-3.0.php
+* If you did not receive a copy of the license and are unable to
+* obtain it through the world-wide-web, please send an email
+* to license@prestashop.com so we can send you a copy immediately.
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
+* versions in the future. If you wish to customize PrestaShop for your
+* needs please refer to http://www.prestashop.com for more information.
+*
+* @author PrestaShop SA
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision$
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*}
+
+
+
+{if ($order->total_paid != $order->total_paid_real)}
+{l s='Warning:'} {displayPrice price=$order->total_paid_real currency=$currency->id} {l s='paid instead of'} {displayPrice price=$order->total_paid currency=$currency->id} !
+{/if}
+
+{if ($HOOK_INVOICE)}
+{$HOOK_INVOICE}
';
+{/if}
+
+
+
+ {if $previousOrder} {/if}
+ {if ($customer->id)}{$customer->firstname} {$customer->lastname} - {/if}{l s='Order #'}{"%06d"|sprintf:$order->id}
+ {if $nextOrder} {/if}
+
+
+
+
+
+{foreach from=$history item=row key=key}
+ {if ($key == 0)}
+
+ {dateFormat date=$row['date_add'] full=true}
+
+ {$row['ostate_name']|stripslashes}
+ {if $row['employee_lastname']}{$row['employee_firstname']|stripslashes} {$row['employee_lastname']|stripslashes}{/if}
+
+ {else}
+
+ {dateFormat date=$row['date_add'] full=true}
+
+ {$row['ostate_name']|stripslashes}
+ {if $row['employee_lastname']}{$row['employee_firstname']|stripslashes} {$row['employee_lastname']|stripslashes}{/if}
+
+ {/if}
+{/foreach}
+
+
+
+
+
+ {foreach from=$states item=state}
+ id}selected="selected"{/if}>{$state['name']|stripslashes}
+ {/foreach}
+
+
+ {foreach from=$warehouse_list item=warehouse}
+ {$warehouse['name']}
+ {/foreach}
+
+
+
+
+
+{if $customer->id}
+
+
+ {l s='Customer information'}
+ {$customer->firstname} {$customer->lastname} ({l s='#'}{$customer->id})
+ ({$customer->email} )
+ {if ($customer->isGuest())}
+ {l s='This order has been placed by a'} {l s='guest'}
+ {if (!Customer::customerExists($customer->email))}
+
+
+
+ {l s='This feature will generate a random password and send an e-mail to the customer'}
+
+ {else}
+ {l s='A registered customer account exists with the same email address'}
+ {/if}
+ {else}
+ {l s='Account registered:'} {dateFormat date=$customer->date_add full=true}
+ {l s='Valid orders placed:'} {$customerStats['nb_orders']}
+ {l s='Total paid since registration:'} {displayPrice price=Tools::ps_round(Tools::convertPrice($customerStats['total_orders'], $currency), 2) currency=$currency->id}
+
+ {/if}
+{/if}
+
+{if (sizeof($sources))}
+
+
+ {l s='Sources'}
+
+
+{/if}
+
+{if $HOOK_ADMIN_ORDER}
+ {$HOOK_ADMIN_ORDER}
+{/if}
+
+
+
+
+ {if (($currentState->invoice OR $order->invoice_number) AND count($products))}
+ {l s='Invoice'}
+ {l s='Invoice #'}{$PS_INVOICE_PREFIX}{"%06d"|sprintf:$order->invoice_number}
+ {l s='Created on:'} {dateFormat date=$order->invoice_date full=true}
+ {else}
+ {l s='Invoice'}
+ {l s='No invoice yet.'}
+ {/if}
+
+
+
+
+ {l s='Shipping information'}
+ {l s='Total weight:'} {$order->getTotalWeight()|string_format:"%.3f"} {$PS_WEIGHT_UNIT}
+ {l s='Carrier:'} {if $carrier->name == '0'}{$PS_SHOP_NAME}{else}{$carrier->name}{/if}
+
+ {if ($currentState->delivery || $order->delivery_number)}
+ {l s='Delivery slip #'}{$PS_DELIVERY_PREFIX}{"%06d"|sprintf:$order->delivery_number}
+ {/if}
+
+ {if $order->shipping_number}
+ {l s='Tracking number:'} {$order->shipping_number}
+ {if $carrier->url}
+ {l s='Track the shipment'}
+ {/if}
+ {/if}
+
+ {if $carrierModuleCall}
+ {$carrierModuleCall}
+ {/if}
+
+ {if ($carrier->url && $order->hasBeenShipped())}
+
+
+
+
+
+ {/if}
+
+
+
+
+ {l s='Order details'}
+ {if (Shop::isFeatureActive())}
+ {l s='Shop:'}
+ {Shop::getInstance($order->id_shop)->name}
+ {/if}
+
+ {l s='Original cart:'}
+
+ {l s='Payment mode:'}
+ {substr($order->payment, 0, 32)}{if $order->module} ({$order->module}){/if}
+
+
+
+ {l s='Products'}
+ {displayPrice price=$order->getTotalProductsWithTaxes() currency=$currency->id}
+
+ {if $order->total_discounts > 0}
+
+ {l s='Discounts'}
+ -{displayPrice price=$order->total_discounts currency=$currency->id}
+
+ {/if}
+ {if $order->total_wrapping > 0}
+
+ {l s='Wrapping'}
+ {displayPrice price=$order->total_wrapping currency=$currency->id}
+
+ {/if}
+
+ {l s='Shipping'}
+ {displayPrice price=$order->total_shipping currency=$currency->id}
+
+
+ {l s='Total'}
+
+ {displayPrice price=$order->total_paid currency=$currency->id}
+ {if $order->total_paid != $order->total_paid_real}
+
+ {l s='Paid:'} {displayPrice price=$order->total_paid_real currency=$currency->id}
+ {/if}
+
+
+
+
+
+
{l s='Recycled package:'}
+ {if $order->recyclable}
+
+ {else}
+
+ {/if}
+
+
+
{l s='Gift wrapping:'}
+ {if $order->gift}
+
+
+
+ {if $order->gift_message}
+
{l s='Message:'} {$order->gift_message|nl2br}
+ {/if}
+ {else}
+
+ {/if}
+
+
+
+
+
+
+
+
+ {l s='Shipping address'}
+
+
+
+
+ {displayAddressDetail address=$addresses.delivery newLine=' '}
+ {if $addresses.delivery->other} {$addresses.delivery->other} {/if}
+
+
+
+
+ {l s='Invoice address'}
+
+ {displayAddressDetail address=$addresses.invoice newLine=' '}
+ {if $addresses.invoice->other} {$addresses.invoice->other} {/if}
+
+
+
+
+
+
+
+ {l s='Products'}
+
+
+
+
+ {l s='Product'}
+ {l s='UP'} *
+ {l s='Qty'}
+ {if ($order->hasBeenPaid())}{l s='Refunded'} {/if}
+ {if ($order->hasBeenDelivered())}{l s='Returned'} {/if}
+ {l s='Stock'}
+ {l s='Total'} *
+
+ {if ($order->hasBeenDelivered())}
+ {l s='Return'}
+ {elseif ($order->hasBeenPaid())}
+ {l s='Refund'}
+ {else}
+ {l s='Cancel'}
+ {/if}
+
+
+
+ {foreach from=$products item=product key=k}
+ {* Include customized datas partial *}
+ {include file='orders/_customized_data.tpl'}
+
+ {* Include product line partial *}
+ {include file='orders/_product_line.tpl'}
+ {/foreach}
+
+
+
+ * {l s='According to the group of this customer, prices are printed:'}
+ {if ($order->getTaxCalculationMethod() == PS_TAX_EXC)}
+ {l s='tax excluded.'}
+ {else}
+ {l s='tax included.'}
+ {/if}
+
+ {if Configuration::get('PS_ORDER_RETURN')}
+ {l s='Merchandise returns are disabled'}
+ {/if}
+
+
+ {if (sizeof($discounts))}
+
+
+
+ {l s='Discount name'}
+ {l s='Value'}
+
+ {foreach from=$discounts item=discount}
+
+ {$discount['name']}
+
+ {if $discount['value'] != 0.00}
+ -
+ {/if}
+ {displayPrice price=$discount['value'] currency=$currency->id}
+
+
+ {/foreach}
+
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+ {l s='New message'}
+
+
+
+ -- {l s='Choose a standard message'} --
+ {foreach from=$orderMessages item=orderMessage}
+ {$orderMessage['name']}
+ {/foreach}
+
+
{l s='Display to consumer?'}
+
{l s='Yes'}
+
{l s='No'}
+
+
{Tools::getValue('message')|escape:'htmlall':'UTF-8'}
+
+
+
+
+
+
+
+{if (sizeof($messages))}
+
+
+ {l s='Messages'}
+ {foreach from=$messages item=message}
+
+ {if ($message['is_new_for_me'])}
+
+ {/if}
+ {l s='At'}
{dateFormat date=$message['date_add']}
+ {l s='from'}
{if ($message['elastname'])}{$message['efirstname']} {$message['elastname']}{else}{$message['cfirstname']} {$message['clastname']}{/if}
+ {if ($message['private'] == 1)}
{l s='Private:'} {/if}
+
{$message['message']|nl2br}
+
+
+ {/foreach}
+ {l s='When you read a message, please click on the green check.'}
+
+{/if}
+
+
+
+
+ {l s='Merchandise returns'}
+{if (!sizeof($returns))}
+ {l s='No merchandise return for this order.'}
+{else}
+ {foreach from=$returns item=return}
+ ({dateFormat date=$return['date_upd']}) :
+ {l s='#'}{'%06d'|sprintf:$return['id_order_return']} -
+ {$return['state_name']}
+ {/foreach}
+{/if}
+
+
+
+
+ {l s='Credit slip'}
+{if (!sizeof($slips))}
+ {l s='No slip for this order.'}
+{else}
+ {foreach from=$slips item=slip}
+ ({dateFormat date=$slip['date_upd']}) : {l s='#'}{'%06d'|sprintf:$slip['id_order_slip']}
+ {/foreach}
+{/if}
+
+
+
+ {l s='Back to list'}
\ No newline at end of file
diff --git a/classes/AddressFormat.php b/classes/AddressFormat.php
index 586234103..53979279f 100644
--- a/classes/AddressFormat.php
+++ b/classes/AddressFormat.php
@@ -341,12 +341,13 @@ class AddressFormatCore extends ObjectModel
return $tab;
}
- /*
+ /**
* Generates the full address text
- * @address is an instanciate object of Address class
- * @patternrules is a defined rules array to avoid some pattern
- * @newLine is a string containing the newLine format
- * @separator is a string containing the separator format
+ * @param address is an instanciate object of Address class
+ * @param patternrules is a defined rules array to avoid some pattern
+ * @param newLine is a string containing the newLine format
+ * @param separator is a string containing the separator format
+ * @return string
*/
public static function generateAddress(Address $address, $patternRules = array(), $newLine = "\r\n", $separator = ' ', $style = array())
{
@@ -375,6 +376,17 @@ class AddressFormatCore extends ObjectModel
return $addressText;
}
+ public static function generateAddressSmarty($params, &$smarty)
+ {
+ return self::generateAddress(
+ $params['address'],
+ (isset($params['patternRules']) ? $params['patternRules'] : array()),
+ (isset($params['newLine']) ? $params['newLine'] : "\r\n"),
+ (isset($params['separator']) ? $params['separator'] : ''),
+ (isset($params['style']) ? $params['style'] : array())
+ );
+ }
+
/**
* Returns selected fields required for an address in an array according to a selection hash
* @return array String values
diff --git a/classes/Order.php b/classes/Order.php
index ef55b047a..54e8744bb 100644
--- a/classes/Order.php
+++ b/classes/Order.php
@@ -408,9 +408,12 @@ class OrderCore extends ObjectModel
public function getFirstMessage()
{
- $sql = 'SELECT `message` FROM `'._DB_PREFIX_.'message` WHERE `id_order` = '.(int)($this->id).' ORDER BY `id_message` asc';
- $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);
- return $result['message'];
+ return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
+ SELECT `message`
+ FROM `'._DB_PREFIX_.'message`
+ WHERE `id_order` = '.(int)$this->id.'
+ ORDER BY `id_message`
+ ');
}
public function setProductPrices(&$row)
@@ -478,6 +481,8 @@ class OrderCore extends ObjectModel
if (!$products)
$products = $this->getProductsDetail();
+ $customized_datas = Product::getAllCustomizedDatas($this->id_cart);
+
$resultArray = array();
foreach ($products AS $row)
{
@@ -492,19 +497,18 @@ class OrderCore extends ObjectModel
continue ;
}
+ $this->setProductImageInformations($row);
+ $this->setProductCurrentStock($row);
$this->setProductPrices($row);
+ $this->setProductCustomizedDatas($row, $customized_datas);
- /* Add information for virtual product */
+ // Add information for virtual product
if ($row['download_hash'] && !empty($row['download_hash']))
{
if ($row['product_attribute_id'] && !empty($row['product_attribute_id']))
- {
$row['filename'] = ProductDownload::getFilenameFromIdAttribute((int)$row['product_id'], (int)$row['product_attribute_id']);
- }
else
- {
$row['filename'] = ProductDownload::getFilenameFromIdProduct((int)$row['product_id']);
- }
// Get the display filename
$row['display_filename'] = ProductDownload::getFilenameFromFilename($row['filename']);
}
@@ -512,9 +516,58 @@ class OrderCore extends ObjectModel
$resultArray[(int)$row['id_order_detail']] = $row;
}
+ if ($customized_datas)
+ Product::addCustomizationPrice($resultArray, $customized_datas);
+
return $resultArray;
}
+ protected function setProductCustomizedDatas(&$product, $customized_datas)
+ {
+ $product['customizedDatas'] = null;
+ if (isset($customized_datas[$product['product_id']][$product['product_attribute_id']]))
+ $product['customizedDatas'] = $customized_datas[$product['product_id']][$product['product_attribute_id']];
+ else
+ $product['customizationQuantityTotal'] = 0;
+ }
+
+ /**
+ *
+ * This method allow to add stock information on a product detail
+ * @param array &$product
+ */
+ protected function setProductCurrentStock(&$product)
+ {
+ $product['current_stock'] = StockManagerFactory::getManager()->getProductRealQuantities($product['product_id'], $product['product_attribute_id'], null, true);
+ }
+
+ /**
+ *
+ * This method allow to add image information on a product detail
+ * @param array &$product
+ */
+ protected function setProductImageInformations(&$product)
+ {
+ if (isset($product['product_attribute_id']) && $product['product_attribute_id'])
+ $id_image = Db::getInstance()->getValue('
+ SELECT id_image
+ FROM '._DB_PREFIX_.'product_attribute_image
+ WHERE id_product_attribute = '.(int)$product['product_attribute_id']);
+
+ if (!isset($image['id_image']) || !$image['id_image'])
+ $id_image = Db::getInstance()->getValue('
+ SELECT id_image
+ FROM '._DB_PREFIX_.'image
+ WHERE id_product = '.(int)($product['product_id']).' AND cover = 1
+ ');
+
+ $product['image'] = null;
+ $product['image_size'] = null;
+
+ if ($id_image)
+ $product['image'] = new Image($id_image);
+ }
+
public function getTaxesAverageUsed()
{
return Cart::getTaxesAverageUsed((int)($this->id_cart));
@@ -772,7 +825,6 @@ class OrderCore extends ObjectModel
return $this->total_products_wt;
/* Retro-compatibility (now set directly on the validateOrder() method) */
-
if (!$products)
$products = $this->getProductsDetail();
@@ -1042,13 +1094,40 @@ class OrderCore extends ObjectModel
DELETE FROM `'._DB_PREFIX_.'order_detail`
WHERE `id_order` = '.(int)($this->id)) !== false);
}
-
- /*
- ** Get the an order detail list of the current order
- */
+
+ /**
+ * This method return the ID of the previous order
+ * @return int
+ */
+ public function getPreviousOrderId()
+ {
+ return Db::getInstance()->getValue('
+ SELECT id_order
+ FROM '._DB_PREFIX_.'orders
+ WHERE id_order < '.(int)$this->id.'
+ ORDER BY id_order DESC');
+ }
+
+ /**
+ * This method return the ID of the next order
+ * @return int
+ */
+ public function getNextOrderId()
+ {
+ return Db::getInstance()->getValue('
+ SELECT id_order
+ FROM '._DB_PREFIX_.'orders
+ WHERE id_order > '.(int)$this->id.'
+ ORDER BY id_order ASC');
+ }
+
+ /**
+ * Get the an order detail list of the current order
+ * @return array
+ */
public function getOrderDetailList()
{
return OrderDetail::getList($this->id);
}
-
+
}
diff --git a/classes/Tools.php b/classes/Tools.php
index 828d80ec4..6f05419b3 100644
--- a/classes/Tools.php
+++ b/classes/Tools.php
@@ -818,6 +818,12 @@ class ToolsCore
return Tools::getAdminToken($tab.(int)Tab::getIdFromClassName($tab).(int)$context->employee->id);
}
+ public static function getAdminTokenLiteSmarty($params, &$smarty)
+ {
+ $context = Context::getContext();
+ return Tools::getAdminToken($params['tab'].(int)Tab::getIdFromClassName($params['tab']).(int)$context->employee->id);
+ }
+
/**
* Get the user's journey
*
diff --git a/config/smartyadmin.config.inc.php b/config/smartyadmin.config.inc.php
index 4ada80709..ec1e9a1ea 100644
--- a/config/smartyadmin.config.inc.php
+++ b/config/smartyadmin.config.inc.php
@@ -62,6 +62,8 @@ smartyRegisterFunction($smarty, 'function', 'displayWtPrice', array('Product', '
smartyRegisterFunction($smarty, 'function', 'displayWtPriceWithCurrency', array('Product', 'displayWtPriceWithCurrency'));
smartyRegisterFunction($smarty, 'function', 'displayPrice', array('Tools', 'displayPriceSmarty'));
smartyRegisterFunction($smarty, 'modifier', 'convertAndFormatPrice', array('Product', 'convertAndFormatPrice')); // used twice
+smartyRegisterFunction($smarty, 'function', 'getAdminToken', array('Tools', 'getAdminTokenLiteSmarty'));
+smartyRegisterFunction($smarty, 'function', 'displayAddressDetail', array('AddressFormat', 'generateAddressSmarty'));
function smartyTranslate($params, &$smarty)
{
diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php
new file mode 100755
index 000000000..0fed5cacc
--- /dev/null
+++ b/controllers/admin/AdminOrdersController.php
@@ -0,0 +1,527 @@
+
+* @copyright 2007-2011 PrestaShop SA
+* @version Release: $Revision$
+* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+class AdminOrdersControllerCore extends AdminController
+{
+ public function __construct()
+ {
+ $this->table = 'order';
+ $this->className = 'Order';
+ $this->lang = false;
+
+ $this->addRowAction('view');
+
+ $this->deleted = false;
+ $this->colorOnBackground = true;
+ $this->requiredDatabase = false;
+ $this->context = Context::getContext();
+
+ $this->_select = '
+ a.id_order AS id_pdf,
+ CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`,
+ osl.`name` AS `osname`,
+ os.`color`,
+ IF((SELECT COUNT(so.id_order) FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new,
+ (SELECT COUNT(od.`id_order`) FROM `'._DB_PREFIX_.'order_detail` od WHERE od.`id_order` = a.`id_order` GROUP BY `id_order`) AS product_number';
+ $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`)
+ LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (oh.`id_order` = a.`id_order`)
+ LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`)
+ LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$this->context->language->id.')';
+ $this->_where = 'AND oh.`id_order_history` = (SELECT MAX(`id_order_history`) FROM `'._DB_PREFIX_.'order_history` moh WHERE moh.`id_order` = a.`id_order` GROUP BY moh.`id_order`)';
+
+ $statesArray = array();
+ $states = OrderState::getOrderStates((int)$this->context->language->id);
+
+ foreach ($states AS $state)
+ $statesArray[$state['id_order_state']] = $state['name'];
+
+ $this->fieldsDisplay = array(
+ 'id_order' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25),
+ 'new' => array('title' => $this->l('New'), 'width' => 25, 'align' => 'center', 'type' => 'bool', 'filter_key' => 'new', 'tmpTableFilter' => true, 'icon' => array(0 => 'blank.gif', 1 => 'news-new.gif'), 'orderby' => false),
+ 'customer' => array('title' => $this->l('Customer'), 'widthColumn' => 160, 'width' => 140, 'filter_key' => 'customer', 'tmpTableFilter' => true),
+ 'total_paid' => array('title' => $this->l('Total'), 'width' => 70, 'align' => 'right', 'prefix' => '', 'suffix' => ' ', 'price' => true, 'currency' => true),
+ 'payment' => array('title' => $this->l('Payment'), 'width' => 100),
+ 'osname' => array('title' => $this->l('Status'), 'widthColumn' => 230, 'type' => 'select', 'select' => $statesArray, 'filter_key' => 'os!id_order_state', 'filter_type' => 'int', 'width' => 200),
+ 'date_add' => array('title' => $this->l('Date'), 'width' => 35, 'align' => 'right', 'type' => 'datetime', 'filter_key' => 'a!date_add'),
+ 'id_pdf' => array('title' => $this->l('PDF'), 'callback' => 'printPDFIcons', 'orderby' => false, 'search' => false));
+ $this->shopLinkType = 'shop';
+ $this->shopShareDatas = Shop::SHARE_ORDER;
+
+ parent::__construct();
+ }
+
+ public function initContent()
+ {
+ $this->display = 'list';
+
+ if (Tools::isSubmit('view'.$this->table))
+ {
+ $this->display = 'view';
+ $this->viewOrder();
+ }
+
+ parent::initContent();
+ }
+
+ public function printPDFIcons($id_order, $tr)
+ {
+ $order = new Order($id_order);
+ $orderState = OrderHistory::getLastOrderState($id_order);
+ if (!Validate::isLoadedObject($orderState) OR !Validate::isLoadedObject($order))
+ die(Tools::displayError('Invalid objects'));
+
+ // Generate HTML code for printing Invoice Icon with link
+ $content = '';
+ if (($orderState->invoice && $order->invoice_number) && (int)$tr['product_number'])
+ $content .= ' ';
+ else
+ $content .= '-';
+ $content .= ' ';
+
+ // Generate HTML code for printing Delivery Icon with link
+ $content .= '';
+ if ($orderState->delivery && $order->delivery_number)
+ $content .= ' ';
+ else
+ $content .= '-';
+ $content .= ' ';
+
+ return $content;
+ }
+
+ public function postProcess()
+ {
+ /* Update shipping number */
+ if (Tools::isSubmit('submitShippingNumber') AND ($id_order = (int)(Tools::getValue('id_order'))) AND Validate::isLoadedObject($order = new Order($id_order)))
+ {
+ if ($this->tabAccess['edit'] === '1')
+ {
+ if (!$order->hasBeenShipped())
+ die(Tools::displayError('The shipping number can only be set once the order has been shipped.'));
+ $_GET['view'.$this->table] = true;
+
+ $shipping_number = pSQL(Tools::getValue('shipping_number'));
+ $order->shipping_number = $shipping_number;
+ $order->update();
+ if ($shipping_number)
+ {
+ global $_LANGMAIL;
+ $customer = new Customer((int)($order->id_customer));
+ $carrier = new Carrier((int)($order->id_carrier));
+ if (!Validate::isLoadedObject($customer) OR !Validate::isLoadedObject($carrier))
+ die(Tools::displayError());
+ $templateVars = array(
+ '{followup}' => str_replace('@', $order->shipping_number, $carrier->url),
+ '{firstname}' => $customer->firstname,
+ '{lastname}' => $customer->lastname,
+ '{id_order}' => (int)($order->id)
+ );
+ @Mail::Send((int)($order->id_lang), 'in_transit', Mail::l('Package in transit'), $templateVars,
+ $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL, NULL,
+ _PS_MAIL_DIR_, true);
+ }
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to edit here.');
+ }
+
+ /* Change order state, add a new entry in order history and send an e-mail to the customer if needed */
+ elseif (Tools::isSubmit('submitState') AND ($id_order = (int)(Tools::getValue('id_order'))) AND Validate::isLoadedObject($order = new Order($id_order)))
+ {
+ if ($this->tabAccess['edit'] === '1')
+ {
+ $_GET['view'.$this->table] = true;
+ if (!$newOrderStatusId = (int)(Tools::getValue('id_order_state')))
+ $this->_errors[] = Tools::displayError('Invalid new order status');
+ else
+ {
+ $history = new OrderHistory();
+ $history->id_order = (int)$id_order;
+ $history->id_employee = (int)$this->context->employee->id;
+ if (!(int)Tools::getValue('id_warehouse'))
+ $this->_errors[] = Tools::displayError('An error occurred while changing the status.');
+ else
+ {
+ $history->changeIdOrderState((int)($newOrderStatusId), (int)($id_order), (int)Tools::getValue('id_warehouse'));
+ $order = new Order((int)$order->id);
+ $carrier = new Carrier((int)($order->id_carrier), (int)($order->id_lang));
+ $templateVars = array();
+ if ($history->id_order_state == Configuration::get('PS_OS_SHIPPING') AND $order->shipping_number)
+ $templateVars = array('{followup}' => str_replace('@', $order->shipping_number, $carrier->url));
+ else if ($history->id_order_state == Configuration::get('PS_OS_CHEQUE'))
+ $templateVars = array(
+ '{cheque_name}' => (Configuration::get('CHEQUE_NAME') ? Configuration::get('CHEQUE_NAME') : ''),
+ '{cheque_address_html}' => (Configuration::get('CHEQUE_ADDRESS') ? nl2br(Configuration::get('CHEQUE_ADDRESS')) : ''));
+ elseif ($history->id_order_state == Configuration::get('PS_OS_BANKWIRE'))
+ $templateVars = array(
+ '{bankwire_owner}' => (Configuration::get('BANK_WIRE_OWNER') ? Configuration::get('BANK_WIRE_OWNER') : ''),
+ '{bankwire_details}' => (Configuration::get('BANK_WIRE_DETAILS') ? nl2br(Configuration::get('BANK_WIRE_DETAILS')) : ''),
+ '{bankwire_address}' => (Configuration::get('BANK_WIRE_ADDRESS') ? nl2br(Configuration::get('BANK_WIRE_ADDRESS')) : ''));
+ if ($history->addWithemail(true, $templateVars))
+ Tools::redirectAdmin(self::$currentIndex.'&id_order='.$id_order.'&vieworder'.'&token='.$this->token);
+ $this->_errors[] = Tools::displayError('An error occurred while changing the status or was unable to send e-mail to the customer.');
+ }
+ }
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to edit here.');
+ }
+
+ /* Add a new message for the current order and send an e-mail to the customer if needed */
+ elseif (isset($_POST['submitMessage']))
+ {
+ $_GET['view'.$this->table] = true;
+ if ($this->tabAccess['edit'] === '1')
+ {
+ if (!($id_order = (int)(Tools::getValue('id_order'))) OR !($id_customer = (int)(Tools::getValue('id_customer'))))
+ $this->_errors[] = Tools::displayError('An error occurred before sending message');
+ elseif (!Tools::getValue('message'))
+ $this->_errors[] = Tools::displayError('Message cannot be blank');
+ else
+ {
+ /* Get message rules and and check fields validity */
+ $rules = call_user_func(array('Message', 'getValidationRules'), 'Message');
+ foreach ($rules['required'] AS $field)
+ if (($value = Tools::getValue($field)) == false AND (string)$value != '0')
+ if (!Tools::getValue('id_'.$this->table) OR $field != 'passwd')
+ $this->_errors[] = Tools::displayError('field').' '.$field.' '.Tools::displayError('is required.');
+ foreach ($rules['size'] AS $field => $maxLength)
+ if (Tools::getValue($field) AND Tools::strlen(Tools::getValue($field)) > $maxLength)
+ $this->_errors[] = Tools::displayError('field').' '.$field.' '.Tools::displayError('is too long.').' ('.$maxLength.' '.Tools::displayError('chars max').')';
+ foreach ($rules['validate'] AS $field => $function)
+ if (Tools::getValue($field))
+ if (!Validate::$function(htmlentities(Tools::getValue($field), ENT_COMPAT, 'UTF-8')))
+ $this->_errors[] = Tools::displayError('field').' '.$field.' '.Tools::displayError('is invalid.');
+ if (!sizeof($this->_errors))
+ {
+ $order = new Order((int)(Tools::getValue('id_order')));
+ $customer = new Customer((int)$order->id_customer);
+ //check if a thread already exist
+ $id_customer_thread = CustomerThread::getIdCustomerThreadByEmailAndIdOrder($customer->email, $order->id);
+ $cm = new CustomerMessage();
+ if (!$id_customer_thread)
+ {
+ $ct = new CustomerThread();
+ $ct->id_contact = 0;
+ $ct->id_customer = (int)$order->id_customer;
+ $ct->id_shop = (int)$this->context->shop->getId(true);
+ $ct->id_order = (int)$order->id;
+ $ct->id_lang = (int)$this->context->language->id;
+ $ct->email = $customer->email;
+ $ct->status = 'open';
+ $ct->token = Tools::passwdGen(12);
+ $ct->add();
+ }
+ else
+ $ct = new CustomerThread((int)$id_customer_thread);
+ $cm->id_customer_thread = $ct->id;
+ $cm->id_employee = (int)$this->context->employee->id;
+ $cm->message = htmlentities(Tools::getValue('message'), ENT_COMPAT, 'UTF-8');
+ $cm->private = Tools::getValue('visibility');
+ if (!$cm->add())
+ $this->_errors[] = Tools::displayError('An error occurred while sending message.');
+ elseif ($message->private)
+ Tools::redirectAdmin($currentIndex.'&id_order='.$id_order.'&vieworder&conf=11'.'&token='.$this->token);
+ elseif (Validate::isLoadedObject($customer = new Customer($id_customer)))
+ {
+ if (Validate::isLoadedObject($order))
+ {
+ $varsTpl = array(
+ '{lastname}' => $customer->lastname,
+ '{firstname}' => $customer->firstname,
+ '{id_order}' => $order->id,
+ '{message}' => (Configuration::get('PS_MAIL_TYPE') == 2 ? $cm->message : Tools::nl2br($cm->message))
+ );
+ if (@Mail::Send((int)($order->id_lang), 'order_merchant_comment',
+ Mail::l('New message regarding your order'), $varsTpl, $customer->email,
+ $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL, NULL, _PS_MAIL_DIR_, true))
+ Tools::redirectAdmin(self::$currentIndex.'&id_order='.$id_order.'&vieworder&conf=11'.'&token='.$this->token);
+ }
+ }
+ $this->_errors[] = Tools::displayError('An error occurred while sending e-mail to customer.');
+ }
+ }
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to delete here.');
+ }
+
+ /* Cancel product from order */
+ elseif (Tools::isSubmit('cancelProduct') AND Validate::isLoadedObject($order = new Order((int)(Tools::getValue('id_order')))))
+ {
+ if ($this->tabAccess['delete'] === '1')
+ {
+ $productList = Tools::getValue('id_order_detail');
+ $customizationList = Tools::getValue('id_customization');
+ $qtyList = Tools::getValue('cancelQuantity');
+ $customizationQtyList = Tools::getValue('cancelCustomizationQuantity');
+
+ $full_product_list = $productList;
+ $full_quantity_list = $qtyList;
+
+ if ($customizationList)
+ {
+ foreach ($customizationList as $key => $id_order_detail)
+ {
+ $full_product_list[$id_order_detail] = $id_order_detail;
+ $full_quantity_list[$id_order_detail] = $customizationQtyList[$key];
+ }
+ }
+
+ if ($productList OR $customizationList)
+ {
+ if ($productList)
+ {
+ $id_cart = Cart::getCartIdByOrderId($order->id);
+ $customization_quantities = Customization::countQuantityByCart($id_cart);
+
+ foreach ($productList AS $key => $id_order_detail)
+ {
+ $qtyCancelProduct = abs($qtyList[$key]);
+ if (!$qtyCancelProduct)
+ $this->_errors[] = Tools::displayError('No quantity selected for product.');
+
+ // check actionable quantity
+ $order_detail = new OrderDetail($id_order_detail);
+ $customization_quantity = 0;
+ if (array_key_exists($order_detail->product_id, $customization_quantities) && array_key_exists($order_detail->product_attribute_id, $customization_quantities[$order_detail->product_id]))
+ $customization_quantity = (int) $customization_quantities[$order_detail->product_id][$order_detail->product_attribute_id];
+
+ if (($order_detail->product_quantity - $customization_quantity - $order_detail->product_quantity_refunded - $order_detail->product_quantity_return) < $qtyCancelProduct)
+ $this->_errors[] = Tools::displayError('Invalid quantity selected for product.');
+
+ }
+ }
+ if ($customizationList)
+ {
+ $customization_quantities = Customization::retrieveQuantitiesFromIds(array_keys($customizationList));
+
+ foreach ($customizationList AS $id_customization => $id_order_detail)
+ {
+ $qtyCancelProduct = abs($customizationQtyList[$id_customization]);
+ $customization_quantity = $customization_quantities[$id_customization];
+
+ if (!$qtyCancelProduct)
+ $this->_errors[] = Tools::displayError('No quantity selected for product.');
+
+ if ($qtyCancelProduct > ($customization_quantity['quantity'] - ($customization_quantity['quantity_refunded'] + $customization_quantity['quantity_returned'])))
+ $this->_errors[] = Tools::displayError('Invalid quantity selected for product.');
+ }
+ }
+
+ if (!sizeof($this->_errors) AND $productList)
+ foreach ($productList AS $key => $id_order_detail)
+ {
+ $qtyCancelProduct = abs($qtyList[$key]);
+ $orderDetail = new OrderDetail((int)($id_order_detail));
+
+ // Reinject product
+ if (!$order->hasBeenDelivered() OR ($order->hasBeenDelivered() AND Tools::isSubmit('reinjectQuantities')))
+ {
+ $reinjectableQuantity = (int)($orderDetail->product_quantity) - (int)($orderDetail->product_quantity_reinjected);
+ $quantityToReinject = $qtyCancelProduct > $reinjectableQuantity ? $reinjectableQuantity : $qtyCancelProduct;
+ if (!Product::reinjectQuantities($orderDetail, $quantityToReinject))
+ $this->_errors[] = Tools::displayError('Cannot re-stock product').' '.$orderDetail->product_name.' ';
+ else
+ {
+ $updProductAttributeID = !empty($orderDetail->product_attribute_id) ? (int)($orderDetail->product_attribute_id) : NULL;
+ $newProductQty = Product::getQuantity($orderDetail->product_id, $updProductAttributeID);
+ $product = get_object_vars(new Product($orderDetail->product_id, false, $this->context->language->id, $order->id_shop));
+ if (!empty($orderDetail->product_attribute_id))
+ {
+ $updProduct['quantity_attribute'] = (int)($newProductQty);
+ $product['quantity_attribute'] = $updProduct['quantity_attribute'];
+ }
+ else
+ {
+ $updProduct['stock_quantity'] = (int)($newProductQty);
+ $product['stock_quantity'] = $updProduct['stock_quantity'];
+ }
+ Hook::updateQuantity($product, $order);
+ }
+ }
+
+ // Delete product
+ if (!$order->deleteProduct($order, $orderDetail, $qtyCancelProduct))
+ $this->_errors[] = Tools::displayError('An error occurred during deletion of the product.').' '.$orderDetail->product_name.' ';
+ Module::hookExec('cancelProduct', array('order' => $order, 'id_order_detail' => $id_order_detail));
+ }
+ if (!sizeof($this->_errors) AND $customizationList)
+ foreach ($customizationList AS $id_customization => $id_order_detail)
+ {
+ $orderDetail = new OrderDetail((int)($id_order_detail));
+ $qtyCancelProduct = abs($customizationQtyList[$id_customization]);
+ if (!$order->deleteCustomization($id_customization, $qtyCancelProduct, $orderDetail))
+ $this->_errors[] = Tools::displayError('An error occurred during deletion of product customization.').' '.$id_customization;
+ }
+ // E-mail params
+ if ((isset($_POST['generateCreditSlip']) OR isset($_POST['generateDiscount'])) AND !sizeof($this->_errors))
+ {
+ $customer = new Customer((int)($order->id_customer));
+ $params['{lastname}'] = $customer->lastname;
+ $params['{firstname}'] = $customer->firstname;
+ $params['{id_order}'] = $order->id;
+ }
+
+ // Generate credit slip
+ if (isset($_POST['generateCreditSlip']) AND !sizeof($this->_errors))
+ {
+ if (!OrderSlip::createOrderSlip($order, $full_product_list, $full_quantity_list, isset($_POST['shippingBack'])))
+ $this->_errors[] = Tools::displayError('Cannot generate credit slip');
+ else
+ {
+ Module::hookExec('orderSlip', array('order' => $order, 'productList' => $full_product_list, 'qtyList' => $full_quantity_list));
+ @Mail::Send((int)$order->id_lang, 'credit_slip', Mail::l('New credit slip regarding your order', $order->id_lang),
+ $params, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL, NULL,
+ _PS_MAIL_DIR_, true);
+ }
+ }
+
+ // Generate voucher
+ if (isset($_POST['generateDiscount']) AND !sizeof($this->_errors))
+ {
+ if (!$voucher = Discount::createOrderDiscount($order, $full_product_list, $full_quantity_list, $this->l('Credit Slip concerning the order #'), isset($_POST['shippingBack'])))
+ $this->_errors[] = Tools::displayError('Cannot generate voucher');
+ else
+ {
+ $currency = $this->context->currency;
+ $params['{voucher_amount}'] = Tools::displayPrice($voucher->value, $currency, false);
+ $params['{voucher_num}'] = $voucher->name;
+ @Mail::Send((int)($order->id_lang), 'voucher', Mail::l('New voucher regarding your order'),
+ $params, $customer->email, $customer->firstname.' '.$customer->lastname, NULL, NULL, NULL,
+ NULL, _PS_MAIL_DIR_, true);
+ }
+ }
+ }
+ else
+ $this->_errors[] = Tools::displayError('No product or quantity selected.');
+
+ // Redirect if no errors
+ if (!sizeof($this->_errors))
+ Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=24&token='.$this->token);
+ }
+ else
+ $this->_errors[] = Tools::displayError('You do not have permission to delete here.');
+ }
+ elseif (isset($_GET['messageReaded']))
+ {
+ Message::markAsReaded($_GET['messageReaded'], $this->context->employee->id);
+ }
+ parent::postProcess();
+ }
+
+ public function viewOrder()
+ {
+ $order = $this->loadObject();
+ if (!Validate::isLoadedObject($order))
+ return;
+
+ $customer = new Customer($order->id_customer);
+ $carrier = new Carrier($order->id_carrier);
+ $products = $order->getProducts();
+
+ foreach ($products as &$product)
+ {
+ if ($product['image'] != null)
+ {
+ $name = 'product_mini_'.(int)$product['product_id'].(isset($product['product_attribute_id']) ? '_'.(int)$product['product_attribute_id'] : '').'.jpg';
+ // generate image cache, only for back office
+ $product['image_tag'] = cacheImage(_PS_IMG_DIR_.'p/'.$product['image']->getExistingImgPath().'.jpg', $name, 45, 'jpg');
+ $product['image_size'] = getimagesize(_PS_TMP_IMG_DIR_.$name);
+ }
+ }
+
+ // Carrier module call
+ $carrier_module_call = null;
+ if ($carrier->is_module)
+ {
+ $module = Module::getInstanceByName($carrier->external_module_name);
+ if (method_exists($module, 'displayInfoByCart'))
+ $carrier_module_call = call_user_func(array($module, 'displayInfoByCart'), $order->id_cart);
+ }
+
+ // Retrieve addresses informations
+ $addressInvoice = new Address($order->id_address_invoice, $this->context->language->id);
+ if (Validate::isLoadedObject($addressInvoice) AND $addressInvoice->id_state)
+ $invoiceState = new State((int)($addressInvoice->id_state));
+
+ if ($order->id_address_invoice == $order->id_address_delivery)
+ {
+ $addressDelivery = $addressInvoice;
+ if (isset($invoiceState))
+ $deliveryState = $invoiceState;
+ }
+ else
+ {
+ $addressDelivery = new Address($order->id_address_delivery, $this->context->language->id);
+ if (Validate::isLoadedObject($addressDelivery) AND $addressDelivery->id_state)
+ $deliveryState = new State((int)($addressDelivery->id_state));
+ }
+
+ // Smarty assign
+ $this->context->smarty->assign(array(
+ 'order' => $order,
+ 'cart' => new Cart($order->id),
+ 'customer' => $customer,
+ 'addresses' => array(
+ 'delivery' => $addressDelivery,
+ 'deliveryState' => isset($deliveryState) ? $deliveryState : null,
+ 'invoice' => $addressInvoice,
+ 'invoiceState' => isset($invoiceState) ? $invoiceState : null
+ ),
+ 'customerStats' => $customer->getStats(),
+ 'products' => $products,
+ 'discounts' => $order->getDiscounts(),
+ 'returns' => OrderReturn::getOrdersReturn($order->id_customer, $order->id),
+ 'slips' => OrderSlip::getOrdersSlip($order->id_customer, $order->id),
+ 'orderMessages' => OrderMessage::getOrderMessages($order->id_lang),
+ 'messages' => Message::getMessagesByOrderId($order->id, true),
+ 'carrier' => $carrier = new Carrier($order->id_carrier),
+ 'history' => $order->getHistory($this->context->language->id),
+ 'states' => OrderState::getOrderStates($this->context->language->id),
+ 'warehouse_list' => Warehouse::getWarehouseList(),
+ 'sources' => ConnectionsSource::getOrderSources($order->id),
+ 'currentState' => OrderHistory::getLastOrderState($order->id),
+ 'currency' => new Currency($order->id_currency),
+ 'previousOrder' => $order->getPreviousOrderId(),
+ 'nextOrder' => $order->getNextOrderId(),
+ 'currentIndex' => self::$currentIndex,
+ 'carrierModuleCall' => $carrier_module_call,
+ 'iso_code_lang' => $this->context->language->iso_code,
+ 'PS_INVOICE_PREFIX' => Configuration::get('PS_INVOICE_PREFIX', $this->context->language->id),
+ 'PS_WEIGHT_UNIT' => Configuration::get('PS_WEIGHT_UNIT'),
+ 'PS_SHOP_NAME' => Configuration::get('PS_SHOP_NAME'),
+ 'PS_DELIVERY_PREFIX' => Configuration::get('PS_DELIVERY_PREFIX', $this->context->language->id)
+ ));
+
+ // Assign Hook
+ $this->context->smarty->assign(array(
+ 'HOOK_INVOICE' => Module::hookExec('invoice', array('id_order' => $order->id)),
+ 'HOOK_ADMIN_ORDER' => Module::hookExec('adminOrder', array('id_order' => $order->id))
+ ));
+ }
+}