diff --git a/models/acc_operation.py b/models/acc_operation.py index 9bfe32e10e6975e13a67d45dcc14104d23a77a2a..4acd9227321c3e87c3dd92050a25386d50c44f8c 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -9,8 +9,6 @@ from odoo.exceptions import ValidationError from odoo.osv import expression from odoo.tools import date_utils -DEFAULT_MONTH_RANGE = 3 - class AccOperation(models.Model): _inherit = "acc.operation" @@ -49,7 +47,9 @@ class AccOperation(models.Model): start_date, end_date = self.get_interval("month", last_record) query = """ SELECT - date_trunc('month', cdc.date_slot) AS date_slot, + date_trunc('month', + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris' + ) AS date_slot, (SUM( (CASE WHEN cdc.comp_data_type = 'cons' THEN cdc.power ELSE 0 END) )/2) / 1000 as conso_tot, @@ -67,7 +67,8 @@ class AccOperation(models.Model): cdc.acc_operation_id = %s AND cdc.date_slot >= %s AND cdc.date_slot <= %s - GROUP BY date_trunc('month', cdc.date_slot); + GROUP BY date_trunc('month', + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris'); """ query_params = ( self.id, @@ -78,18 +79,19 @@ class AccOperation(models.Model): raw_data = self.env.cr.fetchone() return raw_data[1], raw_data[2], raw_data[3], start_date - def get_last_cdc_record(self): + def get_last_cdc_record(self, partner_id=None): """ @returns: last acc.enedis.cdc record in operations """ + domain = [("acc_operation_id", "in", self.ids)] + if partner_id: + domain = expression.AND([domain, [("partner_id", "=", partner_id)]]) # Get last date slot recorded last_record = ( self.env["acc.enedis.cdc"] .sudo() .search( - [ - ("acc_operation_id", "in", self.ids), - ], + domain, limit=1, order="date_slot DESC", ) @@ -100,7 +102,7 @@ class AccOperation(models.Model): return last_record - def get_interval(self, scale, last_record): + def get_interval(self, scale, cdc_record): """ Fonction retournant une date de début et une date de fin. Ces dates sont calculées en fonction de l'échelle choisie et du dernier @@ -114,14 +116,14 @@ class AccOperation(models.Model): date de début = début de l'année du dernier jour de données :param str scale: type d'affichage des graphes (day/week/month/year) - :param object last_record: Dernier enregistrement dans la base + :param object cdc_record: courbe de charge (table acc.enedis.cdc) @returns: une date de début et une date de fin """ # Convert end datetime to timezone - last_day_start = datetime.combine(last_record.date_slot, time.min) - last_day_end = datetime.combine(last_record.date_slot, time.max) - start_month, end_month = date_utils.get_month(last_record.date_slot) + last_day_start = datetime.combine(cdc_record.date_slot, time.min) + last_day_end = datetime.combine(cdc_record.date_slot, time.max) + start_month, end_month = date_utils.get_month(cdc_record.date_slot) if scale == "year": end_date = end_month @@ -160,13 +162,13 @@ class AccOperation(models.Model): step_display_curve = "hour" # Calculate delta between 2 dates delta = (end_date - start_date).days - if delta > 1 and delta < 32: + if delta > 0 and delta < 31: step_display_curve = "day" display_hourly_curves = True - elif delta >= 32 and delta <= 366: + elif delta >= 31 and delta <= 365: step = "month" step_display_curve = "month" - elif delta > 366: + elif delta > 365: step = "year" step_display_curve = "year" @@ -194,7 +196,9 @@ class AccOperation(models.Model): query = """ SELECT - date_trunc(%s, cdc.date_slot) AS date_slot, + date_trunc(%s, + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris' + ) AS date_slot, (SUM( (CASE WHEN cdc.comp_data_type = 'cons' THEN cdc.power ELSE 0 END) )/2) / 1000 as cons, @@ -213,7 +217,8 @@ 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 - GROUP BY date_trunc(%s, cdc.date_slot) + GROUP BY date_trunc(%s, + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris') ORDER BY date_slot ASC; """ query_params = ( @@ -258,7 +263,9 @@ class AccOperation(models.Model): query = """ SELECT - date_trunc('day', cdc.date_slot) AS date_slot, + date_trunc('day', + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris' + ) AS date_slot, (SUM( (CASE WHEN cdc.comp_data_type = 'autocons' THEN cdc.power ELSE 0 END) )/2) / 1000 as autocons, @@ -275,7 +282,8 @@ class AccOperation(models.Model): AND cdc.acc_counter_id IN %s AND cdc.date_slot >= %s AND cdc.date_slot <= %s - GROUP BY date_trunc('day', cdc.date_slot) + GROUP BY date_trunc('day', + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris') ORDER BY date_slot ASC; """ query_params = ( @@ -316,7 +324,9 @@ class AccOperation(models.Model): query = """ SELECT - date_trunc(%s, cdc.date_slot) AS date_slot, + date_trunc(%s, + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris' + ) AS date_slot, ((SUM((CASE WHEN cdc.comp_data_type = 'prod' THEN cdc.power ELSE 0 END)) @@ -334,7 +344,8 @@ class AccOperation(models.Model): AND cdc.acc_operation_id IN %s AND cdc.date_slot >= %s AND cdc.date_slot <= %s - GROUP BY date_trunc(%s, cdc.date_slot) + GROUP BY date_trunc(%s, + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris') ORDER BY date_slot ASC; """ query_params = ( @@ -375,7 +386,9 @@ class AccOperation(models.Model): query = """ SELECT - date_trunc('day', cdc.date_slot) AS date_slot, + date_trunc('day', + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris' + ) AS date_slot, ((SUM((CASE WHEN cdc.comp_data_type = 'prod' THEN cdc.power ELSE 0 END)) @@ -393,7 +406,8 @@ class AccOperation(models.Model): AND cdc.acc_operation_id IN %s AND cdc.date_slot >= %s AND cdc.date_slot <= %s - GROUP BY date_trunc('day', cdc.date_slot) + GROUP BY date_trunc('day', + cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris') ORDER BY date_slot ASC; """ query_params = ( @@ -416,11 +430,19 @@ class AccOperation(models.Model): } return cdc_jour - def get_date_min_max(self): + def get_date_min_max(self, partner_id=None): self.ensure_one() - last_record = self.get_last_cdc_record() + last_record = self.get_last_cdc_record(partner_id) date_max = last_record.date_slot.strftime("%d/%m/%Y") - date_min = self.date_start_contract.strftime("%d/%m/%Y") + if partner_id: + first_date = self.env["acc.counter.period"].search( + [("acc_operation_id", "=", self.id), ("partner_id", "=", partner_id)], + order="start_date ASC", + limit=1, + ) + date_min = first_date.start_date.strftime("%d/%m/%Y") + else: + date_min = self.date_start_contract.strftime("%d/%m/%Y") return {"date_min": date_min, "date_max": date_max} # ------------------------------------------------------ @@ -495,7 +517,7 @@ class AccOperation(models.Model): chart_data.update(chart_data_prod) result_graph["chart_data"] = chart_data - result_graph.update(self.get_date_min_max()) + result_graph.update(self.get_date_min_max(partner_id)) result_graph.update( { "start_date": start_date,