diff --git a/bemade_fsm/models/fsm_visit.py b/bemade_fsm/models/fsm_visit.py index 43f4a5e..0cc023f 100644 --- a/bemade_fsm/models/fsm_visit.py +++ b/bemade_fsm/models/fsm_visit.py @@ -21,9 +21,19 @@ class FSMVisit(models.Model): related="so_section_id.is_fully_delivered") is_invoiced = fields.Boolean(string="Invoiced", related="so_section_id.is_fully_delivered_and_invoiced") + summarized_equipment_ids = fields.Many2many(comodel_name="bemade_fsm.equipment", + string="Equipment to Service", + compute="_compute_summarized_equipment_ids") - def _compute_is_invoiced(self): - self.is_invoiced = False + @api.depends('so_section_id', 'sale_order_id.summary_equipment_ids') + def _compute_summarized_equipment_ids(self): + for rec in self: + lines = rec.so_section_id.get_section_lines() + equipment_ids = [] + for line in lines: + for equipment in line.equipment_ids: + equipment_ids.append(equipment) + rec.summarized_equipment_ids = equipment_ids @api.model_create_multi def create(self, vals_list): diff --git a/bemade_fsm/models/sale_order.py b/bemade_fsm/models/sale_order.py index bf3bf07..6356d27 100644 --- a/bemade_fsm/models/sale_order.py +++ b/bemade_fsm/models/sale_order.py @@ -5,12 +5,18 @@ from odoo.exceptions import ValidationError class SaleOrder(models.Model): _inherit = 'sale.order' - equipment_id = fields.Many2one(comodel_name="bemade_fsm.equipment", - string="Equipment to Service", - tracking=True, - compute="_compute_equipment", - inverse="_inverse_equipment", - store=True) + valid_equipment_ids = fields.One2many(comodel_name="bemade_fsm.equipment", + related="partner_id.owned_equipment_ids") + default_equipment_ids = fields.Many2many(comodel_name="bemade_fsm.equipment", + string="Default Equipment to Service", + help="The default equipment to service for new sale order lines.", + compute="_compute_default_equipment", + inverse="_inverse_default_equipment", + store=True, ) + + summary_equipment_ids = fields.Many2many(comodel_name="bemade_fsm.equipment", + string="Equipment Being Serviced", + compute="_compute_summary_equipment_ids") site_contacts = fields.Many2many(comodel_name='res.partner', relation="sale_order_site_contacts_rel", @@ -29,10 +35,15 @@ class SaleOrder(models.Model): inverse_name="sale_order_id", readonly=False) + @api.depends('order_line.equipment_ids') + def _compute_summary_equipment_ids(self): + for rec in self: + rec.summary_equipment_ids = rec.order_line.mapped('equipment_ids') + @api.onchange('partner_shipping_id') def _onchange_partner_shipping_id(self): super()._onchange_partner_shipping_id() - self._compute_equipment() + self._compute_default_equipment() self._compute_default_contacts() @api.depends('partner_shipping_id') @@ -45,18 +56,19 @@ class SaleOrder(models.Model): pass @api.depends('partner_shipping_id') - def _compute_equipment(self): + def _compute_default_equipment(self): + ids = self.partner_shipping_id.equipment_ids for rec in self: - rec.equipment_id = self.partner_shipping_id.equipment_ids if len( - self.partner_shipping_id.equipment_ids) <= 1 else False + rec.default_equipment_ids = ids if len(ids) < 4 else False - def _inverse_equipment(self): + def _inverse_default_equipment(self): pass class SaleOrderLine(models.Model): _inherit = 'sale.order.line' - + valid_equipment_ids = fields.One2many(comodel_name="bemade_fsm.equipment", + related="order_id.partner_id.owned_equipment_ids") visit_id = fields.One2many(comodel_name="bemade_fsm.visit", inverse_name="so_section_id", string="Visit") @@ -65,9 +77,14 @@ class SaleOrderLine(models.Model): help="Indicates whether a line or all the lines in a section have been" "entirely delivered.") is_fully_delivered_and_invoiced = fields.Boolean(string="Fully Invoiced", - compute="_compute_is_fully_invoiced", - help="Indicates whether a line or all the lines in a section have been" - "entirely delivered and invoiced.") + compute="_compute_is_fully_invoiced", + help="Indicates whether a line or all the lines in a section have been" + "entirely delivered and invoiced.") + equipment_ids = fields.Many2many(string="Equipment to Service", + comodel_name="bemade_fsm.equipment", + relation="bemade_fsm_equipment_sale_order_line_rel", + column1="sale_order_line_id", + column2="equipment_id") def _timesheet_create_task(self, project): """ Generate task for the given so line, and link it. @@ -129,8 +146,8 @@ class SaleOrderLine(models.Model): "This task has been created from: %s (%s)") % ( self.order_id.id, self.order_id.name, self.product_id.name) task.message_post(body=task_msg) - if not task.equipment_ids and self.order_id.equipment_id: - task.write({'equipment_ids': [Command.set([self.order_id.equipment_id.id])]}) + if not task.equipment_ids and self.equipment_ids: + task.write({'equipment_ids': [Command.set([self.equipment_ids.ids])]}) task.name = _generate_task_name(tmpl) return task @@ -146,6 +163,24 @@ class SaleOrderLine(models.Model): return self.is_fully_delivered_and_invoiced = self._iterate_items_compute_bool(lambda l: l.qty_to_invoice == 0) + def get_section_lines(self): + """ Returns a list containing the sale order lines that fall under this section. """ + self.ensure_one() + assert self.display_type == 'line_section', 'Method called incorrectly on non-section order line.' + found = False + lines = [] + for line in self.order_id: + if line == self: + found = True + continue + if not found: + continue + if line.display_type == 'line_section': # Stop when we hit the next section + return lines + else: + lines.add(line) + return lines + def _iterate_items_compute_bool(self, single_line_func): if not self.display_type: return single_line_func(self) diff --git a/bemade_fsm/views/sale_order_views.xml b/bemade_fsm/views/sale_order_views.xml index 0421d41..6baed0c 100644 --- a/bemade_fsm/views/sale_order_views.xml +++ b/bemade_fsm/views/sale_order_views.xml @@ -13,16 +13,28 @@ context="{'tree_view_ref': 'bemade_fsm.bemade_fsm_visit_tree'}"/> - + + + + + + + +