From 6aade582ef868d0ac5f9caa16a5eb35c8ff7a226 Mon Sep 17 00:00:00 2001
From: Julien Ortet <julien@le-filament.com>
Date: Wed, 14 Aug 2024 16:51:36 +0200
Subject: [PATCH] [ADD] module creation

---
 __manifest__.py                               |   4 +-
 __pycache__/__init__.cpython-311.pyc          | Bin 0 -> 238 bytes
 .../__pycache__/acc_operation.cpython-311.pyc | Bin 5621 -> 1776 bytes
 models/acc_operation.py                       | 117 +-----------
 views/acc_operation_views.xml                 |   8 +-
 wizard/__pycache__/__init__.cpython-311.pyc   | Bin 239 -> 243 bytes
 ...cc_operation_import_wizard.cpython-311.pyc | Bin 7083 -> 2553 bytes
 wizard/acc_operation_import_wizard.py         | 178 ++++--------------
 wizard/acc_operation_import_wizard_views.xml  |  36 ----
 9 files changed, 41 insertions(+), 302 deletions(-)
 create mode 100644 __pycache__/__init__.cpython-311.pyc
 delete mode 100644 wizard/acc_operation_import_wizard_views.xml

diff --git a/__manifest__.py b/__manifest__.py
index 702987e..9ef2c2a 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -5,7 +5,7 @@
     "website": "https://le-filament.com",
     "version": "16.0.1.0.0",
     "license": "AGPL-3",
