diff --git a/wizard/acc_operation_import_wizard.py b/wizard/acc_operation_import_wizard.py index b962dabbecae6f3909e7948a82deb54d50d66c13..02996ce19fd1fdb6bd4d76bf4f14e3b6ac8b9eac 100644 --- a/wizard/acc_operation_import_wizard.py +++ b/wizard/acc_operation_import_wizard.py @@ -8,8 +8,10 @@ from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from odoo import fields, models +from odoo.osv import expression from odoo.addons.api_connector.tools.date_utils import local_to_utc +from odoo.addons.oacc.models.acc_enedis_cdc_day import COMP_DATA_TYPE_MAP class AccOperationImportWizard(models.TransientModel): @@ -55,7 +57,7 @@ class AccOperationImportWizard(models.TransientModel): # ------------------------------------------------------ # Business methods # ------------------------------------------------------ - def delete_existing_data(self, data_filename, counter_id): + def _delete_existing_data(self, data_filename, counter_id): message = "" # Suppression des données si déjà existantes date_begin_str = data_filename[1] @@ -78,35 +80,51 @@ class AccOperationImportWizard(models.TransientModel): computed_data_type = "autocons" domain_all = [ + ("acc_operation_id", "=", self.operation_id.id), + ("acc_counter_id", "=", counter_id), + ] + domain_cdc = expression.AND([domain_all, [ ("date_slot", ">=", start_datetime), ("date_slot", "<", end_datetime), - ("acc_operation_id", "=", self.operation_id.id), ("comp_data_type", "=", computed_data_type), - ("acc_counter_id", "=", counter_id.id), - ] - rec_ids = self.env[self.model].search(domain_all) + ]]) + domain_cdc_day = expression.AND([domain_all, [ + ("date_slot", ">=", date_begin_obj.date()), + ("date_slot", "<", date_end_obj.date()), + ("comp_data_type", "=", COMP_DATA_TYPE_MAP[computed_data_type]), + ]]) + rec_ids = self.env[self.model].search(domain_cdc) if rec_ids: - message += "Suppression des enregistrements existants ... <br/>" + message += "Suppression des enregistrements existants de courbes ... <br/>" rec_ids.unlink() - message += "Suppression des enregistrements existants OK <br/>" + message += "Suppression des enregistrements existants de courbes OK <br/>" + + if self.model == "acc.enedis.cdc": + day_rec_ids = self.env["acc.enedis.cdc.day"].search(domain_cdc_day) + if day_rec_ids: + message += "Suppression des enregistrements existants de courbes "\ + "agrégées au jour ... <br/>" + day_rec_ids.unlink() + message += "Suppression des enregistrements existants de courbes "\ + "agrégées au jour OK <br/>" return message def create_curve(self, curve_data): self.env[self.model].create(curve_data) - def update_partner_id(self, data_filename, counter_id): + def _update_partner_id(self, data_filename, counter_id): date_begin_str = data_filename[1] date_end_str = data_filename[2] date_format = "%d%m%Y" - date_begin_obj = datetime.strptime(date_begin_str, date_format) + date_begin_obj = datetime.strptime(date_begin_str, date_format).date() date_end_obj = datetime.strptime(date_end_str, date_format) + relativedelta( days=1 - ) + ).date() # Update partner_id for retrieved cdc domain = [ ("acc_operation_id", "=", self.operation_id.id), - ("acc_counter_id", "=", counter_id.id or False), + ("acc_counter_id", "=", counter_id), ( "prm_type", "=", @@ -115,10 +133,10 @@ class AccOperationImportWizard(models.TransientModel): ] self.env["acc.counter.period"]._get_periods_from_interval( domain, date_begin_obj, date_end_obj - )._update_cdc_partner_id( + ).update_cdc_partner_id( model=self.model, - date_start=date_begin_obj.date(), - date_end=date_end_obj.date(), + date_start=date_begin_obj, + date_end=date_end_obj, ) def valid_import(self): @@ -131,9 +149,6 @@ class AccOperationImportWizard(models.TransientModel): + "</h1>" ) - start_dates = [] - end_dates = [] - for file in self.attachment_ids: message += ( "<p><strong>Fichier " @@ -143,16 +158,16 @@ class AccOperationImportWizard(models.TransientModel): data_filename = file.name.split("_") date_format = "%d%m%Y" id_pdm = data_filename[0] - start_dates.append(datetime.strptime(data_filename[1], date_format)) - end_dates.append(datetime.strptime(data_filename[2], date_format)) + start_date = datetime.strptime(data_filename[1], date_format) + end_date = datetime.strptime(data_filename[2], date_format) - counter_id = self.env["acc.counter"].search([("name", "=", id_pdm)]) + counter_id = self.env["acc.counter"].search([("name", "=", id_pdm)]).id data_filename[3] = data_filename[3].lower() if data_filename[3] not in ["prod", "surplus"]: data_filename[3] = data_filename[3][:-1] - message += self.delete_existing_data( + message += self._delete_existing_data( data_filename=data_filename, counter_id=counter_id ) @@ -163,6 +178,8 @@ class AccOperationImportWizard(models.TransientModel): csv_reader = csv.reader(file_decode, delimiter=";") file_reader.extend(csv_reader) + curves_to_create = [] + # Create Data for the CDC message += "Lecture et import des données ... <br/>" for row in file_reader: @@ -186,11 +203,11 @@ class AccOperationImportWizard(models.TransientModel): else: timestamp = timestamp + timedelta(minutes=timestep) - self.create_curve( + curves_to_create.append( { "name": file.name, "acc_operation_id": self.operation_id.id, - "acc_counter_id": counter_id.id, + "acc_counter_id": counter_id, "comp_data_type": data_filename[3], "power": power, "date_slot": timestamp, @@ -198,7 +215,18 @@ class AccOperationImportWizard(models.TransientModel): } ) - self.update_partner_id(data_filename, counter_id) + message += "Création des courbes<br/>" + self.create_curve(curves_to_create) + message += "Mise à jour du contact associé aux courbes<br/>" + self._update_partner_id(data_filename, counter_id) + + message += "Génération des données agrégées au jour<br/>" + self.env["acc.enedis.cdc.day"].generate( + acc_operation_id=self.operation_id.id, + acc_counter_id=counter_id, + start_date=start_date, + end_date=end_date, + ) message += "Fin de l'import des données OK<br/>" # Suppression du fichier après création des enregistrements @@ -206,24 +234,6 @@ class AccOperationImportWizard(models.TransientModel): file.unlink() message += "Suppression OK </p>" - message += "Génération des données agrégées<br/>" - domain = [ - ("acc_operation_id", "=", self.operation_id.id), - ("date_slot", ">=", min(start_dates)), - ("date_slot", "<", max(end_dates)), - ] - - # Vérification si des données existent déjà - # pour cet intervalle de date - rec_ids = self.env["acc.enedis.cdc.agg"].search(domain) - if rec_ids: - rec_ids.unlink() - - self.env["acc.enedis.cdc.agg"].generate( - acc_operation_id=self.operation_id.id, - start_date=min(start_dates), - end_date=max(end_dates), - ) message += "<h1>Fin import manuel: " + str(fields.Datetime.now()) + "</h1>" # Logs information logs