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 ''; - } - elseif ($type == Product::CUSTOMIZE_TEXTFIELD) - { - $i = 0; - 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.' -

-
- '.((($currentState->invoice OR $order->invoice_number) AND count($products)) - ? ''.$this->l('View invoice').' '.$this->l('View invoice').'' - : ''.$this->l('No invoice').' '.$this->l('No invoice')).' - - '.(($currentState->delivery OR $order->delivery_number) - ? ''.$this->l('View delivery slip').' '.$this->l('View delivery slip').'' - : ''.$this->l('No delivery slip').' '.$this->l('No delivery slip')).' - - '.$this->l('Print order').' '.$this->l('Print page').' -
-
 
'; - - /* Display current status */ - echo ' - - - - - - - '; - /* Display previous status */ - foreach ($history AS $row) - { - echo ' - - - - - - '; - } - 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']).')' : '').'
'.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 status form */ - echo ' -
- '; - $warehouse_list = Warehouse::getWarehouseList(); - echo ''; - - 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 '
- -

- '.$this->l('This feature will generate a random password and send an e-mail to the customer').' -
'; - } - 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').'
'; - } - // 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 ' -
'.Shop::getInstance($order->id_shop)->name.'
'; - } - echo ' - -
'.$this->l('Cart #').sprintf('%06d', $cart->id).'
- -
'.Tools::substr($order->payment, 0, 32).' '.($order->module ? '('.$order->module.')' : '').'
-
- - - '.($order->total_discounts > 0 ? '' : '').' - '.($order->total_wrapping > 0 ? '' : '').' - - -
'.$this->l('Products').''.Tools::displayPrice($order->getTotalProductsWithTaxes(), $currency, false).'
'.$this->l('Discounts').'-'.Tools::displayPrice($order->total_discounts, $currency, false).'
'.$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->l('Shipping address').' -
- - -
- '.$this->displayAddressDetail($addressDelivery) - .(!empty($addressDelivery->other) ? '
'.$addressDelivery->other.'
' : '') - .'
-
-
-
- '.$this->l('Invoice address').''.$this->l('Invoice address').' -
- '.$this->displayAddressDetail($addressInvoice) - .(!empty($addressInvoice->other) ? '
'.$addressInvoice->other.'
' : '') - - .'
-
-
 
'; - - // List of products - echo ' -
-
- -
- '.$this->l('Products').''.$this->l('Products').' -
- - - - - - - '.($order->hasBeenPaid() ? '' : '').' - '.($order->hasBeenDelivered() ? '' : '').' - - - '; - echo ' - '; - $tokenCatalog = Tools::getAdminToken('AdminCatalog'.(int)(Tab::getIdFromClassName('AdminCatalog')).(int)$this->context->employee->id); - 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'); - // @FIXME - $stock = StockManagerFactory::getManager()->getProductRealQuantities($product['product_id'], $product['product_attribute_id'], null, true); - 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); - - if (!isset($product['customizationQuantityTotal'])) - $product['customizationQuantityTotal'] = 0; - // Normal display - if ($product['product_quantity'] > $product['customizationQuantityTotal']) - { - $productObj = new Product($product['product_id']); - $imageObj = new Image($image['id_image']); - - echo ' - - - - - - '.($order->hasBeenPaid() ? '' : '').' - '.($order->hasBeenDelivered() ? '' : '').' - - - - - '; - } - } - echo ' -
 '.$this->l('Product').''.$this->l('UP').' *'.$this->l('Qty').''.$this->l('Refunded').''.$this->l('Returned').''.$this->l('Stock').''.$this->l('Total').' *'.$this->l('Products').' '.($order->hasBeenDelivered() ? $this->l('Return') : ($order->hasBeenPaid() ? $this->l('Refund') : $this->l('Cancel'))).'
'.(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'].'
- '.($product['product_reference'] ? $this->l('Ref:').' '.$product['product_reference'].'
' : '') - .($product['product_supplier_reference'] ? $this->l('Ref Supplier:').' '.$product['product_supplier_reference'] : '') - .'
'.Tools::displayPrice($product_price, $currency, false).' 1 ? 'style="font-weight:700;font-size:1.1em;color:red"' : '').'>'.(int)$product['product_quantity'].''.(int)($product['product_quantity_refunded']).''.(int)($product['product_quantity_return']).''.StockManagerFactory::getManager()->getProductRealQuantities($product['product_id'], $product['product_attribute_id'], null, true).''.Tools::displayPrice(Tools::ps_round($product_price, 2) * ((int)($product['product_quantity']) - $product['customizationQuantityTotal']), $currency, false).' - - - '; - if ((!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN')) AND (int)($product['product_quantity_return']) < (int)($product['product_quantity'])) - echo ' - = (int)($product['product_quantity'])) ? 'disabled="disabled" ' : '').'/>'; - else - echo '--'; - echo ' - '; - if ((int)($product['product_quantity_return'] + $product['product_quantity_refunded']) >= (int)($product['product_quantity'])) - echo ''; - elseif (!$order->hasBeenDelivered() OR Configuration::get('PS_ORDER_RETURN')) - echo ' - '; - echo $this->getCancelledProductNumber($order, $product).' -
-
* '.$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') ? '

