From b414ed145bd314c739f106144c0fbcf33e704b52 Mon Sep 17 00:00:00 2001
From: Juliana <juliana@le-filament.com>
Date: Tue, 19 Oct 2021 16:04:29 +0200
Subject: [PATCH] [UPD]Update curve calcul
---
models/enercoop_operation.py | 323 ++++++++++++++++++++++-------------
1 file changed, 203 insertions(+), 120 deletions(-)
diff --git a/models/enercoop_operation.py b/models/enercoop_operation.py
index 3bae7eb..7af2c92 100644
--- a/models/enercoop_operation.py
+++ b/models/enercoop_operation.py
@@ -172,12 +172,10 @@ class EnercoopOperation(models.Model):
elif delta <= 7:
step_display_courbe = 'day'
step = 'hour'
- elif delta <= 181:
+ # elif delta <= 181:
+ else:
step = 'month'
step_display_courbe = 'month'
- else:
- step = 'year'
- step_display_courbe = 'year'
return step, step_display_courbe
@@ -239,6 +237,113 @@ class EnercoopOperation(models.Model):
}
return cdc_jour
+ def get_cdc_by_query_prod(self, slot_type, date_start, date_end, prm_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
+ :param slot_type: type de slot pour la query ('month' ou 'hour' ou 'year')
+ date_start: date début
+ date_end: date de fin
+ :return: un dictionnaire de données
+ (labels et data pour les charts à afficher)
+ """
+ label = []
+ data_autocons = []
+ data_surplus = []
+ label_histo = []
+ data_autocons_histo = []
+ data_surplus_histo = []
+
+ query = """
+ SELECT
+ date_trunc(%s, A.date_slot) AS date_slot,
+ ((SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) - SUM(CASE
+ WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
+ (SUM((CASE WHEN comp_data_type = 'prod' AND A.enercoop_counter_id IN %s THEN A.power ELSE 0 END)) / 2) /
+ (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 1 END)) / 2) *
+ (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 1 END)) / 2) / 1000 as surplus
+ FROM enercoop_enedis_cdc A
+ JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
+ WHERE A.enercoop_operation_id IS NOT NULL
+ AND A.enercoop_operation_id IN %s
+ AND A.date_slot >= %s
+ AND A.date_slot < %s
+ GROUP BY date_trunc(%s, A.date_slot)
+ ORDER BY date_slot ASC;
+ """
+ query_params = (slot_type, tuple(prm_ids.ids), tuple(self.ids), date_start, date_end, slot_type)
+ self.env.cr.execute(query, query_params)
+ raw_data = self.env.cr.fetchall()
+ for row in raw_data:
+ if slot_type == 'month' or slot_type == 'year':
+ data_autocons.append(int(row[1]))
+ data_surplus.append(int(row[2]))
+ label.append(row[0])
+ elif slot_type == 'day':
+ data_autocons_histo.append(int(row[1]))
+ data_surplus_histo.append(int(row[2]))
+ label_histo.append(row[0])
+ else:
+ data_autocons.append({'x': row[0], 'y': int(row[1])})
+ data_surplus.append({'x': row[0], 'y': int(row[2])})
+ label.append(row[0])
+
+ cdc_jour = {
+ 'autocons_prod': data_autocons,
+ 'label': label,
+ 'surplus': data_surplus,
+ 'autocons_histo': data_autocons_histo,
+ 'label_histo': label_histo,
+ 'surplus_histo': data_surplus_histo,
+ }
+ return cdc_jour
+
+ def get_cdc_by_query_histo_prod(self, slot_type, date_start, date_end, prm_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
+ :param slot_type: type de slot pour la query ('month' ou 'hour' ou 'year')
+ date_start: date début
+ date_end: date de fin
+ :return: un dictionnaire de données
+ (labels et data pour les charts à afficher)
+ """
+ label_histo = []
+ data_autocons_prod_histo = []
+ data_surplus_histo = []
+
+ query = """
+ SELECT
+ date_trunc(%s, A.date_slot) AS date_slot,
+ ((SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) - SUM(CASE
+ WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
+ (SUM((CASE WHEN comp_data_type = 'prod' AND A.enercoop_counter_id IN %s THEN A.power ELSE 0 END)) / 2) /
+ (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 1 END)) / 2) *
+ (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 1 END)) / 2) / 1000 as surplus
+ FROM enercoop_enedis_cdc A
+ JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
+ WHERE A.enercoop_operation_id IS NOT NULL
+ AND A.enercoop_operation_id IN %s
+ AND A.date_slot >= %s
+ AND A.date_slot < %s
+ GROUP BY date_trunc(%s, A.date_slot)
+ ORDER BY date_slot ASC;
+ """
+ query_params = (slot_type, tuple(prm_ids.ids), tuple(self.ids), date_start, date_end, slot_type)
+ self.env.cr.execute(query, query_params)
+ raw_data = self.env.cr.fetchall()
+ for row in raw_data:
+ data_autocons_prod_histo.append(int(row[1]))
+ data_surplus_histo.append(int(row[2]))
+ label_histo.append(row[0])
+
+ cdc_jour = {
+ 'autocons_prod_histo': data_autocons_prod_histo,
+ 'label_histo': label_histo,
+ 'surplus_histo': data_surplus_histo,
+ }
+ return cdc_jour
+
def get_cdc_by_query(self, slot_type, date_start, date_end, prm_ids=None):
"""
Fonction permettant de récupérer les données pour la
@@ -251,52 +356,36 @@ class EnercoopOperation(models.Model):
"""
label = []
data_autocons = []
+ data_autocons_prod = []
data_allocons = []
data_cons = []
data_prod = []
data_surplus = []
- if prm_ids:
- query = """
- SELECT
- date_trunc(%s, A.date_slot) AS date_slot,
- (SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) / 2) / 1000 as cons,
- (SUM((CASE WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
- (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) / 2) / 1000 as prod,
- (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as surplus,
- ((SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) - SUM(CASE
- WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as allocons
- FROM enercoop_enedis_cdc A
- JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
- WHERE A.enercoop_operation_id IS NOT NULL
- AND A.enercoop_operation_id IN %s
- AND A.enercoop_counter_id IN %s
- AND A.date_slot >= %s
- AND A.date_slot < %s
- GROUP BY date_trunc(%s, A.date_slot)
- ORDER BY date_slot ASC;
- """
- query_params = (slot_type, tuple(self.ids), tuple(prm_ids.ids), date_start, date_end, slot_type)
- else:
- query = """
- SELECT
- date_trunc(%s, A.date_slot) AS date_slot,
- (SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) / 2) / 1000 as cons,
- (SUM((CASE WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
- (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) / 2) / 1000 as prod,
- (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as surplus,
- ((SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) - SUM(CASE
- WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as allocons
- FROM enercoop_enedis_cdc A
- JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
- WHERE A.enercoop_operation_id IS NOT NULL
- AND A.enercoop_operation_id IN %s
- AND A.date_slot >= %s
- AND A.date_slot < %s
- GROUP BY date_trunc(%s, A.date_slot)
- ORDER BY date_slot ASC;
- """
- query_params = (slot_type, tuple(self.ids), date_start, date_end, slot_type)
+ # if prm_ids:
+ query = """
+ SELECT
+ date_trunc(%s, A.date_slot) AS date_slot,
+ (SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) / 2) / 1000 as cons,
+ (SUM((CASE WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
+ (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) / 2) / 1000 as prod_s,
+ (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) / 2) /
+ (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 1 END)) / 2) *
+ (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 1 END)) / 2) / 1000 as surplus,
+ ((SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) - SUM(CASE
+ WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as allocons,
+ ((SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) - SUM(CASE
+ WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons_prod
+ FROM enercoop_enedis_cdc A
+ JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
+ WHERE A.enercoop_operation_id IS NOT NULL
+ AND A.enercoop_operation_id IN %s
+ AND A.date_slot >= %s
+ AND A.date_slot < %s
+ GROUP BY date_trunc(%s, A.date_slot)
+ ORDER BY date_slot ASC;
+ """
+ query_params = (slot_type, tuple(self.ids), date_start, date_end, slot_type)
self.env.cr.execute(query, query_params)
raw_data = self.env.cr.fetchall()
for row in raw_data:
@@ -306,6 +395,7 @@ class EnercoopOperation(models.Model):
data_prod.append(int(row[3]))
data_surplus.append(int(row[4]))
data_allocons.append(int(row[5]))
+ data_autocons_prod.append(int(row[6]))
label.append(row[0])
else:
data_cons.append({'x': row[0], 'y': int(row[1])})
@@ -313,10 +403,12 @@ class EnercoopOperation(models.Model):
data_prod.append({'x': row[0], 'y': int(row[3])})
data_surplus.append({'x': row[0], 'y': int(row[4])})
data_allocons.append({'x': row[0], 'y': int(row[5])})
+ data_autocons_prod.append({'x': row[0], 'y': int(row[6])})
label.append(row[0])
cdc_jour = {
'autocons': data_autocons,
+ 'autocons_prod': data_autocons_prod,
'cons': data_cons,
'prod': data_prod,
'surplus': data_surplus,
@@ -337,58 +429,45 @@ class EnercoopOperation(models.Model):
"""
label_histo = []
data_autocons_histo = []
+ data_autocons_prod_histo = []
data_allocons_histo = []
data_surplus_histo = []
- if prm_ids:
- query = """
- SELECT
- date_trunc(%s, A.date_slot) AS date_slot,
- (SUM((CASE WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
- (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as surplus,
- ((SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) - SUM(CASE
- WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as allocons
- FROM enercoop_enedis_cdc A
- JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
- WHERE A.enercoop_operation_id IS NOT NULL
- AND A.enercoop_operation_id IN %s
- AND A.enercoop_counter_id IN %s
- AND A.date_slot >= %s
- AND A.date_slot < %s
- GROUP BY date_trunc(%s, A.date_slot)
- ORDER BY date_slot ASC;
- """
- query_params = (slot_type, tuple(self.ids), tuple(prm_ids.ids), date_start, date_end, slot_type)
- else:
- query = """
- SELECT
- date_trunc(%s, A.date_slot) AS date_slot,
- (SUM((CASE WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
- (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as surplus,
- ((SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) - SUM(CASE
- WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as allocons
- FROM enercoop_enedis_cdc A
- JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
- WHERE A.enercoop_operation_id IS NOT NULL
- AND A.enercoop_operation_id IN %s
- AND A.date_slot >= %s
- AND A.date_slot < %s
- GROUP BY date_trunc(%s, A.date_slot)
- ORDER BY date_slot ASC;
- """
- query_params = (slot_type, tuple(self.ids), date_start, date_end, slot_type)
+ query = """
+ SELECT
+ date_trunc(%s, A.date_slot) AS date_slot,
+ (SUM((CASE WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons,
+ (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) / 2) /
+ (SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 1 END)) / 2) *
+ (SUM((CASE WHEN comp_data_type = 'surplus' THEN A.power ELSE 1 END)) / 2) / 1000 as surplus,
+ ((SUM((CASE WHEN comp_data_type = 'cons' THEN A.power ELSE 0 END)) - SUM(CASE
+ WHEN comp_data_type = 'autocons' THEN A.power ELSE 0 END)) / 2) / 1000 as allocons,
+ ((SUM((CASE WHEN comp_data_type = 'prod' THEN A.power ELSE 0 END)) - SUM(CASE
+ WHEN comp_data_type = 'surplus' THEN A.power ELSE 0 END)) / 2) / 1000 as autocons_prod
+ FROM enercoop_enedis_cdc A
+ JOIN enercoop_operation E ON E.id = A.enercoop_operation_id
+ WHERE A.enercoop_operation_id IS NOT NULL
+ AND A.enercoop_operation_id IN %s
+ AND A.date_slot >= %s
+ AND A.date_slot < %s
+ GROUP BY date_trunc(%s, A.date_slot)
+ ORDER BY date_slot ASC;
+ """
+ query_params = (slot_type, tuple(self.ids), date_start, date_end, slot_type)
self.env.cr.execute(query, query_params)
raw_data = self.env.cr.fetchall()
for row in raw_data:
data_autocons_histo.append(int(row[1]))
data_surplus_histo.append(int(row[2]))
data_allocons_histo.append(int(row[3]))
+ data_allocons_histo.append(int(row[3]))
label_histo.append(row[0])
cdc_jour = {
'autocons_histo': data_autocons_histo,
'surplus_histo': data_surplus_histo,
'allocons_histo': data_allocons_histo,
+ 'autocons_prod_histo': data_autocons_prod_histo,
'label_histo': label_histo,
}
return cdc_jour
@@ -462,6 +541,20 @@ class EnercoopOperation(models.Model):
}
},
}
+ result['line_chart_prod_prm'] = {
+ 'type': 'line',
+ 'data': {
+ 'labels': chart_data['label'],
+ 'datasets': [
+ {
+ 'label': 'Production solaire',
+ 'data': chart_data['prod'],
+ 'backgroundColor': 'rgba(244, 165, 25, 0)',
+ 'borderColor': 'rgba(244, 165, 25, 1)',
+ },
+ ],
+ },
+ }
return result
def chart_data_histo_cons(self, chart_data, scale, scale_spe):
@@ -604,7 +697,7 @@ class EnercoopOperation(models.Model):
},
{
'label': 'Autoconso',
- 'data': chart_data['autocons'],
+ 'data': chart_data['autocons_prod'],
'backgroundColor': 'rgba(91, 154, 81, 0.4)',
'borderColor': 'rgba(91, 154, 81, 1)',
'borderWidth': 2,
@@ -642,20 +735,6 @@ class EnercoopOperation(models.Model):
}
},
}
- result['line_chart_prod_prm'] = {
- 'type': 'line',
- 'data': {
- 'labels': chart_data['label'],
- 'datasets': [
- {
- 'label': 'Production solaire',
- 'data': chart_data['prod'],
- 'backgroundColor': 'rgba(244, 165, 25, 0)',
- 'borderColor': 'rgba(244, 165, 25, 1)',
- },
- ],
- },
- }
return result
def chart_data_donuts_prod(self, chart_data, scale):
@@ -668,10 +747,10 @@ class EnercoopOperation(models.Model):
result = {}
if scale == 'hour':
- sum_res1 = sum(int(item['y']) for item in chart_data['autocons'])
+ sum_res1 = sum(int(item['y']) for item in chart_data['autocons_prod'])
sum_res2 = sum(int(item['y']) for item in chart_data['surplus'])
else:
- sum_res1 = sum(chart_data['autocons'])
+ sum_res1 = sum(chart_data['autocons_prod'])
sum_res2 = sum(chart_data['surplus'])
tot_res = sum_res1 + sum_res2
@@ -705,11 +784,11 @@ class EnercoopOperation(models.Model):
result = {}
if scale_spe == 'week':
- data_autocons = chart_data['autocons_histo']
+ data_autocons = chart_data['autocons_prod_histo']
data_surplus = chart_data['surplus_histo']
data_label = chart_data['label_histo']
else:
- data_autocons = chart_data['autocons']
+ data_autocons = chart_data['autocons_prod']
data_surplus = chart_data['surplus']
data_label = chart_data['label']
@@ -784,10 +863,10 @@ class EnercoopOperation(models.Model):
:return: un dictionnaire de données
(labels et data pour les charts à afficher)
"""
-
- enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_ids) if prm_ids else None
+ enercoop_counter_ids = self.env['enercoop.counter'].search([])
chart_data = self.get_cdc_by_query(step_courbe, date_start, date_end, enercoop_counter_ids)
+
if scale == 'week':
chart_data_histo = self.get_cdc_by_query_histo('day', date_start, date_end, enercoop_counter_ids)
chart_data.update(chart_data_histo)
@@ -813,10 +892,13 @@ class EnercoopOperation(models.Model):
if first_day and last_day:
date_start = fields.Datetime.to_datetime(first_day)
date_end = fields.Datetime.to_datetime(last_day)
+ date_end = date_utils.end_of(date_end, 'day')
elif first_day:
date_start, date_end = operation_ids.get_last_day('day')
+ date_end = date_utils.end_of(date_end, 'day')
else:
date_start, date_end = operation_ids.get_last_day('month')
+ date_end = date_utils.end_of(date_end, 'day')
counter_ids = None
if enercoop_counter_id:
@@ -876,18 +958,17 @@ class EnercoopOperation(models.Model):
step_courbe, step_display_courbe = self.get_step_from_date(date_start=date_start, date_end=date_end)
# New code implementation
- enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_id) if prm_id else None
-
- if enercoop_counter_ids:
- chart_data = self.get_cdc_by_query_cons(step_courbe, date_start, date_end, enercoop_counter_ids)
- if scale == 'week':
- chart_data_histo = self.get_cdc_by_query_histo('day', date_start, date_end, enercoop_counter_ids)
- chart_data.update(chart_data_histo)
+ # enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_id) if prm_id else None
+ if prm_id:
+ enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_id)
else:
- chart_data = self.get_cdc_by_query(step_courbe, date_start, date_end, enercoop_counter_ids)
- if scale == 'week':
- chart_data_histo = self.get_cdc_by_query_histo('day', date_start, date_end, enercoop_counter_ids)
- chart_data.update(chart_data_histo)
+ # enercoop_counter_op_ids = self.enercoop_injection_operation_ids
+ enercoop_counter_ids = self.env['enercoop.counter'].search([('enercoop_operation_ids', 'in', self.enercoop_delivery_operation_ids.ids)])
+
+ chart_data = self.get_cdc_by_query_cons(step_courbe, date_start, date_end, enercoop_counter_ids)
+ if scale == 'week':
+ chart_data_histo = self.get_cdc_by_query_histo('day', date_start, date_end, enercoop_counter_ids)
+ chart_data.update(chart_data_histo)
# Build the chart with data and options
result_graph_line = self.chart_data_line_cons(chart_data, step_display_courbe)
@@ -928,14 +1009,16 @@ class EnercoopOperation(models.Model):
step_courbe, step_display_courbe = self.get_step_from_date(date_start=date_start, date_end=date_end)
# New code implementation
- enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_id) if prm_id else None
+ # enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_id) if prm_id else None
+ if prm_id:
+ enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_id)
+ else:
+ # enercoop_counter_op_ids = self.enercoop_injection_operation_ids
+ enercoop_counter_ids = self.env['enercoop.counter'].search([('enercoop_operation_ids', 'in', self.enercoop_injection_operation_ids.ids)])
- # if enercoop_counter_ids:
- # chart_data = self.get_cdc_by_query(step_courbe, date_start, date_end, enercoop_counter_ids)
- # else:
- chart_data = self.get_cdc_by_query(step_courbe, date_start, date_end, enercoop_counter_ids)
+ chart_data = self.get_cdc_by_query_prod(step_courbe, date_start, date_end, enercoop_counter_ids)
if scale == 'week':
- chart_data_histo = self.get_cdc_by_query_histo('day', date_start, date_end, enercoop_counter_ids)
+ chart_data_histo = self.get_cdc_by_query_histo_prod('day', date_start, date_end, enercoop_counter_ids)
chart_data.update(chart_data_histo)
result_graph_line = self.chart_data_line_prod(chart_data, step_display_courbe)
--
GitLab