From 70afb81d3dbd3cbb7295f1c283ced8340e6be198 Mon Sep 17 00:00:00 2001
From: daniquilez <dani.quilez@gmail.com>
Date: Fri, 21 Feb 2025 19:27:03 +0100
Subject: [PATCH] =?UTF-8?q?[IMP]=20=E2=9C=A8=20Service=20Invoicing=20MVP?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../components/contract_utils.py              | 28 +++++++------------
 .../components/sale_order_utils.py            | 10 ++++---
 .../models/contract_line.py                   |  5 +---
 energy_communities_service_invoicing/utils.py |  4 +--
 .../views/contract_views.xml                  | 14 +++++-----
 .../service_invoicing_action_create.py        | 22 +++++++--------
 6 files changed, 36 insertions(+), 47 deletions(-)

diff --git a/energy_communities_service_invoicing/components/contract_utils.py b/energy_communities_service_invoicing/components/contract_utils.py
index c0cd319e4..cc36474cf 100644
--- a/energy_communities_service_invoicing/components/contract_utils.py
+++ b/energy_communities_service_invoicing/components/contract_utils.py
@@ -4,7 +4,7 @@ from odoo.addons.component.core import Component
 class ContractUtils(Component):
     _inherit = "contract.utils"
 
-    def set_contract_status_ready_to_start(self):
+    def setup_initial_data(self):
         for line in self.work.record.contract_line_ids:
             line.write(
                 {
@@ -15,7 +15,7 @@ class ContractUtils(Component):
                     "quantity": 0,
                 }
             )
-        self.work.record.write({"status": "ready_to_start"})
+        self.work.record.write({"status": "paused"})
 
     def _activate_contract_lines(self, execution_date):
         for line in self.work.record.contract_line_ids:
@@ -39,10 +39,7 @@ class ContractUtils(Component):
 
     def set_contract_status_closed(self, execution_date):
         for line in self.work.record.contract_line_ids:
-            if (
-                self.work.record.status == "ready_to_start"
-                or self.work.record.is_free_pack
-            ):
+            if self.work.record.status == "paused" or self.work.record.is_free_pack:
                 self._activate_contract_lines(execution_date)
             line.write({"date_end": execution_date})
             line._compute_state()
@@ -95,17 +92,12 @@ class ContractUtils(Component):
             discount,
             payment_mode_id,
         )
-        if initial_status == "ready_to_start":
-            new_service_invoicing_id = (
-                sale_order_utils.create_service_invoicing_ready_to_start(
-                    **service_invoicing_params
-                )
-            )
-        if initial_status == "in_progress":
-            new_service_invoicing_id = sale_order_utils.create_service_invoicing(
-                **service_invoicing_params
-            )
-
+        new_service_invoicing_id = sale_order_utils.create_service_invoicing_initial(
+            **service_invoicing_params
+        )
+        # Do we really want new contract to be in_progress on a modification??
+        if initial_status == "in_progress" and not self.work.record.is_free_pack:
+            self.set_contract_status_active()
         self._setup_successors_and_predecessors(new_service_invoicing_id)
         return new_service_invoicing_id
 
