Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • e8bc0b5a140f78ec5338c4c1d3438466448368bf
  • 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,12 Kio
    # Copyright 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    import json
    import base64
    import pandas as pd
    from io import StringIO
    from odoo import fields, models, api
    from datetime import datetime, timedelta, date
    from odoo.exceptions import UserError
    from odoo.tools import date_utils
    
    from dateutil.relativedelta import relativedelta
    
    
    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()