// BugFix : Adding warehouse on order edition

This commit is contained in:
mDeflotte
2011-12-14 16:19:05 +00:00
parent 1a4c91ce5b
commit e0ff6f4697
9 changed files with 135 additions and 24 deletions
@@ -5,6 +5,10 @@
<div id="add_product_product_attribute_area" style="margin-top: 5px;display: none;">
{l s='Combinations:'} <select name="add_product[product_attribute_id]" id="add_product_product_attribute_id"></select>
</div>
<div id="add_product_product_warehouse_area" style="margin-top: 5px; display: none;">
{l s='Warehouse:'} <select id="add_product_warehouse" name="add_product_warehouse">
</select>
</div>
</td>
<td style="display:none;">
{if $currency->sign % 2}{$currency->sign}{/if}<input type="text" name="add_product[product_price_tax_excl]" id="add_product_product_price_tax_excl" value="" size="4" disabled="disabled" /> {if !($currency->sign % 2)}{$currency->sign}{/if} {l s='tax excl.'}<br />
+32 -12
View File
@@ -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 += '<option '+(this.combinations.length > 0 ? 'rel="'+this.qty_in_stock+'"' : '')+' value="'+this.id_product+'">'+this.name+(this.combinations.length == 0 ? ' - '+this.formatted_price : '')+'</option>';
attributes_html += '<select class="id_product_attribute" id="ipa_'+this.id_product+'" style="display:none;">';
var id_product = this.id_product;
$.each(this.combinations, function() {
attributes_html += '<option rel="'+this.qty_in_stock+'" '+(this.default_on == 1 ? 'selected="selected"' : '')+' value="'+this.id_product_attribute+'">'+this.attributes+' - '+this.formatted_price+'</option>';
});
stock[this.id_product] = this.stock;
attributes_html += '</select>';
});
products_found += '</select>';
$('#products_found #product_list').html(products_found);
$('#products_found #attributes_list').html(attributes_html);
displayProductAttributes();
@@ -771,14 +791,14 @@
<input type="hidden" value="" id="id_cart" name="id_cart" />
<input type="text" id="product" value="" /></p>
<div id="products_found">
<div id="product_list">
</div>
<div id="attributes_list">
</div>
<p><label for="qty">{l s='Quantity:'}</label><input type="text" name="qty" id="qty"/>&nbsp;<b>{l s='In stock:'}</b>&nbsp;<span id="qty_in_stock"></span></p>
<div class="margin-form">
<p><input type="submit" onclick="addProduct();return false;" class="button" id="submitAddProduct" value="{l s='Add to cart'}"/></p>
</div>
<div id="product_list">
</div>
<div id="attributes_list">
</div>
<p><label for="qty">{l s='Quantity:'}</label><input type="text" name="qty" id="qty"/>&nbsp;<b>{l s='In stock:'}</b>&nbsp;<span id="qty_in_stock"></span></p>
<div class="margin-form">
<p><input type="submit" onclick="addProduct();return false;" class="button" id="submitAddProduct" value="{l s='Add to cart'}"/></p>
</div>
</div>
</div>
<div id="products_err" class="warn" style="display:none;"></div>
@@ -507,6 +507,9 @@
<form style="width: 98%" action="{$currentIndex}&vieworder&token={$smarty.get.token}" method="post" onsubmit="return orderDeleteProduct('{l s='Cannot return this product'}', '{l s='Quantity to cancel is greater than quantity available'}');">
<input type="hidden" name="id_order" value="{$order->id}" />
<fieldset style="width: 100%; ">
<div style="display: none">
<input type="hidden" value="{$order->getWarehouseList()|implode}" id="warehouse_list" />
</div>
<legend><img src="../img/admin/cart.gif" alt="{l s='Products'}" />{l s='Products'}</legend>
<div style="float:left;width: 100%;">
{if $can_edit}
+1 -1
View File
@@ -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)
+16
View File
@@ -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);
}
}
+22
View File
@@ -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;
}
}
+5 -4
View File
@@ -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();
+21 -3
View File
@@ -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')
+31 -4
View File
@@ -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('<option value="'+this.id_product_attribute+'"'+(this.default_on == 1 ? ' selected="selected"' : '')+'>'+this.attributes+'</option>');
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($('<option value="' + this.id_warehouse + '">' + this.name + '</option>'));
});
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() {
});