diff --git a/wizard/acc_operation_import_wizard.py b/wizard/acc_operation_import_wizard.py index dfa2e28db2e2270c8a2e86a5f488b27e1165d55d..2c356a0a2ddf2d0fbe164b88b634b179489d79f0 100644 --- a/wizard/acc_operation_import_wizard.py +++ b/wizard/acc_operation_import_wizard.py @@ -3,13 +3,18 @@ import base64 import csv import io +import logging 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 + +_logger = logging.getLogger(__name__) class AccOperationImportWizard(models.TransientModel): @@ -55,7 +60,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 +83,65 @@ class AccOperationImportWizard(models.TransientModel): computed_data_type = "autocons" 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), + ("acc_counter_id", "=", counter_id), ] - rec_ids = self.env[self.model].search(domain_all) + domain_cdc = expression.AND( + [ + domain_all, + [ + ("date_slot", ">=", start_datetime), + ("date_slot", "<", end_datetime), + ("comp_data_type", "=", computed_data_type), + ], + ] + ) + 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_end_obj = datetime.strptime(date_end_str, date_format) + relativedelta( - days=1 - ) + 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,7 +150,11 @@ class AccOperationImportWizard(models.TransientModel): ] self.env["acc.counter.period"]._get_periods_from_interval( domain, date_begin_obj, date_end_obj - )._update_cdc_partner_id(model=self.model) + ).update_cdc_partner_id( + model=self.model, + date_start=date_begin_obj, + date_end=date_end_obj, + ) def valid_import(self): message = "" @@ -126,22 +165,29 @@ class AccOperationImportWizard(models.TransientModel): + self.model + "</h1>" ) + for file in self.attachment_ids: + _logger.debug(f"Processing file {file.name} - Start") message += ( "<p><strong>Fichier " + file.name + "</strong><br/>Début Import ... <br/>" ) data_filename = file.name.split("_") + date_format = "%d%m%Y" id_pdm = data_filename[0] + start_date = datetime.strptime(data_filename[1], date_format).date() + end_date = ( + datetime.strptime(data_filename[2], date_format) + relativedelta(days=1) + ).date() - 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 ) @@ -152,6 +198,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: @@ -175,11 +223,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, @@ -187,10 +235,27 @@ class AccOperationImportWizard(models.TransientModel): } ) - self.update_partner_id(data_filename, counter_id) + _logger.debug(f"Processing file {file.name} - Curves creation") + message += "Création des courbes<br/>" + self.create_curve(curves_to_create) + + if self.model == "acc.enedis.cdc": + _logger.debug(f"Processing file {file.name} - Update partner_id on curves") + message += "Mise à jour du contact associé aux courbes<br/>" + self._update_partner_id(data_filename, counter_id) + + _logger.debug(f"Processing file {file.name} - Generating daily curves") + 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 + _logger.debug(f"Processing file {file.name} - Remove file") message += "Suppression du fichier " + file.name + " ...<br/>" file.unlink() message += "Suppression OK </p>"