diff --git a/models/acc_operation.py b/models/acc_operation.py index 3241845914c4529a91d01a6b6d822cf0ea0db0fc..23a3f2269275da58b63a9b18b99323f9bc5483d7 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -115,22 +115,48 @@ class AccOperation(models.Model): "de consommation</strong><br/>" ) for usage_point_id in usage_point_cons_ids: - desc = ( - "Opération: " - + self.name - + " - PRM: " - + usage_point_id.name - + " - Date: " - + str(fields.Datetime.today()) - + " - Période: du " - + str(start_date) - + " au " - + str(end_date) - ) - message += desc + "<br/>" - self.with_delay(description=desc).get_definitive_load_curves( - start_date, end_date, usage_point_id, "cons" + # Vérification que le PRM est actif sur la période demandée + period_ids = self.env["acc.counter.period"]._get_periods_from_interval( + [ + ("acc_operation_id", "=", self.id), + ("acc_counter_id", "=", usage_point_id.id), + ("prm_type", "=", "delivery"), + ], + start_date, + end_date, ) + # Si pas de période de PRM, on ne fait pas d'appel API + if not period_ids: + message += ( + "Opération: " + + self.name + + " - PRM: " + + usage_point_id.name + " - aucune période trouvée du " + str(start_date) + + " au " + + str(end_date) + "<br/>"") + # Si période de PRM on vérifie les dates puis on appelle l'API + else: + start_date_upd = max(start_date, period_ids[0].start_date) + if period_ids[-1].end_date: + end_date_upd = min(end_date, period_ids[-1].end_date) + else: + end_date_upd = end_date + desc = ( + "Opération: " + + self.name + + " - PRM: " + + usage_point_id.name + + " - Date: " + + str(fields.Datetime.today()) + + " - Période: du " + + str(start_date_upd) + + " au " + + str(end_date_upd) + ) + message += desc + "<br/>" + self.with_delay(description=desc).get_definitive_load_curves( + start_date_upd, end_date_upd, usage_point_id, "cons" + ) if usage_point_prod_ids: # Traitement données de prod @@ -139,25 +165,51 @@ class AccOperation(models.Model): "de production</strong><br/>" ) for usage_point_id in usage_point_prod_ids: - desc = ( - "Opération: " - + self.name - + " - PRM: " - + usage_point_id.name - + " - Date: " - + str(fields.Datetime.today()) - + " - Période: du " - + str(start_date) - + " au " - + str(end_date) - ) - message += desc + "<br/>" - self.with_delay(description=desc).get_definitive_load_curves( + # Vérification que le PRM est actif sur la période demandée + period_ids = self.env["acc.counter.period"]._get_periods_from_interval( + [ + ("acc_operation_id", "=", self.id), + ("acc_counter_id", "=", usage_point_id.id), + ("prm_type", "=", "injection"), + ], start_date, end_date, - usage_point_id, - "prod", ) + # Si pas de période de PRM, on ne fait pas d'appel API + if not period_ids: + message += ( + "Opération: " + + self.name + + " - PRM: " + + usage_point_id.name + " - aucune période trouvée du " + str(start_date) + + " au " + + str(end_date) + "<br/>"") + # Si période de PRM on vérifie les dates puis on appelle l'API + else: + start_date_upd = max(start_date, period_ids[0].start_date) + if period_ids[-1].end_date: + end_date_upd = min(end_date, period_ids[-1].end_date) + else: + end_date_upd = end_date + desc = ( + "Opération: " + + self.name + + " - PRM: " + + usage_point_id.name + + " - Date: " + + str(fields.Datetime.today()) + + " - Période: du " + + str(start_date_upd) + + " au " + + str(end_date_upd) + ) + message += desc + "<br/>" + self.with_delay(description=desc).get_definitive_load_curves( + start_date_upd, + end_date_upd, + usage_point_id, + "prod", + ) message += ( "<br/><h1>Fin de création des jobs de récupération des courbes: " diff --git a/wizards/acc_operation_wizard.py b/wizards/acc_operation_wizard.py index 875fdbb2b15b45b8b09a1afa37e8c14f940d5225..0c0a8221d9a1c6c0faa60b564b23b62250cc8a12 100644 --- a/wizards/acc_operation_wizard.py +++ b/wizards/acc_operation_wizard.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) from odoo import _, fields, models from odoo.exceptions import UserError +from odoo.osv import expression class AccOperationWizard(models.TransientModel): @@ -29,8 +30,6 @@ class AccOperationWizard(models.TransientModel): relation="acc_counter_cons_rel", column1="cons_id", column2="op_id", - # TODO: rework domain ? - # domain=[("prm_type", "=", "injection")], string="PRM de soutirage", ) prm_prod_ids = fields.Many2many( @@ -38,8 +37,6 @@ class AccOperationWizard(models.TransientModel): relation="acc_counter_prod_rel", column1="prod_id", column2="op_id", - # TODO: rework domain ? - # domain=[("is_injection", "=", True)], string="PRM d'injection", ) @@ -67,45 +64,63 @@ class AccOperationWizard(models.TransientModel): # Actions # ------------------------------------------------------ def get_curves(self): - if not self.end_date and not self.start_date: + if not self.start_date or not self.end_date: raise UserError( _("Les champs Date de début et Date de fin sont obligatoires") ) if (self.end_date - self.start_date).days > 31: raise UserError(_("L'intervalle de temps ne doit pas dépasser 31 Jours")) - if self.end_date <= self.start_date: + if self.start_date >= self.end_date: raise UserError(_("La date de fin doit être supérieure à la date de début")) - # Vérification si des données existent déjà - # pour cet intervalle de date - domain_all = [ - ("date_slot", ">=", self.start_date), - ("date_slot", "<", self.end_date), + # Instanciation des domaines de recherche + domain_base = [ ("acc_operation_id", "=", self.operation_id.id), ] - if self.prm_cons_ids and self.prm_prod_ids: - domain_all += [ - "|", - "&", + domain_extra = [] + domain_extra_cdc = [] + if self.prm_cons_ids: + domain_cons = [ ("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), - ("comp_data_type", "in", ("autocons", "cons")), ] - elif self.prm_prod_ids: - domain_all += [ + domain_cons_cdc = expression.AND( + [domain_cons, [("comp_data_type", "in", ("autocons", "cons"))]] + ) + domain_extra = domain_cons + domain_extra_cdc = domain_cons_cdc + if self.prm_prod_ids: + domain_prod = [ ("acc_counter_id", "in", self.prm_prod_ids.ids), - ("comp_data_type", "in", ("prod", "surplus")), ] + domain_prod_cdc = expression.AND( + [domain_prod, [("comp_data_type", "in", ("prod", "surplus"))]] + ) + domain_extra = domain_prod + domain_extra_cdc = domain_prod_cdc + if self.prm_cons_ids and self.prm_prod_ids: + domain_extra = expression.OR([domain_cons, domain_prod]) + domain_extra_cdc = expression.OR([domain_cons_cdc, domain_prod_cdc]) + + domain_periods = expression.AND([domain_base, domain_extra]) + domain_date = [ + ("date_slot", ">=", self.start_date), + ("date_slot", "<", self.end_date), + ] + domain_cdc = expression.AND([domain_base, domain_extra_cdc, domain_date]) - rec_ids = self.env["acc.enedis.cdc"].search(domain_all) + # Vérification que des périodes existent pour cet intervalle de date + period_ids = self.env["acc.counter.period"]._get_periods_from_interval( + domain_periods, + self.start_date, + self.end_date, + ) + if not period_ids: + raise UserError(_("Aucun période trouvée pour le(s) PRM(s) et la période demandés")) + + # Vérification si des données existent déjà + # pour cet intervalle de date + rec_ids = self.env["acc.enedis.cdc"].search(domain_cdc) if rec_ids: wizard = self.env["acc.operation.wizard.confirm"].create( { diff --git a/wizards/acc_operation_wizard_confirm.py b/wizards/acc_operation_wizard_confirm.py index 0935682f5fbc765a3e9a8bab4f352e09ed40665a..03d49f2c44e385f8596f810484d48274a2a1d875 100644 --- a/wizards/acc_operation_wizard_confirm.py +++ b/wizards/acc_operation_wizard_confirm.py @@ -18,8 +18,6 @@ class AccOperationWizardConfirm(models.TransientModel): relation="acc_counter_cons_confirm_rel", column1="cons_id", column2="op_id", - # TODO: rework domain ? - # domain=[("is_delivery", "=", True)], string="PRM de soutirage", ) prm_prod_ids = fields.Many2many( @@ -27,8 +25,6 @@ class AccOperationWizardConfirm(models.TransientModel): relation="acc_counter_prod_confirm_rel", column1="prod_id", column2="op_id", - # TODO: rework domain ? - # domain=[("is_injection", "=", True)], string="PRM d'injection", ) rec_ids = fields.Many2many("acc.enedis.cdc", string="Records") diff --git a/wizards/acc_operation_wizard_views.xml b/wizards/acc_operation_wizard_views.xml index 760ceca41c2f4e6f6659d3ac2d14eed2a669de2f..3f8025f44b21b217b74240ebb2419bf22f3c3a65 100644 --- a/wizards/acc_operation_wizard_views.xml +++ b/wizards/acc_operation_wizard_views.xml @@ -14,15 +14,14 @@ name="prm_cons_ids" widget="many2many_tags" options="{'no_create_edit': True, 'no_create': True}" + domain="[('type', 'in', ('del', 'del_inj')), ('acc_operation_id', '=', operation_id)]" /> - <!-- TODO rework domain="[('prm_type', '=', 'delivery'), ('acc_operation_id', '=', operation_id)]" --> - <field name="prm_prod_ids" widget="many2many_tags" options="{'no_create_edit': True, 'no_create': True}" + domain="[('type', 'in', ('del_inj', 'inj')), ('acc_operation_id', '=', operation_id)]" /> - <!-- TODO rework domain="[('is_injection', '=', True), ('acc_operation_id', '=', operation_id)]" --> </group> <group name="period" string="Période" col="2"> <field name="start_date" />