From 4ffd1d86e4a7da4b9f7f189df2abf63ced844e88 Mon Sep 17 00:00:00 2001 From: clesgow Date: Thu, 10 Aug 2023 11:03:43 +0200 Subject: [PATCH] [FIX] mrp: change qty_producing when updating product_qty Currently, when no workorders are defined for a production, updating its `product_qty` through the wizard won't update its qty_producing, meaning that if the production gets validated right afterwards, the total produced will be the same as prior the update. This is missleading and unconsistent with how things work when workorders are involved, since in that case the `qty_producing` of the production will be updated through the inverse of the workorder's `qty_producing`. Also removed the verification on `produced_qty` as it will never be set before the MO is done, and the wizard can't be accessed at this point. Part-of: odoo/odoo#142513 --- addons/mrp/i18n/mrp.pot | 9 -------- addons/mrp/tests/test_order.py | 24 ++++++++++++++-------- addons/mrp/wizard/change_production_qty.py | 16 +++++++-------- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/addons/mrp/i18n/mrp.pot b/addons/mrp/i18n/mrp.pot index 65f030aaf2c..2a49830b260 100644 --- a/addons/mrp/i18n/mrp.pot +++ b/addons/mrp/i18n/mrp.pot @@ -6676,15 +6676,6 @@ msgid "" " " msgstr "" -#. module: mrp -#. odoo-python -#: code:addons/mrp/wizard/change_production_qty.py:0 -#, python-format -msgid "" -"You have already processed %(quantity)s. Please input a quantity higher than" -" %(quantity)s " -msgstr "" - #. module: mrp #: model_terms:ir.ui.view,arch_db:mrp.view_assign_serial_numbers_production msgid "" diff --git a/addons/mrp/tests/test_order.py b/addons/mrp/tests/test_order.py index babec6424cb..e054032eba0 100644 --- a/addons/mrp/tests/test_order.py +++ b/addons/mrp/tests/test_order.py @@ -304,18 +304,26 @@ class TestMrpOrder(TestMrpCommon): mo_form.qty_producing = 2 mo = mo_form.save() + # Produce & backorder + action = mo.button_mark_done() + backorder = Form(self.env['mrp.production.backorder'].with_context(**action['context'])) + backorder.save().action_backorder() + mo_backorder = mo.procurement_group_id.mrp_production_ids[-1] + self.assertEqual(mo_backorder.product_qty, 1) + update_quantity_wizard = self.env['change.production.qty'].create({ - 'mo_id': mo.id, - 'product_qty': 5, + 'mo_id': mo_backorder.id, + 'product_qty': 3, }) update_quantity_wizard.change_prod_qty() - mo_form = Form(mo) - mo_form.qty_producing = 5 - mo = mo_form.save() - mo.button_mark_done() + mo_back_form = Form(mo_backorder) + mo_back_form.qty_producing = 3 + mo_backorder = mo_back_form.save() + mo_backorder.button_mark_done() - self.assertEqual(sum(mo.move_raw_ids.filtered(lambda m: m.product_id == p1).mapped('quantity')), 20) - self.assertEqual(sum(mo.move_finished_ids.mapped('quantity')), 5) + productions = mo | mo_backorder + self.assertEqual(sum(productions.move_raw_ids.filtered(lambda m: m.product_id == p1).mapped('quantity')), 20) + self.assertEqual(sum(productions.move_finished_ids.mapped('quantity')), 5) def test_update_quantity_3(self): bom = self.env['mrp.bom'].create({ diff --git a/addons/mrp/wizard/change_production_qty.py b/addons/mrp/wizard/change_production_qty.py index 018193347f8..6782676406e 100644 --- a/addons/mrp/wizard/change_production_qty.py +++ b/addons/mrp/wizard/change_production_qty.py @@ -3,7 +3,7 @@ from odoo import api, fields, models, _ from odoo.exceptions import UserError -from odoo.tools import float_is_zero, float_round +from odoo.tools import float_is_zero class ChangeProductionQty(models.TransientModel): @@ -58,16 +58,10 @@ class ChangeProductionQty(models.TransientModel): precision = self.env['decimal.precision'].precision_get('Product Unit of Measure') for wizard in self: production = wizard.mo_id - if wizard.product_qty < production.qty_produced: - format_qty = '%.{precision}f'.format(precision=precision) - raise UserError(_( - "You have already processed %(quantity)s. Please input a quantity higher than %(quantity)s ", - quantity=format_qty % production.qty_produced, - )) old_production_qty = production.product_qty new_production_qty = wizard.product_qty - factor = (new_production_qty - production.qty_produced) / (old_production_qty - production.qty_produced) + factor = new_production_qty / old_production_qty update_info = production._update_raw_moves(factor) documents = {} for move, old_qty, new_qty in update_info: @@ -80,8 +74,12 @@ class ChangeProductionQty(models.TransientModel): else: documents[key] = [value] production._log_manufacture_exception(documents) - self._update_finished_moves(production, new_production_qty - production.qty_produced, old_production_qty - production.qty_produced) + self._update_finished_moves(production, new_production_qty, old_production_qty) production.write({'product_qty': new_production_qty}) + if not float_is_zero(production.qty_producing, precision_rounding=production.product_uom_id.rounding) and\ + not production.workorder_ids: + production.qty_producing = new_production_qty + production._set_qty_producing() for wo in production.workorder_ids: operation = wo.operation_id