diff --git a/models/enercoop_operation.py b/models/enercoop_operation.py index c1d1ca825741314d263f0893afde8784469b8459..334b752b4fd5a3fe21b1a34e3657c43ffed1a118 100644 --- a/models/enercoop_operation.py +++ b/models/enercoop_operation.py @@ -240,6 +240,50 @@ class EnercoopOperation(models.Model): } return cdc_jour + def get_cdc_by_query_histo_cons(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_histo = [] + data_allocons_histo = [] + + 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 = '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) + 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_allocons_histo.append(int(row[2])) + label_histo.append(row[0]) + + cdc_jour = { + 'autocons_histo': data_autocons_histo, + 'allocons_histo': data_allocons_histo, + 'label_histo': label_histo, + } + 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 @@ -463,7 +507,7 @@ class EnercoopOperation(models.Model): 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])) + data_autocons_prod_histo.append(int(row[4])) label_histo.append(row[0]) cdc_jour = { @@ -940,10 +984,51 @@ class EnercoopOperation(models.Model): }) return result_graph + + # ------------------------------------------------------ + # Functions to manage route + # ------------------------------------------------------ + def build_graph_data_options(self, chart_data, step_display_courbe=None, scale=None, step_courbe=None): + result_graph = {} + result_graph_line = self.chart_data_line_prod(chart_data, step_display_courbe) + result_graph.update(result_graph_line) + result_graph_histo = self.chart_data_histo_prod(chart_data, step_display_courbe, scale) + result_graph.update(result_graph_histo) + result_graph_donuts = self.chart_data_donuts_prod(chart_data, step_courbe) + result_graph.update(result_graph_donuts) + + result_graph_line = self.chart_data_line_cons(chart_data, step_display_courbe) + result_graph.update(result_graph_line) + result_graph_histo = self.chart_data_histo_cons(chart_data, step_display_courbe, scale) + result_graph.update(result_graph_histo) + result_graph_donuts = self.chart_data_donuts_cons(chart_data, step_courbe) + result_graph.update(result_graph_donuts) + return result_graph + + def build_graph_data_options_prod(self, chart_data, step_display_courbe=None, scale=None, step_courbe=None): + result_graph = {} + result_graph_line = self.chart_data_line_prod(chart_data, step_display_courbe) + result_graph.update(result_graph_line) + result_graph_histo = self.chart_data_histo_prod(chart_data, step_display_courbe, scale) + result_graph.update(result_graph_histo) + result_graph_donuts = self.chart_data_donuts_prod(chart_data, step_courbe) + result_graph.update(result_graph_donuts) + return result_graph + + def build_graph_data_options_cons(self, chart_data, step_display_courbe=None, scale=None, step_courbe=None): + result_graph = {} + result_graph_line = self.chart_data_line_cons(chart_data, step_display_courbe) + result_graph.update(result_graph_line) + result_graph_histo = self.chart_data_histo_cons(chart_data, step_display_courbe, scale) + result_graph.update(result_graph_histo) + result_graph_donuts = self.chart_data_donuts_cons(chart_data, step_courbe) + result_graph.update(result_graph_donuts) + return result_graph + # ------------------------------------------------------ # Functions to manage route # ------------------------------------------------------ - def graph_view_conso(self, scale=None, date_start=None, date_end=None, prm_id=None, partner_id=None): + def graph_view_global(self, scale=None, date_start=None, date_end=None): """ Fonction appelée pour l'affichage des courbes consommation sur le portail @@ -957,31 +1042,16 @@ class EnercoopOperation(models.Model): if not date_start and not date_end: date_start, date_end = self.get_last_day(scale) - # Get the step to display courbe in chart - step_courbe, step_display_courbe = self.get_step_from_date(date_start=date_start, date_end=date_end) + counter_ids = self.env['enercoop.counter'].search([('enercoop_operation_ids', 'in', self.enercoop_delivery_operation_ids.ids)]).ids - # New code implementation - # 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) - elif partner_id: - enercoop_counter_ids = self.env['enercoop.counter'].search([('partner_id', '=', partner_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_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) + step_courbe, step_display_courbe = self.get_step_from_date(date_start=date_start, date_end=date_end) + # Get the data to display in chart + chart_data = self.get_cdc( + scale=scale, step_courbe=step_courbe, date_start=date_start, + date_end=date_end, prm_ids=counter_ids) # Build the chart with data and options - result_graph_line = self.chart_data_line_cons(chart_data, step_display_courbe) - result_graph.update(result_graph_line) - result_graph_histo = self.chart_data_histo_cons(chart_data, step_display_courbe, scale) - result_graph.update(result_graph_histo) - result_graph_donuts = self.chart_data_donuts_cons(chart_data, step_courbe) - result_graph.update(result_graph_donuts) + result_graph = self.build_graph_data_options(chart_data, step_display_courbe=step_display_courbe, scale=scale, step_courbe=step_courbe) date_deb, date_max = self.get_last_day('day') date_max = date_max.strftime("%d/%m/%Y") @@ -997,44 +1067,80 @@ class EnercoopOperation(models.Model): }) return result_graph - def graph_view_prod(self, scale=None, date_start=None, date_end=None, prm_id=None, partner_id=None): + # ------------------------------------------------------ + # Functions to manage route + # ------------------------------------------------------ + def get_graph_data(self, type=None, scale=None, date_start=None, date_end=None, prm_id=None, partner_id=None): + + if scale: + graph_datas = self.graph_view_type(type, scale, prm_id, partner_id) + elif date_start and date_end: + graph_datas = self.graph_view_type( + type=type, + date_start=datetime.strptime(date_start, '%Y-%m-%d'), + date_end=datetime.strptime(date_end, '%Y-%m-%d'), + prm_id=prm_id, + partner_id=partner_id + ) + else: + graph_datas = self.graph_view_type( + type=type, scale='week', prm_id=prm_id, partner_id=partner_id) + if prm_id: + graph_datas['name'] = "PRM n° " + self.env['enercoop.counter'].sudo().browse(prm_id).name + if partner_id: + graph_datas['name'] = self.env['res.partner'].sudo().browse(partner_id).name + graph_datas['prm_id'] = prm_id + graph_datas['partner_id'] = partner_id + return graph_datas + + def graph_view_type(self, type=None, scale=None, date_start=None, date_end=None, prm_id=None, partner_id=None): """ - Fonction appelée pour l'affichage des courbes production + Fonction appelée pour l'affichage des courbes consommation sur le portail :param scale: type d'affichage des graphes (day/week/month/semestre/year) défini par le clic bouton :return: dictionnaire pour la construction des graphes """ + result_graph = {} - # Get the step to display courbe in chart - if not date_start and not date_end: + if scale: date_start, date_end = self.get_last_day(scale) + # Get the step to display curve in chart 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 + # Get PRM ids if prm_id: enercoop_counter_ids = self.env['enercoop.counter'].browse(prm_id) elif partner_id: enercoop_counter_ids = self.env['enercoop.counter'].search([('partner_id', '=', partner_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 type == 'cons': + enercoop_counter_ids = self.env['enercoop.counter'].search( + [('enercoop_operation_ids', 'in', self.enercoop_delivery_operation_ids.ids)]) + else: + enercoop_counter_ids = self.env['enercoop.counter'].search( + [('enercoop_operation_ids', 'in', self.enercoop_injection_operation_ids.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_prod('day', date_start, date_end, enercoop_counter_ids) - chart_data.update(chart_data_histo) + if type == 'cons': + 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_cons('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) - result_graph.update(result_graph_line) - result_graph_histo = self.chart_data_histo_prod(chart_data, step_display_courbe, scale) - result_graph.update(result_graph_histo) - result_graph_donuts = self.chart_data_donuts_prod(chart_data, step_courbe) - result_graph.update(result_graph_donuts) + # Build the chart with data and options + result_graph = self.build_graph_data_options_cons(chart_data, step_display_courbe=step_display_courbe, + scale=scale, step_courbe=step_courbe) + else: + 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_prod('day', date_start, date_end, enercoop_counter_ids) + chart_data.update(chart_data_histo) + # Build the chart with data and options + result_graph = self.build_graph_data_options_prod(chart_data, step_display_courbe=step_display_courbe, + scale=scale, step_courbe=step_courbe) date_deb, date_max = self.get_last_day('day') date_max = date_max.strftime("%d/%m/%Y") date_min = self.get_first_day() @@ -1047,5 +1153,4 @@ class EnercoopOperation(models.Model): 'date_max': date_max, 'scale': scale }) - return result_graph