[FIX] mrp_subcontracting: avoid setting done qty on subcontracted SM
On the backorders, the consumed quantities are incorrect. To reproduce the issue: 1. Create two products: - C01: consumable - P01: storable 2. Create a BoM - Product: P01 - Type: Subcontracting - Subcontractor: S - Components: 1 x C01 3. Create and confirm a planned receipt: - From: S - 10 x P01 4. Set the done quantity (directly on the tree view) to 1 5. Validate + Backorder 6. On this first backorder, set the qty to 2 7. Validate + Backorder 8. Validate the second backorder 9. Inventory > Reporting > Moves History, filter on C01 Error: There are three SMs, and here are the done quantities: 1, 9 and 7. The second one is incorrect, it should be 2 (see step 6). Since [1] the done quantity is always editable on the picking's operations, but the feature is not implemented in subcontracting, therefore the communication between the MO and the picking does not work well. For instance, step 4: save the done quantity and open the MO: nothing changed on it, its producing qty is still zero. Another example: step 4, instead of setting the done quantity directly on the picking, open the wizard (the MO), record 3 produced products and close the wizard. The done quantity of the stock move is 3 but the user can still edit it. However, if he tries to update the line, nothing will change on MO side. On top of these "little" bugs, it may lead to a more important one as shown in the above use case. Step 5: at some point, we split the MO to generate a backorder for 9 x P01: https://github.com/odoo/odoo/blob/c47e4ac7cb5fdd690f40ab2e0f8d022ba565145e/addons/mrp_subcontracting/models/stock_picking.py#L72-L76 And, as shown, the flag `set_consumed_qty` is set to `True`. As explained in the method description: https://github.com/odoo/odoo/blob/a2574b45aef1ff6ff3a221b996d0bb0dda2a8c74/addons/mrp/models/mrp_production.py#L1602-L1603 So, because of this flag, the method will create a SML for C01 on the backorder, with its done quantity set to the reserved one: 9. However, back to the first block code: `move.move_line_ids` only contains the SML created at step 4 (i.e., the SML of the inital SM, with a done quantity equal to 1). As a result, in the for loop, we only define the producing quantity of the initial MO. This is a first issue: step 6, suppose the user rather opens the detailed operations of the line: it displays the new MO, the producing qty is 0 but the consumed quantity of the component is 9. This is not perfect, but let's ignore this and continue with the above steps. The user sets the done quantity to 2 and validates with backorder. It runs the productions split again, we use the done quantity as producing one on the MO, but we don't edit the consumed quantities, hence the error. For all these reasons, the safer solution is probably to prevent the feature 'qty done always editable' in case of subcontracting. [1] cacc677a OPW-3441197 closes odoo/odoo#135120 Signed-off-by:William Henrotin (whe) <whe@odoo.com>
Showing
- addons/mrp_subcontracting/models/stock_move.py 5 additions, 0 deletionsaddons/mrp_subcontracting/models/stock_move.py
- addons/mrp_subcontracting/tests/test_subcontracting.py 55 additions, 0 deletionsaddons/mrp_subcontracting/tests/test_subcontracting.py
- addons/stock/models/stock_move.py 0 additions, 8 deletionsaddons/stock/models/stock_move.py
- addons/stock/views/stock_picking_views.xml 1 addition, 1 deletionaddons/stock/views/stock_picking_views.xml
Loading