diff --git a/models/acc_operation.py b/models/acc_operation.py index 15b81f31b4995b8839bd10662d99ddab20720343..1fc24aac4acca453e14d3fd0c3cc2567bcf6caa5 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -172,6 +172,158 @@ class AccOperation(models.Model): return power_tab_by_prod + def process_create_account( + self, acc_injection_id, acc_delivery_id, date_start, date_end, power_total + ): + account_list = [] + Account = self.env["acc.account"] + + acc_account = Account.create( + { + "acc_operation_id": self.id, + "acc_injection_id": acc_injection_id.id, + "acc_delivery_id": acc_delivery_id.id, + "power_cons": power_total, + "start_date": date_start, + "end_date": date_end, + } + ) + + interval_ids = self.env["acc.sale.price"].search( + [ + ("acc_operation_id", "=", self.id), + ("acc_injection_id", "=", acc_injection_id.id), + ("acc_delivery_id", "=", acc_delivery_id.id), + ("start_date", "<=", date_start), + ("end_date", "=", False), + ] + ) + if not interval_ids: + price_ids = self.env["acc.sale.price"].search( + [ + ("acc_operation_id", "=", self.id), + ("acc_injection_id", "=", acc_injection_id.id), + ("acc_delivery_id", "=", acc_delivery_id.id), + "|", + ("end_date", ">=", date_start), + ("end_date", "=", False), + ] + ) + price2_ids = self.env["acc.sale.price"].search( + [ + ("acc_operation_id", "=", self.id), + ("acc_injection_id", "=", acc_injection_id.id), + ("acc_delivery_id", "=", acc_delivery_id.id), + ("start_date", "<=", date_end), + ] + ) + interval_ids = price_ids & price2_ids + + # Création des lignes de facturation + # pour chaque période de tarifs trouvée + 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_total = self.calc_power_by_cons_by_prod( + acc_injection_id, + acc_delivery_id, + date_interval_start, + date_interval_end, + ) + + AccountLine = self.env["acc.account.line"] + + # Création de la ligne de facture + # par intervalle de période de prix + AccountLine.create( + { + "quantity": power_total, + "price_unit": interval.price, + "acc_account_id": acc_account.id, + "start_date": date_interval_start, + "end_date": date_interval_end, + "description": "Période du " + + str(date_interval_start) + + " au " + + str(date_interval_end), + } + ) + account_list.append(acc_account) + + tax_interval_ids = self.env["acc.account.tax.tcfe"].search( + [ + ("start_date", "<=", date_start), + ("end_date", "=", False), + ] + ) + if not tax_interval_ids: + tax_ids = self.env["acc.account.tax.tcfe"].search( + [ + ("end_date", ">=", date_start), + ] + ) + tax2_ids = self.env["acc.account.tax.tcfe"].search( + [ + ("start_date", "<=", date_end), + ] + ) + tax_interval_ids = tax_ids & tax2_ids + + # Création des lignes de facturation + # pour chaque période de taxes trouvée + for interval in tax_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_total = self.calc_power_by_cons_by_prod( + acc_injection_id, + acc_delivery_id, + date_interval_start, + date_interval_end, + ) + + AccountLine = self.env["acc.account.line"] + + # Création de la ligne de facture + # par intervalle de période de prix + AccountLine.create( + { + "quantity": power_total, + "is_tax": True, + "price_unit": interval.price, + "acc_account_id": acc_account.id, + "start_date": date_interval_start, + "end_date": date_interval_end, + "description": "TCFE - Période du " + + str(date_interval_start) + + " au " + + str(date_interval_end), + } + ) + account_list.append(acc_account) + return True + def create_account(self, date_month, account_periodicity): """ Fonction permettant de générer les factures à une date donné. @@ -181,8 +333,6 @@ class AccOperation(models.Model): 6 pour semestre, 12 pour année) :return: """ - account_list = [] - date_end = date_utils.end_of(date_month, "month") if account_periodicity == "1": date_start = date_utils.start_of(date_month, "month") @@ -198,157 +348,37 @@ class AccOperation(models.Model): acc_injection_id, acc_delivery_id, date_start, date_end ) if power_total > 0: - Account = self.env["acc.account"] - - acc_account = Account.create( - { - "acc_operation_id": self.id, - "acc_injection_id": acc_injection_id.id, - "acc_delivery_id": acc_delivery_id.id, - "power_cons": power_total, - "start_date": date_start, - "end_date": date_end, - } - ) - - interval_ids = self.env["acc.sale.price"].search( - [ - ("acc_operation_id", "=", self.id), - ("acc_injection_id", "=", acc_injection_id.id), - ("acc_delivery_id", "=", acc_delivery_id.id), - ("start_date", "<=", date_start), - ("end_date", "=", False), - ] + # Création du lot + batch_name = ( + "Factures du " + + str(date_start) + + " au " + + str(date_end) + + " - Opération :" + + str(self.name) + + " - Prod :" + + str(acc_injection_id.name) + + " - Conso :" + + str(acc_delivery_id.name) ) - if not interval_ids: - price_ids = self.env["acc.sale.price"].search( - [ - ("acc_operation_id", "=", self.id), - ("acc_injection_id", "=", acc_injection_id.id), - ("acc_delivery_id", "=", acc_delivery_id.id), - "|", - ("end_date", ">=", date_start), - ("end_date", "=", False), - ] - ) - price2_ids = self.env["acc.sale.price"].search( - [ - ("acc_operation_id", "=", self.id), - ("acc_injection_id", "=", acc_injection_id.id), - ("acc_delivery_id", "=", acc_delivery_id.id), - ("start_date", "<=", date_end), - ] - ) - interval_ids = price_ids & price2_ids - - # Création des lignes de facturation - # pour chaque période de tarifs trouvée - 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_total = self.calc_power_by_cons_by_prod( - acc_injection_id, - acc_delivery_id, - date_interval_start, - date_interval_end, - ) - - AccountLine = self.env["acc.account.line"] - - # Création de la ligne de facture - # par intervalle de période de prix - AccountLine.create( - { - "quantity": power_total, - "price_unit": interval.price, - "acc_account_id": acc_account.id, - "start_date": date_interval_start, - "end_date": date_interval_end, - "description": "Période du " - + str(date_interval_start) - + " au " - + str(date_interval_end), - } - ) - account_list.append(acc_account) - - tax_interval_ids = self.env["acc.account.tax.tcfe"].search( - [ - ("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( + acc_injection_id, + acc_delivery_id, + date_start, + date_end, + power_total, ) - if not tax_interval_ids: - tax_ids = self.env["acc.account.tax.tcfe"].search( - [ - ("end_date", ">=", date_start), - ] - ) - tax2_ids = self.env["acc.account.tax.tcfe"].search( - [ - ("start_date", "<=", date_end), - ] - ) - tax_interval_ids = tax_ids & tax2_ids - - # Création des lignes de facturation - # pour chaque période de taxes trouvée - for interval in tax_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_total = self.calc_power_by_cons_by_prod( - acc_injection_id, - acc_delivery_id, - date_interval_start, - date_interval_end, - ) - - AccountLine = self.env["acc.account.line"] - - # Création de la ligne de facture - # par intervalle de période de prix - AccountLine.create( - { - "quantity": power_total, - "is_tax": True, - "price_unit": interval.price, - "acc_account_id": acc_account.id, - "start_date": date_interval_start, - "end_date": date_interval_end, - "description": "TCFE - Période 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 calc_power_by_cons_by_prod(