diff --git a/admin-dev/themes/template/supplier_orders/view.tpl b/admin-dev/themes/template/supplier_orders/view.tpl index ef3c4245b..b22ce282b 100755 --- a/admin-dev/themes/template/supplier_orders/view.tpl +++ b/admin-dev/themes/template/supplier_orders/view.tpl @@ -35,6 +35,10 @@ {l s='Employee:'} {$supplier_order_employee} + + {l s='Creation date:'} + {$supplier_order_creation_date} + {l s='Last update:'} {$supplier_order_last_update} @@ -47,6 +51,14 @@ {l s='Warehouse:'} {$supplier_order_warehouse} + + {l s='Currency:'} + {$supplier_order_currency->name} + + + {l s='Global discount rate:'} + {$supplier_order_discount_rate} % + @@ -64,7 +76,7 @@ - + @@ -72,15 +84,15 @@ - + - + - + @@ -88,11 +100,11 @@ - + - + @@ -100,7 +112,7 @@ - +
{l s='Designation'}{l s='Value'}{l s='Value'}
{l s='Total TE'}{$supplier_order_total_te}{$supplier_order_currency->prefix} {$supplier_order_total_te} {$supplier_order_currency->suffix}
{l s='Discount'}{$supplier_order_discount_value_te}{$supplier_order_currency->prefix} {$supplier_order_discount_value_te} {$supplier_order_currency->suffix}
{l s='Total with discount TE'}{$supplier_order_total_with_discount_te}{$supplier_order_currency->prefix} {$supplier_order_total_with_discount_te} {$supplier_order_currency->suffix}
{l s='Total Tax'}{$supplier_order_total_tax}{$supplier_order_currency->prefix} {$supplier_order_total_tax} {$supplier_order_currency->suffix}
{l s='Total TI'}{$supplier_order_total_ti}{$supplier_order_currency->prefix} {$supplier_order_total_ti} {$supplier_order_currency->suffix}
{l s='TOTAL TO PAY'}{$supplier_order_total_ti}{$supplier_order_currency->prefix} {$supplier_order_total_ti} {$supplier_order_currency->suffix}
diff --git a/admin-dev/themes/template/toolbar.tpl b/admin-dev/themes/template/toolbar.tpl index 04b5714ab..b33ce54ea 100644 --- a/admin-dev/themes/template/toolbar.tpl +++ b/admin-dev/themes/template/toolbar.tpl @@ -40,49 +40,54 @@ //get reference on save link btn_save = $('span[class~="process-icon-save"]').parent(); - //get reference on save and stay link - btn_save_and_stay = $('span[class~="process-icon-save-and-stay"]').parent(); - - //get reference on form submit button - btn_submit = $('#{$table}_form_submit_btn'); - - //get reference on current save link label - lbl_save = $('#desc-{$table}-save div'); - - //override save link label with submit button value - lbl_save.html(btn_submit.attr("value")); - - if (btn_save_and_stay) + if (btn_save.length > 0) { + //get reference on save and stay link + btn_save_and_stay = $('span[class~="process-icon-save-and-stay"]').parent(); + + //get reference on form submit button + btn_submit = $('#{$table}_form_submit_btn'); + //get reference on current save link label - lbl_save_and_stay = $('#desc-{$table}-save-and-stay div'); + lbl_save = $('#desc-{$table}-save div'); - //override save and stay link label with submit button value - lbl_save_and_stay.html(btn_submit.attr("value") + ' and stay'); - } + //override save link label with submit button value + if (btn_submit.attr("value").length > 0) + lbl_save.html(btn_submit.attr("value")); - //hide standard submit button - btn_submit.hide(); - - //submit the form - {block name=formSubmit} - btn_save.click(function() { - //add hidden input to emulate submit button click when posting the form -> field name posted - btn_submit.before(''); - - $('#{$table}_form').submit(); - }); - - if (btn_save_and_stay) + if (btn_save_and_stay.length > 0) { - btn_save_and_stay.click(function() { + //get reference on current save link label + lbl_save_and_stay = $('#desc-{$table}-save-and-stay div'); + + //override save and stay link label with submit button value + if (btn_submit.attr("value").length > 0) + lbl_save_and_stay.html(btn_submit.attr("value") + ' and stay'); + } + + //hide standard submit button + btn_submit.hide(); + + //submit the form + {block name=formSubmit} + btn_save.click(function() { //add hidden input to emulate submit button click when posting the form -> field name posted - btn_submit.before(''); + btn_submit.before(''); $('#{$table}_form').submit(); }); - } - {/block} + + if (btn_save_and_stay) + { + btn_save_and_stay.click(function() { + //add hidden input to emulate submit button click when posting the form -> field name posted + btn_submit.before(''); + + $('#{$table}_form').submit(); + }); + } + {/block} + } }); {/block} diff --git a/classes/stock/SupplierOrder.php b/classes/stock/SupplierOrder.php index a06a8c62c..b5bae5850 100755 --- a/classes/stock/SupplierOrder.php +++ b/classes/stock/SupplierOrder.php @@ -219,6 +219,7 @@ class SupplierOrderCore extends ObjectModel $this->total_ti = 0; $is_discount = false; + if (is_numeric($this->discount_rate) && (float)$this->discount_rate > 0) $is_discount = true; @@ -229,10 +230,7 @@ class SupplierOrderCore extends ObjectModel { // apply global discount rate on each product if possible if ($is_discount) - { $entry->applyGlobalDiscount((float)$this->discount_rate); - $entry->save(); - } // add new prices to the total $this->total_te += $entry->price_with_discount_te; diff --git a/classes/stock/SupplierOrderDetail.php b/classes/stock/SupplierOrderDetail.php index 03901f038..10a80d1c8 100755 --- a/classes/stock/SupplierOrderDetail.php +++ b/classes/stock/SupplierOrderDetail.php @@ -227,8 +227,8 @@ class SupplierOrderDetailCore extends ObjectModel $this->price_te = (float)$this->unit_price_te * (int)$this->quantity_expected; // calcul entry discount value - if ($this->discount_rate != null && is_numeric($this->discount_rate) && $this->discount_rate > 0) - $htis->discount_value_te = (float)$this->price_te * ((float)$this->discount_rate / 100); + if ($this->discount_rate != null && is_float($this->discount_rate) && $this->discount_rate > 0) + $this->discount_value_te = (float)$this->price_te * ($this->discount_rate / 100); // calcul entry price with discount $this->price_with_discount_te = $this->price_te - $this->discount_value_te; @@ -239,7 +239,7 @@ class SupplierOrderDetailCore extends ObjectModel // define default values for order discount fields $this->tax_value_with_order_discount = $this->tax_value; - $this->price_with_order_dscount_te = $this->price_with_discount_te; + $this->price_with_order_discount_te = $this->price_with_discount_te; } /** @@ -252,10 +252,12 @@ class SupplierOrderDetailCore extends ObjectModel if ($discount_rate != null && is_numeric($discount_rate) && (float)$discount_rate > 0) { // calculate new price, with global order discount, tax ecluded - $this->price_with_order_dscount_te = $this->price_with_discount_te - ($this->price_with_discount_te * ((float)$discount_rate / 100)); + $this->price_with_order_discount_te = $this->price_with_discount_te - ($this->price_with_discount_te * ((float)$discount_rate / 100)); // calculate new tax value, with global order discount - $this->tax_value_with_order_discount = $this->price_with_order_dscount_te * ((float)$this->tax_rate / 100); + $this->tax_value_with_order_discount = $this->price_with_order_discount_te * ((float)$this->tax_rate / 100); + + parent::update(); } } @@ -264,15 +266,48 @@ class SupplierOrderDetailCore extends ObjectModel */ public function validateController($htmlentities = true) { - $errors = parent::validateController($htmlentities); + $errors = array(); + + /* Checking for required fields */ + $fields_required = $this->fieldsRequired; + + if (isset(self::$fieldsRequiredDatabase[get_class($this)])) + $fields_required = array_merge( + $this->fieldsRequired, + self::$fieldsRequiredDatabase[get_class($this)] + ); + + foreach ($fields_required as $field) + if (($value = $this->{$field}) == false && (string)$value != '0') + if (!$this->id || $field != 'passwd') + $errors[] = ''.self::displayFieldName($field, get_class($this), $htmlentities) + .' '.Tools::displayError('is required.'); + + /* Checking for maximum fields sizes */ + foreach ($this->fieldsSize as $field => $max_length) + if ($value = $this->{$field} && Tools::strlen($value) > $max_length) + $errors[] = ''.self::displayFieldName($field, get_class($this), $htmlentities) + .' '.Tools::displayError('is too long.').' ('.Tools::displayError('Maximum length:').' '.$max_length.')'; + + /* Checking for fields validity */ + foreach ($this->fieldsValidate as $field => $function) + if ($value = $this->{$field}) + if (!Validate::$function($value) && (!empty($value) || in_array($field, $this->fieldsRequired))) + $errors[] = ''.self::displayFieldName($field, get_class($this), $htmlentities).' '.Tools::displayError('is invalid.'); + else + if ($field == 'passwd') + if ($value = Tools::getValue($field)) + $this->{$field} = Tools::encrypt($value); + else + $this->{$field} = $value; if ($this->quantity_expected <= 0) $errors[] = ''.self::displayFieldName('quantity_expected', get_class($this)).' '.Tools::displayError('is invalid.'); - if ($this->tax_rate <= 0 || $this->tax_rate > 100) + if ($this->tax_rate < 0 || $this->tax_rate > 100) $errors[] = ''.self::displayFieldName('tax_rate', get_class($this)).' '.Tools::displayError('is invalid.'); - if ($this->discount_rate <= 0 || $this->discount_rate > 100) + if ($this->discount_rate < 0 || $this->discount_rate > 100) $errors[] = ''.self::displayFieldName('discount_rate', get_class($this)).' '.Tools::displayError('is invalid.'); return $errors; diff --git a/controllers/admin/AdminSupplierOrdersController.php b/controllers/admin/AdminSupplierOrdersController.php index 356151347..c93cf4fba 100644 --- a/controllers/admin/AdminSupplierOrdersController.php +++ b/controllers/admin/AdminSupplierOrdersController.php @@ -351,11 +351,11 @@ class AdminSupplierOrdersControllerCore extends AdminController ), array( 'type' => 'text', - 'label' => $this->l('Global discount rate:'), + 'label' => $this->l('Global discount rate (%):'), 'name' => 'discount_rate', 'size' => 7, 'required' => true, - 'p' => $this->l('This is the global discount rate for the order.'), + 'p' => $this->l('This is the global discount rate in percents for the order.'), ), ), 'submit' => array( @@ -1400,178 +1400,36 @@ class AdminSupplierOrdersControllerCore extends AdminController // gets the id supplier to view $id_supplier_order = (int)Tools::getValue('id_supplier_order'); - // re-defines fieldsDisplay - $this->fieldsDisplay = array( - 'p_reference' => array( - 'title' => $this->l('Reference'), - 'align' => 'center', - 'width' => 100, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'p_ean13' => array( - 'title' => $this->l('EAN13'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'p_name' => array( - 'title' => $this->l('Name'), - 'width' => 350, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'unit_price_te' => array( - 'title' => $this->l('Unit price (te)'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'quantity_expected' => array( - 'title' => $this->l('Quantity'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'price_te' => array( - 'title' => $this->l('Price (te)'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'discount_rate' => array( - 'title' => $this->l('Discount rate'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'discount_value_te' => array( - 'title' => $this->l('Discount value (te)'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'price_with_discount_te' => array( - 'title' => $this->l('Price with product discount (te)'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'tax_rate' => array( - 'title' => $this->l('Tax rate'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'tax_value' => array( - 'title' => $this->l('Tax value'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'price_ti' => array( - 'title' => $this->l('Price (ti)'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'tax_value_with_order_discount' => array( - 'title' => $this->l('Tax value with global order discount'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'price_with_order_discount_te' => array( - 'title' => $this->l('Price with global order discount (te)'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - 'exchange_rate' => array( - 'title' => $this->l('Exchange rate'), - 'align' => 'center', - 'width' => 75, - 'orderby' => false, - 'filter' => false, - 'search' => false, - ), - ); - // just in case.. unset($this->_select, $this->_join, $this->_where, $this->_orderBy, $this->_orderWay, $this->_group, $this->_filterHaving, $this->_filter); // gets all information on the products ordered $this->_select = ' - CONCAT(a.unit_price_te, \' \', c.sign) as unit_price_te, - CONCAT(a.price_te, \' \', c.sign) as price_te, - CONCAT(a.discount_value_te, \' \', c.sign) as discount_value_te, - CONCAT(a.price_with_discount_te, \' \', c.sign) as price_with_discount_te, - CONCAT(a.tax_value, \' \', c.sign) as tax_value, - CONCAT(a.price_ti, \' \', c.sign) as price_ti, - CONCAT(a.tax_value_with_order_discount, \' \', c.sign) as tax_value_with_order_discount, - CONCAT(a.price_with_order_discount_te, \' \', c.sign) as price_with_order_discount_te, - IFNULL(CONCAT(pl.name, \' : \', GROUP_CONCAT(agl.name, \' - \', al.name SEPARATOR \', \')), pl.name) as p_name, - p.reference as p_reference, - p.ean13 as p_ean13'; + IFNULL(CONCAT(pl.name, \' : \', GROUP_CONCAT(agl.name, \' - \', al.name SEPARATOR \', \')), pl.name) as p_name, + p.reference as p_reference, + p.ean13 as p_ean13'; + $this->_join = ' - INNER JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = a.id_product AND pl.id_lang = '.$lang_id.') - LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = a.id_product) - LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_product_attribute = a.id_product_attribute) - LEFT JOIN '._DB_PREFIX_.'attribute atr ON (atr.id_attribute = pac.id_attribute) - LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = atr.id_attribute AND al.id_lang = '.$lang_id.') - LEFT JOIN '._DB_PREFIX_.'attribute_group_lang agl ON (agl.id_attribute_group = atr.id_attribute_group AND agl.id_lang = '.$lang_id.') - LEFT JOIN '._DB_PREFIX_.'currency c ON (a.id_currency = c.id_currency)'; + INNER JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = a.id_product AND pl.id_lang = '.$lang_id.') + LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = a.id_product) + LEFT JOIN '._DB_PREFIX_.'product_attribute_combination pac ON (pac.id_product_attribute = a.id_product_attribute) + LEFT JOIN '._DB_PREFIX_.'attribute atr ON (atr.id_attribute = pac.id_attribute) + LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = atr.id_attribute AND al.id_lang = '.$lang_id.') + LEFT JOIN '._DB_PREFIX_.'attribute_group_lang agl ON (agl.id_attribute_group = atr.id_attribute_group AND agl.id_lang = '.$lang_id.')'; + $this->_where = 'AND a.`id_supplier_order` = '.(int)$id_supplier_order; $this->_group = 'GROUP BY a.id_product'; - // gets the list ordered by price desc, without limit - $this->getList($lang_id, 'price_te', 'DESC', 0, false, false); - - // renders list - $helper = new HelperList(); - $helper->simple_header = true; - $helper->no_link = true; - $helper->show_toolbar = false; - $helper->toolbar_fix = false; - $helper->shopLinkType = ''; - $helper->identifier = $this->identifier; - - // generates content - $content = $helper->generateList($this->_list, $this->fieldsDisplay); - // displays content - // gets global order information $supplier_order = new SupplierOrder((int)$id_supplier_order); + if (Validate::isLoadedObject($supplier_order)) { + // gets the list ordered by price desc, without limit + $this->getList($lang_id, 'price_te', 'DESC', 0, false, false); + // gets the currency used in this order - $currency = Currency::getCurrency($supplier_order->id_currency); + $currency = new Currency($supplier_order->id_currency); // gets the employee in charge of the order $employee = new Employee($supplier_order->id_employee); @@ -1579,24 +1437,167 @@ class AdminSupplierOrdersControllerCore extends AdminController // gets the warehouse where products will be received $warehouse = new Warehouse($supplier_order->id_warehouse); + // sets toolbar title with order reference + $this->toolbar_title = sprintf($this->l('View Supplier Order #%s'), $supplier_order->reference); + + // re-defines fieldsDisplay + $this->fieldsDisplay = array( + 'p_reference' => array( + 'title' => $this->l('Reference'), + 'align' => 'center', + 'width' => 120, + 'orderby' => false, + 'filter' => false, + 'search' => false, + ), + 'p_ean13' => array( + 'title' => $this->l('EAN13'), + 'align' => 'center', + 'width' => 100, + 'orderby' => false, + 'filter' => false, + 'search' => false, + ), + 'p_name' => array( + 'title' => $this->l('Name'), + 'orderby' => false, + 'filter' => false, + 'search' => false, + ), + 'unit_price_te' => array( + 'title' => $this->l('Unit price (te)'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'prefix' => $currency->prefix, + 'suffix' => $currency->suffix, + ), + 'quantity_expected' => array( + 'title' => $this->l('Quantity'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + ), + 'price_te' => array( + 'title' => $this->l('Price (te)'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'prefix' => $currency->prefix, + 'suffix' => $currency->suffix, + ), + 'discount_rate' => array( + 'title' => $this->l('Discount rate'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'suffix' => '%', + ), + 'discount_value_te' => array( + 'title' => $this->l('Discount value (te)'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'prefix' => $currency->prefix, + 'suffix' => $currency->suffix, + ), + 'price_with_discount_te' => array( + 'title' => $this->l('Price with product discount (te)'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'prefix' => $currency->prefix, + 'suffix' => $currency->suffix, + ), + 'tax_rate' => array( + 'title' => $this->l('Tax rate'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'suffix' => '%', + ), + 'tax_value' => array( + 'title' => $this->l('Tax value'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'prefix' => $currency->prefix, + 'suffix' => $currency->suffix, + ), + 'price_ti' => array( + 'title' => $this->l('Price (ti)'), + 'align' => 'right', + 'width' => 80, + 'orderby' => false, + 'filter' => false, + 'search' => false, + 'prefix' => $currency->prefix, + 'suffix' => $currency->suffix, + ), + ); + + //some staff before render list + foreach ($this->_list as &$item) + { + $item['unit_price_te'] = Tools::ps_round($item['unit_price_te'], (int)$currency->decimals + 1); + $item['price_te'] = Tools::ps_round($item['price_te'], (int)$currency->decimals + 1); + $item['tax_value'] = Tools::ps_round($item['tax_value'], (int)$currency->decimals + 1); + $item['tax_value_with_order_discount'] = Tools::ps_round($item['tax_value_with_order_discount'], (int)$currency->decimals + 1); + $item['price_ti'] = Tools::ps_round($item['price_ti'], (int)$currency->decimals + 1); + $item['price_with_discount_te'] = Tools::ps_round($item['price_with_discount_te'], (int)$currency->decimals + 1); + $item['price_with_order_discount_te'] = Tools::ps_round($item['price_with_order_discount_te'], (int)$currency->decimals + 1); + $item['discount_value_te'] = Tools::ps_round($item['discount_value_te'], (int)$currency->decimals + 1); + + $item['discount_rate'] = Tools::ps_round($item['discount_rate'], 2); + $item['tax_rate'] = Tools::ps_round($item['tax_rate'], 2); + } + + // renders list + $helper = new HelperList(); + $helper->simple_header = true; + $helper->no_link = true; + $helper->show_toolbar = false; + $helper->toolbar_fix = false; + $helper->shopLinkType = ''; + $helper->identifier = $this->identifier; + + $content = $helper->generateList($this->_list, $this->fieldsDisplay); + // display these global order informations $this->tpl_view_vars = array( 'supplier_order_detail_content' => $content, - 'supplier_order_currency_sign' => $currency ? $currency['sign'] : '', 'supplier_order_employee' => (Validate::isLoadedObject($employee) ? $employee->firstname.' '.$employee->lastname : ''), 'supplier_order_warehouse' => (Validate::isLoadedObject($warehouse) ? $warehouse->name : ''), 'supplier_order_reference' => $supplier_order->reference, - 'supplier_order_last_update' => $supplier_order->date_upd, - 'supplier_order_expected' => $supplier_order->date_delivery_expected, - 'supplier_order_total_te' => $supplier_order->total_te, - 'supplier_order_discount_value_te' => $supplier_order->discount_value_te, - 'supplier_order_total_with_discount_te' => $supplier_order->total_with_discount_te, - 'supplier_order_total_tax' => $supplier_order->total_tax, - 'supplier_order_total_ti' => $supplier_order->total_ti, + 'supplier_order_creation_date' => Tools::displayDate($supplier_order->date_add, $lang_id, true), + 'supplier_order_last_update' => Tools::displayDate($supplier_order->date_upd, $lang_id, true), + 'supplier_order_expected' => Tools::displayDate($supplier_order->date_delivery_expected, $lang_id, true), + 'supplier_order_discount_rate' => Tools::ps_round($supplier_order->discount_rate, 2), + 'supplier_order_total_te' => Tools::ps_round($supplier_order->total_te, (int)$currency->decimals + 1), + 'supplier_order_discount_value_te' => Tools::ps_round($supplier_order->discount_value_te, (int)$currency->decimals + 1), + 'supplier_order_total_with_discount_te' => Tools::ps_round($supplier_order->total_with_discount_te, (int)$currency->decimals + 1), + 'supplier_order_total_tax' => Tools::ps_round($supplier_order->total_tax, (int)$currency->decimals + 1), + 'supplier_order_total_ti' => Tools::ps_round($supplier_order->total_ti, (int)$currency->decimals + 1), + 'supplier_order_currency' => $currency, ); - // sets toolbar title with order reference - $this->toolbar_title = sprintf($this->l('View Supplier Order #%s'), $supplier_order->reference); } + return parent::initView(); }