diff --git a/addons/purchase/stock.py b/addons/purchase/stock.py index 35193dfa07b..a4c0be17916 100644 --- a/addons/purchase/stock.py +++ b/addons/purchase/stock.py @@ -126,4 +126,13 @@ class stock_partial_picking(osv.osv_memory): 'currency': move.picking_id.purchase_id.pricelist_id.currency_id.id} return super(stock_partial_picking, self)._product_cost_for_average_update(cr, uid, move) +# Redefinition of the new field in order to update the model stock.picking.in in the orm +# FIXME: this is a temporary workaround because of a framework bug (ref: lpxxxx). It should be removed as soon as +# the bug is fixed +class stock_picking_in(osv.osv): + _inherit = 'stock.picking.in' + _columns = { + 'purchase_id': fields.many2one('purchase.order', 'Purchase Order', + ondelete='set null', select=True), + } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/sale/stock.py b/addons/sale/stock.py index 44b993ec0e1..23e936aed47 100644 --- a/addons/sale/stock.py +++ b/addons/sale/stock.py @@ -186,4 +186,13 @@ class stock_picking(osv.osv): }) return result +# Redefinition of the new field in order to update the model stock.picking.out in the orm +# FIXME: this is a temporary workaround because of a framework bug (ref: lpxxxx). It should be removed as soon as +# the bug is fixed +class stock_picking_out(osv.osv): + _inherit = 'stock.picking.out' + _columns = { + 'sale_id': fields.many2one('sale.order', 'Sale Order', + ondelete='set null', select=True), + } # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 1a6aeca6b0d..2d8e3d70c36 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -874,7 +874,7 @@ class stock_picking(osv.osv): def _get_partner_to_invoice(self, cr, uid, picking, context=None): """ Gets the partner that will be invoiced - Note that this function is inherited in the sale module + Note that this function is inherited in the sale and purchase modules @param picking: object of the picking for which we are selecting the partner to invoice @return: object of the partner to invoice """ @@ -2119,11 +2119,11 @@ class stock_move(osv.osv): return True if context is None: context = {} - pickings = {} + pickings = [] for move in self.browse(cr, uid, ids, context=context): if move.state in ('confirmed', 'waiting', 'assigned', 'draft'): if move.picking_id: - pickings[move.picking_id.id] = True + pickings += [move.picking_id.id] if move.move_dest_id and move.move_dest_id.state == 'waiting': self.write(cr, uid, [move.move_dest_id.id], {'state': 'assigned'}) if context.get('call_unlink',False) and move.move_dest_id.picking_id: @@ -2131,7 +2131,7 @@ class stock_move(osv.osv): wf_service.trg_write(uid, 'stock.picking', move.move_dest_id.picking_id.id, cr) self.write(cr, uid, ids, {'state': 'cancel', 'move_dest_id': False}) if not context.get('call_unlink',False): - for pick in self.pool.get('stock.picking').browse(cr, uid, pickings.keys()): + for pick in self.pool.get('stock.picking').browse(cr, uid, pickings, context=context): if all(move.state == 'cancel' for move in pick.move_lines): self.pool.get('stock.picking').write(cr, uid, [pick.id], {'state': 'cancel'}) diff --git a/addons/stock/stock_demo.yml b/addons/stock/stock_demo.yml index b4836566f55..245e55c38c6 100644 --- a/addons/stock/stock_demo.yml +++ b/addons/stock/stock_demo.yml @@ -18,10 +18,7 @@ - !record {model: stock.location, id: location_convenience_shop}: name: Convenient Store - chained_auto_packing: auto - chained_location_type: fixed usage: supplier - location_id: stock_location_suppliers - !record {model: stock.warehouse, id: warehouse_icecream}: name: Ice Cream Shop diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 96c42c6c488..4468823d98e 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -73,6 +73,7 @@ assert shipment.state == 'done', "shipment should be close after received." for move_line in shipment.move_lines: assert move_line.product_qty == 10, "Qty does not correspond." + assert move_line.product_id.virtual_available == 20, "Virtual stock does not correspond." assert move_line.state == 'done', "Move line should be closed." - @@ -82,11 +83,15 @@ invoice_state: none - !python {model: stock.return.picking }: | + # this work without giving the id of the picking to return, magically, thanks to the context self.create_returns(cr, uid, [ref('return_incomming')], context=context) - I cancel incomming shipment after return it. - !python {model: stock.picking}: | + # the cancel is not on the return, but on the incomming shipment (which now has a quantity of 10, thanks to the + # backorder). This situation is a little weird as we returned a move that we finally cancelled... As result, only + # 30Kg from the original 50Kg will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity)) self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context) - I make invoice of backorder of incomming shipment. @@ -107,12 +112,12 @@ shipment = self.browse(cr, uid, ref("incomming_shipment")) assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not upadted.' - - I check availabile stock after received incomming shipping. + I check available stock after received incomming shipping. - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_icecream'), context=context) assert product.qty_available == 140, "Stock does not correspond." - assert product.virtual_available == 10, "Vitual stock does not correspond." + assert product.virtual_available == 0, "Vitual stock does not correspond." - I split incomming shipment into lots. each lot contain 10 kgm Ice-cream. -