From 91ccb721b9174e068370b6519d4d11ee776719b2 Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Wed, 13 Jan 2021 12:52:02 +0000 Subject: [PATCH 1/2] [IMP] mrp_analytic_cost_material: trigger Analytic Item on consumption ofraw materials --- mrp_analytic_cost_material/__manifest__.py | 2 +- mrp_analytic_cost_material/models/__init__.py | 1 + .../models/account_analytic_line.py | 5 -- .../models/mrp_production.py | 38 ++------------- .../models/stock_move.py | 47 +++++++++++++++++++ .../views/account_analytic_line_view.xml | 7 --- .../views/mrp_production_views.xml | 9 ++-- 7 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 mrp_analytic_cost_material/models/stock_move.py diff --git a/mrp_analytic_cost_material/__manifest__.py b/mrp_analytic_cost_material/__manifest__.py index 3babe9e4e..c8fa68292 100644 --- a/mrp_analytic_cost_material/__manifest__.py +++ b/mrp_analytic_cost_material/__manifest__.py @@ -10,7 +10,7 @@ "author": "Open Source Integrators, Odoo Community Association (OCA)", "website": "https://github.com/OCA/manufacture", "license": "AGPL-3", - "depends": ["mrp_analytic", "account"], + "depends": ["mrp_analytic"], "data": ["views/account_analytic_line_view.xml", "views/mrp_production_views.xml"], "maintainer": "dreispt", "development_status": "Alpha", diff --git a/mrp_analytic_cost_material/models/__init__.py b/mrp_analytic_cost_material/models/__init__.py index b4221a567..9d34c7c3d 100644 --- a/mrp_analytic_cost_material/models/__init__.py +++ b/mrp_analytic_cost_material/models/__init__.py @@ -3,3 +3,4 @@ from . import account_analytic_line from . import mrp_production +from . import stock_move diff --git a/mrp_analytic_cost_material/models/account_analytic_line.py b/mrp_analytic_cost_material/models/account_analytic_line.py index b9fc0a87f..0044ff010 100644 --- a/mrp_analytic_cost_material/models/account_analytic_line.py +++ b/mrp_analytic_cost_material/models/account_analytic_line.py @@ -15,8 +15,3 @@ class AccountAnalyticLine(models.Model): "mrp.production", string="Related Manufacturing Order", ) - product_category_id = fields.Many2one( - related="product_id.categ_id", - string="Product Category", - store=True, - ) diff --git a/mrp_analytic_cost_material/models/mrp_production.py b/mrp_analytic_cost_material/models/mrp_production.py index c9017349d..5d407804c 100644 --- a/mrp_analytic_cost_material/models/mrp_production.py +++ b/mrp_analytic_cost_material/models/mrp_production.py @@ -7,38 +7,6 @@ from odoo import models class MrpProduction(models.Model): _inherit = "mrp.production" - def _prepare_material_analytic_line(self): - self.ensure_one() - order = self.raw_material_production_id - return { - "name": self.product_id.default_code or "", - "account_id": order.analytic_account_id.id or False, - "ref": order.name, - "unit_amount": self.product_uom_qty, - "company_id": order.company_id.id, - "manufacturing_order_id": order.id, - "product_id": self.product_id.id or False, - "stock_move_id": self.id, - } - - def generate_analytic_line(self): - """Generate Analytic Lines Manually.""" - # FIXME: this is a placeholder for final logic - # TODO: when should Analytic Items generation be triggered? - # TODO: what to do if prevous items were already generated? - AnalyticLine = self.env["account.analytic.line"].sudo() - order_raw_moves = self.mapped("move_raw_ids") - existing_items = AnalyticLine.search( - [("stock_move_id ", "in", order_raw_moves.ids)] - ) - for order in self.filtered("analytic_account_id"): - for line in order.move_raw_ids: - line_vals = line._prepare_material_analytic_line() - if line in existing_items: - analytic_line = existing_items.filter( - lambda x: x.stock_move_id == line - ) - analytic_line.write(line_vals) - else: - analytic_line = AnalyticLine.create(line_vals) - analytic_line.on_change_unit_amount() + def generate_analytic_lines(self): + """ Generate Analytic Lines for a MO """ + return self.mapped("move_raw_ids").generate_mrp_raw_analytic_line() diff --git a/mrp_analytic_cost_material/models/stock_move.py b/mrp_analytic_cost_material/models/stock_move.py new file mode 100644 index 000000000..88d51cc50 --- /dev/null +++ b/mrp_analytic_cost_material/models/stock_move.py @@ -0,0 +1,47 @@ +# Copyright (C) 2021 Open Source Integrators +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class StockMove(models.Model): + _inherit = "stock.move" + + def _prepare_mrp_raw_material_analytic_line(self): + self.ensure_one() + move = self + mrp_order = move.raw_material_production_id + return { + "date": move.date, + "name": "{} / {}".format(mrp_order.name, move.product_id.display_name), + "ref": mrp_order.name, + "account_id": mrp_order.analytic_account_id.id, + "manufacturing_order_id": mrp_order.id, + "company_id": mrp_order.company_id.id, + "stock_move_id": move.id, + "product_id": move.product_id.id, + "unit_amount": move.quantity_done, + } + + def generate_mrp_raw_analytic_line(self): + """Generate Analytic Lines""" + # FIXME: consumed products coming from child MOs + # should not generate Analytic Items, to avoid duplicating costs! + AnalyticLine = self.env["account.analytic.line"].sudo() + existing_items = AnalyticLine.search([("stock_move_id", "in", self.ids)]) + for move in self.filtered("raw_material_production_id.analytic_account_id"): + line_vals = move._prepare_mrp_raw_material_analytic_line() + if move in existing_items.mapped("stock_move_id"): + analytic_line = existing_items.filtered( + lambda x: x.stock_move_id == move + ) + analytic_line.write(line_vals) + analytic_line.on_change_unit_amount() + elif line_vals.get("unit_amount"): + analytic_line = AnalyticLine.create(line_vals) + analytic_line.on_change_unit_amount() + + def _quantity_done_set(self): + """ When material is consumed, generate Analytic Items """ + super()._quantity_done_set() + self.generate_mrp_raw_analytic_line() diff --git a/mrp_analytic_cost_material/views/account_analytic_line_view.xml b/mrp_analytic_cost_material/views/account_analytic_line_view.xml index 9d44d7c4e..0f709438f 100644 --- a/mrp_analytic_cost_material/views/account_analytic_line_view.xml +++ b/mrp_analytic_cost_material/views/account_analytic_line_view.xml @@ -9,7 +9,6 @@ - @@ -31,12 +30,6 @@ domain="[]" context="{'group_by': 'manufacturing_order_id'}" /> - diff --git a/mrp_analytic_cost_material/views/mrp_production_views.xml b/mrp_analytic_cost_material/views/mrp_production_views.xml index 4e09e562d..d1e99addd 100644 --- a/mrp_analytic_cost_material/views/mrp_production_views.xml +++ b/mrp_analytic_cost_material/views/mrp_production_views.xml @@ -5,12 +5,13 @@ mrp.production - +