diff --git a/models/acc_operation.py b/models/acc_operation.py index 1fc24aac4acca453e14d3fd0c3cc2567bcf6caa5..1e356b38a7c124ef155d6e5ee2db362fe84ee54a 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -430,6 +430,89 @@ class AccOperation(models.Model): ) return power_total + def process_create_account_surplus( + self, injection_id, date_start, date_end, power_surplus + ): + account_list = [] + Account = self.env["acc.account"] + + acc_account = Account.create( + { + "acc_operation_id": self.id, + "buyer_id": injection_id.buyer_id.id, + "acc_injection_id": injection_id.id, + "power_cons": power_surplus[1]["power"] / 1000 / 2, + "start_date": date_start, + "end_date": date_end, + # 'price_kwh': price_kwh, + "is_account_buyer": True, + } + ) + + interval_ids = self.env["acc.sale.price.buyer"].search( + [ + ("acc_operation_id", "=", self.id), + ("acc_injection_id", "=", injection_id.id), + ("acc_buyer_id", "=", injection_id.buyer_id.id), + ("start_date", "<=", date_start), + ("end_date", "=", False), + ] + ) + if not interval_ids: + price_ids = self.env["acc.sale.price.buyer"].search( + [ + ("acc_operation_id", "=", self.id), + ("acc_injection_id", "=", injection_id.id), + ("acc_buyer_id", "=", injection_id.buyer_id.id), + ("end_date", ">=", date_start), + ] + ) + price2_ids = self.env["acc.sale.price.buyer"].search( + [ + ("acc_operation_id", "=", self.id), + ("acc_injection_id", "=", injection_id.id), + ("acc_buyer_id", "=", injection_id.buyer_id.id), + ("start_date", "<=", date_end), + ] + ) + interval_ids = price_ids & price2_ids + + for interval in interval_ids: + if date_start > interval.start_date: + date_interval_start = date_start + else: + date_interval_start = interval.start_date + + if interval.end_date: + if date_end < interval.end_date: + date_interval_end = date_end + else: + date_interval_end = interval.end_date + else: + date_interval_end = date_end + + power_surplus = self.get_power_by_prod( + injection_id, date_interval_start, date_interval_end + ) + AccountLine = self.env["acc.account.line"] + + # Création de la ligne du mois + AccountLine.create( + { + "quantity": power_surplus[1]["power"] / 1000 / 2, + "price_unit": interval.price, + "acc_account_id": acc_account.id, + "start_date": date_interval_start, + "end_date": date_interval_end, + "description": "Surplus kWh en ACC du " + + str(date_interval_start) + + " au " + + str(date_interval_end), + } + ) + account_list.append(acc_account) + return True + def create_account_surplus(self, date_month, account_periodicity): """ Fonction permettant de générer les factures se surplus à une date donnée. @@ -439,7 +522,6 @@ class AccOperation(models.Model): 6 pour semestre, 12 pour année) :return: """ - account_list = [] date_end = date_utils.end_of(date_month, "month") date_start = date_end - relativedelta(months=int(account_periodicity) - 1) @@ -452,88 +534,32 @@ class AccOperation(models.Model): injection_id, date_start, date_end ) - Account = self.env["acc.account"] - - acc_account = Account.create( - { - "acc_operation_id": self.id, - "buyer_id": injection_id.buyer_id.id, - "acc_injection_id": injection_id.id, - "power_cons": power_surplus[1]["power"] / 1000 / 2, - "start_date": date_start, - "end_date": date_end, - # 'price_kwh': price_kwh, - "is_account_buyer": True, - } + # Création du lot + batch_name = ( + "Facture surplus du " + + str(date_start) + + " au " + + str(date_end) + + " - Opération :" + + str(self.name) + + " - Prod :" + + str(injection_id.name) + + " - Acheteur :" + + str(injection_id.buyer_id.name) ) - - interval_ids = self.env["acc.sale.price.buyer"].search( - [ - ("acc_operation_id", "=", self.id), - ("acc_injection_id", "=", injection_id.id), - ("acc_buyer_id", "=", injection_id.buyer_id.id), - ("start_date", "<=", date_start), - ("end_date", "=", False), - ] + batch = self.env["queue.job.batch"].get_new_batch(batch_name) + self.with_context( + job_batch=batch + ).with_delay().process_create_account_surplus( + injection_id, date_start, date_end, power_surplus ) - if not interval_ids: - price_ids = self.env["acc.sale.price.buyer"].search( - [ - ("acc_operation_id", "=", self.id), - ("acc_injection_id", "=", injection_id.id), - ("acc_buyer_id", "=", injection_id.buyer_id.id), - ("end_date", ">=", date_start), - ] - ) - price2_ids = self.env["acc.sale.price.buyer"].search( - [ - ("acc_operation_id", "=", self.id), - ("acc_injection_id", "=", injection_id.id), - ("acc_buyer_id", "=", injection_id.buyer_id.id), - ("start_date", "<=", date_end), - ] - ) - interval_ids = price_ids & price2_ids - - for interval in interval_ids: - if date_start > interval.start_date: - date_interval_start = date_start - else: - date_interval_start = interval.start_date - - if interval.end_date: - if date_end < interval.end_date: - date_interval_end = date_end - else: - date_interval_end = interval.end_date - else: - date_interval_end = date_end - - power_surplus = self.get_power_by_prod( - injection_id, date_interval_start, date_interval_end - ) - AccountLine = self.env["acc.account.line"] - - # Création de la ligne du mois - AccountLine.create( - { - "quantity": power_surplus[1]["power"] / 1000 / 2, - "price_unit": interval.price, - "acc_account_id": acc_account.id, - "start_date": date_interval_start, - "end_date": date_interval_end, - "description": "Surplus kWh en ACC du " - + str(date_interval_start) - + " au " - + str(date_interval_end), - } - ) - account_list.append(acc_account) + # lancement de la file d'attente + batch.enqueue() action = self.env["ir.actions.actions"]._for_xml_id( "acc_account.action_acc_account" ) - action["domain"] = [("id", "in", account_list)] + action["domain"] = [("acc_operation_id", "=", self.id)] return action def _open_x2m_matrix(self, view_xmlid):