From f773f1f0c1b6ecbb74e9e65a0919f46ffe38beec Mon Sep 17 00:00:00 2001 From: DavidJForgeFlow Date: Thu, 21 Mar 2024 11:37:05 +0100 Subject: [PATCH 1/2] [IMP] ddmrp_adjustment: visualize parent DAFs Adds a button next to ADU to clearly see if the demand is being affected by a parent DAF. --- ddmrp_adjustment/models/stock_buffer.py | 41 +++++++++++++------ .../tests/test_adu_dlt_adjustment.py | 1 + .../views/ddmrp_adjustment_demand_view.xml | 6 +++ ddmrp_adjustment/views/stock_buffer_view.xml | 17 +++++--- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/ddmrp_adjustment/models/stock_buffer.py b/ddmrp_adjustment/models/stock_buffer.py index 903b10ea1..882d3fbbd 100644 --- a/ddmrp_adjustment/models/stock_buffer.py +++ b/ddmrp_adjustment/models/stock_buffer.py @@ -4,7 +4,7 @@ import logging from datetime import timedelta as td -from odoo import _, api, fields, models +from odoo import api, fields, models from ..models.ddmrp_adjustment import DAF_string, LTAF_string @@ -21,8 +21,17 @@ class StockBuffer(models.Model): help="Demand associated to Demand Adjustment Factors applied to " "parent buffers.", ) + daf_text = fields.Char(compute="_compute_daf_text") + parent_daf_text = fields.Char(compute="_compute_daf_text") pre_daf_adu = fields.Float(readonly=True) daf_applied = fields.Float(default=-1, readonly=True) + parent_daf_applied = fields.Float(default=-1, readonly=True) + + @api.depends("daf_applied", "parent_daf_applied") + def _compute_daf_text(self): + for rec in self: + rec.daf_text = "DAF: *" + str(rec.daf_applied) + rec.parent_daf_text = "P. DAF: +" + str(rec.parent_daf_applied) def _daf_to_apply_domain(self, current=True): self.ensure_one() @@ -122,16 +131,18 @@ def cron_ddmrp_adu(self, automatic=False): res = super().cron_ddmrp_adu(automatic) today = fields.Date.today() for op in self.search([]).filtered("extra_demand_ids"): - to_add = sum( + op.parent_daf_applied = -1 + daf_parent = sum( op.extra_demand_ids.filtered( lambda r: r.date_start <= today <= r.date_end ).mapped("extra_demand") ) - if to_add: - op.adu += to_add + if daf_parent: + op.parent_daf_applied = daf_parent + op.adu += op.parent_daf_applied _logger.debug( "DAFs-originated demand applied. {}: ADU += {}".format( - op.name, to_add + op.name, op.parent_daf_applied ) ) return res @@ -172,13 +183,11 @@ def action_view_demand_to_components(self): .search([("buffer_origin_id", "=", self.id)]) .ids ) - return { - "name": _("Demand Allocated to Components"), - "type": "ir.actions.act_window", - "res_model": "ddmrp.adjustment.demand", - "view_mode": "tree", - "domain": [("id", "in", demand_ids)], - } + action = self.env["ir.actions.act_window"]._for_xml_id( + "ddmrp_adjustment.ddmrp_adjustment_demand_action" + ) + action["domain"] = [("id", "in", demand_ids)] + return action def action_view_affecting_adu(self): demand_ids = ( @@ -192,3 +201,11 @@ def action_view_affecting_adu(self): action["domain"] = [("id", "in", demand_ids)] action["context"] = {"search_default_current": 1} return action + + def action_view_parent_affecting_adu(self): + demand_ids = self.extra_demand_ids.ids + action = self.env["ir.actions.act_window"]._for_xml_id( + "ddmrp_adjustment.ddmrp_adjustment_demand_action" + ) + action["domain"] = [("id", "in", demand_ids)] + return action diff --git a/ddmrp_adjustment/tests/test_adu_dlt_adjustment.py b/ddmrp_adjustment/tests/test_adu_dlt_adjustment.py index bfebd3c5d..7a9ded318 100644 --- a/ddmrp_adjustment/tests/test_adu_dlt_adjustment.py +++ b/ddmrp_adjustment/tests/test_adu_dlt_adjustment.py @@ -49,3 +49,4 @@ def test_dummy(self): # Run actions self.assertTrue(self.buffer.action_view_demand_to_components()) self.assertTrue(self.buffer.action_view_affecting_adu()) + self.assertTrue(self.buffer.action_view_parent_affecting_adu()) diff --git a/ddmrp_adjustment/views/ddmrp_adjustment_demand_view.xml b/ddmrp_adjustment/views/ddmrp_adjustment_demand_view.xml index 04fddadf2..71ca53070 100644 --- a/ddmrp_adjustment/views/ddmrp_adjustment_demand_view.xml +++ b/ddmrp_adjustment/views/ddmrp_adjustment_demand_view.xml @@ -18,4 +18,10 @@ + + Buffer Adjustments Demand + ir.actions.act_window + ddmrp.adjustment.demand + tree + diff --git a/ddmrp_adjustment/views/stock_buffer_view.xml b/ddmrp_adjustment/views/stock_buffer_view.xml index dee6015d6..43ef8a97b 100644 --- a/ddmrp_adjustment/views/stock_buffer_view.xml +++ b/ddmrp_adjustment/views/stock_buffer_view.xml @@ -20,16 +20,23 @@ /> + From e60032229a556c0a7b0aec3e82a36fa643d75f10 Mon Sep 17 00:00:00 2001 From: DavidJForgeFlow Date: Wed, 12 Jun 2024 11:04:56 +0200 Subject: [PATCH 2/2] [IMP] ddmrp_adjustment: delete DAD when updating parent buffer. --- .../models/ddmrp_adjustment_demand.py | 2 ++ ddmrp_adjustment/models/stock_buffer.py | 25 ++++++++++++++++--- ddmrp_adjustment/views/stock_buffer_view.xml | 7 +++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/ddmrp_adjustment/models/ddmrp_adjustment_demand.py b/ddmrp_adjustment/models/ddmrp_adjustment_demand.py index de8656405..3b3c41e28 100644 --- a/ddmrp_adjustment/models/ddmrp_adjustment_demand.py +++ b/ddmrp_adjustment/models/ddmrp_adjustment_demand.py @@ -16,6 +16,8 @@ class DdmrpAdjustmentDemand(models.Model): buffer_origin_id = fields.Many2one( comodel_name="stock.buffer", string="Originated from", + required=True, + ondelete="cascade", ) product_origin_id = fields.Many2one( related="buffer_origin_id.product_id", diff --git a/ddmrp_adjustment/models/stock_buffer.py b/ddmrp_adjustment/models/stock_buffer.py index 882d3fbbd..16b12fca8 100644 --- a/ddmrp_adjustment/models/stock_buffer.py +++ b/ddmrp_adjustment/models/stock_buffer.py @@ -26,12 +26,23 @@ class StockBuffer(models.Model): pre_daf_adu = fields.Float(readonly=True) daf_applied = fields.Float(default=-1, readonly=True) parent_daf_applied = fields.Float(default=-1, readonly=True) + count_ddmrp_adjustment_demand = fields.Integer( + compute="_compute_count_ddmrp_adjustment_demand" + ) + + def _compute_count_ddmrp_adjustment_demand(self): + for rec in self: + rec.count_ddmrp_adjustment_demand = len( + self.env["ddmrp.adjustment.demand"].search( + [("buffer_origin_id", "=", rec.id)] + ) + ) @api.depends("daf_applied", "parent_daf_applied") def _compute_daf_text(self): for rec in self: - rec.daf_text = "DAF: *" + str(rec.daf_applied) - rec.parent_daf_text = "P. DAF: +" + str(rec.parent_daf_applied) + rec.daf_text = "DAF: *" + str(round(rec.daf_applied, 2)) + rec.parent_daf_text = "P. DAF: +" + str(round(rec.parent_daf_applied, 2)) def _daf_to_apply_domain(self, current=True): self.ensure_one() @@ -49,6 +60,9 @@ def _calc_adu(self): # Apply DAFs if existing for the buffer. res = super()._calc_adu() for rec in self: + self.env["ddmrp.adjustment.demand"].search( + [("buffer_origin_id", "=", rec.id)] + ).unlink() dafs_to_apply = self.env["ddmrp.adjustment"].search( rec._daf_to_apply_domain() ) @@ -127,7 +141,6 @@ def _create_demand(bom, factor=1, level=0, clt=0): def cron_ddmrp_adu(self, automatic=False): """Apply extra demand originated by Demand Adjustment Factors to components after the cron update of all the buffers.""" - self.env["ddmrp.adjustment.demand"].search([]).unlink() res = super().cron_ddmrp_adu(automatic) today = fields.Date.today() for op in self.search([]).filtered("extra_demand_ids"): @@ -177,6 +190,12 @@ def _compute_dlt(self): ) return res + def action_archive(self): + self.env["ddmrp.adjustment.demand"].search( + [("buffer_origin_id", "in", self.ids)] + ).unlink() + return super().action_archive() + def action_view_demand_to_components(self): demand_ids = ( self.env["ddmrp.adjustment.demand"] diff --git a/ddmrp_adjustment/views/stock_buffer_view.xml b/ddmrp_adjustment/views/stock_buffer_view.xml index 43ef8a97b..781c61048 100644 --- a/ddmrp_adjustment/views/stock_buffer_view.xml +++ b/ddmrp_adjustment/views/stock_buffer_view.xml @@ -7,16 +7,15 @@ stock.buffer - + +