[FIX] fixing yaml tests
[odoo/odoo.git] / addons / stock / test / shipment.yml
1 -
2   I confirm outgoing shipment of 130 kgm Ice-cream.
3 -
4   !workflow {model: stock.picking, action: button_confirm, ref: outgoing_shipment}
5 -
6   I check shipment details after confirmed.
7 -
8   !python {model: stock.picking}: |
9     shipment = self.browse(cr, uid, ref("outgoing_shipment"))
10     assert shipment.state == "confirmed", "Shipment should be confirmed."
11     for move_line in shipment.move_lines:
12         assert move_line.state == "confirmed", "Move should be confirmed."
13
14 -
15   Now I check vitual stock of Ice-cream after confirmed outgoing shipment.
16 -
17   !python {model: product.product}: |
18     product = self.browse(cr, uid, ref('product_icecream'), context=context)
19     product.virtual_available == -30, "Vitual stock is not updated."
20
21 -
22   I confirm incomming shipment of 50 kgm Ice-cream.
23 -
24   !workflow {model: stock.picking, action: button_confirm, ref: incomming_shipment}
25 -
26   I receive 40kgm Ice-cream so I make backorder of incomming shipment for 40 kgm.
27 -
28   !python {model: stock.partial.picking}: |
29     context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]})
30 -
31   !record {model: stock.partial.picking, id: partial_incomming}:
32     move_ids:
33         - quantity: 40
34           product_id: product_icecream
35           product_uom: product.product_uom_kgm
36           move_id: incomming_shipment_icecream
37           location_id: location_convenience_shop
38           location_dest_id: location_refrigerator
39 -
40   !python {model: stock.partial.picking }: |
41     self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
42 -
43   I check backorder shipment after received partial shipment.
44 -
45   !python {model: stock.picking}: |
46     shipment = self.browse(cr, uid, ref("incomming_shipment"))
47     backorder = shipment.backorder_id
48     assert backorder, "Backorder should be created after partial shipment."
49     assert backorder.state == 'done', "Backorder should be close after received."
50     for move_line in backorder.move_lines:
51         assert move_line.product_qty == 40, "Qty in backorder does not correspond."
52         assert move_line.state == 'done', "Move line of backorder should be closed."
53 -
54   I receive another 10kgm Ice-cream.
55 -
56   !record {model: stock.partial.picking, id: partial_incomming}:
57     move_ids:
58         - quantity: 10
59           product_id: product_icecream
60           product_uom: product.product_uom_kgm
61           move_id: incomming_shipment_icecream
62           location_id: location_convenience_shop
63           location_dest_id: location_refrigerator
64 -
65   !python {model: stock.partial.picking }: |
66     self.do_partial(cr, uid, [ref('partial_incomming')], context=context)
67
68 -
69   I check incomming shipment after received.
70 -
71   !python {model: stock.picking}: |
72     shipment = self.browse(cr, uid, ref("incomming_shipment"))
73     assert shipment.state == 'done', "shipment should be close after received."
74     for move_line in shipment.move_lines:
75         assert move_line.product_qty == 10, "Qty does not correspond."
76         assert move_line.state == 'done', "Move line should be closed."
77
78 -
79   I return last incomming shipment for 10 kgm Ice-cream.
80 -
81   !record {model: stock.return.picking, id: return_incomming}:
82     invoice_state: none
83 -
84   !python {model: stock.return.picking }: |
85     self.create_returns(cr, uid, [ref('return_incomming')], context=context)
86 -
87   I cancel incomming shipment after return it.
88 -
89   !python {model: stock.picking}: |
90     self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context)
91 -
92   I make invoice of backorder of incomming shipment.
93 -
94   !python {model: stock.invoice.onshipping}: |
95     shipment = self.pool.get('stock.picking').browse(cr, uid, ref("incomming_shipment"))
96     context.update({'active_model': 'stock.picking', 'active_id': shipment.backorder_id.id, 'active_ids': [shipment.backorder_id.id]})
97 -
98   !record {model: stock.invoice.onshipping, id: invoice_incomming}:
99     group: False
100 -
101   !python {model: stock.invoice.onshipping }: |
102     self.create_invoice(cr, uid, [ref('invoice_incomming')], context=context)
103 -
104   I check invoice state of backorder of incomming shipment.
105 -
106   !python {model: stock.picking}: |
107     shipment = self.browse(cr, uid, ref("incomming_shipment"))
108     assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not upadted.'
109 -
110   I check availabile stock after received incomming shipping.
111 -
112   !python {model: product.product}: |
113     product = self.browse(cr, uid, ref('product_icecream'), context=context)
114     assert product.qty_available == 140, "Stock does not correspond."
115     assert product.virtual_available == 10, "Vitual stock does not correspond."
116 -
117   I split incomming shipment into lots. each lot contain 10 kgm Ice-cream.
118 -
119   !python {model: stock.picking}: |
120     shipment = self.browse(cr, uid, ref("incomming_shipment"))
121     move_ids = [x.id for x in shipment.backorder_id.move_lines]
122     context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids})
123 -
124   !record {model: stock.move.split, id: split_lot_incomming}:
125     line_ids:
126         - name: incoming_lot0
127           quantity: 10
128         - name: incoming_lot1
129           quantity: 10
130         - name: incoming_lot2
131           quantity: 10
132         - name: incoming_lot3
133           quantity: 10
134         
135 -
136  !python {model: stock.move.split }: |
137     self.split_lot(cr, uid, [ref('split_lot_incomming')], context=context)
138 -
139   I check move lines after spliting
140 -
141   !python {model: stock.move}: |
142     lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context)
143     lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])])
144     assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.'
145     move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_refrigerator')),('prodlot_id','in',lot_ids)])
146     assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.'
147     for move in self.browse(cr, uid, move_ids, context=context):
148         assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond." 
149         assert move.product_qty == 10, "qty does not correspond per production lot."
150     context.update({'active_model':'stock.move', 'active_id':move_ids[0],'active_ids': move_ids})
151 -
152   I check the stock valuation account entries.
153 -
154   !python {model: account.move}: |
155     incomming_shipment = self.pool.get('stock.picking').browse(cr, uid, ref('incomming_shipment'), context=context)
156     account_move_ids = self.search(cr, uid, [('ref','=',incomming_shipment.name)])
157     assert len(account_move_ids), "account move should be created."
158     account_move = self.browse(cr, uid, account_move_ids[0], context=context)
159     assert len(account_move.line_id) == len(incomming_shipment.move_lines) + 1, 'accuont entries are not correspond.'
160     for account_move_line in account_move.line_id:
161         for stock_move in incomming_shipment.move_lines:
162             if account_move_line.account_id.id == stock_move.product_id.property_stock_account_input.id:
163                 assert account_move_line.credit == 800.0, "Credit amount does not correspond."
164                 assert account_move_line.debit == 0.0, "Debit amount does not correspond."
165             else:
166                 assert account_move_line.credit == 0.0, "Credit amount does not correspond."
167                 assert account_move_line.debit == 800.0, "Debit amount does not correspond."
168 -
169   I consume 1 kgm ice-cream from each incoming lots into internal production.
170 -
171   !record {model: stock.move.consume, id: consume_lot_incomming}:
172     product_qty: 1
173     location_id: location_refrigerator
174 -
175   !python {model: stock.move.consume}: |
176     self.do_move_consume(cr, uid, [ref('consume_lot_incomming')], context=context)
177 -
178   I scrap 10 gm ice-cream from each incoming lots into scrap location.
179 -
180   !record {model: stock.move.scrap, id: scrap_lot_incomming}:
181     product_qty: 0.010
182 -
183   !python {model: stock.move.scrap}: |
184     self.move_scrap(cr, uid, [ref('scrap_lot_incomming')], context=context)
185 -
186   I check stock in scrap location and refrigerator location.
187 -
188   !python {model: stock.location}: |
189     ctx = {'product_id': ref('product_icecream')}
190     refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_refrigerator'), context=ctx)
191     assert refrigerator_location.stock_real == 135.96, 'stock does not correspond in refrigerator location.'
192     scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx)
193     assert scrapped_location.stock_real == 0.010*4, 'scraped stock does not correspond in scrap location.'
194     
195 -
196   I check availabile stock after consumed and scraped.
197 -
198   !python {model: product.product}: |
199     product = self.browse(cr, uid, ref('product_icecream'), context=context)
200     assert product.qty_available == 135.96, "Stock does not correspond."
201     assert round(product.virtual_available, 2) == 5.96, "Vitual stock does not correspond."
202 -
203   I trace all incoming lots.
204 -
205   !python {model: stock.production.lot }: |
206     lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context)
207     lot_ids = self.search(cr, uid, [('name', 'in', [x.name for x in lot.line_ids])])
208     self.action_traceability(cr, uid, lot_ids, context=context)
209 -
210   I check outgoing shipment after stock availablity in refrigerator.
211 -
212   !python {model: stock.picking}: |
213     shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context)
214     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
215     #TOFIX: shipment should be assigned if stock available
216     #assert shipment.state == "assigned", "Shipment should be assigned."
217     #for move_line in shipment.move_lines:
218     #    assert move_line.state == "assigned", "Move should be assigned."
219     self.force_assign(cr, uid, [shipment.id])
220 -
221   I deliver 5kgm Ice-cream to customer so I make partial deliver
222 -
223   !python {model: stock.partial.move}: |
224     context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_icecream'), 'active_ids': [ref('outgoing_shipment_icecream')]})
225 -
226   !record {model: stock.partial.move, id: partial_outgoing_icecream}:
227     move_ids:
228         - quantity: 5
229           product_id: product_icecream
230           product_uom: product.product_uom_kgm
231           move_id: outgoing_shipment_icecream
232           location_id: location_refrigerator
233           location_dest_id: location_delivery_counter
234 -
235   !python {model: stock.partial.move }: |
236     self.do_partial(cr, uid, [ref('partial_outgoing_icecream')], context=context)
237
238 -
239   I packing outgoing shipment into box per 10kgm with unique tracking lot.
240 -
241   !python {model: stock.move}: |
242     stock_split = self.pool.get('stock.split.into')
243     move = self.browse(cr, uid, ref('outgoing_shipment_icecream'), context=context)
244     context.update({'active_model': 'stock.move', 'active_id': move.id, 'active_ids': [move.id]})
245     total_qty = move.product_qty
246     split_qty = 10
247     while(total_qty>0):
248         split_id = stock_split.create(cr, uid, {'quantity': split_qty}, context=context)
249         stock_split.split(cr, uid, [split_id], context=context)
250         total_qty -= split_qty
251 -
252   I deliver outgoing shipment.
253 -
254   !python {model: stock.partial.picking}: |
255     context.update({'active_model': 'stock.picking', 'active_id': ref('outgoing_shipment'), 'active_ids': [ref('outgoing_shipment')]})
256 -
257   !record {model: stock.partial.picking, id: partial_outgoing}:
258     picking_id: outgoing_shipment
259 -
260   !python {model: stock.partial.picking }: |
261     self.do_partial(cr, uid, [ref('partial_outgoing')], context=context)
262
263 -
264   I check outgoing shipment after deliver.
265 -
266   !python {model: stock.picking}: |
267     shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context)
268     assert shipment.state == "done", "Shipment should be closed."
269     for move_line in shipment.move_lines:
270         assert move_line.state == "done", "Move should be closed."
271 -
272   I check availabile stock after deliver.
273 -
274   !python {model: product.product}: |
275     product = self.browse(cr, uid, ref('product_icecream'), context=context)
276     assert round(product.qty_available, 2) == 5.96, "Stock does not correspond."
277     assert round(product.virtual_available, 2) == 5.96, "Vitual stock does not correspond."