Merge lp:~camptocamp/openobject-addons/7.0-bug-1168398-tta+afe into lp:openobject-addons/7.0

Proposed by Alexandre Fayolle - camptocamp
Status: Needs review
Proposed branch: lp:~camptocamp/openobject-addons/7.0-bug-1168398-tta+afe
Merge into: lp:openobject-addons/7.0
Diff against target: 107 lines (+79/-2)
3 files modified
mrp/__openerp__.py (+1/-0)
mrp/mrp.py (+11/-2)
mrp/test/order_process_prodlot_split.yml (+67/-0)
To merge this branch: bzr merge lp:~camptocamp/openobject-addons/7.0-bug-1168398-tta+afe
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+174153@code.launchpad.net
To post a comment you must log in.
9048. By Alexandre Fayolle - camptocamp

[IMP] fix typo in test, delete trailing whitespace, add an assertion

9049. By Alexandre Fayolle - camptocamp

[MRG] merge back the fix on 7.0 head, and hopefully get green on runbot

Revision history for this message
Joshua Jan(SHINEIT) (joshuajan) wrote :

Hi All,

Thanks for Contribution. I have make some test about this change. I found a problem.
if I Create a MO to make 2 Piece Product-A.
Product-A`s BOM
-- Product-A-M QTY:1

1.I click "split in Serial Numbers" and assign 1 serial number "A-M-001" to Product-A-M, so I get two line in "Products to Consume":
|Product-A-M | 1 | |
|Product-A-M | 1 | A-M-001|

2.I consume and produce 1 Product-A. The line without serial number will be consume. Because there are same qty in "Products to Consume" then system will sort by id.

I suggest change the sort code from
moves = sorted(raw_product, key=lambda k: (k.product_qty))
to
moves = sorted(raw_product, key=lambda k: (k.prodlot_id), reverse=True)
is better.

Best regards
Joshua

Unmerged revisions

9049. By Alexandre Fayolle - camptocamp

[MRG] merge back the fix on 7.0 head, and hopefully get green on runbot

9048. By Alexandre Fayolle - camptocamp

[IMP] fix typo in test, delete trailing whitespace, add an assertion

9047. By Alexandre Fayolle - camptocamp

[TEST] added test for bug lp:1168398

9046. By SnippetBucket.com

[FIX] bug:1168398/Incorrect behaviour when producing MO with component split in serial numbers.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'mrp/__openerp__.py'
--- mrp/__openerp__.py 2013-01-31 18:41:41 +0000
+++ mrp/__openerp__.py 2013-07-11 11:49:30 +0000
@@ -80,6 +80,7 @@
80# 'test/order_demo.yml',80# 'test/order_demo.yml',
81# 'test/order_process.yml',81# 'test/order_process.yml',
82# 'test/cancel_order.yml',82# 'test/cancel_order.yml',
83 'test/order_process_prodlot_split.yml',
83 ],84 ],
84 'installable': True,85 'installable': True,
85 'application': True,86 'application': True,
8687
=== modified file 'mrp/mrp.py'
--- mrp/mrp.py 2012-12-20 11:47:30 +0000
+++ mrp/mrp.py 2013-07-11 11:49:30 +0000
@@ -738,8 +738,17 @@
738 if qty <= 0.0:738 if qty <= 0.0:
739 # we already have more qtys consumed than we need739 # we already have more qtys consumed than we need
740 continue740 continue
741741 splitqty = qty
742 raw_product[0].action_consume(qty, raw_product[0].location_id.id, context=context)742 moves = sorted(raw_product, key=lambda k: (k.product_qty))
743 for move in moves:
744 if splitqty <= 0:
745 break
746 elif move.product_qty >= qty:
747 move.action_consume(qty, move.location_id.id, context=context)
748 splitqty = 0
749 else:
750 move.action_consume(splitqty, move.location_id.id, context=context)
751 splitqty = splitqty - move.product_qty
743752
744 if production_mode == 'consume_produce':753 if production_mode == 'consume_produce':
745 # To produce remaining qty of final product754 # To produce remaining qty of final product
746755
=== added file 'mrp/test/order_process_prodlot_split.yml'
--- mrp/test/order_process_prodlot_split.yml 1970-01-01 00:00:00 +0000
+++ mrp/test/order_process_prodlot_split.yml 2013-07-11 11:49:30 +0000
@@ -0,0 +1,67 @@
1-
2 I create a MO for 1 PCSC349
3-
4 !record {model: mrp.production, id: test_mo_pcsc349}:
5 product_id: product.product_product_4
6 product_qty: 1
7 product_uom: product.product_uom_unit
8 location_src_id: stock.stock_location_stock
9 location_dest_id: stock.stock_location_stock
10 bom_id: mrp_bom_24
11-
12 I confirm the MO
13-
14 !workflow {model: mrp.production, action: button_confirm, ref: test_mo_pcsc349}
15-
16 I split the RAM SR3 in 2 production lots
17-
18 !python {model: stock.move.split}: |
19 order = self.pool.get('mrp.production').browse(cr, uid, ref('test_mo_pcsc349'), context=context)
20 ram_lines = [line for line in order.move_lines if line.product_id.default_code == 'RAM-SR3']
21 assert len(ram_lines) == 1, 'no RAM-SR3 lines found'
22 ctxt = context.copy()
23 ctxt['active_id'] = ram_lines[0].id
24 ctxt['active_ids'] = [ram_lines[0].id]
25 ctxt['active_model'] = 'stock.move'
26 values = self.default_get(cr, uid,
27 ['product_id', 'product_uom', 'qty', 'use_exist', 'location_id'],
28 ctxt)
29 wizard_id = self.create(cr, uid, values, context=ctxt)
30 prodlot_obj = self.pool.get('stock.production.lot')
31 split_line_obj = self.pool.get('stock.move.split.lines')
32 split_line_obj.create(cr, uid, {'wizard_id': wizard_id,
33 'name': 'ram_sn_1',
34 'quantity': 1,}, context=ctxt)
35 split_line_obj.create(cr, uid, {'wizard_id': wizard_id,
36 'name': 'ram_sn_2',
37 'quantity': 1,}, context=ctxt)
38 self.split_lot(cr, uid, [wizard_id], context=ctxt)
39 order.refresh()
40 ram_lines = [line for line in order.move_lines if line.product_id.default_code == 'RAM-SR3']
41 assert len(ram_lines) == 2, 'RAM-SR3 line not split'
42
43
44-
45 I click on the "Produce" button of the Manufacturing Order and in the wizard select "Consume and Produce" mode
46-
47 !python {model: mrp.product.produce}: |
48 ctxt = context.copy()
49 order = self.pool.get('mrp.production').browse(cr, uid, ref('test_mo_pcsc349'), context=context)
50 ctxt['active_id'] = order.id
51 ctxt['active_model'] = 'mrp.production'
52 wizard_id = self.create(cr, uid,
53 {'product_qty': 1,
54 'mode': 'consume_produce'}, ctxt)
55 self.do_produce(cr, uid, [wizard_id], ctxt)
56-
57 I expect
58 all the Products in the "Products to consume" lists to be consumed
59 and moved to the "consumed products" list,
60 and the manufacturing order to be in state "Done"
61-
62 !python {model: mrp.production}: |
63 order = self.browse(cr, uid, ref('test_mo_pcsc349'), context=context)
64 assert order.state == 'done', "wrong state for the production order (%r, expected: 'done')" % order.state
65 assert len(order.move_lines) == 0, "%d leftover move lines in 'products to consume'" % len(order.move_lines)
66 ram_lines = [line for line in order.move_lines2 if line.product_id.default_code == 'RAM-SR3']
67 assert len(ram_lines) == 2, 'not all RAM-SR3 were consumed'