diff --git a/admin-dev/themes/template/supplier_orders/form.tpl b/admin-dev/themes/template/supplier_orders/form.tpl
index 1090b3d42..1326bcbd1 100644
--- a/admin-dev/themes/template/supplier_orders/form.tpl
+++ b/admin-dev/themes/template/supplier_orders/form.tpl
@@ -189,7 +189,16 @@
$('#supplier_order_form').submit();
});
- // set autocomplete
+ // bind enter key event on search field
+ $('#cur_product_name').bind('keypress', function(e) {
+ var code = (e.keyCode ? e.keyCode : e.which);
+ if(code == 13) { //Enter keycode
+ e.stopPropagation();//Stop event propagation
+ return false;
+ }
+ });
+
+ // set autocomplete on search field
$('#cur_product_name').autocomplete("ajax_supplier_order_products_list.php", {
delay: 100,
minChars: 4,
diff --git a/admin-dev/themes/template/supplier_orders/update_receipt.tpl b/admin-dev/themes/template/supplier_orders/update_receipt.tpl
index fd9bfbc58..b4bb190ec 100644
--- a/admin-dev/themes/template/supplier_orders/update_receipt.tpl
+++ b/admin-dev/themes/template/supplier_orders/update_receipt.tpl
@@ -31,7 +31,5 @@ $(function() {
});
});
-
- {l s='Order'} #{$supplier_order_reference}
- {$content}
-
+
+{$content}
\ No newline at end of file
diff --git a/admin-dev/themes/template/supplier_orders/view.tpl b/admin-dev/themes/template/supplier_orders/view.tpl
index b22ce282b..eba856fe1 100755
--- a/admin-dev/themes/template/supplier_orders/view.tpl
+++ b/admin-dev/themes/template/supplier_orders/view.tpl
@@ -84,15 +84,15 @@
{l s='Total TE'}
- {$supplier_order_currency->prefix} {$supplier_order_total_te} {$supplier_order_currency->suffix}
+ {$supplier_order_total_te}
{l s='Discount'}
- {$supplier_order_currency->prefix} {$supplier_order_discount_value_te} {$supplier_order_currency->suffix}
+ {$supplier_order_discount_value_te}
{l s='Total with discount TE'}
- {$supplier_order_currency->prefix} {$supplier_order_total_with_discount_te} {$supplier_order_currency->suffix}
+ {$supplier_order_total_with_discount_te}
@@ -100,11 +100,11 @@
{l s='Total Tax'}
- {$supplier_order_currency->prefix} {$supplier_order_total_tax} {$supplier_order_currency->suffix}
+ {$supplier_order_total_tax}
{l s='Total TI'}
- {$supplier_order_currency->prefix} {$supplier_order_total_ti} {$supplier_order_currency->suffix}
+ {$supplier_order_total_ti}
@@ -112,7 +112,7 @@
{l s='TOTAL TO PAY'}
- {$supplier_order_currency->prefix} {$supplier_order_total_ti} {$supplier_order_currency->suffix}
+ {$supplier_order_total_ti}
diff --git a/classes/OrderHistory.php b/classes/OrderHistory.php
index 1ec247025..5749d8268 100644
--- a/classes/OrderHistory.php
+++ b/classes/OrderHistory.php
@@ -1,6 +1,6 @@
'isUnsignedId', 'id_order_state' => 'isUnsignedId', 'id_employee' => 'isUnsignedId');
protected $table = 'order_history';
protected $identifier = 'id_order_history';
-
+
protected $webserviceParameters = array(
'objectsNodeName' => 'order_histories',
'fields' => array(
@@ -61,12 +61,12 @@ class OrderHistoryCore extends ObjectModel
public function getFields()
{
$this->validateFields();
-
+
$fields['id_order'] = (int)$this->id_order;
$fields['id_order_state'] = (int)$this->id_order_state;
$fields['id_employee'] = (int)$this->id_employee;
$fields['date_add'] = pSQL($this->date_add);
-
+
return $fields;
}
@@ -76,7 +76,7 @@ class OrderHistoryCore extends ObjectModel
{
Hook::updateOrderStatus((int)($new_order_state), (int)$id_order);
$order = new Order((int)($id_order));
-
+
/* Best sellers */
$newOS = new OrderState((int)($new_order_state), $order->id_lang);
$oldOrderStatus = OrderHistory::getLastOrderState((int)$id_order);
@@ -91,20 +91,31 @@ class OrderHistoryCore extends ObjectModel
/* If becoming unlogable => removing sale */
elseif (!$newOS->logable AND ($oldOrderStatus AND $oldOrderStatus->logable))
ProductSale::removeProductSale($product['id_product'], $product['cart_quantity']);
-
+
if (!Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') && !$isValidated AND $newOS->logable AND isset($oldOrderStatus) AND $oldOrderStatus AND $oldOrderStatus->id == Configuration::get('PS_OS_ERROR'))
StockAvailable::updateQuantity($product['id_product'], $product['id_product_attribute'], (int)$product['cart_quantity']);
else if ($newOS->shipped == 1 && $oldOrderStatus->shipped == 0) // The product is removed from the physical stock. $id_warehouse is needed
- Stock::updateQuantity($product['id_product'], $product['id_product_attribute'], -$product['cart_quantity'], $id_warehouse, $id_order);
+ {
+ $manager = StockManagerFactory::getManager();
+ $warehouse = new Warehouse($id_warehouse);
+
+ $manager->removeProduct($product['id_product'],
+ $product['id_product_attribute'],
+ $warehouse,
+ $product['cart_quantity'],
+ Configuration::get('PS_STOCK_CUSTOMER_ORDER_REASON'),
+ true,
+ (int)$id_order);
+ }
// @todo If the old order states was "shipped" and the new is "not shipped" the stock is not decremented
}
-
+
$this->id_order_state = (int)($new_order_state);
-
+
/* Change invoice number of order ? */
if (!Validate::isLoadedObject($newOS) OR !Validate::isLoadedObject($order))
die(Tools::displayError('Invalid new order state'));
-
+
/* The order is valid only if the invoice is available and the order is not cancelled */
$order->valid = $newOS->logable;
$order->update();
@@ -134,7 +145,7 @@ class OrderHistoryCore extends ObjectModel
if (!$context)
$context = Context::getContext();
$lastOrderState = $this->getLastOrderState($this->id_order);
-
+
if (!parent::add($autodate))
return false;
@@ -156,7 +167,7 @@ class OrderHistoryCore extends ObjectModel
$order = new Order((int)$this->id_order);
$data['{total_paid}'] = Tools::displayPrice((float)$order->total_paid, new Currency((int)$order->id_currency), false);
$data['{order_name}'] = sprintf("#%06d", (int)$order->id);
-
+
// An additional email is sent the first time a virtual item is validated
if ($virtualProducts = $order->getVirtualProducts() AND (!$lastOrderState OR !$lastOrderState->logable) AND $newOrderState = new OrderState($this->id_order_state, Configuration::get('PS_LANG_DEFAULT')) AND $newOrderState->logable)
{
@@ -196,13 +207,13 @@ class OrderHistoryCore extends ObjectModel
return true;
}
-
+
public function isValidated()
{
return Db::getInstance()->getValue('
SELECT COUNT(oh.`id_order_history`) AS nb
- FROM `'._DB_PREFIX_.'order_state` os
- LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (os.`id_order_state` = oh.`id_order_state`)
+ FROM `'._DB_PREFIX_.'order_state` os
+ LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (os.`id_order_state` = oh.`id_order_state`)
WHERE oh.`id_order` = '.(int)$this->id_order.'
AND os.`logable` = 1');
}
diff --git a/classes/Tools.php b/classes/Tools.php
index 4eedeeb66..5c00bbad3 100644
--- a/classes/Tools.php
+++ b/classes/Tools.php
@@ -378,6 +378,8 @@ class ToolsCore
*/
public static function displayPrice($price, $currency = NULL, $no_utf8 = false, Context $context = null)
{
+ if (!is_numeric($price))
+ return $price;
if (!$context)
$context = Context::getContext();
if ($currency === NULL)
diff --git a/classes/stock/Stock.php b/classes/stock/Stock.php
index 379ea9b13..6a84c8149 100644
--- a/classes/stock/Stock.php
+++ b/classes/stock/Stock.php
@@ -73,34 +73,4 @@ class StockCore extends ObjectModel
$fields['price_te'] = (float)round($this->price_te, 6);
return $fields;
}
-
- /**
- * For a given id_product and id_product_attribute update the quantity in stock
- */
- public static function updateQuantity($id_product, $id_product_attribute, $delta_quantity, $id_warehouse, $id_order = null)
- {
- $warehouse = new Warehouse($id_warehouse);
- // Update quantity of the pack products
- if (Pack::isPack($id_product))
- {
- $products_pack = Pack::getItems((int)$product['id_product'], (int)Configuration::get('PS_LANG_DEFAULT'));
- foreach ($products_pack as $product_pack)
- {
- $pack_id_product_attribute = Product::getDefaultAttribute($tab_product_pack['id_product'], 1);
- self::updateQuantity($product_pack->id, $pack_id_product_attribute, $product_pack->pack_quantity * $delta_quantity, $id_warehouse, $id_order);
- }
- }
- if ($delta_quantity > 0)
- $id_stock_mvt_reason = Configuration::get('PS_STOCK_MVT_INC_REASON_DEFAULT');
- else
- $id_stock_mvt_reason = Configuration::get('PS_STOCK_MVT_DEC_REASON_DEFAULT');
-
- StockManagerFactory::getManager()->removeProduct($id_product,
- $id_product_attribute,
- $warehouse,
- $delta_quantity,
- $id_stock_mvt_reason,
- true,
- (int)$id_order);
- }
}
\ No newline at end of file
diff --git a/classes/stock/StockManager.php b/classes/stock/StockManager.php
index bc45b81d2..887a2ec0b 100644
--- a/classes/stock/StockManager.php
+++ b/classes/stock/StockManager.php
@@ -202,188 +202,202 @@ class StockManagerCore implements StockManagerInterface
$context = Context::getContext();
- // gets total quantities in stock for the current product
- $physical_quantity_in_stock = (int)$this->getProductPhysicalQuantities($id_product, $id_product_attribute, array($warehouse->id), false);
- $usable_quantity_in_stock = (int)$this->getProductPhysicalQuantities($id_product, $id_product_attribute, array($warehouse->id), true);
-
- // check quantity if we want to decrement unusable quantity
- if (!$is_usable)
- $quantity_in_stock = $physical_quantity_in_stock - $usable_quantity_in_stock;
- else
- $quantity_in_stock = $usable_quantity_in_stock;
-
- // checks if it's possible to remove the given quantity
- if ($quantity_in_stock < $quantity)
- return $return;
-
- $stock_collection = $this->getStockCollection($id_product, $id_product_attribute, $warehouse->id);
-
- // check if the collection is loaded
- if (count($stock_collection) <= 0)
- return $return;
-
- $stock_history_qty_available = array();
- $mvt_params = array();
- $stock_params = array();
- $quantity_to_decrement_by_stock = array();
- $global_quantity_to_decrement = $quantity;
-
- // switch on MANAGEMENT_TYPE
- switch ($warehouse->management_type)
+ // Special case of a pack
+ if (Pack::isPack($id_product))
{
- // case CUMP mode
- case 'WA':
- // There is one and only one stock for a given product in a warehouse in this mode
- $stock = $stock_collection[0];
+ $products_pack = Pack::getItems((int)$product['id_product'], (int)Configuration::get('PS_LANG_DEFAULT'));
+ foreach ($products_pack as $product_pack)
+ {
+ $pack_id_product_attribute = Product::getDefaultAttribute($tab_product_pack['id_product'], 1); //@TODO is there a better way to retrieve the product attribute assciated to the pack ?
+ $this->removeProduct($product_pack->id, $pack_id_product_attribute, $product_pack->pack_quantity * $quantity, $warehouse, $id_order);
+ }
+ }
+ else
+ {
+ // gets total quantities in stock for the current product
+ $physical_quantity_in_stock = (int)$this->getProductPhysicalQuantities($id_product, $id_product_attribute, array($warehouse->id), false);
+ $usable_quantity_in_stock = (int)$this->getProductPhysicalQuantities($id_product, $id_product_attribute, array($warehouse->id), true);
- $mvt_params = array(
- 'id_stock' => $stock->id,
- 'physical_quantity' => $quantity,
- 'id_stock_mvt_reason' => $id_stock_mvt_reason,
- 'id_order' => $id_order,
- 'price_te' => $stock->price_te,
- 'last_wa' => $stock->price_te,
- 'current_wa' => $stock->price_te,
- 'id_employee' => $context->employee->id,
- 'sign' => -1
- );
- $stock_params = array(
- 'physical_quantity' => ($stock->physical_quantity - $quantity),
- 'usable_quantity' => ($is_usable ? ($stock->usable_quantity - $quantity) : $stock->usable_quantity)
- );
+ // check quantity if we want to decrement unusable quantity
+ if (!$is_usable)
+ $quantity_in_stock = $physical_quantity_in_stock - $usable_quantity_in_stock;
+ else
+ $quantity_in_stock = $usable_quantity_in_stock;
- // saves stock in warehouse
- $stock->hydrate($stock_params);
- $stock->update();
+ // checks if it's possible to remove the given quantity
+ if ($quantity_in_stock < $quantity)
+ return $return;
- // saves stock mvt
- $stock_mvt = new StockMvt();
- $stock_mvt->hydrate($mvt_params);
- $stock_mvt->save();
+ $stock_collection = $this->getStockCollection($id_product, $id_product_attribute, $warehouse->id);
- $return[$stock->id]['quantity'] = $quantity;
- $return[$stock->id]['price_te'] = $stock->price_te;
+ // check if the collection is loaded
+ if (count($stock_collection) <= 0)
+ return $return;
- break;
+ $stock_history_qty_available = array();
+ $mvt_params = array();
+ $stock_params = array();
+ $quantity_to_decrement_by_stock = array();
+ $global_quantity_to_decrement = $quantity;
- case 'LIFO':
- case 'FIFO':
+ // switch on MANAGEMENT_TYPE
+ switch ($warehouse->management_type)
+ {
+ // case CUMP mode
+ case 'WA':
+ // There is one and only one stock for a given product in a warehouse in this mode
+ $stock = $stock_collection[0];
- // for each stock, parse its mvts history to calculate the quantities left for each positive mvt,
- // according to the instant available quantities for this stock
- foreach ($stock_collection as $stock)
- {
- $left_quantity_to_check = $stock->physical_quantity;
- if ($left_quantity_to_check <= 0)
- continue;
-
- $resource = Db::getInstance(_PS_USE_SQL_SLAVE_)->execute('
- SELECT sm.`id_stock_mvt`, sm.`date_add`, sm.`physical_quantity`,
- IF ((sm2.`physical_quantity` is null), sm.`physical_quantity`, (sm.`physical_quantity` - SUM(sm2.`physical_quantity`))) as qty
- FROM `'._DB_PREFIX_.'stock_mvt` sm
- LEFT JOIN `'._DB_PREFIX_.'stock_mvt` sm2 ON sm2.`referer` = sm.`id_stock_mvt`
- WHERE sm.`sign` = 1
- AND sm.`id_stock` = '.(int)$stock->id.'
- GROUP BY sm.`id_stock_mvt`
- ORDER BY sm.`date_add` DESC'
+ $mvt_params = array(
+ 'id_stock' => $stock->id,
+ 'physical_quantity' => $quantity,
+ 'id_stock_mvt_reason' => $id_stock_mvt_reason,
+ 'id_order' => $id_order,
+ 'price_te' => $stock->price_te,
+ 'last_wa' => $stock->price_te,
+ 'current_wa' => $stock->price_te,
+ 'id_employee' => $context->employee->id,
+ 'sign' => -1
+ );
+ $stock_params = array(
+ 'physical_quantity' => ($stock->physical_quantity - $quantity),
+ 'usable_quantity' => ($is_usable ? ($stock->usable_quantity - $quantity) : $stock->usable_quantity)
);
- while ($row = Db::getInstance()->nextRow($resource))
+ // saves stock in warehouse
+ $stock->hydrate($stock_params);
+ $stock->update();
+
+ // saves stock mvt
+ $stock_mvt = new StockMvt();
+ $stock_mvt->hydrate($mvt_params);
+ $stock_mvt->save();
+
+ $return[$stock->id]['quantity'] = $quantity;
+ $return[$stock->id]['price_te'] = $stock->price_te;
+
+ break;
+
+ case 'LIFO':
+ case 'FIFO':
+
+ // for each stock, parse its mvts history to calculate the quantities left for each positive mvt,
+ // according to the instant available quantities for this stock
+ foreach ($stock_collection as $stock)
{
- // break - in FIFO mode, we have to retreive the oldest positive mvts for which there are left quantities
- if ($warehouse->management_type == 'FIFO')
- if ($row['qty'] == 0)
- break;
+ $left_quantity_to_check = $stock->physical_quantity;
+ if ($left_quantity_to_check <= 0)
+ continue;
- // converts date to timestamp
- $date = new DateTime($row['date_add']);
- $timestamp = $date->format('U');
-
- // history of the mvt
- $stock_history_qty_available[$timestamp] = array(
- 'id_stock' => $stock->id,
- 'id_stock_mvt' => (int)$row['id_stock_mvt'],
- 'qty' => (int)$row['qty']
+ $resource = Db::getInstance(_PS_USE_SQL_SLAVE_)->execute('
+ SELECT sm.`id_stock_mvt`, sm.`date_add`, sm.`physical_quantity`,
+ IF ((sm2.`physical_quantity` is null), sm.`physical_quantity`, (sm.`physical_quantity` - SUM(sm2.`physical_quantity`))) as qty
+ FROM `'._DB_PREFIX_.'stock_mvt` sm
+ LEFT JOIN `'._DB_PREFIX_.'stock_mvt` sm2 ON sm2.`referer` = sm.`id_stock_mvt`
+ WHERE sm.`sign` = 1
+ AND sm.`id_stock` = '.(int)$stock->id.'
+ GROUP BY sm.`id_stock_mvt`
+ ORDER BY sm.`date_add` DESC'
);
- // break - in LIFO mode, checks only the necessary history to handle the global quantity for the current stock
- if ($warehouse->management_type == 'LIFO')
+ while ($row = Db::getInstance()->nextRow($resource))
{
- $left_quantity_to_check -= (int)$row['physical_quantity'];
- if ($left_quantity_to_check <= 0)
- break;
- }
- }
- }
+ // break - in FIFO mode, we have to retreive the oldest positive mvts for which there are left quantities
+ if ($warehouse->management_type == 'FIFO')
+ if ($row['qty'] == 0)
+ break;
- if ($warehouse->management_type == 'LIFO')
- // orders stock history by timestamp to get newest history first
- krsort($stock_history_qty_available);
- else
- // orders stock history by timestamp to get oldest history first
- ksort($stock_history_qty_available);
+ // converts date to timestamp
+ $date = new DateTime($row['date_add']);
+ $timestamp = $date->format('U');
- // checks each stock to manage the real quantity to decrement for each of them
- foreach ($stock_history_qty_available as $entry)
- {
- if ($entry['qty'] >= $global_quantity_to_decrement)
- {
- $quantity_to_decrement_by_stock[$entry['id_stock']][$entry['id_stock_mvt']] = $global_quantity_to_decrement;
- $global_quantity_to_decrement = 0;
- }
- else
- {
- $quantity_to_decrement_by_stock[$entry['id_stock']][$entry['id_stock_mvt']] = $entry['qty'];
- $global_quantity_to_decrement -= $entry['qty'];
- }
-
- if ($global_quantity_to_decrement <= 0)
- break;
- }
-
- // for each stock, decrements it and logs the mvts
- foreach ($stock_collection as $stock)
- {
- if (array_key_exists($stock->id, $quantity_to_decrement_by_stock) && is_array($quantity_to_decrement_by_stock[$stock->id]))
- {
- $total_quantity_for_current_stock = 0;
-
- foreach ($quantity_to_decrement_by_stock[$stock->id] as $id_mvt_referrer => $qte)
- {
- $mvt_params = array(
+ // history of the mvt
+ $stock_history_qty_available[$timestamp] = array(
'id_stock' => $stock->id,
- 'physical_quantity' => $qte,
- 'id_stock_mvt_reason' => $id_stock_mvt_reason,
- 'id_order' => $id_order,
- 'price_te' => $stock->price_te,
- 'sign' => -1,
- 'referer' => $id_mvt_referrer,
- 'id_employee' => $context->employee->id
+ 'id_stock_mvt' => (int)$row['id_stock_mvt'],
+ 'qty' => (int)$row['qty']
);
- // saves stock mvt
- $stock_mvt = new StockMvt();
- $stock_mvt->hydrate($mvt_params);
- $stock_mvt->save();
+ // break - in LIFO mode, checks only the necessary history to handle the global quantity for the current stock
+ if ($warehouse->management_type == 'LIFO')
+ {
+ $left_quantity_to_check -= (int)$row['physical_quantity'];
+ if ($left_quantity_to_check <= 0)
+ break;
+ }
+ }
+ }
- $total_quantity_for_current_stock += $qte;
+ if ($warehouse->management_type == 'LIFO')
+ // orders stock history by timestamp to get newest history first
+ krsort($stock_history_qty_available);
+ else
+ // orders stock history by timestamp to get oldest history first
+ ksort($stock_history_qty_available);
+
+ // checks each stock to manage the real quantity to decrement for each of them
+ foreach ($stock_history_qty_available as $entry)
+ {
+ if ($entry['qty'] >= $global_quantity_to_decrement)
+ {
+ $quantity_to_decrement_by_stock[$entry['id_stock']][$entry['id_stock_mvt']] = $global_quantity_to_decrement;
+ $global_quantity_to_decrement = 0;
+ }
+ else
+ {
+ $quantity_to_decrement_by_stock[$entry['id_stock']][$entry['id_stock_mvt']] = $entry['qty'];
+ $global_quantity_to_decrement -= $entry['qty'];
}
- $stock_params = array(
- 'physical_quantity' => ($stock->physical_quantity - $total_quantity_for_current_stock),
- 'usable_quantity' => ($is_usable ? ($stock->usable_quantity - $total_quantity_for_current_stock) : $stock->usable_quantity)
- );
-
- $return[$stock->id]['quantity'] = $total_quantity_for_current_stock;
- $return[$stock->id]['price_te'] = $stock->price_te;
-
- // saves stock in warehouse
- $stock->hydrate($stock_params);
- $stock->update();
+ if ($global_quantity_to_decrement <= 0)
+ break;
}
- }
- break;
+
+ // for each stock, decrements it and logs the mvts
+ foreach ($stock_collection as $stock)
+ {
+ if (array_key_exists($stock->id, $quantity_to_decrement_by_stock) && is_array($quantity_to_decrement_by_stock[$stock->id]))
+ {
+ $total_quantity_for_current_stock = 0;
+
+ foreach ($quantity_to_decrement_by_stock[$stock->id] as $id_mvt_referrer => $qte)
+ {
+ $mvt_params = array(
+ 'id_stock' => $stock->id,
+ 'physical_quantity' => $qte,
+ 'id_stock_mvt_reason' => $id_stock_mvt_reason,
+ 'id_order' => $id_order,
+ 'price_te' => $stock->price_te,
+ 'sign' => -1,
+ 'referer' => $id_mvt_referrer,
+ 'id_employee' => $context->employee->id
+ );
+
+ // saves stock mvt
+ $stock_mvt = new StockMvt();
+ $stock_mvt->hydrate($mvt_params);
+ $stock_mvt->save();
+
+ $total_quantity_for_current_stock += $qte;
+ }
+
+ $stock_params = array(
+ 'physical_quantity' => ($stock->physical_quantity - $total_quantity_for_current_stock),
+ 'usable_quantity' => ($is_usable ? ($stock->usable_quantity - $total_quantity_for_current_stock) : $stock->usable_quantity)
+ );
+
+ $return[$stock->id]['quantity'] = $total_quantity_for_current_stock;
+ $return[$stock->id]['price_te'] = $stock->price_te;
+
+ // saves stock in warehouse
+ $stock->hydrate($stock_params);
+ $stock->update();
+ }
+ }
+ break;
+ }
}
+
return $return;
}
diff --git a/classes/stock/StockMvt.php b/classes/stock/StockMvt.php
index a87a8d523..924dee51c 100644
--- a/classes/stock/StockMvt.php
+++ b/classes/stock/StockMvt.php
@@ -33,28 +33,35 @@ class StockMvtCore extends ObjectModel
/**
* @since 1.5.0
- * @var int
+ * @var int The stock id on wtich the movement is applied
*/
public $id_stock;
/**
* @since 1.5.0
- * @var int
+ * @var int the quantity of product with is moved
*/
public $physical_quantity;
+ /**
+ * @var int id of the movement reason assoiated to the movement
+ */
public $id_stock_mvt_reason;
+
+ /**
+ * @var int Used when the movement is due to a customer order
+ */
public $id_order = null;
/**
* @since 1.5.0
- * @var int
+ * @var int detrmine if the movement is a positive or negative operation
*/
public $sign;
/**
* @since 1.5.0
- * @var int Will be used when supplier order are implemented
+ * @var int Used when the movement is due to a supplier order
*/
public $id_supplier_order = null;
@@ -72,7 +79,7 @@ class StockMvtCore extends ObjectModel
/**
* @since 1.5.0
- * @var float
+ * @var float The unit price without tax of the product associated to the movement
*/
public $price_te;
diff --git a/classes/stock/StockMvtReason.php b/classes/stock/StockMvtReason.php
index 316e4a308..063f914d7 100644
--- a/classes/stock/StockMvtReason.php
+++ b/classes/stock/StockMvtReason.php
@@ -27,14 +27,26 @@
class StockMvtReasonCore extends ObjectModel
{
+ /** @var int identifier of the movement reason */
public $id;
+
+ /** @var string the name of the movement reason */
public $name;
+
+ /** @var int detrmine if the movement reason correspond to a positive or negative operation */
public $sign;
+
+ /** @var string the creation date of the movement reason */
public $date_add;
+
+ /** @var string the last update date of the movement reason */
public $date_upd;
+
+ /** @var boolean True if the movement reason has been deleted (staying in database as deleted) */
+ public $deleted = 0;
+
protected $table = 'stock_mvt_reason';
protected $identifier = 'id_stock_mvt_reason';
-
protected $fieldsRequiredLang = array('name');
protected $fieldsSizeLang = array('name' => 255);
protected $fieldsValidateLang = array('name' => 'isGenericName');
@@ -50,6 +62,7 @@ class StockMvtReasonCore extends ObjectModel
$fields['sign'] = (int)$this->sign;
$fields['date_add'] = pSQL($this->date_add);
$fields['date_upd'] = pSQL($this->date_upd);
+ $fields['deleted'] = (int)$this->deleted;
return $fields;
}
@@ -65,6 +78,7 @@ class StockMvtReasonCore extends ObjectModel
$query->select('smrl.name, smr.id_stock_mvt_reason, smr.sign');
$query->from('stock_mvt_reason smr');
$query->leftjoin('stock_mvt_reason_lang smrl ON (smr.id_stock_mvt_reason = smrl.id_stock_mvt_reason AND smrl.id_lang='.(int)$id_lang.')');
+ $query->where('smr.deleted = 0');
if ($sign != null)
$query->where('smr.sign = '.(int)$sign);
@@ -86,6 +100,7 @@ class StockMvtReasonCore extends ObjectModel
$query->select('smrl.name, smr.id_stock_mvt_reason, smr.sign');
$query->from('stock_mvt_reason smr');
$query->leftjoin('stock_mvt_reason_lang smrl ON (smr.id_stock_mvt_reason = smrl.id_stock_mvt_reason AND smrl.id_lang='.(int)$id_lang.')');
+ $query->where('smr.deleted = 0');
if ($sign != null)
$query->where('smr.sign = '.(int)$sign);
@@ -111,6 +126,7 @@ class StockMvtReasonCore extends ObjectModel
$query->select('smr.id_stock_mvt_reason');
$query->from('stock_mvt_reason smr');
$query->where('smr.id_stock_mvt_reason = '.(int)$id_stock_mvt_reason);
+ $query->where('smr.deleted = 0');
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
}
}
diff --git a/classes/stock/Warehouse.php b/classes/stock/Warehouse.php
index 647e6e278..2834c170e 100644
--- a/classes/stock/Warehouse.php
+++ b/classes/stock/Warehouse.php
@@ -32,13 +32,27 @@
*/
class WarehouseCore extends ObjectModel
{
+ /** @var int identifier of the warehouse */
public $id;
+
+ /** @var int The id of the address associated to the warehouse */
public $id_address;
+
+ /** @var string The reference of the warehouse */
public $reference;
+
+ /** @var string The name of the warehouse */
public $name;
+
+ /** @var int The id of the employee who is responsible of the warehouse */
public $id_employee;
+
+ /** @var int The id of the valuation currency of the warehouse */
public $id_currency;
+ /** @var boolean True if warehouse has been deleted (staying in database as deleted) */
+ public $deleted = 0;
+
/**
* Describes the way a Warehouse is managed
* @var enum WA|LIFO|FIFO
@@ -78,9 +92,11 @@ class WarehouseCore extends ObjectModel
$fields['id_address'] = (int)$this->id_address;
$fields['reference'] = $this->reference;
$fields['name'] = pSQL($this->name);
+ $fields['deleted'] = (int)$this->deleted;
$fields['id_employee'] = (int)$this->id_employee;
$fields['management_type'] = pSQL($this->management_type);
$fields['id_currency'] = (int)$this->id_currency;
+
return $fields;
}
@@ -192,6 +208,7 @@ class WarehouseCore extends ObjectModel
$query->select('id_warehouse');
$query->from('warehouse');
$query->where('id_warehouse = '.(int)$id_warehouse);
+ $query->where('deleted = 0');
return (Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query));
}
@@ -259,6 +276,7 @@ class WarehouseCore extends ObjectModel
$query = new DbQuery();
$query->select('w.id_warehouse, name');
$query->from('warehouse w');
+ $query->where('deleted = 0');
if (!$ignore_shop)
$query->innerJoin('warehouse_shop ws ON ws.id_warehouse = w.id_warehouse AND ws.id_shop = '.(int)$id_shop);
diff --git a/controllers/admin/AdminStockInstantStateController.php b/controllers/admin/AdminStockInstantStateController.php
index ea1a8fa73..20ece73ea 100644
--- a/controllers/admin/AdminStockInstantStateController.php
+++ b/controllers/admin/AdminStockInstantStateController.php
@@ -59,6 +59,8 @@ class AdminStockInstantStateControllerCore extends AdminController
'width' => 150,
'orderby' => false,
'search' => false,
+ 'type' => 'price',
+ 'currency' => true,
),
'physical_quantity' => array(
'title' => $this->l('Physical quantity'),
@@ -107,7 +109,8 @@ class AdminStockInstantStateControllerCore extends AdminController
IFNULL(CONCAT(pl.name, \' : \', GROUP_CONCAT(agl.`name`, \' - \', al.name SEPARATOR \', \')),pl.name) as name,
IFNULL(s.physical_quantity, 0) as physical_quantity,
IFNULL(s.usable_quantity, 0) as usable_quantity,
- s.price_te
+ s.price_te,
+ w.id_currency as id_currency
FROM '._DB_PREFIX_.'product_attribute a
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_attribute_combination pac ON (pac.id_product_attribute = a.id_product_attribute)
@@ -115,6 +118,7 @@ class AdminStockInstantStateControllerCore extends AdminController
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.')
INNER JOIN '._DB_PREFIX_.'stock s ON (a.id_product_attribute = s.id_product_attribute)
+ LEFT JOIN `'._DB_PREFIX_.'warehouse` w ON (w.id_warehouse = s.id_warehouse)
WHERE a.id_product = '.$id_product.
($warehouse != -1 ? ' AND s.id_warehouse = '.(int)$warehouse : ' ').'
GROUP BY a.id_product_attribute';
@@ -124,13 +128,19 @@ class AdminStockInstantStateControllerCore extends AdminController
// queries
$datas = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query);
- foreach ($datas as &$data) // retrieves real quantity for each product
+
+ foreach ($datas as &$data)
{
+ // retrieves real quantity for each product
$data['real_quantity'] = $manager->getProductRealQuantities($data['id_product'],
$data['id'],
($warehouse == -1 ? null : array($warehouse)), // all or selected warehouse(s)
true);
+
+ // display price correctly
+ $data['price_te'] = Tools::displayPrice($data['price_te'], (int)$data['id_currency']);
}
+
echo Tools::jsonEncode(array('data'=> $datas, 'fields_display' => $this->fieldsDisplay));
}
die;
@@ -148,9 +158,13 @@ class AdminStockInstantStateControllerCore extends AdminController
COUNT(pa.id_product_attribute) as variations,
s.physical_quantity as physical_quantity,
s.usable_quantity as usable_quantity,
- s.price_te as price_te';
+ s.price_te as price_te,
+ w.id_currency as id_currency';
+
$this->_join = 'LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (pa.id_product = a.id_product)
- INNER JOIN `'._DB_PREFIX_.'stock` s ON (s.id_product = a.id_product)';
+ INNER JOIN `'._DB_PREFIX_.'stock` s ON (s.id_product = a.id_product)
+ LEFT JOIN `'._DB_PREFIX_.'warehouse` w ON (w.id_warehouse = s.id_warehouse)';
+
if ($this->getCurrentCoverageWarehouse() != -1)
$this->_where .= ' AND s.id_warehouse = '.$this->getCurrentCoverageWarehouse();
diff --git a/controllers/admin/AdminStockManagementController.php b/controllers/admin/AdminStockManagementController.php
index 539f4373e..2960afebf 100644
--- a/controllers/admin/AdminStockManagementController.php
+++ b/controllers/admin/AdminStockManagementController.php
@@ -116,10 +116,10 @@ class AdminStockManagementControllerCore extends AdminController
switch ($this->display)
{
case 'addstock' :
- $this->fields_form = array(
+ $this->fields_form[]['form'] = array(
'legend' => array(
'title' => $this->l('Add product to stock'),
- 'image' => '../img/admin/arrow_up.png'
+ 'image' => '../img/admin/add_stock.png'
),
'input' => array(
array(
@@ -252,10 +252,10 @@ class AdminStockManagementControllerCore extends AdminController
break;
case 'removestock' :
- $this->fields_form = array(
+ $this->fields_form[]['form'] = array(
'legend' => array(
'title' => $this->l('Remove product from stock'),
- 'image' => '../img/admin/arrow_down.png'
+ 'image' => '../img/admin/remove_stock.png'
),
'input' => array(
array(
@@ -367,10 +367,10 @@ class AdminStockManagementControllerCore extends AdminController
break;
case 'transferstock' :
- $this->fields_form = array(
+ $this->fields_form[]['form'] = array(
'legend' => array(
'title' => $this->l('Transfert product from warehouse to another'),
- 'image' => '../img/admin/arrow-right.png'
+ 'image' => '../img/admin/transfer_stock.png'
),
'input' => array(
array(
diff --git a/controllers/admin/AdminStockMvtController.php b/controllers/admin/AdminStockMvtController.php
index a695a79cd..09abbb902 100644
--- a/controllers/admin/AdminStockMvtController.php
+++ b/controllers/admin/AdminStockMvtController.php
@@ -81,14 +81,32 @@ class AdminStockMvtControllerCore extends AdminController
'cast' => 'intval',
'type' => 'select',
'list' => $reasons_inc,
- 'identifier' => 'id_stock_mvt_reason'
+ 'identifier' => 'id_stock_mvt_reason',
+ 'visibility' => Shop::CONTEXT_ALL
),
'PS_STOCK_MVT_DEC_REASON_DEFAULT' => array(
'title' => $this->l('Default reason when decrementing stock:'),
'cast' => 'intval',
'type' => 'select',
'list' => $reasons_dec,
- 'identifier' => 'id_stock_mvt_reason'
+ 'identifier' => 'id_stock_mvt_reason',
+ 'visibility' => Shop::CONTEXT_ALL
+ ),
+ 'PS_STOCK_CUSTOMER_ORDER_REASON' => array(
+ 'title' => $this->l('Default reason when decrementing stock when a customer order is shipped:'),
+ 'cast' => 'intval',
+ 'type' => 'select',
+ 'list' => $reasons_dec,
+ 'identifier' => 'id_stock_mvt_reason',
+ 'visibility' => Shop::CONTEXT_ALL
+ ),
+ 'PS_STOCK_MVT_SUPPLIER_ORDER' => array(
+ 'title' => $this->l('Default reason when incrementing stock when a supplier order is received:'),
+ 'cast' => 'intval',
+ 'type' => 'select',
+ 'list' => $reasons_inc,
+ 'identifier' => 'id_stock_mvt_reason',
+ 'visibility' => Shop::CONTEXT_ALL
),
),
'submit' => array(),
@@ -175,7 +193,8 @@ class AdminStockMvtControllerCore extends AdminController
*/
$this->addRowAction('edit');
$this->addRowAction('delete');
- $this->addRowActionSkipList('delete', array(1, 2, 3, 4, 6, 7, 8));
+ $this->addRowActionSkipList('edit', array(1, 2, 3, 4, 5, 6, 7, 8));
+ $this->addRowActionSkipList('delete', array(1, 2, 3, 4, 5, 6, 7, 8));
$this->toolbar_title = $this->l('Stock : Stock movements reasons');
$first_list = parent::initList();
@@ -195,6 +214,7 @@ class AdminStockMvtControllerCore extends AdminController
unset($this->_select, $this->_join, $this->_group, $this->_filterHaving, $this->_filter);
// override table, land, className and identifier for the current controller
+ $this->deleted = false;
$this->table = 'stock_mvt';
$this->className = 'StockMvt';
$this->identifier = 'id_stock_mvt';
@@ -305,8 +325,14 @@ class AdminStockMvtControllerCore extends AdminController
// reset all query vars
unset($this->_select, $this->_join, $this->_group, $this->_filterHaving, $this->_filter);
+ // reset default table and className for options list management
+ $this->table = 'stock_mvt_reason';
+ $this->className = 'StockMvtReason';
+
// return the two lists
return $second_list.$first_list;
+
+
}
/**
@@ -327,4 +353,17 @@ class AdminStockMvtControllerCore extends AdminController
return $warehouse;
}
+
+ /**
+ * AdminController::postProcess() override
+ * @see AdminController::postProcess()
+ */
+ public function postProcess()
+ {
+ //when deleting a movement reason, enable deleted flag for parent postProcess and no remove the corresponding row from the database
+ if (Tools::isSubmit('delete'.$this->table))
+ $this->deleted = true;
+
+ return parent::postProcess();
+ }
}
\ No newline at end of file
diff --git a/controllers/admin/AdminSupplierOrdersController.php b/controllers/admin/AdminSupplierOrdersController.php
index 7856389f6..1fa65cfdc 100644
--- a/controllers/admin/AdminSupplierOrdersController.php
+++ b/controllers/admin/AdminSupplierOrdersController.php
@@ -129,6 +129,15 @@ class AdminSupplierOrdersControllerCore extends AdminController
else
$this->_errors[] = Tools::displayError($this->l('You do not have permission to edit here.'));
}
+
+ if (Tools::isSubmit('update_receipt') && Tools::isSubmit('id_supplier_order'))
+ {
+ // change the display type in order to add specific actions to
+ $this->display = 'update_receipt';
+
+ // display correct toolBar
+ $this->initToolbar();
+ }
}
/**
@@ -142,11 +151,6 @@ class AdminSupplierOrdersControllerCore extends AdminController
Tools::isSubmit('submitAddsupplier_order_state') ||
Tools::isSubmit('submitUpdatesupplier_order_state'))
{
- if (Tools::isSubmit('updatesupplier_order_state'))
- $this->toolbar_title = $this->l('Stock : Update Supplier order state');
- else
- $this->toolbar_title = $this->l('Stock : Add Supplier order state');
-
$this->fields_form = array(
'legend' => array(
'title' => $this->l('Supplier Order State'),
@@ -263,6 +267,48 @@ class AdminSupplierOrdersControllerCore extends AdminController
)
);
+ if (Tools::isSubmit('addsupplier_order_state'))
+ $this->toolbar_title = $this->l('Stock : Add Supplier order state');
+ else
+ {
+ $this->toolbar_title = $this->l('Stock : Update Supplier order state');
+
+ $id_supplier_order_state = Tools::getValue('id_supplier_order_state', 0);
+
+ // only some fields are editable for initial states
+ if (in_array($id_supplier_order_state, array(1, 2, 3, 4, 5, 6)))
+ {
+ $this->fields_form = array(
+ 'legend' => array(
+ 'title' => $this->l('Supplier Order State'),
+ 'image' => '../img/admin/edit.gif'
+ ),
+ 'input' => array(
+ array(
+ 'type' => 'text',
+ 'lang' => true,
+ 'attributeLang' => 'name',
+ 'label' => $this->l('Name:'),
+ 'name' => 'name',
+ 'size' => 50,
+ 'required' => true
+ ),
+ array(
+ 'type' => 'color',
+ 'label' => $this->l('Back office color:'),
+ 'name' => 'color',
+ 'size' => 20,
+ 'p' => $this->l('Back office background will be displayed in this color. HTML colors only (e.g.,').' "lightblue", "#CC6600")'
+ ),
+ ),
+ 'submit' => array(
+ 'title' => $this->l(' Save '),
+ 'class' => 'button'
+ )
+ );
+ }
+ }
+
return parent::initForm();
}
@@ -281,10 +327,7 @@ class AdminSupplierOrdersControllerCore extends AdminController
$this->addJqueryUI('ui.datepicker');
//get warehouses list
- $warehouses = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
- SELECT `id_warehouse`, CONCAT(`reference`, " - ", `name`) as name
- FROM `'._DB_PREFIX_.'warehouse`
- ORDER BY `reference` ASC');
+ $warehouses = Warehouse::getWarehouseList(true);
//get currencies list
$currencies = Currency::getCurrencies();
@@ -421,7 +464,6 @@ class AdminSupplierOrdersControllerCore extends AdminController
*/
$this->addRowAction('edit');
$this->addRowAction('delete');
- $this->addRowActionSkipList('edit', array(1, 2, 3, 4, 5, 6));
$this->addRowActionSkipList('delete', array(1, 2, 3, 4, 5, 6));
$this->toolbar_title = $this->l('Stock : Suppliers Orders States');
@@ -482,7 +524,7 @@ class AdminSupplierOrdersControllerCore extends AdminController
),
'state' => array(
'title' => $this->l('State'),
- 'width' => 150,
+ 'width' => 250,
'filter_key' => 'stl!name',
'color' => 'color',
),
@@ -523,7 +565,7 @@ class AdminSupplierOrdersControllerCore extends AdminController
$this->_select = '
CONCAT(e.lastname, \' \', e.firstname) AS employee,
s.name AS supplier,
- CONCAT(w.reference, \' \', w.name) AS warehouse,
+ w.name AS warehouse,
stl.name AS state,
st.delivery_note,
st.editable,
@@ -588,10 +630,10 @@ class AdminSupplierOrdersControllerCore extends AdminController
$this->getlanguages();
// defines the fields of the form to display
- $this->fields_form = array(
+ $this->fields_form[]['form'] = array(
'legend' => array(
'title' => $this->l('Supplier Order State'),
- 'image' => '../img/admin/edit.gif'
+ 'image' => '../img/admin/cms.gif'
),
'input' => array(
array(
@@ -711,11 +753,6 @@ class AdminSupplierOrdersControllerCore extends AdminController
*/
public function initUpdateReceiptContent()
{
- // change the display type in order to add specific actions to
- $this->display = 'update_receipt';
- // overrides parent::initContent();
- $this->initToolbar();
-
$id_supplier_order = (int)Tools::getValue('id_supplier_order', null);
// if there is no order to fetch
@@ -797,13 +834,19 @@ class AdminSupplierOrdersControllerCore extends AdminController
)
);
- // defines which table we are using
+ // attributes override
unset($this->_select, $this->_join, $this->_where, $this->_orderBy, $this->_orderWay, $this->_group, $this->_filterHaving, $this->_filter);
$this->table = 'supplier_order_detail';
$this->identifier = 'id_supplier_order_detail';
$this->className = 'SupplierOrderDetail';
- // theme pruposes
- $this->colorOnBackground = false;
+ $this->list_simple_header = true;
+ $this->list_no_link = true;
+ $this->bulk_actions = array('Update' => array('text' => $this->l('Update selected'), 'confirm' => $this->l('Update selected items?')));
+ $this->addRowAction('details');
+
+ // sets toolbar title with order reference
+ $this->toolbar_title = sprintf($this->l('Reception of products for supplier order #%s'), $supplier_order->reference);
+
// gets lang info
$this->lang = false;
$lang_id = (int)$this->context->language->id;
@@ -828,27 +871,18 @@ class AdminSupplierOrdersControllerCore extends AdminController
$this->_where = 'AND a.`id_supplier_order` = '.(int)$id_supplier_order;
$this->_group = 'GROUP BY a.id_supplier_order_detail';
- $this->addRowAction('details');
-
// gets the list ordered by price desc, without limit
$this->getList($lang_id, 'quantity_expected', 'DESC', 0, false, false);
// defines action for POST
$action = '&id_supplier_order='.$id_supplier_order.'&submitUpdateReceipt';
+
// renders list
$helper = new HelperList();
+ $this->setHelperDisplay($helper);
$helper->override_folder = 'supplier_orders_receipt_history/';
- $helper->simple_header = true;
- $helper->actions = $this->actions;
- $helper->table = $this->table;
- $helper->no_link = true;
- $helper->show_toolbar = false;
- $helper->toolbar_fix = false;
- $helper->shopLinkType = '';
+ //$helper->shopLinkType = '';
$helper->currentIndex = self::$currentIndex.$action;
- $helper->token = $this->token;
- $helper->identifier = $this->identifier;
- $helper->bulk_actions = array('Update' => array('text' => $this->l('Update selected'), 'confirm' => $this->l('Update selected items?')));
// display these global order informations
$this->displayInformation($this->l('This interface allows you to update the quantities of this on-going order.').' ');
@@ -860,7 +894,6 @@ class AdminSupplierOrdersControllerCore extends AdminController
// assigns var
$this->context->smarty->assign(array(
'content' => $content,
- 'supplier_order_reference' => $supplier_order->reference
));
}
@@ -1193,7 +1226,7 @@ class AdminSupplierOrdersControllerCore extends AdminController
$warehouse,
(int)$quantity,
Configuration::get('PS_STOCK_MVT_SUPPLIER_ORDER'),
- $supplier_order_detail->price_te,
+ $supplier_order_detail->unit_price_te,
true,
$supplier_order->id);
if ($res) // if product has been added
@@ -1410,6 +1443,8 @@ class AdminSupplierOrdersControllerCore extends AdminController
$this->className = 'SupplierOrderDetail';
$this->colorOnBackground = false;
$this->lang = false;
+ $this->list_simple_header = true;
+ $this->list_no_link = true;
$lang_id = (int)$this->context->language->id;
// gets the id supplier to view
@@ -1453,7 +1488,7 @@ class AdminSupplierOrdersControllerCore extends AdminController
$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);
+ $this->toolbar_title = sprintf($this->l('Details on supplier order #%s'), $supplier_order->reference);
// re-defines fieldsDisplay
$this->fieldsDisplay = array(
@@ -1486,8 +1521,8 @@ class AdminSupplierOrdersControllerCore extends AdminController
'orderby' => false,
'filter' => false,
'search' => false,
- 'prefix' => $currency->prefix,
- 'suffix' => $currency->suffix,
+ 'type' => 'price',
+ 'currency' => true,
),
'quantity_expected' => array(
'title' => $this->l('Quantity'),
@@ -1504,8 +1539,8 @@ class AdminSupplierOrdersControllerCore extends AdminController
'orderby' => false,
'filter' => false,
'search' => false,
- 'prefix' => $currency->prefix,
- 'suffix' => $currency->suffix,
+ 'type' => 'price',
+ 'currency' => true,
),
'discount_rate' => array(
'title' => $this->l('Discount rate'),
@@ -1523,8 +1558,8 @@ class AdminSupplierOrdersControllerCore extends AdminController
'orderby' => false,
'filter' => false,
'search' => false,
- 'prefix' => $currency->prefix,
- 'suffix' => $currency->suffix,
+ 'type' => 'price',
+ 'currency' => true,
),
'price_with_discount_te' => array(
'title' => $this->l('Price with product discount (te)'),
@@ -1533,8 +1568,8 @@ class AdminSupplierOrdersControllerCore extends AdminController
'orderby' => false,
'filter' => false,
'search' => false,
- 'prefix' => $currency->prefix,
- 'suffix' => $currency->suffix,
+ 'type' => 'price',
+ 'currency' => true,
),
'tax_rate' => array(
'title' => $this->l('Tax rate'),
@@ -1552,8 +1587,8 @@ class AdminSupplierOrdersControllerCore extends AdminController
'orderby' => false,
'filter' => false,
'search' => false,
- 'prefix' => $currency->prefix,
- 'suffix' => $currency->suffix,
+ 'type' => 'price',
+ 'currency' => true,
),
'price_ti' => array(
'title' => $this->l('Price (ti)'),
@@ -1562,35 +1597,22 @@ class AdminSupplierOrdersControllerCore extends AdminController
'orderby' => false,
'filter' => false,
'search' => false,
- 'prefix' => $currency->prefix,
- 'suffix' => $currency->suffix,
+ 'type' => 'price',
+ 'currency' => true,
),
);
//some staff before render list
foreach ($this->_list as &$item)
{
- $item['unit_price_te'] = Tools::ps_round($item['unit_price_te'], 2);
- $item['price_te'] = Tools::ps_round($item['price_te'], 2);
- $item['tax_value'] = Tools::ps_round($item['tax_value'], 2);
- $item['tax_value_with_order_discount'] = Tools::ps_round($item['tax_value_with_order_discount'], 2);
- $item['price_ti'] = Tools::ps_round($item['price_ti'], 2);
- $item['price_with_discount_te'] = Tools::ps_round($item['price_with_discount_te'], 2);
- $item['price_with_order_discount_te'] = Tools::ps_round($item['price_with_order_discount_te'], 2);
- $item['discount_value_te'] = Tools::ps_round($item['discount_value_te'], 2);
-
$item['discount_rate'] = Tools::ps_round($item['discount_rate'], 4);
$item['tax_rate'] = Tools::ps_round($item['tax_rate'], 4);
}
// renders list
$helper = new HelperList();
- $helper->simple_header = true;
- $helper->no_link = true;
+ $this->setHelperDisplay($helper);
$helper->show_toolbar = false;
- $helper->toolbar_fix = false;
- $helper->shopLinkType = '';
- $helper->identifier = $this->identifier;
$content = $helper->generateList($this->_list, $this->fieldsDisplay);
@@ -1604,11 +1626,11 @@ class AdminSupplierOrdersControllerCore extends AdminController
'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, 2),
- 'supplier_order_discount_value_te' => Tools::ps_round($supplier_order->discount_value_te, 2),
- 'supplier_order_total_with_discount_te' => Tools::ps_round($supplier_order->total_with_discount_te, 2),
- 'supplier_order_total_tax' => Tools::ps_round($supplier_order->total_tax, 2),
- 'supplier_order_total_ti' => Tools::ps_round($supplier_order->total_ti, 2),
+ 'supplier_order_total_te' => Tools::displayPrice($supplier_order->total_te, $currency),
+ 'supplier_order_discount_value_te' => Tools::displayPrice($supplier_order->discount_value_te, $currency),
+ 'supplier_order_total_with_discount_te' => Tools::displayPrice($supplier_order->total_with_discount_te, $currency),
+ 'supplier_order_total_tax' => Tools::displayPrice($supplier_order->total_tax, $currency),
+ 'supplier_order_total_ti' => Tools::displayPrice($supplier_order->total_ti, $currency),
'supplier_order_currency' => $currency,
);
}
@@ -1658,6 +1680,7 @@ class AdminSupplierOrdersControllerCore extends AdminController
'desc' => $this->l('Save')
);
+ case 'update_receipt':
// Default cancel button - like old back link
if (!isset($this->no_back) || $this->no_back == false)
{
diff --git a/controllers/admin/AdminWarehousesController.php b/controllers/admin/AdminWarehousesController.php
index e493c8a2e..a4dc11065 100644
--- a/controllers/admin/AdminWarehousesController.php
+++ b/controllers/admin/AdminWarehousesController.php
@@ -35,7 +35,9 @@ class AdminWarehousesControllerCore extends AdminController
$this->table = 'warehouse';
$this->className = 'Warehouse';
$this->context = Context::getContext();
+ $this->deleted = true;
$this->lang = false;
+
$this->fieldsDisplay = array(
'reference' => array(
'title' => $this->l('Reference'),
@@ -89,6 +91,7 @@ class AdminWarehousesControllerCore extends AdminController
// adds actions on rows
$this->addRowAction('edit');
$this->addRowAction('view');
+ $this->addRowAction('delete');
// query: select
$this->_select = '
@@ -123,6 +126,10 @@ class AdminWarehousesControllerCore extends AdminController
*/
public function initForm()
{
+ // loads current warehouse
+ if (!($obj = $this->loadObject(true)))
+ return;
+
// gets the manager of the warehouse
$query = new DbQuery();
$query->select('id_employee, CONCAT(lastname," ",firstname) as name');
@@ -137,7 +144,7 @@ class AdminWarehousesControllerCore extends AdminController
$this->fields_form = array(
'legend' => array(
'title' => $this->l('Warehouse management'),
- 'image' => '../img/admin/tab.gif'
+ 'image' => '../img/admin/edit.gif'
),
'input' => array(
array(
@@ -234,44 +241,6 @@ class AdminWarehousesControllerCore extends AdminController
'name' => 'name'
),
),
- array(
- 'type' => 'select',
- 'label' => $this->l('Management type:'),
- 'name' => 'management_type',
- 'required' => true,
- 'options' => array(
- 'query' => array(
- array(
- 'id' => 'WA',
- 'name' => $this->l('Weight Average')
- ),
- array(
- 'id' => 'FIFO',
- 'name' => $this->l('First In, First Out')
- ),
- array(
- 'id' => 'LIFO',
- 'name' => $this->l('Last In, First Out')
- ),
- ),
- 'id' => 'id',
- 'name' => 'name'
- ),
- 'p' => $this->l('Inventory valuation method'),
- 'hint' => $this->l('Do not change this value before the end of the accounting period for this warehouse.'),
- ),
- array(
- 'type' => 'select',
- 'label' => $this->l('Stock valuation currency:'),
- 'name' => 'id_currency',
- 'required' => true,
- 'options' => array(
- 'query' => Currency::getCurrencies(),
- 'id' => 'id_currency',
- 'name' => 'name'
- ),
- 'hint' => $this->l('Do not change this value before the end of the accounting period for this warehouse.'),
- ),
array(
'type' => 'select',
'label' => $this->l('Associated shops:'),
@@ -295,22 +264,72 @@ class AdminWarehousesControllerCore extends AdminController
'multiple' => true,
'options' => array(
'query' => Carrier::getCarriers($this->context->language->id, true),
- 'id' => 'id_carrier',
+ 'id' => 'id_reference',
'name' => 'name'
),
'p' => $this->l('Associated carriers'),
'hint' => $this->l('You can specifiy the carriers available to ship orders from this warehouse'),
),
),
- 'submit' => array(
- 'title' => $this->l(' Save '),
- 'class' => 'button'
- )
+
);
- // loads current warehouse
- if (!($obj = $this->loadObject(true)))
- return;
+ // It is not possible to change currency valuation and management type
+ if (Tools::isSubmit('addwarehouse'))
+ {
+ $this->fields_form['input'][] = array(
+ 'type' => 'select',
+ 'label' => $this->l('Management type:'),
+ 'name' => 'management_type',
+ 'required' => true,
+ 'options' => array(
+ 'query' => array(
+ array(
+ 'id' => 'WA',
+ 'name' => $this->l('Weight Average')
+ ),
+ array(
+ 'id' => 'FIFO',
+ 'name' => $this->l('First In, First Out')
+ ),
+ array(
+ 'id' => 'LIFO',
+ 'name' => $this->l('Last In, First Out')
+ ),
+ ),
+ 'id' => 'id',
+ 'name' => 'name'
+ ),
+ 'p' => $this->l('Inventory valuation method')
+ );
+
+ $this->fields_form['input'][] = array(
+ 'type' => 'select',
+ 'label' => $this->l('Stock valuation currency:'),
+ 'name' => 'id_currency',
+ 'required' => true,
+ 'options' => array(
+ 'query' => Currency::getCurrencies(),
+ 'id' => 'id_currency',
+ 'name' => 'name'
+ )
+ );
+ } else {
+ $this->fields_form['input'][] = array(
+ 'type' => 'hidden',
+ 'name' => 'management_type'
+ );
+
+ $this->fields_form['input'][] = array(
+ 'type' => 'hidden',
+ 'name' => 'id_currency'
+ );
+ }
+
+ $this->fields_form['submit'] = array(
+ 'title' => $this->l(' Save '),
+ 'class' => 'button'
+ );
// loads current address for this warehouse - if possible
$address = null;
@@ -405,9 +424,19 @@ class AdminWarehousesControllerCore extends AdminController
$_POST['id_address'] = $address->id;
}
}
- }
- return parent::postProcess();
+ // hack for enable the possibility to update a warehouse without recreate new id
+ $this->deleted = false;
+
+ return parent::postProcess();
+ }
+ else if (Tools::isSubmit('delete'.$this->table))
+ if (!($obj = $this->loadObject(true)))
+ return;
+ else if ($obj->getQuantitiesOfProducts() > 0)
+ $this->_errors[] = $this->l('It is not possible to delete a Warehosue when there are products in it.');
+ else
+ return parent::postProcess();
}
/**
diff --git a/install-dev/sql/db.sql b/install-dev/sql/db.sql
index 955262acf..03b117af4 100644
--- a/install-dev/sql/db.sql
+++ b/install-dev/sql/db.sql
@@ -1985,6 +1985,7 @@ CREATE TABLE `PREFIX_stock_mvt_reason` (
`sign` tinyint(1) NOT NULL DEFAULT 1,
`date_add` datetime NOT NULL,
`date_upd` datetime NOT NULL,
+ `deleted` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`id_stock_mvt_reason`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
@@ -2017,6 +2018,7 @@ CREATE TABLE `PREFIX_warehouse` (
`reference` VARCHAR(32) DEFAULT NULL,
`name` VARCHAR(45) NOT NULL,
`management_type` ENUM('WA', 'FIFO', 'LIFO') NOT NULL DEFAULT 'WA',
+`deleted` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`id_warehouse`)
) ENGINE=ENGINE_TYPE DEFAULT CHARSET=utf8;
diff --git a/install-dev/sql/db_settings_lite.sql b/install-dev/sql/db_settings_lite.sql
index 18bf5e962..50c67011f 100644
--- a/install-dev/sql/db_settings_lite.sql
+++ b/install-dev/sql/db_settings_lite.sql
@@ -330,10 +330,11 @@ INSERT INTO `PREFIX_configuration` (`id_configuration`, `name`, `value`, `date_a
(154, 'PS_STOCK_MVT_DEC_REASON_DEFAULT', '2', NOW(), NOW()),
(155, 'PS_ADVANCED_STOCK_MANAGEMENT', '1', NOW(), NOW()),
(156, 'PS_ADMINREFRESH_NOTIFICATION', '1', NOW(), NOW()),
-(157, 'PS_STOCK_MVT_TRANSFER_TO', '6', NOW(), NOW()),
-(158, 'PS_STOCK_MVT_TRANSFER_FROM', '7', NOW(), NOW()),
+(157, 'PS_STOCK_MVT_TRANSFER_TO', '7', NOW(), NOW()),
+(158, 'PS_STOCK_MVT_TRANSFER_FROM', '6', NOW(), NOW()),
(159, 'PS_CARRIER_DEFAULT_ORDER', '0', NOW(), NOW()),
-(160, 'PS_STOCK_MVT_SUPPLIER_ORDER', '8', NOW(), NOW());
+(160, 'PS_STOCK_MVT_SUPPLIER_ORDER', '8', NOW(), NOW()),
+(161, 'PS_STOCK_CUSTOMER_ORDER_REASON', '3', NOW(), NOW());
INSERT INTO `PREFIX_configuration_lang` (`id_configuration`, `id_lang`, `value`, `date_upd`) VALUES
(36, 1, 'IN', NOW()),(36, 2, 'FA', NOW()),(36, 3, 'CU', NOW()),(36, 4, 'FA', NOW()),(36, 5, 'FA', NOW()),
@@ -1426,7 +1427,15 @@ INSERT INTO `PREFIX_group_group_shop` (`id_group`, `id_group_shop`) (SELECT `id_
INSERT INTO `PREFIX_category_group` (`id_category`, `id_group`) VALUES (1, 1);
INSERT INTO `PREFIX_stock_mvt_reason` (`id_stock_mvt_reason`, `sign`, `date_add`, `date_upd`) VALUES
-(1, 1, NOW(), NOW()), (2, -1, NOW(), NOW()), (3, -1, NOW(), NOW()), (4, -1, NOW(), NOW()), (5, 1, NOW(), NOW()), (6, 1, NOW(), NOW()), (7, -1, NOW(), NOW()), (8, 1, NOW(), NOW());
+(1, 1, NOW(), NOW()),
+(2, -1, NOW(), NOW()),
+(3, -1, NOW(), NOW()),
+(4, -1, NOW(), NOW()),
+(5, 1, NOW(), NOW()),
+(6, -1, NOW(), NOW()),
+(7, 1, NOW(), NOW()),
+(8, 1, NOW(), NOW());
+
INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason`, `id_lang`, `name`) VALUES
(1, 1, 'Increase'),
(1, 2, 'Augmenter'),
@@ -1438,33 +1447,33 @@ INSERT INTO `PREFIX_stock_mvt_reason_lang` (`id_stock_mvt_reason`, `id_lang`, `n
(2, 3, 'Disminuir'),
(2, 4, 'Reduzieren'),
(2, 5, 'Decrease'),
-(3, 1, 'Client Order'),
+(3, 1, 'Customer Order'),
(3, 2, 'Commande client'),
(3, 3, 'Pedido'),
(3, 4, 'Bestellung'),
(3, 5, 'Ordine'),
-(4, 1, 'Missing Stock Movement'),
-(4, 2, 'Mouvement de stock manquant'),
-(4, 3, 'Movimiento de stock que falta'),
-(4, 4, 'Lagerbewegung nicht stattgefunden'),
-(4, 5, 'Movimento di merce mancante'),
-(5, 1, 'Restocking'),
-(5, 2, 'Réassort'),
-(5, 3, 'Reaprovisionar'),
-(5, 4, 'Auffüllung'),
-(5, 5, 'Riassortimento'),
-(6, 1, 'Transfer (to)'),
-(6, 2, 'Transferer (vers)'),
-(6, 3, 'Transfer (to)'),
-(6, 4, 'Transfer (to)'),
-(6, 5, 'Transfer (to)'),
-(7, 1, 'Transfer (from)'),
-(7, 2, 'Transferer (depuis)'),
-(7, 3, 'Transfer (from)'),
-(7, 4, 'Transfer (from)'),
-(7, 5, 'Transfer (from)'),
+(4, 1, 'Regulation following an inventory of stock'),
+(4, 2, 'Régularisation du stock suite à un inventaire'),
+(4, 3, 'Regulation following an inventory of stock'),
+(4, 4, 'Regulation following an inventory of stock'),
+(4, 5, 'Regulation following an inventory of stock'),
+(5, 1, 'Regulation following an inventory of stock'),
+(5, 2, 'Régularisation du stock suite à un inventaire'),
+(5, 3, 'Regulation following an inventory of stock'),
+(5, 4, 'Regulation following an inventory of stock'),
+(5, 5, 'Regulation following an inventory of stock'),
+(6, 1, 'Transfer to another warehouse'),
+(6, 2, 'Transfert vers un autre entrepôt'),
+(6, 3, 'Transfer to another warehouse'),
+(6, 4, 'Transfer to another warehouse'),
+(6, 5, 'Transfer to another warehouse'),
+(7, 1, 'Transfer from another warehouse'),
+(7, 2, 'Transfert depuis un autre entrepôt'),
+(7, 3, 'Transfer from another warehouse'),
+(7, 4, 'Transfer from another warehouse'),
+(7, 5, 'Transfer from another warehouse'),
(8, 1, 'Supplier Order'),
-(8, 2, 'Commande fournisseur)'),
+(8, 2, 'Commande fournisseur'),
(8, 3, 'Supplier Order'),
(8, 4, 'Supplier Order'),
(8, 5, 'Supplier Order');