@@ -120,7 +112,7 @@ class ContractUtils(Component):
         self.set_contract_status_closed(execution_date)
         new_service_invoicing_id = self.component(
             usage="sale.order.utils", model_name="sale.order"
-        ).create_service_invoicing_ready_to_start(
+        ).create_service_invoicing_initial(
             **self._build_service_invoicing_params(
                 "reopen",
                 "modify_service_pack,modify_pricelist,modify_discount,modify_payment_mode",
diff --git a/energy_communities_service_invoicing/components/sale_order_utils.py b/energy_communities_service_invoicing/components/sale_order_utils.py
index 2dc8013c9..5375602fb 100644
--- a/energy_communities_service_invoicing/components/sale_order_utils.py
+++ b/energy_communities_service_invoicing/components/sale_order_utils.py
@@ -42,7 +42,7 @@ class SaleOrderUtils(Component):
             order_line._compute_name()
         return self.env["sale.order"].create(so_creation_dict)
 
-    def create_service_invoicing(
+    def _create_service_invoicing(
         self,
         company_id,
         community_company_id,
@@ -75,7 +75,7 @@ class SaleOrderUtils(Component):
                 component.set_configuration_service_invoicing_journal_if_defined()
         return service_invoicing_id
 
-    def create_service_invoicing_ready_to_start(
+    def create_service_invoicing_initial(
         self,
         company_id,
         community_company_id,
@@ -87,7 +87,7 @@ class SaleOrderUtils(Component):
         executed_action,
         executed_action_description="none",
     ):
-        service_invoicing_id = self.create_service_invoicing(
+        service_invoicing_id = self._create_service_invoicing(
             company_id,
             community_company_id,
             service_pack_id,
@@ -100,7 +100,9 @@ class SaleOrderUtils(Component):
         )
         # TODO: We must call contract_utils with a better component and workcontext modification approach
         with contract_utils(self.env, service_invoicing_id) as component:
-            component.set_contract_status_ready_to_start()
+            component.setup_initial_data()
+            if service_invoicing_id.is_free_pack:
+                component.set_contract_status_active(start_date)
         return service_invoicing_id
 
     def _get_related_contracts(self, sale_order):
diff --git a/energy_communities_service_invoicing/models/contract_line.py b/energy_communities_service_invoicing/models/contract_line.py
index 3bed75255..3ec81ca6a 100644
--- a/energy_communities_service_invoicing/models/contract_line.py
+++ b/energy_communities_service_invoicing/models/contract_line.py
@@ -19,9 +19,6 @@ class ContractLine(models.Model):
         # FIXME: Change method name according to real updated field
         # e.g.: _update_last_date_invoiced()
         for record in self:
-            if (
-                record.contract_id.status != "ready_to_start"
-                or record.contract_id.is_free_pack
-            ):
+            if record.contract_id.status == "paused" or record.contract_id.is_free_pack:
                 return
         super()._update_recurring_next_date()
diff --git a/energy_communities_service_invoicing/utils.py b/energy_communities_service_invoicing/utils.py
index 47feda5bc..3da795640 100644
--- a/energy_communities_service_invoicing/utils.py
+++ b/energy_communities_service_invoicing/utils.py
@@ -5,7 +5,7 @@ from odoo.exceptions import ValidationError
 from odoo.addons.contract.models.contract import ContractContract
 
 _CONTRACT_STATUS_VALUES = [
-    ("ready_to_start", _("Ready to start")),
+    ("paused", _("Paused")),
     ("in_progress", _("In progress")),
     ("closed_planned", _("Planned closure")),
     ("closed", _("Closed")),
@@ -52,7 +52,7 @@ def get_existing_open_contract(
         ("partner_id", "=", partner_id.id),
         ("community_company_id", "=", community_company_id.id),
         ("is_pack", "=", True),
-        ("status", "in", ["ready_to_start", "in_progress"]),
+        ("status", "in", ["paused", "in_progress"]),
     ]
     if contract_id:
         query.append(("id", "!=", contract_id.id))
diff --git a/energy_communities_service_invoicing/views/contract_views.xml b/energy_communities_service_invoicing/views/contract_views.xml
index 14da3acba..9f7dd5a4b 100644
--- a/energy_communities_service_invoicing/views/contract_views.xml
+++ b/energy_communities_service_invoicing/views/contract_views.xml
@@ -7,9 +7,9 @@
     <field name="arch" type="xml">
       <filter name="not_finished" position="before">
         <filter
-          name="ready_to_start"
-          string="Ready to start"
-          domain="[('status','=','ready_to_start')]"
+          name="paused"
+          string="Paused"
+          domain="[('status','=','paused')]"
         />
         <!--<separator />-->
       </filter>
@@ -41,7 +41,7 @@
         <field 
           name="status"
           widget="badge"
-          decoration-info="status == 'ready_to_start'"
+          decoration-info="status == 'paused'"
           decoration-danger="status == 'closed'"
           decoration-warning="status == 'closed_planned'"
           decoration-success="status == 'in_progress'"
@@ -117,19 +117,19 @@
           name="action_activate_contract"
           type="object"
           string="Activate"
-          attrs="{'invisible':[('status','not in',['ready_to_start'])]}"
+          attrs="{'invisible':[('status','not in',['paused'])]}"
         />
         <button
           name="action_modify_contract"
           type="object"
           string="Modify"
-          attrs="{'invisible':[('status','not in',['ready_to_start','in_progress'])]}"
+          attrs="{'invisible':[('status','not in',['paused','in_progress'])]}"
         />
         <button
           name="action_close_contract"
           type="object"
           string="Close"
-          attrs="{'invisible':[('status','not in',['ready_to_start','in_progress'])]}"
+          attrs="{'invisible':[('status','not in',['paused','in_progress'])]}"
         />
         <button
           name="action_reopen_contract"
diff --git a/energy_communities_service_invoicing/wizards/service_invoicing_action_create.py b/energy_communities_service_invoicing/wizards/service_invoicing_action_create.py
index 3dfce8f31..a68cfef60 100644
--- a/energy_communities_service_invoicing/wizards/service_invoicing_action_create.py
+++ b/energy_communities_service_invoicing/wizards/service_invoicing_action_create.py
@@ -100,17 +100,15 @@ class ServiceInvoicingActionCreateWizard(models.TransientModel):
         # If none of previous create a new contract
         else:
             with sale_order_utils(self.env) as component:
-                service_invoicing_id = (
-                    component.create_service_invoicing_ready_to_start(
-                        self.company_id,
-                        self.community_company_id,
-                        self.service_pack_id,
-                        self.pricelist_id,
-                        self.payment_mode_id,
-                        datetime.now(),
-                        self.discount,
-                        "activate",
-                        "active_platform_service_invocing",
-                    )
+                service_invoicing_id = component.create_service_invoicing_initial(
+                    self.company_id,
+                    self.community_company_id,
+                    self.service_pack_id,
+                    self.pricelist_id,
+                    self.payment_mode_id,
+                    datetime.now(),
+                    self.discount,
+                    "activate",
+                    "active_platform_service_invocing",
                 )
         return service_invoicing_view(self.env, service_invoicing_id)
-- 
GitLab