diff --git a/models/acc_operation.py b/models/acc_operation.py index 5bd35b6739ac82342210aef96285aed09d44beb1..61f41cff512b6a26e98fe620f584427c597ceb65 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -1,10 +1,10 @@ # Copyright 2021- Le Filament (https://le-filament.com) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from datetime import datetime, time +from datetime import datetime from dateutil.relativedelta import relativedelta -from odoo import _, models +from odoo import _, fields, models from odoo.exceptions import ValidationError from odoo.osv import expression from odoo.tools import date_utils @@ -47,14 +47,16 @@ class AccOperation(models.Model): start_date, end_date = self.get_interval("month", last_record) end_date_month = end_date + relativedelta(days=1) query = ( - self._select_clause("month", ["cons", "prod", "autocons"]) + self._select_clause( + date_slot="month", curve_types=["cons", "prod", "autocons"] + ) + self._from_clause() + self._where_clause( - self.id, - start_date, - end_date_month, + operation_id=self.id, + start_date=start_date, + end_date=end_date_month, ) - + self._group_clause("month") + + self._group_clause(date_slot="month") + self._order_clause() ) self.env.cr.execute(query) @@ -103,9 +105,8 @@ class AccOperation(models.Model): """ # Convert end datetime to timezone - 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) + cdc_datetime = fields.Datetime.context_timestamp(self, cdc_record.date_slot) + start_month, end_month = date_utils.get_month(cdc_datetime) if scale == "year": end_date = end_month @@ -114,11 +115,11 @@ class AccOperation(models.Model): end_date = end_month start_date = start_month elif scale == "week": - end_date = last_day_end - start_date = last_day_end - relativedelta(days=7) + end_date = cdc_datetime.date() + start_date = cdc_datetime.date() - relativedelta(days=6) elif scale == "day": - end_date = last_day_end - start_date = last_day_start + end_date = cdc_datetime.date() + start_date = cdc_datetime.date() else: raise ValueError( _( @@ -222,8 +223,8 @@ class AccOperation(models.Model): Function to build WHERE section of query for retrieving curves @param int operation_id : id of operation for which curves should be retrieved - datetime start_date : first datetime to be retrieved - datetime end_date : last datetime to be retrieved + date start_date : first date to be retrieved + date end_date : last date to be retrieved int prm_id : id of PRM to be retrieved (optional) char extra_curve_type : extra curve to be retrieved (optional) (allowed values : 'cons', 'autocons', 'allocons', @@ -236,10 +237,13 @@ class AccOperation(models.Model): and not isinstance(end_date, datetime) ): raise ValidationError(_("WHERE clause parameters incorrect")) + + start_datetime = self._convert_time(start_date) + end_datetime = self._convert_time(end_date) result = f""" WHERE cdc.acc_operation_id = {operation_id} - AND cdc.date_slot >= '{start_date}' - AND cdc.date_slot < '{end_date}' + AND cdc.date_slot >= '{start_datetime}' + AND cdc.date_slot < '{end_datetime}' """ if prm_id and isinstance(prm_id, int): if extra_curve_type and extra_curve_type in ( @@ -303,13 +307,15 @@ class AccOperation(models.Model): data_prod = [] query = ( - self._select_clause(slot_type, ["cons", "autocons", "prod"]) + self._select_clause( + date_slot=slot_type, curve_types=["cons", "autocons", "prod"] + ) + self._from_clause() + self._where_clause( self.id, start_date, end_date, prm_id, "prod", partner_id ) + "AND cdc.comp_data_type IN ('autocons', 'cons', 'prod')" - + self._group_clause(slot_type) + + self._group_clause(date_slot=slot_type) + self._order_clause() ) self.env.cr.execute(query) @@ -348,10 +354,16 @@ class AccOperation(models.Model): data_allocons_histo = [] query = ( - self._select_clause("day", ["autocons", "allocons"]) + self._select_clause(date_slot="day", curve_types=["autocons", "allocons"]) + self._from_clause() - + self._where_clause(self.id, start_date, end_date, prm_id, partner_id) - + self._group_clause("day") + + self._where_clause( + operation_id=self.id, + start_date=start_date, + end_date=end_date, + prm_id=prm_id, + partner_id=partner_id, + ) + + self._group_clause(date_slot="day") + self._order_clause() ) @@ -389,10 +401,18 @@ class AccOperation(models.Model): data_surplus = [] query = ( - self._select_clause(slot_type, ["autoprod", "surplus"]) + self._select_clause( + date_slot=slot_type, curve_types=["autoprod", "surplus"] + ) + self._from_clause() - + self._where_clause(self.id, start_date, end_date, prm_id, partner_id) - + self._group_clause(slot_type) + + self._where_clause( + operation_id=self.id, + start_date=start_date, + end_date=end_date, + prm_id=prm_id, + partner_id=partner_id, + ) + + self._group_clause(date_slot=slot_type) + self._order_clause() ) @@ -428,10 +448,16 @@ class AccOperation(models.Model): data_surplus_histo = [] query = ( - self._select_clause("day", ["autoprod", "surplus"]) + self._select_clause(date_slot="day", curve_types=["autoprod", "surplus"]) + self._from_clause() - + self._where_clause(self.id, start_date, end_date, prm_id, partner_id) - + self._group_clause("day") + + self._where_clause( + operation_id=self.id, + start_date=start_date, + end_date=end_date, + prm_id=prm_id, + partner_id=partner_id, + ) + + self._group_clause(date_slot="day") + self._order_clause() ) self.env.cr.execute(query) @@ -477,12 +503,12 @@ class AccOperation(models.Model): """ Fonction appelée pour l'affichage des courbes globales sur le portail - :param: start_date: date début - end_date: date de fin - partner_id: données uniquement de ce contact - prm_id: données uniquement de ce PRM (mutuellement exclusif de + :param: date start_date: date début + date end_date: date de fin + int partner_id: données uniquement de ce contact + int prm_id: données uniquement de ce PRM (mutuellement exclusif de partner_id) - data_type: type de courbes à afficher: + char data_type: type de courbes à afficher: - "pmo" : vue globale (cons + prod sans filtrage) - "cons" : vue mon suivi conso (avec filtrage possible) - "prod" : vue mon suivi production (avec filtrage possible) @@ -491,7 +517,7 @@ 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) + end_date = datetime.strptime(end_date, "%d/%m/%Y") + relativedelta(days=1) display_hourly_curves, step_curve, step_display_curve = self.get_step_from_date( start_date=start_date, end_date=end_date )