From dfd670094baf1606f8d91608c6f4cf7a36a4b63f Mon Sep 17 00:00:00 2001
From: daniquilez <dani.quilez@gmail.com>
Date: Fri, 28 Feb 2025 09:37:15 +0100
Subject: [PATCH] =?UTF-8?q?[IMP]=20=E2=9C=A8=20Introducing=20active=20moni?=
 =?UTF-8?q?toring=20members=20formula?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../data/contract_line_qty_formula_data.xml   | 14 ++++++++--
 .../models/contract.py                        | 28 +++++++++++++++++++
 2 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/energy_communities_service_invoicing/data/contract_line_qty_formula_data.xml b/energy_communities_service_invoicing/data/contract_line_qty_formula_data.xml
index c65eae7e2..edef781e2 100644
--- a/energy_communities_service_invoicing/data/contract_line_qty_formula_data.xml
+++ b/energy_communities_service_invoicing/data/contract_line_qty_formula_data.xml
@@ -1,10 +1,10 @@
 <odoo>
   <data>
     <record
-      id="community_members_formula"
+      id="active_community_members_formula"
       model="contract.line.qty.formula"
     >
-      <field name="name">Community members</field>
+      <field name="name">Active community members</field>
       <field name="code">
 result = env['cooperative.membership'].sudo().search_count([
 ('company_id','=',contract.community_company_id.id),
@@ -13,5 +13,15 @@ result = env['cooperative.membership'].sudo().search_count([
       </field>
       <field name="company_id" eval="ref('base.main_company')" />
     </record>
+    <record
+      id="active_monitoring_members_formula"
+      model="contract.line.qty.formula"
+    >
+      <field name="name">Active monitoring members</field>
+      <field name="code">
+result = contract.get_active_monitoring_members()
+      </field>
+      <field name="company_id" eval="ref('base.main_company')" />
+    </record>
   </data>
 </odoo>
diff --git a/energy_communities_service_invoicing/models/contract.py b/energy_communities_service_invoicing/models/contract.py
index 12ac6b4a1..512e65349 100644
--- a/energy_communities_service_invoicing/models/contract.py
+++ b/energy_communities_service_invoicing/models/contract.py
@@ -1,3 +1,4 @@
+from collections import namedtuple
 from datetime import datetime
 
 from odoo import _, api, fields, models
@@ -263,6 +264,33 @@ class ContractContract(models.Model):
             self.env, self.partner_id, self.community_company_id, self
         )
 
+    def get_active_monitoring_members(self):
+        QueryResult = namedtuple("QueryResult", ["total"])
+        QUERY = """
+            select count(energy_selfconsumption_supply_point.code) from energy_project_project
+            inner join energy_selfconsumption_selfconsumption on
+                energy_selfconsumption_selfconsumption.project_id = energy_project_project.id
+            inner join energy_selfconsumption_distribution_table on
+                energy_selfconsumption_distribution_table.selfconsumption_project_id = energy_selfconsumption_selfconsumption.id
+            inner join energy_selfconsumption_supply_point_assignation on
+                energy_selfconsumption_supply_point_assignation.distribution_table_id = energy_selfconsumption_distribution_table.id
+            inner join energy_selfconsumption_supply_point on
+                energy_selfconsumption_supply_point.id = energy_selfconsumption_supply_point_assignation.supply_point_id
+            inner join energy_project_service_contract on
+                energy_project_service_contract.project_id= energy_project_project.id
+            inner join energy_project_provider on energy_project_service_contract.provider_id=energy_project_provider.id
+            where
+                energy_project_project.company_id={current_company_id} and
+                energy_selfconsumption_distribution_table.state = 'active' and
+                energy_project_provider.name LIKE '{arkenova_like}';
+        """.format(
+            current_company_id=int(self.community_company_id.id),
+            arkenova_like="%Arkenova%",
+        )
+        self.env.cr.execute(QUERY)
+        members = QueryResult._make(self.env.cr.fetchone())
+        return members.total
+
     def set_close_status_type_by_date(self):
         if self.date_end.strftime("%Y-%m-%d") <= datetime.now().strftime("%Y-%m-%d"):
             self.write({"status": "closed"})
-- 
GitLab