From 06c0c7d18d2d13bf7c0f2455fa63cb6a8995598c Mon Sep 17 00:00:00 2001
From: emanuel buzey <emanuel.buzey@somit.coop>
Date: Thu, 7 Mar 2024 13:33:04 +0100
Subject: [PATCH] [WIP] energy_selfconsumption: create import for distribution
 table variable

---
 .../models/distribution_table.py              |  2 +-
 .../security/ir.model.access.csv              |  3 ++
 .../distribution_table_import_wizard.py       | 47 ++++++++++++-------
 3 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/energy_selfconsumption/models/distribution_table.py b/energy_selfconsumption/models/distribution_table.py
index e6bf00cc4..0e106799f 100644
--- a/energy_selfconsumption/models/distribution_table.py
+++ b/energy_selfconsumption/models/distribution_table.py
@@ -171,7 +171,7 @@ class DistributionTableVariable(models.Model):
 
 
 class DistributionTableVariableCoefficient(models.Model):
-    _name = "energy_selfconsumption.distribution_table_variable_coefficient"
+    _name = "energy_selfconsumption.distribution_table_var_coeff"
 
     distribution_table_variable_id = fields.Many2one(
         "energy_selfconsumption.distribution_table_variable", 
diff --git a/energy_selfconsumption/security/ir.model.access.csv b/energy_selfconsumption/security/ir.model.access.csv
index d5f33eed5..6d748f3cd 100644
--- a/energy_selfconsumption/security/ir.model.access.csv
+++ b/energy_selfconsumption/security/ir.model.access.csv
@@ -14,3 +14,6 @@ accces_energy_selfconsumption_coefficient_report,energy_selfconsumption.coeffici
 access_energy_selfconsumption_define_invoicing_mode_wizard_admin,energy_selfconsumption.define_invoicing_mode.wizard.admin,model_energy_selfconsumption_define_invoicing_mode_wizard,energy_project.group_admin,1,1,1,1
 access_energy_selfconsumption_invoicing_wizard_admin,energy_selfconsumption.invoicing.wizard.admin,model_energy_selfconsumption_invoicing_wizard,energy_project.group_admin,1,1,1,1
 access_energy_selfconsumption_distribution_table_fixed_admin,energy_selfconsumption.distribution_table_fixed.admin,model_energy_selfconsumption_distribution_table_fixed,energy_project.group_admin,1,1,1,1
+access_energy_selfconsumption_distribution_table_variable_admin,energy_selfconsumption.distribution_table_variable.admin,model_energy_selfconsumption_distribution_table_variable,energy_project.group_admin,1,1,1,1
+access_energy_selfconsumption_distribution_table_var_coeff_admin,energy_selfconsumption.distribution_table_var_coeff.admin,model_energy_selfconsumption_distribution_table_var_coeff,energy_project.group_admin,1,1,1,1
+
diff --git a/energy_selfconsumption/wizards/distribution_table_import_wizard.py b/energy_selfconsumption/wizards/distribution_table_import_wizard.py
index cb2d438cc..eeca1d7c3 100644
--- a/energy_selfconsumption/wizards/distribution_table_import_wizard.py
+++ b/energy_selfconsumption/wizards/distribution_table_import_wizard.py
@@ -10,6 +10,7 @@ from odoo import _, api, fields, models
 from odoo.exceptions import UserError, ValidationError
 from odoo.http import request
 
+
 logger = logging.getLogger(__name__)
 
 
@@ -45,21 +46,21 @@ class DistributionTableImportWizard(models.TransientModel):
                 raise ValidationError(_("Only csv format files are accepted."))
 
     def import_file_button(self):
+        # Button to import file, checks whether it is necessary to enqueue or not according to the type field
         file_data = base64.b64decode(self.import_file)
         parsing_data = self.with_context(active_id=self.ids[0])._parse_file(file_data)
         active_id = self.env.context.get("active_id")
-        distribution_table = self.env[
-            "energy_selfconsumption.distribution_table"
-        ].browse(active_id)
-        type = self.env.context.get("type")
-
+        distribution_table = self.env['energy_selfconsumption.distribution_table'].browse(active_id)
+        
+        type = distribution_table.type
+        
         if type == 'variable_schedule':
-            # Para 'variable_schedule', encola el trabajo
-            self.env['queue.job'].sudo().with_delay().import_all_lines(parsing_data, distribution_table.id)
+            # For 'variable_schedule', queue job
+            self.with_delay().import_all_lines(parsing_data, active_id)
             message = 'La importación de la programación variable se está procesando en segundo plano.'
         else:
-            # Para cualquier otro tipo, procesa de manera síncrona
-            self.import_all_lines(parsing_data, distribution_table)
+            # For other type, syncron type
+            self.import_all_lines(parsing_data, active_id)
             message = 'La importación ha finalizado.'
 
         return {
@@ -114,7 +115,9 @@ class DistributionTableImportWizard(models.TransientModel):
             raise UserError(_("Error parsing the file"))
 
     def import_all_lines(self, data, distribution_table):
-        type = self.env.context.get("type")
+        logger.debug('Inicio de la importación para la Distribution Table con ID: %s', distribution_table)
+        type = self.env['energy_selfconsumption.distribution_table'].browse(distribution_table).type
+        logger.debug('El valor de type es: %s', type)
         if type == 'fixed':
             supply_point_assignation_values_list = []
 
@@ -127,29 +130,41 @@ class DistributionTableImportWizard(models.TransientModel):
                 {"supply_point_assignation_ids": supply_point_assignation_values_list}
             )
         elif type == 'variable_schedule':
+            logger.debug('Procesando importación tipo "variable_schedule"')
             DistributionTableVariable = self.env['energy_selfconsumption.distribution_table_variable']
-            DistributionTableVariableCoefficient = self.env['energy_selfconsumption.distribution_table_variable_coefficient']
-
+            DistributionTableVariableCoefficient = self.env['energy_selfconsumption.distribution_table_var_coeff']
             cups_ids = data[0][1:]  # Get CUPS
+            logger.debug('CUPS IDs encontrados: %s', cups_ids)
             hours_data = data[1:]  # Get hours and coefficients
 
             for cups_index, cups_id in enumerate(cups_ids, start=1):
                 # Create or find the record in DistributionTableVariable for the current CUPS
-                variable_record, _ = DistributionTableVariable.find_or_create({
-                    'distribution_table_id': distribution_table.id,
-                    'cups_id': cups_id,
-                })
+                logger.debug('Procesando CUPS ID: %s', cups_id)
+                # Check if record exist
+                variable_record = DistributionTableVariable.search([
+                    ('distribution_table_id', '=', distribution_table),
+                    ('cups_id', '=', cups_id),
+                ], limit=1)
+
+                # If not exist, create
+                if not variable_record:
+                    variable_record = DistributionTableVariable.create({
+                        'distribution_table_id': distribution_table,
+                        'cups_id': cups_id,
+                    })
 
                 # Proccess every hour and coefficient for this CUPS
                 for row in hours_data:
                     hour = int(row[0])
                     coefficient = float(row[cups_index])  # Get the coefficient for the current hour and CUPS
+                    logger.debug('Añadiendo coeficiente %s para la hora %s del CUPS ID: %s', coefficient, hour, cups_id)
                     # Create the coefficient record
                     DistributionTableVariableCoefficient.create({
                         'distribution_table_variable_id': variable_record.id,
                         'hour': hour,
                         'coefficient': coefficient,
                     })
+        logger.debug('Finalización de la importación para la Distribution Table con ID: %s', distribution_table)
 
     def get_supply_point_assignation_values(self, line):
         return {
-- 
GitLab