'.$this->l('Merchandise returns are disabled') : '').'
'; - if (sizeof($discounts)) - { - echo ' -
- - - - - '; - foreach ($discounts as $discount) - echo ' - - - - '; - echo ' -
'.$this->l('Discounts').''.$this->l('Discount name').''.$this->l('Value').'
'.$discount['name'].''.($discount['value'] != 0.00 ? '- ' : '').Tools::displayPrice($discount['value'], $currency, false).'
'; - } - echo ' -
'; - - // Cancel product - echo ' -
 
-
'; - if ($order->hasBeenDelivered() AND Configuration::get('PS_ORDER_RETURN')) - echo ' -  
'; - if ((!$order->hasBeenDelivered() AND $order->hasBeenPaid()) OR ($order->hasBeenDelivered() AND Configuration::get('PS_ORDER_RETURN'))) - echo ' -  
-  
- '; - if (!$order->hasBeenDelivered() OR ($order->hasBeenDelivered() AND Configuration::get('PS_ORDER_RETURN'))) - echo ' -
'; - echo ' -
'; - 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 ' -
-
-
- '.$this->l('New message').' - -
-

- '.$this->l('Display to consumer?').' - '.$this->l('Yes').' - '.$this->l('No').' -



-

- - - -
-
-
'; - /* 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').''.$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').''.$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} +

+
+ {if (($currentState->invoice || $order->invoice_number) && count($products))} + {l s='View invoice'} {l s='View invoice'} + {else} + {l s='No invoice'} {l s='No invoice'} + {/if} + - + {if ($currentState->delivery || $order->delivery_number)} + {l s='View delivery slip'} {l s='View delivery slip'} + {else} + {l s='No delivery slip'} {l s='No delivery slip'} + {/if} + - + {l s='Print order'} {l s='Print order'} +
+
 
+ + +{foreach from=$history item=row key=key} + {if ($key == 0)} + + + + + + + {else} + + + + + + + {/if} +{/foreach} +
{dateFormat date=$row['date_add'] full=true}{$row['ostate_name']|stripslashes}{if $row['employee_lastname']}{$row['employee_firstname']|stripslashes} {$row['employee_lastname']|stripslashes}{/if}
{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 $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())} + +
{Shop::getInstance($order->id_shop)->name}
+ {/if} + + + + +
{substr($order->payment, 0, 32)}{if $order->module} ({$order->module}){/if}
+
+ + + + + + {if $order->total_discounts > 0} + + + + + {/if} + {if $order->total_wrapping > 0} + + + + + {/if} + + + + + + + + +
{l s='Products'}{displayPrice price=$order->getTotalProductsWithTaxes() currency=$currency->id}
{l s='Discounts'}-{displayPrice price=$order->total_discounts currency=$currency->id}
{l s='Wrapping'}{displayPrice price=$order->total_wrapping currency=$currency->id}
{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'}{l s='Shipping address'} +
+ + +
+ {displayAddressDetail address=$addresses.delivery newLine='
'} + {if $addresses.delivery->other}
{$addresses.delivery->other}
{/if} +
+
+
+
+ {l s='Invoice address'}{l s='Invoice address'} +
+ {displayAddressDetail address=$addresses.invoice newLine='
'} + {if $addresses.invoice->other}
{$addresses.invoice->other}
{/if} +
+
+
 
+ +
+ +
+ {l s='Products'}{l s='Products'} +
+ + + + + + + {if ($order->hasBeenPaid())}{/if} + {if ($order->hasBeenDelivered())}{/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='Product'}{l s='UP'} *{l s='Qty'}{l s='Refunded'}{l s='Returned'}{l s='Stock'}{l s='Total'} *{l s='Products'} + {if ($order->hasBeenDelivered())} + {l s='Return'} + {elseif ($order->hasBeenPaid())} + {l s='Refund'} + {else} + {l s='Cancel'} + {/if} +
+ +
+ * {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))} +
+ + + + + + {foreach from=$discounts item=discount} + + + + + {/foreach} +
{l s='Discounts'}{l s='Discount name'}{l s='Value'}
{$discount['name']} + {if $discount['value'] != 0.00} + - + {/if} + {displayPrice price=$discount['value'] currency=$currency->id} +
+
+ {/if} +
+ +
 
+
+ {if ($order->hasBeenDelivered() && Configuration::get('PS_ORDER_RETURN'))} +  
+ {/if} + {if ((!$order->hasBeenDelivered() && $order->hasBeenPaid()) || ($order->hasBeenDelivered() && Configuration::get('PS_ORDER_RETURN')))} +  
+  
+ + {/if} + {if (!$order->hasBeenDelivered() || ($order->hasBeenDelivered() && Configuration::get('PS_ORDER_RETURN')))} +
+ +
+ {/if} +
+
+
+
 
+ +
+
+
+ {l s='New message'} + +
+

+ {l s='Display to consumer?'} + {l s='Yes'} + {l s='No'} +



+

+ + + +
+
+
+ +{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'}{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'}{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 .= 'invoice'; + else + $content .= '-'; + $content .= ''; + + // Generate HTML code for printing Delivery Icon with link + $content .= ''; + if ($orderState->delivery && $order->delivery_number) + $content .= 'delivery'; + 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)) + )); + } +}