2011-12-21 11:38:22 +00:00
-
I confirm outgoing shipment of 130 kgm Ice-cream.
-
!workflow {model: stock.picking, action: button_confirm, ref: outgoing_shipment}
-
I check shipment details after confirmed.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("outgoing_shipment"))
assert shipment.state == "confirmed", "Shipment should be confirmed."
2011-12-22 06:06:59 +00:00
for move_line in shipment.move_lines :
2011-12-21 11:38:22 +00:00
assert move_line.state == "confirmed", "Move should be confirmed."
-
Now I check vitual stock of Ice-cream after confirmed outgoing shipment.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
product.virtual_available == -30, "Vitual stock is not updated."
-
I confirm incomming shipment of 50 kgm Ice-cream.
-
2011-12-22 06:06:59 +00:00
!workflow {model: stock.picking, action: button_confirm, ref: incomming_shipment}
2011-12-21 11:38:22 +00:00
-
2011-12-22 10:06:58 +00:00
I receive 40kgm Ice-cream so I make backorder of incomming shipment for 40 kgm.
2011-12-21 11:38:22 +00:00
-
!python {model: stock.partial.picking}: |
2011-12-22 06:06:59 +00:00
context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]})
2011-12-21 11:38:22 +00:00
-
!record {model: stock.partial.picking, id: partial_incomming}:
move_ids :
- quantity : 40
product_id : product_icecream
product_uom : product.product_uom_kgm
move_id : incomming_shipment_icecream
location_id : location_convenience_shop
location_dest_id : location_refrigerator
-
!python {model: stock.partial.picking }: |
self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
-
I check backorder shipment after received partial shipment.
-
!python {model: stock.picking}: |
2011-12-22 06:06:59 +00:00
shipment = self.browse(cr, uid, ref("incomming_shipment"))
2011-12-22 10:06:58 +00:00
backorder = shipment.backorder_id
assert backorder, "Backorder should be created after partial shipment."
assert backorder.state == 'done', "Backorder should be close after received."
for move_line in backorder.move_lines :
2012-01-24 12:34:21 +00:00
assert move_line.product_qty == 40, "Qty in backorder does not correspond."
2011-12-22 10:06:58 +00:00
assert move_line.state == 'done', "Move line of backorder should be closed."
2011-12-21 11:38:22 +00:00
-
2011-12-22 10:06:58 +00:00
I receive another 10kgm Ice-cream.
-
!record {model: stock.partial.picking, id: partial_incomming}:
move_ids :
- quantity : 10
product_id : product_icecream
product_uom : product.product_uom_kgm
move_id : incomming_shipment_icecream
location_id : location_convenience_shop
location_dest_id : location_refrigerator
-
!python {model: stock.partial.picking }: |
self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
-
I check incomming shipment after received.
2011-12-21 11:38:22 +00:00
-
2011-12-22 06:06:59 +00:00
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("incomming_shipment"))
2011-12-22 10:06:58 +00:00
assert shipment.state == 'done', "shipment should be close after received."
for move_line in shipment.move_lines :
2012-01-24 12:34:21 +00:00
assert move_line.product_qty == 10, "Qty does not correspond."
2012-05-08 16:32:04 +00:00
assert move_line.product_id.virtual_available == 20, "Virtual stock does not correspond."
2011-12-22 10:06:58 +00:00
assert move_line.state == 'done', "Move line should be closed."
-
2011-12-22 13:41:49 +00:00
I return last incomming shipment for 10 kgm Ice-cream.
2011-12-21 11:38:22 +00:00
-
2011-12-22 06:06:59 +00:00
!record {model: stock.return.picking, id: return_incomming}:
invoice_state : none
2011-12-21 11:38:22 +00:00
-
!python {model: stock.return.picking }: |
2012-05-08 16:32:04 +00:00
# this work without giving the id of the picking to return, magically, thanks to the context
2011-12-21 11:38:22 +00:00
self.create_returns(cr, uid, [ref('return_incomming')], context=context)
-
2011-12-22 10:06:58 +00:00
I cancel incomming shipment after return it.
2011-12-21 11:38:22 +00:00
-
!python {model: stock.picking}: |
2012-05-08 16:32:04 +00:00
# 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))
2011-12-22 10:06:58 +00:00
self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context)
2011-12-21 11:38:22 +00:00
-
2011-12-22 10:06:58 +00:00
I make invoice of backorder of incomming shipment.
2011-12-21 11:38:22 +00:00
-
!python {model: stock.invoice.onshipping}: |
2011-12-22 10:06:58 +00:00
shipment = self.pool.get('stock.picking').browse(cr, uid, ref("incomming_shipment"))
context.update({'active_model': 'stock.picking', 'active_id': shipment.backorder_id.id, 'active_ids': [shipment.backorder_id.id]})
2011-12-21 11:38:22 +00:00
-
2011-12-22 06:06:59 +00:00
!record {model: stock.invoice.onshipping, id: invoice_incomming}:
group : False
2011-12-21 11:38:22 +00:00
-
!python {model: stock.invoice.onshipping }: |
self.create_invoice(cr, uid, [ref('invoice_incomming')], context=context)
2011-12-22 10:06:58 +00:00
-
I check invoice state of backorder of incomming shipment.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("incomming_shipment"))
assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not upadted.'
2011-12-21 11:38:22 +00:00
-
2012-05-08 16:32:04 +00:00
I check available stock after received incomming shipping.
2011-12-21 11:38:22 +00:00
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
2012-01-24 12:34:21 +00:00
assert product.qty_available == 140, "Stock does not correspond."
2012-05-08 16:32:04 +00:00
assert product.virtual_available == 0, "Vitual stock does not correspond."
2011-12-21 11:38:22 +00:00
-
I split incomming shipment into lots. each lot contain 10 kgm Ice-cream.
-
2011-12-22 10:06:58 +00:00
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("incomming_shipment"))
move_ids = [x.id for x in shipment.backorder_id.move_lines]
context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids})
2011-12-21 11:38:22 +00:00
-
!record {model: stock.move.split, id: split_lot_incomming}:
line_ids :
- name : incoming_lot0
quantity : 10
- name : incoming_lot1
quantity : 10
- name : incoming_lot2
quantity : 10
- name : incoming_lot3
quantity : 10
-
!python {model: stock.move.split }: |
self.split_lot(cr, uid, [ref('split_lot_incomming')], context=context)
-
2011-12-22 10:06:58 +00:00
I check move lines after spliting
2011-12-21 11:38:22 +00:00
-
2011-12-22 10:06:58 +00:00
!python {model: stock.move}: |
2011-12-22 06:06:59 +00:00
lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context)
2011-12-22 10:06:58 +00:00
lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])])
assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.'
move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_refrigerator')),('prodlot_id','in',lot_ids)])
assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.'
for move in self.browse(cr, uid, move_ids, context=context) :
2012-01-24 12:34:21 +00:00
assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond."
assert move.product_qty == 10, "qty does not correspond per production lot."
2011-12-21 11:38:22 +00:00
context.update({'active_model':'stock.move', 'active_id':move_ids[0],'active_ids': move_ids})
2012-01-06 12:16:12 +00:00
-
I check the stock valuation account entries.
-
!python {model: account.move}: |
incomming_shipment = self.pool.get('stock.picking').browse(cr, uid, ref('incomming_shipment'), context=context)
account_move_ids = self.search(cr, uid, [('ref','=',incomming_shipment.name)])
assert len(account_move_ids), "account move should be created."
account_move = self.browse(cr, uid, account_move_ids[0], context=context)
assert len(account_move.line_id) == len(incomming_shipment.move_lines) + 1, 'accuont entries are not correspond.'
for account_move_line in account_move.line_id :
for stock_move in incomming_shipment.move_lines :
if account_move_line.account_id.id == stock_move.product_id.property_stock_account_input.id :
2012-01-24 12:34:21 +00:00
assert account_move_line.credit == 800.0, "Credit amount does not correspond."
assert account_move_line.debit == 0.0, "Debit amount does not correspond."
2012-01-06 12:16:12 +00:00
else :
2012-01-24 12:34:21 +00:00
assert account_move_line.credit == 0.0, "Credit amount does not correspond."
assert account_move_line.debit == 800.0, "Debit amount does not correspond."
2011-12-22 10:06:58 +00:00
-
I consume 1 kgm ice-cream from each incoming lots into internal production.
2011-12-21 11:38:22 +00:00
-
!record {model: stock.move.consume, id: consume_lot_incomming}:
product_qty : 1
2011-12-22 10:06:58 +00:00
location_id : location_refrigerator
2011-12-21 11:38:22 +00:00
-
!python {model: stock.move.consume}: |
self.do_move_consume(cr, uid, [ref('consume_lot_incomming')], context=context)
-
I scrap 10 gm ice-cream from each incoming lots into scrap location.
-
!record {model: stock.move.scrap, id: scrap_lot_incomming}:
product_qty : 0.010
-
!python {model: stock.move.scrap}: |
self.move_scrap(cr, uid, [ref('scrap_lot_incomming')], context=context)
-
2011-12-22 10:06:58 +00:00
I check stock in scrap location and refrigerator location.
2011-12-21 11:38:22 +00:00
-
!python {model: stock.location}: |
ctx = {'product_id': ref('product_icecream')}
2012-02-15 18:34:33 +00:00
refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_refrigerator'), context=ctx)
assert refrigerator_location.stock_real == 135.96, 'stock does not correspond in refrigerator location.'
2011-12-21 11:38:22 +00:00
scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx)
2012-01-24 12:34:21 +00:00
assert scrapped_location.stock_real == 0.010*4, 'scraped stock does not correspond in scrap location.'
2011-12-22 10:06:58 +00:00
2011-12-21 11:38:22 +00:00
-
I check availabile stock after consumed and scraped.
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
2012-02-15 18:34:33 +00:00
assert product.qty_available == 135.96, "Stock does not correspond."
2012-05-08 21:22:45 +00:00
assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."
2011-12-21 11:38:22 +00:00
-
I trace all incoming lots.
-
!python {model: stock.production.lot }: |
2011-12-22 06:06:59 +00:00
lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context)
2011-12-21 11:38:22 +00:00
lot_ids = self.search(cr, uid, [('name', 'in', [x.name for x in lot.line_ids])])
self.action_traceability(cr, uid, lot_ids, context=context)
-
2011-12-22 13:41:49 +00:00
I check outgoing shipment after stock availablity in refrigerator.
2011-12-21 11:38:22 +00:00
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context)
2011-12-22 10:06:58 +00:00
self.pool.get('stock.move').action_assign(cr, uid, [x.id for x in shipment.move_lines]) #TOFIX : assignment of move lines should be call before testing assigment otherwise picking never gone in assign state
#TOFIX: shipment should be assigned if stock available
2011-12-22 06:06:59 +00:00
#assert shipment.state == "assigned", "Shipment should be assigned."
2011-12-22 10:06:58 +00:00
#for move_line in shipment.move_lines:
# assert move_line.state == "assigned", "Move should be assigned."
self.force_assign(cr, uid, [shipment.id])
2011-12-21 11:38:22 +00:00
-
I deliver 5kgm Ice-cream to customer so I make partial deliver
-
!python {model: stock.partial.move}: |
context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_icecream'), 'active_ids': [ref('outgoing_shipment_icecream')]})
-
!record {model: stock.partial.move, id: partial_outgoing_icecream}:
move_ids :
- quantity : 5
product_id : product_icecream
product_uom : product.product_uom_kgm
move_id : outgoing_shipment_icecream
location_id : location_refrigerator
location_dest_id : location_delivery_counter
-
!python {model: stock.partial.move }: |
self.do_partial(cr, uid, [ref('partial_outgoing_icecream')], context=context)
-
I packing outgoing shipment into box per 10kgm with unique tracking lot.
-
!python {model: stock.move}: |
stock_split = self.pool.get('stock.split.into')
move = self.browse(cr, uid, ref('outgoing_shipment_icecream'), context=context)
context.update({'active_model': 'stock.move', 'active_id': move.id, 'active_ids': [move.id]})
total_qty = move.product_qty
split_qty = 10
2011-12-23 10:44:42 +00:00
while(total_qty>0) :
2011-12-21 11:38:22 +00:00
split_id = stock_split.create(cr, uid, {'quantity': split_qty}, context=context)
stock_split.split(cr, uid, [split_id], context=context)
total_qty -= split_qty
-
I deliver outgoing shipment.
-
!python {model: stock.partial.picking}: |
context.update({'active_model': 'stock.picking', 'active_id': ref('outgoing_shipment'), 'active_ids': [ref('outgoing_shipment')]})
-
2011-12-22 06:06:59 +00:00
!record {model: stock.partial.picking, id: partial_outgoing}:
picking_id : outgoing_shipment
2011-12-21 11:38:22 +00:00
-
!python {model: stock.partial.picking }: |
self.do_partial(cr, uid, [ref('partial_outgoing')], context=context)
-
I check outgoing shipment after deliver.
-
!python {model: stock.picking}: |
shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context)
2011-12-22 10:06:58 +00:00
assert shipment.state == "done", "Shipment should be closed."
2011-12-22 06:06:59 +00:00
for move_line in shipment.move_lines :
2011-12-22 10:06:58 +00:00
assert move_line.state == "done", "Move should be closed."
2011-12-21 11:38:22 +00:00
-
2012-05-08 21:22:45 +00:00
I check availaible stock after deliver.
2011-12-21 11:38:22 +00:00
-
!python {model: product.product}: |
product = self.browse(cr, uid, ref('product_icecream'), context=context)
2012-02-15 18:34:33 +00:00
assert round(product.qty_available, 2) == 5.96, "Stock does not correspond."
2012-05-08 21:22:45 +00:00
assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond."