diff --git a/models/acc_enedis_cdc.py b/models/acc_enedis_cdc.py
index 9c2eb91ac47320d900a6823300e54d2662a7ace5..4369894263efd89a5589d4190e1d264e80214103 100644
--- a/models/acc_enedis_cdc.py
+++ b/models/acc_enedis_cdc.py
@@ -4,10 +4,9 @@ from datetime import datetime
from dateutil.relativedelta import relativedelta
-from odoo import _, api, fields, models
+from odoo import _, api, models
from odoo.exceptions import ValidationError
from odoo.osv import expression
-from odoo.tools import date_utils
from odoo.addons.api_connector.tools.date_utils import local_to_utc
@@ -49,6 +48,129 @@ class AccEnedisCdc(models.Model):
return display_hourly_curves, step, step_display_curve
+ @api.model
+ def _read_group_process_groupby(self, gb, query):
+ """
+ Overrides models method to avoid getting wrong display format
+ And manage granluarity = "minute" for 30 minutes curves
+ """
+ initial_gb = gb
+ if self._context.get("portal_acc_curves") and gb == "date_slot:minute":
+ gb = "date_slot:hour"
+ res = super()._read_group_process_groupby(gb, query)
+ if self._context.get("portal_acc_curves"):
+ if res["type"] == "datetime":
+ res["display_format"] = "dd/MM/YYYY HH:mm"
+ if initial_gb == "date_slot:minute":
+ res["groupby"] = res["groupby"].replace("hour", "minute")
+ res["interval"] = relativedelta(minutes=30)
+ res["granularity"] = res["granularity"].replace("hour", "minute")
+ res["qualified_field"] = res["qualified_field"].replace(
+ "hour", "minute"
+ )
+ return res
+
+ @api.model
+ def _get_curves(
+ self,
+ operation_id,
+ slot_type,
+ start_date,
+ end_date,
+ prm_id=None,
+ partner_id=None,
+ curve_types=None,
+ extra_curve_type=None,
+ ):
+ """
+ Fonction permettant de récupérer les courbes de charge pour graphique ou export
+
+ :param: int operation_id: opération concernée
+ char slot_type: type de slot pour la query ("minute", "hour", "month" ou
+ "year")
+ datetime start_date: date début
+ datetime end_date: date de fin
+ int prm_id : PRM de soutirage à récupérer
+ int partner_id: contact associé à la courbe
+ [char] curve_types: type de données
+ char extra_curve_type : extra curve to be retrieved (optional)
+ (allowed values : 'cons', 'autocons', 'prod', 'surplus')
+ @returns: liste de dictionnaires resultat de la requête :
+ - 1 entrée par date
+ - 1 champ par type de courbe
+ """
+ start_date_tz = local_to_utc(start_date, "Europe/Paris")
+ end_date_tz = local_to_utc(end_date, "Europe/Paris")
+ domain = [
+ ("acc_operation_id", "=", operation_id),
+ ("date_slot", ">=", start_date_tz),
+ ("date_slot", "<", end_date_tz),
+ ]
+ if partner_id and isinstance(partner_id, int):
+ partner_domain = [("partner_id", "=", partner_id)]
+ if prm_id and isinstance(prm_id, int):
+ partner_domain = expression.AND(
+ [partner_domain, [("acc_counter_id", "=", prm_id)]]
+ )
+ if extra_curve_type and extra_curve_type in (
+ "cons",
+ "autocons",
+ "prod",
+ "surplus",
+ ):
+ partner_domain = expression.OR(
+ [partner_domain, [("comp_data_type", "=", extra_curve_type)]]
+ )
+ else:
+ partner_domain = [("partner_id", "!=", False)]
+ domain = expression.AND([domain, partner_domain])
+ if curve_types:
+ domain = expression.AND([domain, [("comp_data_type", "in", curve_types)]])
+ res = (
+ self.env["acc.enedis.cdc"]
+ .with_context(fill_temporal=True, tz="Europe/Paris", portal_acc_curves=True)
+ .read_group(
+ domain,
+ ["date_slot", "power:sum"],
+ ["date_slot:" + slot_type, "comp_data_type"],
+ lazy=False,
+ )
+ )
+ final_res = []
+ prev_final_line = {}
+ for line in res:
+ if (
+ prev_final_line
+ and prev_final_line["date"] == line["date_slot:" + slot_type]
+ ):
+ prev_final_line.update(
+ {
+ line["comp_data_type"]: line["power"] / 2 / 1000,
+ }
+ )
+ else:
+ new_line = {
+ "date": line["date_slot:" + slot_type],
+ line["comp_data_type"]: line["power"] / 2 / 1000,
+ }
+ final_res.append(new_line)
+ prev_final_line = new_line
+ # Add computed values
+ for final_line in final_res:
+ if not curve_types or all(
+ value in curve_types for value in ["autoprod", "prod", "surplus"]
+ ):
+ final_line.update(
+ {"autoprod": final_line["prod"] - final_line["surplus"]}
+ )
+ if not curve_types or all(
+ value in curve_types for value in ["allocons", "cons", "autocons"]
+ ):
+ final_line.update(
+ {"allocons": final_line["cons"] - final_line["autocons"]}
+ )
+ return final_res
+
@api.model
def _select_clause(self, date_slot, curve_types):
"""
@@ -122,9 +244,8 @@ class AccEnedisCdc(models.Model):
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',
- 'prod', 'surplus', 'autoprod')
+ char extra_curve_type : extra curve to be retrieved (optional)
+ (allowed values : 'cons', 'autocons', 'prod', 'surplus')
int partner_id : id of partner to be retrieved (optional)
"""
if (
@@ -151,10 +272,8 @@ class AccEnedisCdc(models.Model):
if extra_curve_type and extra_curve_type in (
"cons",
"autocons",
- "allocons",
"prod",
"surplus",
- "autoprod",
):
result = f"{result} OR cdc.comp_data_type = '{extra_curve_type}' )"
else: