Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 1a86b5c1697247947a00132ee2bcc3d202e92509
  • 14.0 par défaut protégée
  • 16.0
  • addOperationDescription
  • 14.0_optim
5 résultats

acc_operation.py

Blame
  • acc_operation.py 6,34 Kio
    # Copyright 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    import base64
    from datetime import datetime, timedelta
    from io import StringIO
    
    import pandas as pd
    
    from odoo import _, api, fields, models
    from odoo.exceptions import UserError
    
    
    class AccOperation(models.Model):
        _name = "acc.operation"
        _inherit = ["mail.thread", "image.mixin"]
        _description = "Opération"
    
        # ------------------------------------------------------
        # Fields declaration
        # ------------------------------------------------------
        active = fields.Boolean(default=True)
        name = fields.Char("ID Convention Enedis", required=True)
        description = fields.Char("Description")
        pmo_id = fields.Many2one(
            comodel_name="res.partner",
            string="PMO",
            domain="[('is_pmo', '=', True)]",
            required=True,
        )
        acc_injection_ids = fields.One2many(
            comodel_name="acc.counter",
            inverse_name="acc_operation_id",
            domain=[("is_injection", "=", True)],
            string="Points d'injection",
        )
        acc_delivery_ids = fields.One2many(
            comodel_name="acc.counter",
            inverse_name="acc_operation_id",
            domain=[("is_delivery", "=", True)],
            string="Points de soutirage",
        )
        acc_enedis_import_logs_ids = fields.One2many(
            comodel_name="acc.enedis.import.logs",
            inverse_name="acc_operation_id",
            string="Table des logs",
        )
        acc_enedis_cdc_ids = fields.One2many(
            comodel_name="acc.enedis.cdc",
            inverse_name="acc_operation_id",
            string="Table des courbes",
        )
        distribution_key = fields.Selection(
            [
                ("statique", "Statique"),
                ("dynamique", "Dynamique par défaut"),
                ("dynamique_perso", "Dynamique personnalisée"),
            ],
            string="Clés de répartition",
        )
        date_start_contract = fields.Date(
            string="Date de début", default=fields.Date.context_today
        )
        date_end_contract = fields.Date(
            string="Date de fin", default=fields.Date.context_today
        )
        birthday_date = fields.Integer(
            string="Date d'anniversaire calculée",
            compute="_compute_birthday_date",
            store=True,
        )
    
        # ------------------------------------------------------
        # SQL Constraints
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Default methods
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Computed fields / Search Fields
        # ------------------------------------------------------
        @api.depends("date_start_contract")
        def _compute_birthday_date(self):
            for operation in self:
                if operation.date_start_contract:
                    operation.birthday_date = operation.date_start_contract.day
    
        # ------------------------------------------------------
        # Onchange / Constraints
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # CRUD methods (ORM overrides)
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Actions
        # ------------------------------------------------------
        def import_enedis_data(self):
            for operation in self:
                files = self.env["ir.attachment"].search(
                    [("res_model", "=", "acc.operation"), ("res_id", "=", operation.id)]
                )
                if not files:
                    raise UserError(_("Pas de fichiers à intégrer"))
                else:
                    for file in files:
                        data_filename = file.name.split("_")
                        id_pdm = data_filename[0]
                        counter_id = self.env["acc.counter"]
                        if id_pdm != self.name:
                            # Get the counter ID from file name
                            counter_id = self.env["acc.counter"].search(
                                [("name", "=", id_pdm)]
                            )
    
                        computed_data_type = data_filename[3]
                        file_decode = StringIO(base64.b64decode(file.datas).decode("UTF-8"))
                        file_decode.seek(0)
                        # reader = pd.read_csv(file_decode, header=None, delimiter=';')
                        reader = pd.read_csv(file_decode, header=None, delimiter=";")
    
                        if data_filename[4] == "CDC.csv":
                            # Create Data for the CDC
                            for row in reader.values:
                                # Create 1st slot 0-30min
                                date_slot = datetime.strptime(row[0], "%d/%m/%Y %H:%M")
                                # date_slot = row[0]
                                self.env["acc.enedis.cdc"].create(
                                    {
                                        "name": file.name,
                                        "acc_operation_id": self.id,
                                        "acc_counter_id": counter_id.id or False,
                                        "comp_data_type": computed_data_type,
                                        "power": row[1],
                                        "date_slot": date_slot,
                                    }
                                )
                                # Create 2nd slot 30-60min
                                date_slot_30 = date_slot + timedelta(minutes=30)
                                self.env["acc.enedis.cdc"].create(
                                    {
                                        "name": file.name,
                                        "acc_operation_id": self.id,
                                        "acc_counter_id": counter_id.id or False,
                                        "comp_data_type": computed_data_type,
                                        "power": row[2],
                                        "date_slot": date_slot_30,
                                    }
                                )
    
                        # Logs information logs
                        self.env["acc.enedis.import.logs"].create(
                            {
                                "name": file.name,
                                "acc_operation_id": self.id,
                            }
                        )
    
                        # Delete file after creation
                        file.unlink()