diff --git a/models/acc_operation.py b/models/acc_operation.py index 84eb2da4f16c4eacae4fe7c30e4bfc645cdf6264..7d1d0eff3fb56274cfd7868d98a87b093d3c529c 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -1,12 +1,11 @@ # Copyright 2023 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from datetime import datetime, time from dateutil.relativedelta import relativedelta from odoo import _, models -from odoo.exceptions import ValidationError +from odoo.exceptions import ValidationError, UserError from odoo.osv import expression from odoo.tools import date_utils @@ -173,7 +172,9 @@ class AccOperation(models.Model): return display_hourly_curves, step, step_display_curve - def get_cdc_by_query_cons(self, slot_type, start_date, end_date, prm_ids=None): + def get_cdc_by_query_cons( + self, slot_type, start_date, end_date, prm_ids=None, partner_ids=None + ): """ Fonction permettant de récupérer les données pour la construction des chart pour une ou des opérations données @@ -214,6 +215,7 @@ class AccOperation(models.Model): AND ( cdc.acc_counter_id IN %s OR cdc.comp_data_type = 'prod' ) AND cdc.date_slot >= %s AND cdc.date_slot <= %s + AND cdc.partner_id IN %s GROUP BY date_trunc(%s, cdc.date_slot) ORDER BY date_slot ASC; """ @@ -223,6 +225,7 @@ class AccOperation(models.Model): tuple(prm_ids.ids), start_date, end_date, + tuple(partner_ids.ids), slot_type, ) self.env.cr.execute(query, query_params) @@ -243,7 +246,9 @@ class AccOperation(models.Model): } return cdc_cons - def get_cdc_by_query_daily_histo_cons(self, start_date, end_date, prm_ids=None): + def get_cdc_by_query_daily_histo_cons( + self, start_date, end_date, prm_ids=None, partner_ids=None + ): """ Fonction permettant de récupérer les données pour la construction des chart pour une ou des opérations données pour les consommateurs @@ -276,6 +281,7 @@ class AccOperation(models.Model): AND cdc.acc_counter_id IN %s AND cdc.date_slot >= %s AND cdc.date_slot <= %s + AND cdc.partner_id IN %s GROUP BY date_trunc('day', cdc.date_slot) ORDER BY date_slot ASC; """ @@ -284,6 +290,7 @@ class AccOperation(models.Model): tuple(prm_ids.ids), start_date, end_date, + tuple(partner_ids.ids), ) self.env.cr.execute(query, query_params) raw_data = self.env.cr.fetchall() @@ -299,7 +306,9 @@ class AccOperation(models.Model): } return cdc_cons - def get_cdc_by_query_prod(self, slot_type, start_date, end_date, prm_ids=None): + def get_cdc_by_query_prod( + self, slot_type, start_date, end_date, prm_ids=None, partner_ids=None + ): """ Fonction permettant de récupérer les données pour la construction des chart pour une ou des opérations données pour les consommateurs @@ -335,6 +344,7 @@ class AccOperation(models.Model): AND cdc.acc_operation_id IN %s AND cdc.date_slot >= %s AND cdc.date_slot <= %s + AND cdc.partner_id IN %s GROUP BY date_trunc(%s, cdc.date_slot) ORDER BY date_slot ASC; """ @@ -344,6 +354,7 @@ class AccOperation(models.Model): tuple(self.ids), start_date, end_date, + tuple(partner_ids.ids), slot_type, ) self.env.cr.execute(query, query_params) @@ -360,7 +371,9 @@ class AccOperation(models.Model): } return cdc_prod - def get_cdc_by_query_daily_histo_prod(self, start_date, end_date, prm_ids=None): + def get_cdc_by_query_daily_histo_prod( + self, start_date, end_date, prm_ids=None, partner_ids=None + ): """ Fonction permettant de récupérer les données pour la construction des chart pour une ou des opérations données pour les consommateurs @@ -394,6 +407,7 @@ class AccOperation(models.Model): AND cdc.acc_operation_id IN %s AND cdc.date_slot >= %s AND cdc.date_slot <= %s + AND cdc.partner_id IN %s GROUP BY date_trunc('day', cdc.date_slot) ORDER BY date_slot ASC; """ @@ -402,6 +416,7 @@ class AccOperation(models.Model): tuple(self.ids), start_date, end_date, + tuple(partner_ids.ids), ) self.env.cr.execute(query, query_params) raw_data = self.env.cr.fetchall() @@ -457,40 +472,43 @@ class AccOperation(models.Model): start_date=start_date, end_date=end_date ) - # TODO: ajouter filtre par période de PRM en fonction date de début / fin - # (si prm_id ou partner_id) + domain = [["acc_operation_id", "=", self.id]] - # Si prm_id alors filtrer pour n'afficher que ce compteur if prm_id: - acc_counter_ids = self.env["acc.counter"].browse(prm_id) - else: - # Filtre par défaut = même opération - domain = [["acc_operation_id", "=", self.id]] - # Si partner_id alors on ne prend que les PRMs appartenant à ce contact - if partner_id: - domain = expression.AND([domain, [("partner_id", "=", partner_id)]]) - acc_counter_ids = ( - self.env["acc.counter.period"].search(domain).mapped("acc_counter_id") + domain = expression.AND([domain, [("acc_counter_id", "=", prm_id)]]) + if partner_id: + domain = expression.AND([domain, [("partner_id", "=", partner_id)]]) + periods = ( + self.env["acc.counter.period"] + .sudo() + ._get_periods_from_interval( + domain=domain, start_date=start_date, end_date=end_date ) + ) + if periods: + acc_counter_ids = periods.mapped("acc_counter_id") + acc_partner_ids = periods.mapped("partner_id") + else: + raise UserError(_("No data found")) chart_data = {} if data_type == "cons" or data_type == "pmo": chart_data_cons = self.get_cdc_by_query_cons( - step_curve, start_date, end_date, acc_counter_ids + step_curve, start_date, end_date, acc_counter_ids, acc_partner_ids ) if display_hourly_curves: chart_data_histo = self.get_cdc_by_query_daily_histo_cons( - start_date, end_date, acc_counter_ids + start_date, end_date, acc_counter_ids, acc_partner_ids ) chart_data_cons.update(chart_data_histo) chart_data.update(chart_data_cons) if data_type == "prod" or data_type == "pmo": chart_data_prod = self.get_cdc_by_query_prod( - step_curve, start_date, end_date, acc_counter_ids + step_curve, start_date, end_date, acc_counter_ids, acc_partner_ids ) if display_hourly_curves: chart_data_histo = self.get_cdc_by_query_daily_histo_prod( - start_date, end_date, acc_counter_ids + start_date, end_date, acc_counter_ids, acc_partner_ids ) chart_data_prod.update(chart_data_histo) chart_data.update(chart_data_prod)