From a2d9f37ef29a5c095010ccbaa0194c424f58555e Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Thu, 20 Jul 2023 11:40:36 -0400 Subject: [PATCH] bemade_fsm: Added logic to use the planned hours from task templates on sale order lines (for planning purposes). Re #11. --- bemade_fsm/__manifest__.py | 1 + bemade_fsm/models/sale_order.py | 16 ++++++++++++++-- bemade_fsm/tests/test_task_template.py | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/bemade_fsm/__manifest__.py b/bemade_fsm/__manifest__.py index 4a9ff46..254f486 100644 --- a/bemade_fsm/__manifest__.py +++ b/bemade_fsm/__manifest__.py @@ -32,6 +32,7 @@ 'sale', 'sale_project', 'sale_stock', + 'sale_planning', 'industry_fsm_stock', 'industry_fsm_report', 'bemade_partner_root_ancestor', diff --git a/bemade_fsm/models/sale_order.py b/bemade_fsm/models/sale_order.py index 0257314..59af3eb 100644 --- a/bemade_fsm/models/sale_order.py +++ b/bemade_fsm/models/sale_order.py @@ -55,7 +55,8 @@ class SaleOrder(models.Model): def _inverse_default_contacts(self): pass - @api.depends('partner_id', 'partner_shipping_id', 'partner_shipping_id.equipment_ids', 'partner_id.owned_equipment_ids') + @api.depends('partner_id', 'partner_shipping_id', 'partner_shipping_id.equipment_ids', + 'partner_id.owned_equipment_ids') def _compute_default_equipment(self): for rec in self: if rec.partner_shipping_id.equipment_ids: @@ -89,7 +90,6 @@ class SaleOrderLine(models.Model): column1="sale_order_line_id", column2="equipment_id") - @api.model_create_multi def create(self, vals): recs = super().create(vals) @@ -238,3 +238,15 @@ class SaleOrderLine(models.Model): if not val: return val return True + + @api.depends('product_uom', 'product_uom_qty', 'product_id.planning_enabled', 'state', + 'product_id.task_template_id') + def _compute_planning_hours_to_plan(self): + # Override the method from sale_planning to use time estimates from the task template if appropriate + super()._compute_planning_hours_to_plan() + templated_lines = self.filtered( + lambda l: l.product_id.task_template_id and l.product_id.task_template_id.planned_hours) + for line in templated_lines: + line.planning_hours_to_plan = line.product_id.task_template_id.planned_hours + if line.product_uom_category_id == self.env.ref('uom.product_uom_unit').category_id: + line.planning_hours_to_plan *= line.product_uom_qty diff --git a/bemade_fsm/tests/test_task_template.py b/bemade_fsm/tests/test_task_template.py index abde9cc..5a18303 100644 --- a/bemade_fsm/tests/test_task_template.py +++ b/bemade_fsm/tests/test_task_template.py @@ -42,6 +42,27 @@ class TestTaskTemplate(BemadeFSMBaseTest): self.assertFalse(equipment1 in task.equipment_ids) + def test_hours_estimate_used_for_planning(self): + partner = self._generate_partner() + so = self._generate_sale_order(partner=partner) + task_template = self._generate_task_template(planned_hours=8) + product = self._generate_product(uom=self.env.ref('uom.product_uom_unit'), task_template=task_template) + + sol = self._generate_sale_order_line(sale_order=so, product=product) + + self.assertEqual(sol.planning_hours_to_plan, 8) + + def test_hours_estimate_multiplied_for_multiple_units_sold(self): + partner = self._generate_partner() + so = self._generate_sale_order(partner=partner) + task_template = self._generate_task_template(planned_hours=8) + product = self._generate_product(uom=self.env.ref('uom.product_uom_unit'), task_template=task_template) + + sol = self._generate_sale_order_line(sale_order=so, product=product, qty=3.0) + + self.assertEqual(sol.planning_hours_to_plan, 24) + + @tagged('-at_install', 'post_install', 'slow') class TestTaskTemplateTour(HttpCase, BemadeFSMBaseTest):