diff --git a/models/acc_operation.py b/models/acc_operation.py index 699514f1735684fb34bfb74f8c522606c6b80da5..73619b563b13a25a4e168115c6483be684688477 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -1,9 +1,8 @@ # Copyright 2023 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import pytz from datetime import datetime, time - from dateutil.relativedelta import relativedelta - from odoo import _, models from odoo.exceptions import ValidationError, UserError from odoo.osv import expression @@ -47,9 +46,10 @@ class AccOperation(models.Model): # Get last date slot recorded last_record = self.get_last_cdc_record() start_date, end_date = self.get_interval("month", last_record) + end_date_mounth = end_date + relativedelta(days=1) 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, @@ -66,13 +66,13 @@ class AccOperation(models.Model): WHERE cdc.acc_operation_id = %s AND cdc.date_slot >= %s - AND cdc.date_slot <= %s - GROUP BY date_trunc('month', cdc.date_slot); + AND cdc.date_slot < %s + GROUP BY date_trunc('month', cdc.date_slot AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris'); """ query_params = ( self.id, - start_date, - end_date, + self._convert_time(start_date), + self._convert_time(end_date_mounth), ) self.env.cr.execute(query, query_params) raw_data = self.env.cr.fetchone() @@ -159,7 +159,7 @@ class AccOperation(models.Model): step = "hour" step_display_curve = "hour" # Calculate delta between 2 dates - delta = (end_date - start_date).days + delta = (self._convert_time(end_date) - self._convert_time(start_date)).days if delta < 32: step_display_curve = "day" display_hourly_curves = True @@ -197,7 +197,7 @@ 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, @@ -217,7 +217,7 @@ class AccOperation(models.Model): AND cdc.date_slot >= %s AND cdc.date_slot <= %s AND cdc.partner_id IN %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 = ( @@ -266,7 +266,7 @@ 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, @@ -284,7 +284,7 @@ class AccOperation(models.Model): AND cdc.date_slot >= %s AND cdc.date_slot <= %s AND cdc.partner_id IN %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 = ( @@ -329,7 +329,7 @@ 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)) @@ -348,7 +348,7 @@ class AccOperation(models.Model): AND cdc.date_slot >= %s AND cdc.date_slot <= %s AND cdc.partner_id IN %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 = ( @@ -393,7 +393,7 @@ 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)) @@ -412,7 +412,7 @@ class AccOperation(models.Model): AND cdc.date_slot >= %s AND cdc.date_slot <= %s AND cdc.partner_id IN %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 = ( @@ -470,8 +470,10 @@ class AccOperation(models.Model): """ self.ensure_one() result_graph = {} - start_date = datetime.strptime(start_date, "%d/%m/%Y") - end_date = datetime.combine(datetime.strptime(end_date, "%d/%m/%Y"), time.max) + start_date = self._convert_time(datetime.strptime(start_date, "%d/%m/%Y")) + end_date = self._convert_time( + datetime.combine(datetime.strptime(end_date, "%d/%m/%Y"), time.max) + ) display_hourly_curves, step_curve, step_display_curve = self.get_step_from_date( start_date=start_date, end_date=end_date ) @@ -528,3 +530,11 @@ class AccOperation(models.Model): } ) return result_graph + + def _convert_time(self, intitial_time): + return ( + pytz.timezone("Europe/Paris") + .localize(intitial_time) + .astimezone(pytz.UTC) + .replace(tzinfo=None) + )