diff --git a/__manifest__.py b/__manifest__.py index 9bdcdc953b3d4a2984282782ca0cf80641763f8a..aba5a9f0312defc135479849a58b45b36b184374 100755 --- a/__manifest__.py +++ b/__manifest__.py @@ -11,6 +11,7 @@ 'data': [ "security/ir.model.access.csv", # datas + 'data/service_cron.xml', # views 'views/res_config_settings_views.xml', 'views/enercoop_operation_views.xml' diff --git a/data/service_cron.xml b/data/service_cron.xml new file mode 100644 index 0000000000000000000000000000000000000000..a3e741e2f0e012e9cd5286953f69e9c4a83b5240 --- /dev/null +++ b/data/service_cron.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <record id="ir_cron_auto_get_enedis_data" model="ir.cron"> + <field name="name">Enercoop - Get data API Enedis</field> + <field name="interval_number">1</field> + <field name="interval_type">days</field> + <field name="numbercall">-1</field> + <field name="doall" eval="False"/> + <field name="model_id" ref="enercoop_partner.model_enercoop_operation"/> + <field name="code">model._auto_get_enedis_data()</field> + <field name="state">code</field> + </record> +</odoo> diff --git a/models/api_enedis.py b/models/api_enedis.py index f033c07d1ae9fcf83c7d248ecccddf17e3d69b91..d81e235bfbc45ae3c6fb1d8c8be4597e8d9d6ebe 100644 --- a/models/api_enedis.py +++ b/models/api_enedis.py @@ -126,7 +126,7 @@ class ApiEnedis(models.AbstractModel): message)) return response - def definitive_load_curves(self, date_start, date_end, usage_point_id=None): + def definitive_load_curves(self, date_start, date_end, type, usage_point_name=None): """ Read function :param usage_point_id: id du PRM @return object: Retourner les courbes de charge @@ -135,14 +135,17 @@ class ApiEnedis(models.AbstractModel): """ url = 'v1/collective_self_consumption/agreements/' + self.name + '/definitive_load_curves' - type_cdc = ['cons', 'autocons'] - for type_courbe in type_cdc: - for delivery_counter_id in self.enercoop_delivery_operation_ids: - self.load_data(url, date_start, date_end, type_courbe, delivery_counter_id.enercoop_counter_id.name) + if usage_point_name: + name = usage_point_name + '_' + date_start + '_' + date_end + '_' + type + else: + name = self.name + '_' + date_start + '_' + date_end + '_' + type - type_cdc = ['prod', 'surplus'] - for type_courbe in type_cdc: - self.load_data(url, date_start, date_end, type_courbe, None) + log_id = self.env['enercoop.enedis.import.logs'].search([ + ('name', '=', name), + ('enercoop_operation_id', '=', self.id) + ]) + if not log_id: + self.load_data(url, date_start, date_end, type, usage_point_name) return True @@ -160,7 +163,6 @@ class ApiEnedis(models.AbstractModel): 'end': date_end, # Type de la courbe (enum) 'type': type_courbe, - # 'type': ['prod', 'autocons', 'surplus', 'complement', 'cons'], # Identifiant du PRM 'usage_point_id': usage_point_id } @@ -182,6 +184,7 @@ class ApiEnedis(models.AbstractModel): name = counter_id.name + '_' + date_start + '_' + date_end + '_' + type else: name = self.name + '_' + date_start + '_' + date_end + '_' + type + for point in curve['interval_reading']: date_slot = datetime.strptime(point['timestamp'], "%Y-%m-%dT%H:%M:%SZ") self.env['enercoop.enedis.cdc'].create({ @@ -193,6 +196,12 @@ class ApiEnedis(models.AbstractModel): 'date_slot': date_slot, }) + # Logs information loaded + self.env['enercoop.enedis.import.logs'].create({ + 'name': name, + 'enercoop_operation_id': self.id, + }) + def perimeter(self): """ Read function @return object: Retourne le périmètre d'une opération donnée diff --git a/models/enercoop_operation.py b/models/enercoop_operation.py index b6b44bb0896d9ccc4bfb5c89416b4a2a24f99332..400af842423ea1480c978210fd5392525f1e763a 100644 --- a/models/enercoop_operation.py +++ b/models/enercoop_operation.py @@ -2,6 +2,8 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import fields, models, api +from datetime import datetime, date +from dateutil.relativedelta import relativedelta class EnercoopOperation(models.Model): @@ -33,22 +35,40 @@ class EnercoopOperation(models.Model): # ------------------------------------------------------ # CRUD methods (ORM overrides) # ------------------------------------------------------ + @api.model + def _auto_get_enedis_data(self): + ''' This method is called from a cron job. + It is used to get data from Enedis with API. + ''' + date_month_before = date.today() - relativedelta(months=1) + records = self.search([ + ('date_start_contract', '=', date_month_before), + ('date_end_contract', '>=', fields.Date.context_today(self)), + ]) + records._get_curves(date_month_before) + + def _get_curves(self, date_month_before): + for operation in self: + yesterday = date.today() - relativedelta(days=1) + operation.get_curves(date_month_before, yesterday) # ------------------------------------------------------ # Actions # ------------------------------------------------------ - def get_curves(self): - # action = self.env['ir.actions.act_window']._for_xml_id('enercoop_api.enercoop_operation_wizard_action') - # # Force the values of the move line in the context to avoid issues - # ctx = dict(self.env.context) - # ctx.pop('active_id', None) - # ctx['active_ids'] = self.ids - # # ctx['active_model'] = 'account.move.line' - # action['context'] = ctx - # return action - for operation in self: - res = operation.definitive_load_curves('2021-03-09', '2021-04-08') - return res + def get_curves(self, date_start, date_end): + # Load consommation data by PRM + for delivery_counter_id in self.enercoop_delivery_operation_ids: + self.definitive_load_curves(date_start, date_end, 'cons', delivery_counter_id.enercoop_counter_id.name) + self.definitive_load_curves(date_start, date_end, 'autocons', delivery_counter_id.enercoop_counter_id.name) + + # Load production data by PRM + for injection_counter_id in self.enercoop_injection_operation_ids: + self.definitive_load_curves(date_start, date_end, 'prod', injection_counter_id.enercoop_counter_id.name) + + # Load surplus data by operation + self.definitive_load_curves(date_start, date_end, 'surplus', None) + + # self.definitive_load_curves(date_start, date_end) def get_perimeter(self): for operation in self: