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