From 8e16f780b24be19dd29f6b3eb3032ef72be17354 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com>
Date: Wed, 8 Jun 2022 08:08:11 +0200
Subject: [PATCH] [ADD] new calculations for hedge and collarettes

---
 models/sale_intervention.py      | 39 +++++++++++++++++++++++++++++---
 views/sale_intervention_view.xml |  4 ++++
 2 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/models/sale_intervention.py b/models/sale_intervention.py
index 31127df..ab4e554 100644
--- a/models/sale_intervention.py
+++ b/models/sale_intervention.py
@@ -105,6 +105,11 @@ class SaleIntervention(models.Model):
         readonly=True,
         states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
     )
+    collarette_calc = fields.Boolean(
+        string="Calculer prix en m.l ?",
+        readonly=True,
+        states={"draft": [("readonly", False)], "sent": [("readonly", False)]},
+    )
 
     # Mulch Fields
     mulch_id = fields.Many2one(
@@ -570,6 +575,7 @@ class SaleIntervention(models.Model):
                 )
 
     @api.depends(
+        "project_id.intervention_ids.intervention_length",
         "project_subvention_id",
         "intervention_length",
         "plant_qty",
@@ -650,50 +656,77 @@ class SaleIntervention(models.Model):
 
                     # Then we create ordered lists with :
                     # products, quantities and partners
+
+                    # Service
+                    # For service we need to take into account the sumed length
+                    # of all interventions of the same type
+
+                    # Get all interventions of same type in the same project
+                    interventions = self.project_id.intervention_ids.filtered(
+                        lambda r: r.intervention_type_id == rec.intervention_type_id
+                    )
+                    service_qty = (
+                        sum(interventions.mapped("intervention_length"))
+                        if rec.intervention_uom_name == "m"
+                        else multiplicator
+                    )
                     products = [
                         service_product_id,
                     ]
                     quantities = [
-                        multiplicator,
+                        service_qty,
                     ]
                     partners = [
                         partner,
                     ]
+
+                    # Collarette
+                    coll_qty = rec.collarette_qty or 0
                     if rec.is_collarette:
+                        # In case collarette price is calculated per meter iso unit
+                        if rec.intervention_uom_name == "m" and rec.collarette_calc:
+                            coll_qty = rec.intervention_length
                         products.append(collarette_product_id)
-                        quantities.append(rec.collarette_qty or 0)
+                        quantities.append(coll_qty or 0)
                         partners.append(partner)
 
+                    # Mulch
                     if rec.mulch_id:
                         products.append(rec.mulch_id)
                         quantities.append(rec.mulch_qty or 0)
                         partners.append(partner)
 
+                    # Mulch 2
                     if rec.mulch2_id:
                         products.append(rec.mulch2_id)
                         quantities.append(rec.mulch2_qty or 0)
                         partners.append(partner)
 
+                    # Staples
                     if rec.mulch_has_staples or rec.mulch2_has_staples:
                         products.append(staples_product_id)
                         quantities.append(rec.mulch_qty * 2 or 0)
                         partners.append(partner)
 
+                    # High Protections
                     if rec.high_protection_id:
                         products.append(rec.high_protection_id)
                         quantities.append(rec.high_protection_qty or 0)
                         partners.append(partner)
 
+                    # Stakes
                     if rec.stake_id:
                         products.append(rec.stake_id)
                         quantities.append(rec.stake_qty or 0)
                         partners.append(partner)
 
+                    # Low Protections
                     if rec.low_protection_id:
                         products.append(rec.low_protection_id)
                         quantities.append(rec.low_protection_qty or 0)
                         partners.append(partner)
 
+                    # Markers
                     if rec.marker_id:
                         products.append(rec.marker_id)
                         quantities.append(rec.marker_qty or 0)
@@ -735,7 +768,7 @@ class SaleIntervention(models.Model):
 
                     rec.price = (
                         multiplicator * (rec.plant_price + rec.service_price)
-                        + rec.collarette_qty * rec.collarette_price
+                        + coll_qty * rec.collarette_price
                         + rec.mulch_qty * (rec.mulch_price + 2 * rec.staple1_price)
                         + rec.mulch2_qty * (rec.mulch2_price + 2 * rec.staple2_price)
                         + rec.high_protection_qty * rec.high_protection_price
diff --git a/views/sale_intervention_view.xml b/views/sale_intervention_view.xml
index 97123a4..115121d 100644
--- a/views/sale_intervention_view.xml
+++ b/views/sale_intervention_view.xml
@@ -86,6 +86,10 @@
                                     name="collarette_qty"
                                     attrs="{'invisible': [('is_collarette', '!=', True)]}"
                                 />
+                                <field
+                                    name="collarette_calc"
+                                    attrs="{'invisible': [('is_collarette', '!=', True), ('intervention_uom_name', '!=', 'm')]}"
+                                />
                             </group>
                             <group name="marker">
                                 <field
-- 
GitLab