From 5b7b4806897c8dc1b1a00a59f3b963301d1b0e74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com> Date: Wed, 6 Dec 2023 12:43:30 +0100 Subject: [PATCH] =?UTF-8?q?[UPD]=20import=20CDC=20and=20perimeter=20Import?= =?UTF-8?q?=20Courbes=20de=20charges=20:=20=20*=20Modification=20contenu?= =?UTF-8?q?=20des=20logs=20(fait=20r=C3=A9f=C3=A9rence=20aux=20jobs=20plut?= =?UTF-8?q?=C3=B4t=20qu'aux=20appels=20API)=20=20*=20Ajoute=20la=20p=C3=A9?= =?UTF-8?q?riode=20dans=20le=20nom=20du=20job=20cr=C3=A9=C3=A9=20=20*=20Mo?= =?UTF-8?q?dification=20import=20de=20toutes=20les=20courbes=20:=20permet?= =?UTF-8?q?=20de=20s=C3=A9lectionner=20des=20PRM=20(injection=20ou=20souti?= =?UTF-8?q?rage)=20=C3=A0=20importer=20et=20si=20d=C3=A9finis=20limite=20l?= =?UTF-8?q?'import=20de=20toutes=20les=20p=C3=A9riodes=20=C3=A0=20ces=20PR?= =?UTF-8?q?Ms=20=20*=20Modification=20v=C3=A9rification=20si=20courbes=20e?= =?UTF-8?q?xistantes=20:=20v=C3=A9rifie=20le=20type=20de=20courbe=20en=20p?= =?UTF-8?q?lus=20du=20num=C3=A9ro=20de=20PRM=20(pour=20=C3=A9viter=20de=20?= =?UTF-8?q?supprimer=20les=20donn=C3=A9es=20de=20soutirage=20si=20on=20veu?= =?UTF-8?q?t=20importer=20les=20donn=C3=A9es=20d'injection=20du=20m=C3=AAm?= =?UTF-8?q?e=20PRM)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Périmètre : * S'il trouve plusieurs PRMs avec le même nom, il le logge mais ne modifie rien * Mise à jour des dates sur PRM uniquement si non définis * Alerte si les dates récupérées d'Enedis ne correspondent pas à celles configurées dans Odoo (mais pas de modification automatique) * Modification de la date de début d'une opération uniquement si non configurée ou si date de début est après la date de début du PRM d'injection * Plus de modification de la date de fin d'une opération (à faire manuellement) --- models/acc_operation.py | 132 ++++++++++++++++-------- wizards/acc_operation_wizard.py | 20 +++- wizards/acc_operation_wizard_confirm.py | 2 +- 3 files changed, 108 insertions(+), 46 deletions(-) diff --git a/models/acc_operation.py b/models/acc_operation.py index fd26001..bd62b81 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -98,17 +98,18 @@ class AccOperation(models.Model): message = "" message += ( - "<h1>API Enedis OACC - Appel Courbes " + "<h1>API Enedis OACC - Création des jobs de récupération des Courbes " + str(fields.Datetime.now()) + "</h1>" - "Appel API pour la période " + "Appels API pour la période " "" + str(date_start) + " " + str(date_end) + "<br/>" ) if usage_point_cons_ids: # Traitement données de cons message += ( - "<br/><strong>Traitement des données de consommation</strong><br/>" + "<br/><strong>Création des jobs de récupération des courbes " + "de consommation</strong><br/>" ) for usage_point_id in usage_point_cons_ids: desc = ( @@ -118,14 +119,22 @@ class AccOperation(models.Model): + usage_point_id.name + " - Date: " + str(fields.Datetime.today()) + + " - Période: du " + + str(date_start) + + " au " + + str(date_end) ) + message += desc + "<br/>" self.with_delay(description=desc).get_definitive_load_curves( date_end, date_start, usage_point_id, "cons" ) if usage_point_prod_ids: # Traitement données de prod - message += "<br/><strong>Traitement des données de production</strong><br/>" + message += ( + "<br/><strong>Création des jobs de récupération des courbes " + "de production</strong><br/>" + ) for usage_point_id in usage_point_prod_ids: desc = ( "Opération: " @@ -134,7 +143,12 @@ class AccOperation(models.Model): + usage_point_id.name + " - Date: " + str(fields.Datetime.today()) + + " - Période: du " + + str(date_start) + + " au " + + str(date_end) ) + message += desc + "<br/>" self.with_delay(description=desc).get_definitive_load_curves( date_end, date_start, @@ -143,7 +157,9 @@ class AccOperation(models.Model): ) message += ( - "<br/><h1>Fin appel API Courbes: " + str(fields.Datetime.now()) + "</h1>" + "<br/><h1>Fin de création des jobs de récupération des courbes: " + + str(fields.Datetime.now()) + + "</h1>" ) if not self.is_cdc_data_exists: self.is_cdc_data_exists = True @@ -213,7 +229,7 @@ class AccOperation(models.Model): _logger.info(message) return message - def get_curves_all(self): + def get_curves_all(self, usage_point_cons_ids=None, usage_point_prod_ids=None): """ Récupère les données de l'opération depuis le début de la mise en place de l'opération. A partir de la date de début de contrat, calcul du nombre @@ -229,7 +245,9 @@ class AccOperation(models.Model): i = 1 while i < nb_months: - self.curves(date_start_it, date_end_it) + self.curves( + date_start_it, date_end_it, usage_point_cons_ids, usage_point_prod_ids + ) date_start_it = date_start_it + relativedelta(months=1) date_end_it = date_start_it + relativedelta(months=1) i += 1 @@ -258,29 +276,63 @@ class AccOperation(models.Model): list_soutirage = [] for usage_point in usage_points: + usage_point_start = date.fromisoformat(usage_point["start"]) + usage_point_end = ( + date.fromisoformat(usage_point["end"]) + if usage_point["end"] != "9999-12-31" + else False + ) usage_id = self.env["acc.counter"].search( [ ("acc_operation_id", "=", self.id), ("name", "=", usage_point["usage_point_id"]), ] ) - message += "<br/>PRM " + usage_point["usage_point_id"] + "<br/>" - if usage_id: - message += ( - "PRM existe : mise à jour des dates - " - "Du " + usage_point["start"] + " au " + usage_point["end"] + "<br/>" - ) - usage_id.write( - { - "date_start_contract": date.fromisoformat(usage_point["start"]), - } - ) - if usage_point["end"] != "9999-12-31": - usage_id.write( - { - "date_end_contract": date.fromisoformat(usage_point["end"]), - } + message += ( + "<br/>PRM " + + usage_point["usage_point_id"] + + " - Dates Enedis : " + + usage_point["start"] + + " - " + + usage_point["end"] + + "<br/>" + ) + if usage_id and len(usage_id) == 1: + message += "PRM existe dans Odoo<br/>" + if not usage_id.date_start_contract: + usage_id.date_start_contract = usage_point_start + message += ( + "mise à jour date de début " + usage_point["start"] + "<br/>" + ) + elif usage_id.date_start_contract != usage_point_start: + message += ( + "date de début ne correspond pas, " + "merci de vérifier manuellement ce PRM : " + "date de début Odoo : " + + fields.Date.to_string(usage_id.date_start_contract) + + "<br/>" + ) + if usage_point_end and not usage_id.date_end_contract: + usage_id.date_end_contract = usage_point_end + message += ( + "mise à jour date de fin : " + usage_point["end"] + "<br/>" + ) + elif usage_id.date_end_contract != usage_point_end: + message += ( + "date de fin ne correspond pas" + ", merci de vérifier manuellement ce PRM : " + "date de fin Odoo : " + + fields.Date.to_string(usage_id.date_end_contract) + + "<br/>" ) + if usage_point["type"] == "CONS" and not usage_id.is_delivery: + usage_id.is_delivery = True + message += "PRM configuré comme point de soutirage <br/>" + if usage_point["type"] == "PROD" and not usage_id.is_injection: + usage_id.is_injection = True + message += "PRM configuré comme point d'injection <br/>" + elif len(usage_id) > 1: + message += "Plusieurs PRMs trouvés avec ce numéro - pas de modif<br/>" else: message += "PRM n'existe pas : Création ...<br/>" is_delivery = False @@ -289,33 +341,31 @@ class AccOperation(models.Model): is_delivery = True if usage_point["type"] == "PROD": is_injection = True - self.date_start_contract = date.fromisoformat(usage_point["start"]) - if usage_point["end"] != "9999-12-31": - self.date_end_contract = date.fromisoformat(usage_point["end"]) - else: - self.date_end_contract = None - - if usage_point["end"] != "9999-12-31": - date_end = date.fromisoformat(usage_point["end"]) - else: - date_end = None + # Si la date de l'opération n'est pas renseignée ou + # après la date de démarrage du point d'injection + # alors on force la date à celle du point d'injection + if ( + not self.date_start_contract + or self.date_start_contract > usage_point_start + ): + self.date_start_contract = usage_point_start usage_id = self.env["acc.counter"].create( { "name": usage_point["usage_point_id"], "is_delivery": is_delivery, "is_injection": is_injection, "acc_operation_id": self.id, - "date_start_contract": date.fromisoformat(usage_point["start"]), - "date_end_contract": date_end, + "date_start_contract": usage_point_start, + "date_end_contract": usage_point_end, } ) message += "Fin de la création du PRM<br/>" - if usage_id.is_injection: - if usage_id.name not in list_injection: - list_injection.append(usage_id.name) - if usage_id.is_delivery: - if usage_id.name not in list_soutirage: - list_soutirage.append(usage_id.name) + if usage_point["type"] == "PROD": + if usage_point["usage_point_id"] not in list_injection: + list_injection.append(usage_point["usage_point_id"]) + if usage_point["type"] == "CONS": + if usage_point["usage_point_id"] not in list_soutirage: + list_soutirage.append(usage_point["usage_point_id"]) message += "<p>LISTE TOTAL DE PRMs: </br>" "PRM Injection </br>" diff --git a/wizards/acc_operation_wizard.py b/wizards/acc_operation_wizard.py index d6cf026..8f5ed7d 100644 --- a/wizards/acc_operation_wizard.py +++ b/wizards/acc_operation_wizard.py @@ -86,13 +86,23 @@ class AccOperationWizard(models.TransientModel): if self.prm_cons_ids and self.prm_prod_ids: domain_all += [ "|", + "&", ("acc_counter_id", "in", self.prm_cons_ids.ids), + ("comp_data_type", "in", ("autocons", "cons")), + "&", ("acc_counter_id", "in", self.prm_prod_ids.ids), + ("comp_data_type", "in", ("prod", "surplus")), ] elif self.prm_cons_ids: - domain_all += [("acc_counter_id", "in", self.prm_cons_ids.ids)] + domain_all += [ + ("acc_counter_id", "in", self.prm_cons_ids.ids), + ("comp_data_type", "in", ("autocons", "cons")), + ] elif self.prm_prod_ids: - domain_all += [("acc_counter_id", "in", self.prm_prod_ids.ids)] + domain_all += [ + ("acc_counter_id", "in", self.prm_prod_ids.ids), + ("comp_data_type", "in", ("prod", "surplus")), + ] rec_ids = self.env["acc.enedis.cdc"].search(domain_all) if rec_ids: @@ -106,7 +116,7 @@ class AccOperationWizard(models.TransientModel): "rec_ids": rec_ids, "mess": _( "Des données existent déjà pour cette période. Etes-vous" - " sûr de vouloir écraser les données existantes?" + " sûr de vouloir écraser les données existantes ?" ), } ) @@ -140,6 +150,8 @@ class AccOperationWizard(models.TransientModel): wizard = self.env["acc.operation.wizard.confirm"].create( { "operation_id": self.operation_id.id, + "prm_cons_ids": self.prm_cons_ids, + "prm_prod_ids": self.prm_prod_ids, "rec_ids": rec_ids, "mess": _( "Des données existent pour cette période. Etes-vous" @@ -156,7 +168,7 @@ class AccOperationWizard(models.TransientModel): "target": "new", } else: - self.operation_id.get_curves_all() + self.operation_id.get_curves_all(self.prm_cons_ids, self.prm_prod_ids) return {"type": "ir.actions.act_window_close"} # ------------------------------------------------------ diff --git a/wizards/acc_operation_wizard_confirm.py b/wizards/acc_operation_wizard_confirm.py index 548842c..463d401 100644 --- a/wizards/acc_operation_wizard_confirm.py +++ b/wizards/acc_operation_wizard_confirm.py @@ -69,7 +69,7 @@ class AccOperationWizardConfirm(models.TransientModel): ) else: # Pas de date renseignée, récupération de toutes les données - self.operation_id.get_curves_all() + self.operation_id.get_curves_all(self.prm_cons_ids, self.prm_prod_ids) return {"type": "ir.actions.act_window_close"} # ------------------------------------------------------ -- GitLab