diff --git a/stock.py b/stock.py index 96b4cb0085..e4911ec34a 100644 --- a/stock.py +++ b/stock.py @@ -453,6 +453,7 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView): c_move.uom, c_move.quantity, c_move.product.default_uom, round=False) + s_product_qty = defaultdict(lambda: 0) for s_move in shipment.supplier_moves: if s_move.state == 'cancel': continue @@ -464,6 +465,7 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView): quantity = UoM.compute_qty( s_move.uom, s_move.quantity, s_move.product.default_uom, round=False) + s_product_qty[s_move.product] += quantity if product_qty[s_move.product]: if quantity <= product_qty[s_move.product]: product_qty[s_move.product] -= quantity @@ -489,7 +491,7 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView): to_save.append(new_customer_move) for product, cost in product_cost.iteritems(): - qty = Decimal(str(product_qty[product])) + qty = Decimal(str(s_product_qty[product])) if qty: product_cost[product] = (cost / qty).quantize(cost_exp) for c_move in list(shipment.customer_moves) + to_save: @@ -508,7 +510,7 @@ class ShipmentDrop(Workflow, ModelSQL, ModelView): c_move.quantity = max( 0, c_move.uom.round(c_move.quantity - exc_qty)) product_qty[c_move.product] -= removed_qty - to_save.append(c_move) + to_save.append(c_move) if to_save: Move.save(to_save) diff --git a/tests/scenario_sale_supply_drop_shipment.rst b/tests/scenario_sale_supply_drop_shipment.rst index 42652cac3f..f44483fca9 100644 --- a/tests/scenario_sale_supply_drop_shipment.rst +++ b/tests/scenario_sale_supply_drop_shipment.rst @@ -109,6 +109,8 @@ Create product:: >>> template.supply_on_sale = True >>> template.save() >>> product, = template.products + >>> product.cost_price = Decimal('4') + >>> product.save() >>> product_supplier = ProductSupplier() >>> product_supplier.product = template >>> product_supplier.party = supplier @@ -157,6 +159,8 @@ Create Purchase from Request:: >>> purchase.delivery_address == sale.shipment_address True >>> purchase.payment_term = payment_term + >>> purchase_line, = purchase.lines + >>> purchase_line.unit_price = Decimal('3.0000') >>> purchase.click('quote') >>> purchase.click('confirm') >>> purchase.click('process') @@ -174,7 +178,14 @@ Receiving only 100 products:: >>> set_user(stock_user) >>> move, = shipment.supplier_moves >>> move.quantity = 100 + >>> move.unit_price + Decimal('3.0000') >>> shipment.click('ship') + >>> move, = shipment.customer_moves + >>> move.unit_price + Decimal('10.0000') + >>> move.cost_price + Decimal('3.0000') >>> set_user(sale_user) >>> sale.reload() >>> sale.shipments