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