From e0ff6f4697c40fa7bd09981d6701f4fb582780c1 Mon Sep 17 00:00:00 2001 From: mDeflotte Date: Wed, 14 Dec 2011 16:19:05 +0000 Subject: [PATCH] // BugFix : Adding warehouse on order edition --- .../themes/template/orders/_new_product.tpl | 4 ++ admin-dev/themes/template/orders/form.tpl | 44 ++++++++++++++----- admin-dev/themes/template/orders/view.tpl | 3 ++ classes/Customer.php | 2 +- classes/Product.php | 16 +++++++ classes/order/Order.php | 22 ++++++++++ classes/stock/Warehouse.php | 9 ++-- controllers/admin/AdminOrdersController.php | 24 ++++++++-- js/admin_order.js | 35 +++++++++++++-- 9 files changed, 135 insertions(+), 24 deletions(-) diff --git a/admin-dev/themes/template/orders/_new_product.tpl b/admin-dev/themes/template/orders/_new_product.tpl index 7ddee6c8c..002f12235 100644 --- a/admin-dev/themes/template/orders/_new_product.tpl +++ b/admin-dev/themes/template/orders/_new_product.tpl @@ -5,6 +5,10 @@ + {if $currency->sign % 2}{$currency->sign}{/if} {if !($currency->sign % 2)}{$currency->sign}{/if} {l s='tax excl.'}
diff --git a/admin-dev/themes/template/orders/form.tpl b/admin-dev/themes/template/orders/form.tpl index de997dfa5..81113a1fd 100755 --- a/admin-dev/themes/template/orders/form.tpl +++ b/admin-dev/themes/template/orders/form.tpl @@ -175,7 +175,7 @@ updateQty(product[0], product[1], $(this).val() - cart_quantity[$(this).attr('rel')]); } }); - $('.increaseqty_product,.decreaseqty_product').live('click', function(e) { + $('.increaseqty_product, .decreaseqty_product').live('click', function(e) { e.preventDefault(); var product = $(this).attr('rel').split('_'); var sign = ''; @@ -183,10 +183,18 @@ sign = '-'; updateQty(product[0], product[1], sign+1); }); + $('#id_product').live('keydown', function(e) { + $(this).click(); + return true; + }); $('#id_product, .id_product_attribute').live('change', function(e) { e.preventDefault(); displayQtyInStock(this.id); }); + $('#id_product, .id_product_attribute').live('keydown', function(e) { + $(this).change(); + return true; + }); $('.product_unit_price').live('change', function(e) { e.preventDefault(); var product = $(this).attr('rel').split('_'); @@ -233,10 +241,13 @@ function displayQtyInStock(id) { - if (id == 'id_product') - $('#qty_in_stock').html($('#id_product option:selected').attr('rel')); + var id_product = $('#id_product').val(); + if ($('#ipa_' + id_product + ' option').length) + var id_product_attribute = $('#ipa_' + id_product).val(); else - $('#qty_in_stock').html($('#ipa_'+$('#id_product option:selected').val()+' option:selected').attr('rel')); + var id_product_attribute = 0; + + $('#qty_in_stock').html(stock[id_product][id_product_attribute]); } function duplicateOrder(id_order) @@ -460,6 +471,8 @@ { var products_found = ''; var attributes_html = ''; + stock = {}; + if(res.found) { $('#products_err').hide(); @@ -469,12 +482,19 @@ $.each(res.products, function() { products_found += ''; attributes_html += ''; }); + products_found += ''; + $('#products_found #product_list').html(products_found); $('#products_found #attributes_list').html(attributes_html); displayProductAttributes(); @@ -771,14 +791,14 @@

-
-
-
-
-

 {l s='In stock:'} 

-
-

-
+
+
+
+
+

 {l s='In stock:'} 

+
+

+
diff --git a/admin-dev/themes/template/orders/view.tpl b/admin-dev/themes/template/orders/view.tpl index a2432f0b4..7bdbb7c6b 100755 --- a/admin-dev/themes/template/orders/view.tpl +++ b/admin-dev/themes/template/orders/view.tpl @@ -507,6 +507,9 @@
+
+ +
{l s='Products'}{l s='Products'}
{if $can_edit} diff --git a/classes/Customer.php b/classes/Customer.php index a610b1777..9afafd1e7 100644 --- a/classes/Customer.php +++ b/classes/Customer.php @@ -304,7 +304,7 @@ class CustomerCore extends ObjectModel FROM `'._DB_PREFIX_.'customer` WHERE `email` = \''.pSQL($email).'\' '.$shop->addSqlRestriction(Shop::SHARE_CUSTOMER). - ($ignore_guest ? 'AND `is_guest` = 0' : ''); + ($ignore_guest ? ' AND `is_guest` = 0' : ''); $result = Db::getInstance()->getRow($sql); if ($return_id) diff --git a/classes/Product.php b/classes/Product.php index ddd92d73d..751e63aaf 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -4643,4 +4643,20 @@ class ProductCore extends ObjectModel Search::indexation(false, $this->id); return $success; } + + public static function getRealQuantity($id_product, $id_product_attribute = 0, $id_warehouse = 0, $id_shop = null) + { + static $manager = null; + + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') && is_null($manager)) + $manager = StockManagerFactory::getManager(); + + if (is_null($id_shop)) + $id_shop = Context::getContext()->shop->getID(true); + + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') && StockAvailable::dependsOnStock($id_product, $id_shop)) + return $manager->getProductRealQuantities($id_product, $id_product_attribute, $id_warehouse, true); + else + return StockAvailable::getQuantityAvailableByProduct($id_product, $id_product_attribute, $id_shop); + } } diff --git a/classes/order/Order.php b/classes/order/Order.php index 1b0481780..e4d20aa18 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -1567,5 +1567,27 @@ class OrderCore extends ObjectModel return true; return false; } + + /** + * Get warehouse associated to the order + * + * return array List of warehouse + */ + public function getWarehouseList() + { + $results = Db::getInstance()->executeS(' + SELECT id_warehouse + FROM `'._DB_PREFIX_.'order_detail` + WHERE `id_order` = '.(int)$this->id.' + GROUP BY id_warehouse'); + if (!$results) + return array(); + + $warehouse_list = array(); + foreach ($results as $row) + $warehouse_list[] = $row['id_warehouse']; + + return $warehouse_list; + } } diff --git a/classes/stock/Warehouse.php b/classes/stock/Warehouse.php index 783920ef5..fc2505ad8 100644 --- a/classes/stock/Warehouse.php +++ b/classes/stock/Warehouse.php @@ -250,17 +250,18 @@ class WarehouseCore extends ObjectModel * @param int $id_product * @param int $id_product_attribute * @param int $id_shop - * @return string + * @return array */ - public static function getProductWarehouseList($id_product, $id_product_attribute, $id_shop = null) + public static function getProductWarehouseList($id_product, $id_product_attribute = 0, $id_shop = null) { if (is_null($id_shop)) $id_shop = Context::getContext()->shop->getID(true); $query = new DbQuery(); - $query->select('wpl.id_warehouse'); + $query->select('wpl.id_warehouse, CONCAT(w.reference, " - ", w.name) as name'); $query->from('warehouse_product_location wpl'); $query->innerJoin('warehouse_shop ws ON (ws.id_warehouse = wpl.id_warehouse AND id_shop = '.(int)$id_shop.')'); + $query->innerJoin('warehouse w ON (ws.id_warehouse = w.id_warehouse)'); $query->where('id_product = '.(int)$id_product); $query->where('id_product_attribute = '.(int)$id_product_attribute); $query->groupBy('wpl.id_warehouse'); @@ -388,7 +389,7 @@ class WarehouseCore extends ObjectModel * @param int $id_product_attribute * @return array */ - public static function getWarehousesByProductId($id_product, $id_product_attribute) + public static function getWarehousesByProductId($id_product, $id_product_attribute = 0) { if (!$id_product && !$id_product_attribute) return array(); diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php index aba3ae3e4..79eb3d84f 100755 --- a/controllers/admin/AdminOrdersController.php +++ b/controllers/admin/AdminOrdersController.php @@ -817,7 +817,6 @@ class AdminOrdersControllerCore extends AdminController 'found' => true); else $to_return = array('found' => false); - $this->content = Tools::jsonEncode($to_return); } @@ -840,6 +839,9 @@ class AdminOrdersControllerCore extends AdminController // Tax rate for this customer if (Tools::isSubmit('id_address')) $product['tax_rate'] = $productObj->getTaxesRate(new Address(Tools::getValue('id_address'))); + + $product['warehouse_list'] = array(); + foreach($attributes AS $attribute) { if (!isset($combinations[$attribute['id_product_attribute']]['attributes'])) @@ -857,7 +859,23 @@ class AdminOrdersControllerCore extends AdminController } if (!isset($combinations[$attribute['id_product_attribute']]['qty_in_stock'])) $combinations[$attribute['id_product_attribute']]['qty_in_stock']= StockAvailable::getQuantityAvailableByProduct((int)$product['id_product'], $attribute['id_product_attribute'], (int)$this->context->shop->getID()); + + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) + $product['warehouse_list'][$attribute['id_product_attribute']] = Warehouse::getProductWarehouseList($product['id_product'], $attribute['id_product_attribute']); + else + $product['warehouse_list'][$attribute['id_product_attribute']] = array(); + + $product['stock'][$attribute['id_product_attribute']] = Product::getRealQuantity($product['id_product'], $attribute['id_product_attribute']); + } + + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) + $product['warehouse_list'][0] = Warehouse::getProductWarehouseList($product['id_product']); + else + $product['warehouse_list'][0] = array(); + + $product['stock'][0] = Product::getRealQuantity($product['id_product'], 0, 0); + foreach ($combinations AS &$combination) $combination['attributes'] = rtrim($combination['attributes'], ' - '); @@ -1064,7 +1082,7 @@ class AdminOrdersControllerCore extends AdminController // Create Order detail information $order_detail = new OrderDetail(); - $order_detail->createList($order, $cart, OrderHistory::getLastOrderState($order->id), $cart->getProducts(), (isset($order_invoice) ? $order_invoice->id : 0), $use_taxes); + $order_detail->createList($order, $cart, OrderHistory::getLastOrderState($order->id), $cart->getProducts(), (isset($order_invoice) ? $order_invoice->id : 0), $use_taxes, (int)Tools::getValue('add_product_warehouse')); // update totals amount of order $order->total_products += (float)$cart->getOrderTotal(false, Cart::ONLY_PRODUCTS); @@ -1332,7 +1350,7 @@ class AdminOrdersControllerCore extends AdminController 'error' => Tools::displayError('Can\'t load Order object') ))); - if ($order_detail->id_order != $order->id_order) + if ($order_detail->id_order != $order->id) die(Tools::jsonEncode(array( 'result' => false, 'error' => Tools::displayError('Can\'t edit this Order Detail for this order') diff --git a/js/admin_order.js b/js/admin_order.js index 49091a255..fe6c3b4a2 100644 --- a/js/admin_order.js +++ b/js/admin_order.js @@ -95,13 +95,19 @@ $(document).ready(function() { { // Reset combinations list $('select#add_product_product_attribute_id').html(''); + var defaultAttribute = 0; $.each(current_product.combinations, function() { $('select#add_product_product_attribute_id').append(''); if (this.default_on == 1) + { $('#add_product_product_stock').html(this.qty_in_stock); + defaultAttribute = this.id_product_attribute; + } }); // Show select list $('#add_product_product_attribute_area').show(); + + populateWarehouseList(current_product.warehouse_list[defaultAttribute]); } else { @@ -109,6 +115,8 @@ $(document).ready(function() { $('select#add_product_product_attribute_id').html(''); // Hide select list $('#add_product_product_attribute_area').hide(); + + populateWarehouseList(current_product.warehouse_list[0]); } } }); @@ -116,11 +124,33 @@ $(document).ready(function() { $('select#add_product_product_attribute_id').change(function() { $('#add_product_product_price_tax_incl').val(current_product.combinations[$(this).val()].price_tax_incl); $('#add_product_product_price_tax_excl').val(current_product.combinations[$(this).val()].price_tax_excl); + + populateWarehouseList(current_product.warehouse_list[$(this).val()]); addProductRefreshTotal(); $('#add_product_product_stock').html(current_product.combinations[$(this).val()].qty_in_stock); }); + + function populateWarehouseList(warehouse_list) + { + $('#add_product_product_warehouse_area').hide(); + if (warehouse_list.length > 1) + { + $('#add_product_product_warehouse_area').show(); + } + var order_warehouse_list = $('#warehouse_list').val().split(','); + $('#add_product_warehouse').html(''); + var warehouse_selected = false; + $.each(warehouse_list, function() { + if (warehouse_selected == false && $.inArray(this.id_warehouse, order_warehouse_list)) + warehouse_selected = this.id_warehouse; + + $('#add_product_warehouse').append($('')); + }); + if (warehouse_selected) + $('#add_product_warehouse').val(warehouse_selected); + } $('input#add_product_product_quantity').keyup(function() { var quantity = parseInt($(this).val()); @@ -170,6 +200,7 @@ $(document).ready(function() { { var query = 'ajax=1&token='+token+'&action=addProductOnOrder&id_order='+id_order+'&'; + query += $('#add_product_warehouse').serialize()+'&'; query += $('tr#new_product select, tr#new_product input').serialize(); if ($('select#add_product_product_invoice').val() == 0) query += '&'+$('tr#new_invoice select, tr#new_invoice input').serialize(); @@ -635,7 +666,3 @@ $(document).ready(function() { }); - - - -