From e06b477700b55311cc13bfe032285c63f67937f8 Mon Sep 17 00:00:00 2001
From: daniquilez <dani.quilez@gmail.com>
Date: Thu, 27 Feb 2025 16:47:26 +0100
Subject: [PATCH] =?UTF-8?q?[IMP]=20=E2=9C=A8=20Propagate=20contract=20and?=
 =?UTF-8?q?=20community=20from=20pack=20contract=20to=20invoice?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../views/account_move_views.xml              | 30 ++++++---------
 .../__manifest__.py                           |  2 +
 .../data/product_data.xml                     |  4 +-
 .../models/account_move.py                    | 38 ++++++++++++++++---
 .../models/contract.py                        | 12 +++---
 .../report/report_invoice.xml                 | 31 +++++++++++++++
 energy_communities_service_invoicing/utils.py |  6 +--
 .../views/account_move_views.xml              | 16 ++++++++
 .../wizards/service_invoicing_action.py       |  2 +-
 .../service_invoicing_action_create.py        | 12 +++---
 10 files changed, 111 insertions(+), 42 deletions(-)
 create mode 100644 energy_communities_service_invoicing/report/report_invoice.xml
 create mode 100644 energy_communities_service_invoicing/views/account_move_views.xml

diff --git a/energy_communities_cooperator/views/account_move_views.xml b/energy_communities_cooperator/views/account_move_views.xml
index de9feb1fd..eedd053f7 100644
--- a/energy_communities_cooperator/views/account_move_views.xml
+++ b/energy_communities_cooperator/views/account_move_views.xml
@@ -1,22 +1,16 @@
 <odoo>
   <record id="account_move_form" model="ir.ui.view">
-      <field name="name">account.move.form.inherit</field>
-      <field name="model">account.move</field>
-      <field name="inherit_id" ref="account.view_move_form" />
-      <field name="arch" type="xml">
-        <xpath expr="//notebook" position="before">
-          <group>
-            <field name="user_current_role" invisible="True" />
-            <field
-            name="membership_id"
-            attrs="{'invisible': [('user_current_role', '!=', 'role_platform_admin')],'readonly': 0}"
-          />
-            <field
-            name="voluntary_share_total_contribution"
-            attrs="{'invisible': [('user_current_role', '!=', 'role_platform_admin')]}"
-          />
-          </group>
-        </xpath>
-      </field>
+    <field name="name">account.move.form.inherit</field>
+    <field name="model">account.move</field>
+    <field name="inherit_id" ref="account.view_move_form" />
+    <field name="arch" type="xml">
+      <xpath expr="//notebook" position="before">
+        <field name="user_current_role" invisible="True" />
+        <group attrs="{'invisible': [('user_current_role', '!=', 'role_platform_admin')]}">
+          <field name="membership_id" readonly="False" />
+          <field name="voluntary_share_total_contribution" />
+        </group>
+      </xpath>
+    </field>
   </record>
 </odoo>
diff --git a/energy_communities_service_invoicing/__manifest__.py b/energy_communities_service_invoicing/__manifest__.py
index f525cf563..38cac035e 100644
--- a/energy_communities_service_invoicing/__manifest__.py
+++ b/energy_communities_service_invoicing/__manifest__.py
@@ -30,6 +30,8 @@
         "data/contract_cron.xml",
         "data/contract_line_qty_formula_data.xml",
         "data/product_data.xml",
+        "report/report_invoice.xml",
+        "views/account_move_views.xml",
         "views/contract_line_formula_views.xml",
         "views/contract_template_views.xml",
         "views/contract_views.xml",
diff --git a/energy_communities_service_invoicing/data/product_data.xml b/energy_communities_service_invoicing/data/product_data.xml
index b3248d09a..89e2a323c 100644
--- a/energy_communities_service_invoicing/data/product_data.xml
+++ b/energy_communities_service_invoicing/data/product_data.xml
@@ -1,8 +1,8 @@
 <odoo>
   <record id="product_category_pack" model="product.category">
-    <field name="name">Service Pack</field>
+    <field name="name">Platform Service Pack</field>
   </record>
   <record id="product_category_service" model="product.category">
-    <field name="name">Service</field>
+    <field name="name">Platform Service</field>
   </record>
 </odoo>
diff --git a/energy_communities_service_invoicing/models/account_move.py b/energy_communities_service_invoicing/models/account_move.py
index 4add5cb7a..378c9bd62 100644
--- a/energy_communities_service_invoicing/models/account_move.py
+++ b/energy_communities_service_invoicing/models/account_move.py
@@ -5,15 +5,37 @@ class AccountMove(models.Model):
     _inherit = "account.move"
 
     ref_invoice_id = fields.Many2one(
-        compute="_compute_ref_invoice_id_and_is_pack", store=False
+        comodel_name="account.move",
+        compute="_compute_ref_invoice_id_related_contract_id_is_pack_is_contract",
+        store=False,
+    )
+    related_contract_id = fields.Many2one(
+        comodel_name="contract.contract",
+        compute="_compute_ref_invoice_id_related_contract_id_is_pack_is_contract",
+        store=False,
+    )
+    is_pack = fields.Boolean(
+        compute="_compute_ref_invoice_id_related_contract_id_is_pack_is_contract",
+        store=True,
+    )
+    is_contract = fields.Boolean(
+        compute="_compute_ref_invoice_id_related_contract_id_is_pack_is_contract",
+        store=True,
+    )
+    related_community_company_id = fields.Many2one(
+        comodel_name="res.company",
+        string="Related community",
+        related="related_contract_id.community_company_id",
+        domain="[('hierarchy_level','=','community')]",
     )