-    "depends": ["oacc"],
+    "depends": ["oacc", "oacc_raw_curves"],
     "data": [
         "security/ir.model.access.csv",
         # datas
@@ -13,7 +13,7 @@
         "views/acc_operation_views.xml",
         # views menu
         # wizard
-        "wizard/acc_operation_import_wizard_views.xml",
+
     ],
     "assets": {
         "web._assets_primary_variables": [],
diff --git a/__pycache__/__init__.cpython-311.pyc b/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a0578289fbd34e9444e2ed356652cbe221d272e7
GIT binary patch
literal 238
zcmZ3^%ge>Uz`(#B(~>I7z`*br#DQTZDC4sj0|Uc!h7^Vr#vF!R#wf;IrYI&xh7_h?
z22JLdj0_A6noPIYa`RJCbBb@Vm1kBZ7Nz)UGT&k-VrF1qC}Lq?U|7lU8D!WmTm6ju
z+*JM2;?yGjl+-f){FMBBLo@w?qRg_yl2rZt#N_1o%-n+fqLTQc#Pay$lw|$*_{_Y_
xlK6PNg34bUHo5sJr8%i~MVt%_3?Q3}l^GZqJ}@&fGTva2xqurLu`@6*008SAJTw3R

literal 0
HcmV?d00001

diff --git a/models/__pycache__/acc_operation.cpython-311.pyc b/models/__pycache__/acc_operation.cpython-311.pyc
index 8daa02b899d581bd55f6659720e1e7c1f2495e98..de2b421675aa1a7947b06e0637772e24a64350a6 100644
GIT binary patch
delta 498
zcmeyW{ehQnIWI340|Ns?*RDNjl3W}47#SHQCJQi1Dh4xXvfScvOiuPMNG(b%$;{9D
z#haL%td|etZtfP)W@NlId6%H9&@V>YA|3_?hFfe!sm1Y`DMbR4UkkR>-(ty2%uT(;
zQc_uvdW*9xGqpTEH$Nq{h@XLhp-2#{z9g|IJ+(xW^%iq#UfC_S;?%^V<cwQPnJKpf
zGjj{_i%Q~?Gg6bY<5TjJi*K<d7o{eaq-wI>Vku6|NxQ|8n_66aixcjoTdZlBIjP0B
z*vd1j5{puJidh*L7!*L@m*?b29xdOZ#Pay$lw^I7D{_kU6O)tU;hOadDsS;Y?S!hU
zl1BEw9;&4FWIo}$9G^jf=cma!`LnRTi5dd~!%BuCb&&T|K?FC9;ALQ7DAr(LU}%8D
z8~kz&9v`eG=ZQ!#s!whgnWn4*QVrMqi^C>2KczG$)vm~hfq{V$WWwUf4x&YtW{g4~
W7%+(mW>aiFg2cao2s9O7M*#pa`<h7r

literal 5621
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

diff --git a/models/acc_operation.py b/models/acc_operation.py
index 690db88..3f5194c 100644
--- a/models/acc_operation.py
+++ b/models/acc_operation.py
@@ -40,122 +40,7 @@ class AccOperation(models.Model):
     # ------------------------------------------------------
     # Actions
     # ------------------------------------------------------
-    def import_check_docs(self, files):
-        mess = ""
-
-        if not files:
-            raise ValidationError(
-                _(
-                    "Aucun fichier à intégrer. Pour joindre des fichiers, "
-                    "veuillez cliquer sur l’icône trombone se trouvant dans "
-                    "le bloc Chatter à droite"
-                )
-            )
-        else:
-            files.mapped("name")
-            for file in files:
-                ext_file = file.name[-3:]
-                if ext_file != "csv":
-                    raise ValidationError(
-                        _(
-                            "Le fichier %s ne semble pas être au bon format. "
-                            "Format CSV attendu."
-                        )
-                        % file.name
-                    )
-
-                data_filename = file.name.split("_")
-
-                if len(data_filename) != 5:
-                    raise ValidationError(
-                        _(
-                            "Le fichier %s ne semble pas correspondre "
-                            "au fichier attendu. Ex de nom de fichier correct: "
-                            "'23555861012080_09022023_08032023_Conso_CDC'."
-                        )
-                        % file.name
-                    )
-
-                date_begin_str = data_filename[1]
-                date_end_str = data_filename[2]
-                computed_data_type = data_filename[3].lower()
-
-                # Contrôle sur le type de données
-                ext_file = data_filename[4][:3]
-                if ext_file != "CDC":
-                    raise UserError(
-                        _(
-                            "Le fichier %s n'a pas le bon type de format, "
-                            "il doit se terminer par 'CDC'."
-                        )
-                        % file.name
-                    )
-
-                # Contrôles sur le type de données CDC
-                if computed_data_type != "prod" and computed_data_type != "surplus":
-                    computed_data_type = data_filename[3].lower()[:-1]
-                    if (
-                        computed_data_type != "cons"
-                        and computed_data_type != "autocons"
-                    ):
-                        raise UserError(
-                            _(
-                                "Le fichier %s ne correspond à aucun type "
-                                "de courbes de charge. il doit contenir Prod, Conso, "
-                                "Autoconso ou Surplus."
-                            )
-                            % file.name
-                        )
-
-                # Contrôle PRM
-                id_prm = data_filename[0]
-                # Vérification existance PRM
-                counter_id = self.env["acc.counter"].search([("name", "=", id_prm)])
-                if not counter_id:
-                    raise ValidationError(
-                        _("Fichier %(file)s : L'ID PRM %(prm)s ne semble pas exister.")
-                        % {"file": file.name, "prm": id_prm}
-                    )
-
-                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)
-
-                # Vérification si des données existent déjà
-                # pour cet intervalle de date
-                start_datetime = local_to_utc(date_begin_obj, "Europe/Paris")
-                end_datetime = local_to_utc(date_end_obj, "Europe/Paris")
-
-                domain_all = [
-                    ("date_slot", ">=", start_datetime),
-                    ("date_slot", "<", end_datetime),
-                    ("acc_operation_id", "=", self.id),
-                    ("comp_data_type", "=", computed_data_type),
-                    ("acc_counter_id", "=", counter_id.id),
-                ]
-                rec_ids = self.env["acc.enedis.cdc"].search(domain_all)
-                if rec_ids:
-                    mess += (
-                        "<p>Fichier "
-                        + file.name
-                        + ": des données existent déjà pour la période du "
-                        + str(date_begin_obj)
-                        + " au "
-                        + str(date_end_obj)
-                        + ". Etes-vous sûr de vouloir écraser "
-                        "les données existantes?</p>"
-                    )
-                else:
-                    mess += (
-                        "<p>Fichier "
-                        + file.name
-                        + ": <strong>Prêt à importer</strong></p>"
-                    )
-            return mess
-
-    def import_cdc(self):
+    def import_raw_cdc(self):
         # vérification des documents à importer
         mess = ""
         for operation in self:
diff --git a/views/acc_operation_views.xml b/views/acc_operation_views.xml
index da46155..530f8c3 100644
--- a/views/acc_operation_views.xml
+++ b/views/acc_operation_views.xml
@@ -2,7 +2,6 @@
 <!-- Copyright 2021- Le Filament (https://le-filament.com)
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-
     <record id="acc_operation_form_view" model="ir.ui.view">
         <field name="name">acc.acc_operation.form.import</field>
         <field name="model">acc.operation</field>
@@ -10,14 +9,13 @@
         <field name="arch" type="xml">
             <xpath expr="//header" position="inside">
                 <button
-                    string="Intégration des données manuelle"
+                    string="Intégration des brutes"
                     type="object"
                     class="btn-primary"
-                    name="import_cdc"
+                    name="import_raw_cdc"
                     groups="oacc.group_operation_superadmin"
                 />
             </xpath>
         </field>
     </record>
-
-</odoo>
+</odoo>
\ No newline at end of file
diff --git a/wizard/__pycache__/__init__.cpython-311.pyc b/wizard/__pycache__/__init__.cpython-311.pyc
index 78e85b4a7ecf28a9e25c83574d3ed9ed4da0ec2c..9815323fce0665d5b956165d265571c04951453f 100644
GIT binary patch
delta 32
ocmaFQ_?eMsIWI340|Ntt{+>N)6L~TiT_%=lF&8D4Pn;JB0Gj&>5C8xG

delta 28
kcmey&_@0qxIWI340|Ns?>e^+g6L~Ti9VV7)O<WuR0C<oH(*OVf

diff --git a/wizard/__pycache__/acc_operation_import_wizard.cpython-311.pyc b/wizard/__pycache__/acc_operation_import_wizard.cpython-311.pyc
index 61da2008e6e0e0a55c9a938e249dd7dd232abe07..eba5592b410ff1867473e1c649d5d41846ba7f47 100644
GIT binary patch
literal 2553
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
M`2|d3Dg=i*0I)Zwng9R*

literal 7083
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
UGs>>Wn|uUIegTu13c=n304SC2C;$Ke

diff --git a/wizard/acc_operation_import_wizard.py b/wizard/acc_operation_import_wizard.py
index 8a06972..b47a369 100644
--- a/wizard/acc_operation_import_wizard.py
+++ b/wizard/acc_operation_import_wizard.py
@@ -1,8 +1,8 @@
 # Copyright 2021- Le Filament (https://le-filament.com)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
-import base64
-import csv
-import io
+
+
+from odoo import api, fields, models
 from datetime import datetime, timedelta
 
 from dateutil.relativedelta import relativedelta
@@ -11,21 +11,12 @@ from odoo import api, fields, models
 
 from odoo.addons.api_connector.tools.date_utils import local_to_utc
 
-
 class AccOperationImportWizard(models.TransientModel):
-    _name = "acc.operation.import.wizard"
-    _description = "Wizard: Import des données brutes"
+    _inherit = "acc.operation.import.wizard"
 
     # ------------------------------------------------------
     # Fields declaration
     # ------------------------------------------------------
-    operation_id = fields.Many2one("acc.operation", "Opération liée")
-    message = fields.Text(
-        string="Message Logs",
-    )
-    attachment_ids = fields.Many2many(
-        comodel_name="ir.attachment", string="Documents à importer"
-    )
 
     # ------------------------------------------------------
     # SQL Constraints
@@ -34,12 +25,6 @@ class AccOperationImportWizard(models.TransientModel):
     # ------------------------------------------------------
     # Default methods
     # ------------------------------------------------------
-    @api.model
-    def default_get(self, fields_list):
-        # OVERRIDE
-        res = super().default_get(fields_list)
-        self._context.get("active_ids")
-        return res
 
     # ------------------------------------------------------
     # Computed fields / Search Fields
@@ -60,129 +45,36 @@ class AccOperationImportWizard(models.TransientModel):
     # ------------------------------------------------------
     # Business methods
     # ------------------------------------------------------
-    def valid_import(self):
-        message = ""
-        message += "<h1>Début Import manuelle: " + str(fields.Datetime.now()) + "</h1>"
-        for file in self.attachment_ids:
-            message += (
-                "<p><strong>Fichier "
-                + file.name
-                + "</strong><br/>Début Import ... <br/>"
-            )
-            data_filename = file.name.split("_")
-            id_pdm = data_filename[0]
-
-            counter_id = self.env["acc.counter"].search([("name", "=", id_pdm)])
-
-            computed_data_type = data_filename[3].lower()
-            if computed_data_type != "prod" and computed_data_type != "surplus":
-                computed_data_type = data_filename[3].lower()[:-1]
-
-            # Suppression des données si déjà existantes
-            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
-            )
-
-            # Vérification si des données existent déjà
-            # pour cet intervalle de date
-            start_datetime = local_to_utc(date_begin_obj, "Europe/Paris")
-            end_datetime = local_to_utc(date_end_obj, "Europe/Paris")
-
-            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["acc.enedis.cdc"].search(domain_all)
-            if rec_ids:
-                message += "Suppression des enregistrements existants ... <br/>"
-                rec_ids.unlink()
-                message += "Suppression des enregistrements existants OK <br/>"
-
-            file_decode = io.StringIO(base64.b64decode(file.datas).decode("UTF-8"))
-            file_decode.seek(0)
-
-            file_reader = []
-            csv_reader = csv.reader(file_decode, delimiter=";")
-            file_reader.extend(csv_reader)
-
-            # Create Data for the CDC
-            message += "Lecture et import des données ... <br/>"
-            for row in file_reader:
-                # Create 1st slot 0-30min
-                slot_datetime_tz = datetime.strptime(row[0], "%d/%m/%Y %H:%M")
-                slot_datetime_utc = local_to_utc(slot_datetime_tz, "Europe/Paris")
-                self.env["acc.enedis.cdc"].create(
-                    {
-                        "name": file.name,
-                        "acc_operation_id": self.operation_id.id,
-                        "acc_counter_id": counter_id.id,
-                        "comp_data_type": computed_data_type,
-                        "power": row[1],
-                        "date_slot": slot_datetime_utc,
-                    }
-                )
-                # Create 2nd slot 30-60min
-                self.env["acc.enedis.cdc"].create(
-                    {
-                        "name": file.name,
-                        "acc_operation_id": self.operation_id.id,
-                        "acc_counter_id": counter_id.id,
-                        "comp_data_type": computed_data_type,
-                        "power": row[2],
-                        "date_slot": slot_datetime_utc + timedelta(minutes=30),
-                    }
-                )
-
-            # Update partner_id for retrieved cdc
-            domain = [
-                ("acc_operation_id", "=", self.operation_id.id),
-                ("acc_counter_id", "=", counter_id.id or False),
-                (
-                    "prm_type",
-                    "=",
-                    "delivery"
-                    if computed_data_type in ("autocons", "cons")
-                    else "injection",
-                ),
-            ]
-            self.env["acc.counter.period"]._get_periods_from_interval(
-                domain, date_begin_obj, date_end_obj
-            )._update_cdc_partner_id()
-            message += "Fin de l'Import des données OK<br/>"
-            # Suppression du fichier après création des enregistrements
-            message += "Suppression du fichiers " + file.name + " ...<br/>"
-            file.unlink()
-            message += "Suppression OK </p>"
-
-        message += "<h1>Fin Import manuelle: " + str(fields.Datetime.now()) + "</h1>"
-        # Logs information logs
-        log_id = self.env["acc.logs"].create(
-            {
-                "name": "Import du " + str(fields.Date.today()) + " manuelle",
-                "date_launched": fields.Datetime.now(),
-                "type_log": "manual",
-                "message": message,
-                "acc_operation_id": self.operation_id.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]
+        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
         )
 
-        view_id = self.env.ref("oacc.acc_logs_form").id
-        return {
-            "name": "LOGS",
-            "view_type": "form",
-            "view_mode": "form",
-            "views": [(view_id, "form")],
-            "res_model": "acc.logs",
-            "view_id": view_id,
-            "type": "ir.actions.act_window",
-            "res_id": log_id.id,
-            "target": "new",
-            "flags": {"initial_mode": "view"},
-        }
+        # Vérification si des données existent déjà
+        # pour cet intervalle de date
+        start_datetime = local_to_utc(date_begin_obj, "Europe/Paris")
+        end_datetime = local_to_utc(date_end_obj, "Europe/Paris")
+
+        domain_all = [
+            ("date_slot", ">=", start_datetime),
+            ("date_slot", "<", end_datetime),
+            ("acc_operation_id", "=", self.operation_id.id),
+            ("comp_data_type", "=", data_filename[3]),
+            ("acc_counter_id", "=", counter_id.id),
+        ]
+        rec_ids = self.env["acc.enedis.raw.cdc"].search(domain_all)
+        if rec_ids:
+            message += "Suppression des enregistrements existants ... <br/>"
+            rec_ids.unlink()
+            message += "Suppression des enregistrements existants OK <br/>"
+
+        return message
+
+    def create_curve(self, curve_data):
+        self.env["acc.enedis.raw.cdc"].create(curve_data)
diff --git a/wizard/acc_operation_import_wizard_views.xml b/wizard/acc_operation_import_wizard_views.xml
deleted file mode 100644
index 53a9b3c..0000000
--- a/wizard/acc_operation_import_wizard_views.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!-- Copyright 2021- Le Filament (https://le-filament.com)
-     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
-<odoo>
-
-    <record id="acc_operation_import_wizard_form" model="ir.ui.view">
-        <field name="name">acc.operation.import.wizard.form</field>
-        <field name="model">acc.operation.import.wizard</field>
-        <field name="arch" type="xml">
-            <form string="Import des fichiers">
-                <div>
-                    <field
-                        class="o_field_header"
-                        name="message"
-                        readonly="1"
-                        widget="html"
-                    />
-                </div>
-                <group>
-                    <field name="operation_id" invisible="1" />
-                    <field name="attachment_ids" invisible="1" />
-                </group>
-                <footer>
-                    <button
-                        name="valid_import"
-                        type="object"
-                        string="Valider l'import"
-                        class="oe_highlight"
-                    />
-                    <button special="cancel" string="Annuler" />
-                </footer>
-            </form>
-        </field>
-    </record>
-
-</odoo>
-- 
GitLab