-    is_pack = fields.Boolean(compute="_compute_ref_invoice_id_and_is_pack", store=True)
 
     @api.depends("invoice_line_ids", "ref")
-    def _compute_ref_invoice_id_and_is_pack(self):
+    def _compute_ref_invoice_id_related_contract_id_is_pack_is_contract(self):
         for record in self:
             record.ref_invoice_id = False
+            record.related_contract_id = False
             record.is_pack = False
+            record.is_contract = False
             rel_inv = False
             if record.ref:
                 rel_inv = (
@@ -24,10 +46,14 @@ class AccountMove(models.Model):
                 if rel_inv:
                     record.ref_invoice_id = rel_inv.id
                     record.is_pack = rel_inv.is_pack
+                    record.is_contract = rel_inv.is_contract
+                    if rel_inv.related_contract_id:
+                        record.related_contract_id = rel_inv.related_contract_id.id
             else:
                 if record.invoice_line_ids:
                     first_move_line = record.invoice_line_ids[0]
                     if first_move_line.contract_line_id:
-                        record.is_pack = (
-                            first_move_line.contract_line_id.contract_id.is_pack
-                        )
+                        rel_contract = first_move_line.contract_line_id.contract_id
+                        record.is_pack = rel_contract.is_pack
+                        record.related_contract_id = rel_contract.id
+                        record.is_contract = True
diff --git a/energy_communities_service_invoicing/models/contract.py b/energy_communities_service_invoicing/models/contract.py
index b10170d78..12ac6b4a1 100644
--- a/energy_communities_service_invoicing/models/contract.py
+++ b/energy_communities_service_invoicing/models/contract.py
@@ -5,8 +5,8 @@ from odoo import _, api, fields, models
 from ..utils import (
     _CONTRACT_STATUS_VALUES,
     _SALE_ORDER_SERVICE_INVOICING_ACTION_VALUES,
-    get_existing_open_contract,
-    raise_existing_same_open_contract_error,
+    get_existing_open_pack_contract,
+    raise_existing_same_open_pack_contract_error,
 )
 
 _CLOSING_ACTION_VALUES = _SALE_ORDER_SERVICE_INVOICING_ACTION_VALUES + [
@@ -106,9 +106,9 @@ class ContractContract(models.Model):
     def _constrain_unique_contract(self):
         for record in self:
             if record.community_company_id:
-                existing_contract = record._get_existing_same_open_contract()
+                existing_contract = record._get_existing_same_open_pack_contract()
                 if existing_contract:
-                    raise_existing_same_open_contract_error(existing_contract)
+                    raise_existing_same_open_pack_contract_error(existing_contract)
 
     def _compute_received_invoices_count(self):
         for record in self:
@@ -258,8 +258,8 @@ class ContractContract(models.Model):
                     received_invoices.append(invoice.id)
         return received_invoices
 
-    def _get_existing_same_open_contract(self):
-        return get_existing_open_contract(
+    def _get_existing_same_open_pack_contract(self):
+        return get_existing_open_pack_contract(
             self.env, self.partner_id, self.community_company_id, self
         )
 
diff --git a/energy_communities_service_invoicing/report/report_invoice.xml b/energy_communities_service_invoicing/report/report_invoice.xml
new file mode 100644
index 000000000..aed13d4d3
--- /dev/null
+++ b/energy_communities_service_invoicing/report/report_invoice.xml
@@ -0,0 +1,31 @@
+<odoo>
+  <template id="report_invoice_document" inherit_id="account.report_invoice_document">
+    <xpath expr="//div[@id='informations']" position="inside">
+      <div class="col-auto col-3 mw-100 mb-2" t-if="o.is_pack">
+        <strong>Community:</strong>
+        <t t-if="o.related_community_company_id.comercial_name">
+          <p class="m-0" t-field="o.related_community_company_id.comercial_name"/>
+        </t>
+        <t t-else="">
+          <p class="m-0" t-field="o.related_community_company_id.name"/>
+        </t>
+      </div>
+    </xpath>
+  </template>
+</odoo>
+<!--<xpath expr="//table" position="before">-->
+<!--  <div class="row">-->
+<!--    <div class="col-6" name="related_community_company_id">-->
+<!--      <label for="related_community_company_id">Related community company</label>-->
+<!--      <address-->
+<!--        class="mb-0"-->
+<!--        t-field="o.related_community_company_id.partner_id"-->
+<!--        t-options="{'widget': 'contact', 'fields': ['address', 'name'], 'no_marker': True}"-->
+<!--      />-->
+<!--      <div t-if="o.related_community_company_id.partner_id.vat">-->
+<!--        Tax ID: <span t-field="o.related_community_company_id.partner_id.vat"/>-->
+<!--      </div>-->
+<!--    </div>-->
+<!--  </div>-->
+<!--</xpath>-->
+
diff --git a/energy_communities_service_invoicing/utils.py b/energy_communities_service_invoicing/utils.py
index f24348955..18562a076 100644
--- a/energy_communities_service_invoicing/utils.py
+++ b/energy_communities_service_invoicing/utils.py
@@ -68,7 +68,7 @@ def service_invoicing_form_view_for_platform_admins(
 
 
 # TODO: Think a bit more about more about if this 3 methods must go to contract utils component
-def raise_existing_same_open_contract_error(existing_contract):
+def raise_existing_same_open_pack_contract_error(existing_contract):
     raise ValidationError(
         _(
             "It already exists an open contract ({}) with same company and community."
@@ -76,7 +76,7 @@ def raise_existing_same_open_contract_error(existing_contract):
     )
 
 
-def get_existing_open_contract(
+def get_existing_open_pack_contract(
     env, partner_id, community_company_id, contract_id=False
 ):
     query = [
@@ -90,7 +90,7 @@ def get_existing_open_contract(
     return env["contract.contract"].search(query, limit=1)
 
 
-def get_existing_last_closed_contract(
+def get_existing_last_closed_pack_contract(
     env, partner_id, community_company_id, contract_id=False
 ):
     query = [
diff --git a/energy_communities_service_invoicing/views/account_move_views.xml b/energy_communities_service_invoicing/views/account_move_views.xml
new file mode 100644
index 000000000..272df95a6
--- /dev/null
+++ b/energy_communities_service_invoicing/views/account_move_views.xml
@@ -0,0 +1,16 @@
+<odoo>
+  <record id="account_move_form" model="ir.ui.view">
+      <field name="name">account.move.form.inherit</field>
+      <field name="model">account.move</field>
+      <field name="inherit_id" ref="account.view_move_form" />
+      <field name="arch" type="xml">
+        <xpath expr="//field[@name='partner_id']" position="after">
+          <field name="is_pack" invisible="True" />
+          <field name="is_contract" invisible="True" />
+          <field name="invoice_origin" attrs="{'invisible': [('is_contract','=',False)]}" />
+          <field name="related_contract_id" attrs="{'invisible': [('is_contract','=',False)]}" />
+          <field name="related_community_company_id" attrs="{'invisible': [('is_pack','=',False)]}" />
+        </xpath>
+      </field>
+  </record>
+</odoo>
diff --git a/energy_communities_service_invoicing/wizards/service_invoicing_action.py b/energy_communities_service_invoicing/wizards/service_invoicing_action.py
index ec3423774..59a6b2d9f 100644
--- a/energy_communities_service_invoicing/wizards/service_invoicing_action.py
+++ b/energy_communities_service_invoicing/wizards/service_invoicing_action.py
@@ -87,5 +87,5 @@ class ServiceInvoicingActionWizard(models.TransientModel):
         if self.discount != self.service_invoicing_id.discount:
             if bool(executed_modification_action):
                 executed_modification_action += ","
-            executed_action += "modify_discount"
+            executed_modification_action += "modify_discount"
         return executed_modification_action
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 82768993b..e36abc4bb 100644
--- a/energy_communities_service_invoicing/wizards/service_invoicing_action_create.py
+++ b/energy_communities_service_invoicing/wizards/service_invoicing_action_create.py
@@ -8,9 +8,9 @@ from odoo.addons.energy_communities.utils import (
 )
 
 from ..utils import (
-    get_existing_last_closed_contract,
-    get_existing_open_contract,
-    raise_existing_same_open_contract_error,
+    get_existing_last_closed_pack_contract,
+    get_existing_open_pack_contract,
+    raise_existing_same_open_pack_contract_error,
     service_invoicing_form_view_for_platform_admins,
     service_invoicing_tree_view,
 )
@@ -110,7 +110,7 @@ class ServiceInvoicingActionCreateWizard(models.TransientModel):
         self, community_company_id, company_id, payment_mode_id=False
     ):
         self._validate_service_invoicing_action_create([community_company_id.id])
-        existing_closed_contract = get_existing_last_closed_contract(
+        existing_closed_contract = get_existing_last_closed_pack_contract(
             self.env, company_id.partner_id, community_company_id
         )
         # If existing closed contract reopen it
@@ -181,11 +181,11 @@ class ServiceInvoicingActionCreateWizard(models.TransientModel):
             raise ValidationError(_("You can only assign pack to communities"))
         # Check if already open one and raise error
         for record in impacted_records:
-            existing_contract = get_existing_open_contract(
+            existing_contract = get_existing_open_pack_contract(
                 self.env, record.parent_id.partner_id, record
             )
             if existing_contract:
-                raise_existing_same_open_contract_error(existing_contract)
+                raise_existing_same_open_pack_contract_error(existing_contract)
 
     def _validate_service_invoicing_action_create_multicommunity(self, company_id_list):
         impacted_records = self.env["res.company"].browse(company_id_list)
-- 
GitLab