From 9d74da986cc3828e4ddbac1108e2ab3029e27cd2 Mon Sep 17 00:00:00 2001 From: CristianoMafraJunior Date: Fri, 9 Feb 2024 09:00:37 -0300 Subject: [PATCH] [FIX] l10n_br_account_payment_brcobranca: fix fare value field --- .../demo/account_journal_demo.xml | 11 +- .../models/account_journal.py | 22 +- .../parser/cnab_file_parser.py | 115 ++-- .../tests/data/CNAB240AILOS_tarifa.RET | 4 + .../tests/data/CNAB240AILOS_tarifa_zero.RET | 4 + .../tests/data/CNAB400BANCOBRASIL_tarifa.RET | 3 + .../tests/test_return_import.py | 600 +++++++++++++++++- .../views/account_journal_view.xml | 1 + 8 files changed, 664 insertions(+), 96 deletions(-) create mode 100644 l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa.RET create mode 100644 l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa_zero.RET create mode 100644 l10n_br_account_payment_brcobranca/tests/data/CNAB400BANCOBRASIL_tarifa.RET diff --git a/l10n_br_account_payment_brcobranca/demo/account_journal_demo.xml b/l10n_br_account_payment_brcobranca/demo/account_journal_demo.xml index af9cb8c7b671..d61bb251434e 100644 --- a/l10n_br_account_payment_brcobranca/demo/account_journal_demo.xml +++ b/l10n_br_account_payment_brcobranca/demo/account_journal_demo.xml @@ -22,5 +22,14 @@ /> True - + + + True + cnab400 + + True + diff --git a/l10n_br_account_payment_brcobranca/models/account_journal.py b/l10n_br_account_payment_brcobranca/models/account_journal.py index d2faebaadb52..f9d832f696e5 100644 --- a/l10n_br_account_payment_brcobranca/models/account_journal.py +++ b/l10n_br_account_payment_brcobranca/models/account_journal.py @@ -24,6 +24,16 @@ class AccountJournal(models.Model): help="Enable automatic payment return reconciliation.", default=False, ) + floating_days = fields.Integer( + help=( + "Specifies the number of 'floating days' - the time period between when a " + "payment is initiated and when the funds become available in the recipient's " + "account. During these days, the funds are being processed by the banking " + "system and are not yet accessible to the recipient. Please enter the typical " + "number of days it takes for transactions with your bank to be fully processed " + "and cleared." + ), + ) def multi_move_import(self, file_stream, ftype="csv"): """Create multiple bank statements from values given by the parser for @@ -178,18 +188,6 @@ def _get_moves(self, parser, result_row_list): ) move_vals = self.prepare_move_vals(result_row, parser) - - # O campo referente a Data de Credito no account.move é o date que - # no account.move.line existe um related desse campo a forma de - # obter e preencher ele por enquanto e feito da forma abaixo, - # verificar se possível melhorar isso. - data_credito = "" - for row in result_row: - if row.get("type") == "liquidado": - data_credito = row.get("date") - break - move_vals["date"] = data_credito - move = move_obj.create(move_vals) moves |= move try: diff --git a/l10n_br_account_payment_brcobranca/parser/cnab_file_parser.py b/l10n_br_account_payment_brcobranca/parser/cnab_file_parser.py index eeeca275d0dd..75e15b523483 100644 --- a/l10n_br_account_payment_brcobranca/parser/cnab_file_parser.py +++ b/l10n_br_account_payment_brcobranca/parser/cnab_file_parser.py @@ -359,13 +359,15 @@ def process_return_file(self, data): # obj_account_move_line.company_id.partner_id.name, # 'tipo_moeda': evento.credito_moeda_tipo, } - # Caso de Pagamento deve criar os Lançamentos de Diário + merged_row_list = [] + log_event_payment = {} + valor_tarifa = self.cnab_str_to_float(linha_cnab.get("valor_tarifa", 0.0)) if cod_ocorrencia in cnab_liq_move_code: row_list, log_event_payment = self._get_accounting_entries( - linha_cnab, account_move_line, payment_lines + linha_cnab, account_move_line, payment_lines, valor_tarifa ) - result_row_list.append(row_list) + merged_row_list.extend(row_list) cnab_return_log_event.update(log_event_payment) else: # Nos codigos de retorno cadastrados no Data do modulo @@ -375,12 +377,19 @@ def process_return_file(self, data): # exceções ? # Caso exista será preciso criar o campo no payment.mode # para informa-lo como nos outros casos. - if cod_ocorrencia == "02": - account_move_line.cnab_state = "accepted" - elif cod_ocorrencia == "03": - # TODO - algo a mais a ser feito ? - account_move_line.cnab_state = "not_accepted" - + ocorrencia_to_state = { + "02": "accepted", + "03": "not_accepted", + } + account_move_line.cnab_state = ocorrencia_to_state.get(cod_ocorrencia) + if valor_tarifa: + row_list = self._create_tariff_entries( + account_move_line, payment_lines, valor_tarifa + ) + merged_row_list.extend(row_list) + cnab_return_log_event.update({"tariff_charge": valor_tarifa}) + if merged_row_list: + result_row_list.append(merged_row_list) # Inclui o LOG do Evento CNAB self.cnab_return_events.append(cnab_return_log_event) @@ -403,12 +412,44 @@ def _get_description_occurrence(self, payment_method_cnab, cod_ocorrencia): return descricao_ocorrencia - def _get_accounting_entries(self, linha_cnab, account_move_line, payment_lines): + def _create_tariff_entries(self, account_move_line, payment_lines, valor_tarifa): + row_list = [] + row_list.append( + { + "name": "Tarifas bancárias (boleto) " + + account_move_line.document_number, + "debit": 0.0, + "credit": valor_tarifa, + "account_id": self.journal.default_account_id.id, + "type": "tarifa", + "partner_id": account_move_line.company_id.partner_id.id, + "payment_line_ids": payment_lines.ids, + "cnab_returned_ref": account_move_line.document_number, + } + ) + tariff_charge_account = ( + account_move_line.payment_mode_id.tariff_charge_account_id + ) + row_list.append( + { + "name": "Tarifas bancárias (boleto) " + + account_move_line.document_number, + "debit": valor_tarifa, + "credit": 0.0, + "type": "tarifa", + "account_id": tariff_charge_account.id, + "payment_line_ids": payment_lines.ids, + "cnab_returned_ref": account_move_line.document_number, + } + ) + return row_list + + def _get_accounting_entries( + self, linha_cnab, account_move_line, payment_lines, valor_tarifa + ): row_list = [] bank_name_brcobranca = dict_brcobranca_bank[self.bank.code_bc] - valor_recebido = ( - valor_desconto - ) = valor_juros_mora = valor_abatimento = valor_tarifa = 0.0 + valor_recebido = valor_desconto = valor_juros_mora = valor_abatimento = 0.0 if linha_cnab["valor_recebido"]: # Campo Valor Recebido vem com o Valor da Tarifa: @@ -498,43 +539,6 @@ def _get_accounting_entries(self, linha_cnab, account_move_line, payment_lines): } ) - # Valor Tarifa - if linha_cnab.get("valor_tarifa"): - valor_tarifa = self.cnab_str_to_float(linha_cnab["valor_tarifa"]) - - if valor_tarifa > 0.0: - # Usado para Conciliar a Fatura - row_list.append( - { - "name": "Tarifas bancárias (boleto) " - + account_move_line.document_number, - "debit": 0.0, - "credit": valor_tarifa, - "account_id": self.journal.default_account_id.id, - "type": "tarifa", - "partner_id": account_move_line.company_id.partner_id.id, - "payment_line_ids": payment_lines.ids, - "cnab_returned_ref": account_move_line.document_number, - } - ) - - # Avoid error in pre commit - tariff_charge_account = ( - account_move_line.payment_mode_id.tariff_charge_account_id - ) - row_list.append( - { - "name": "Tarifas bancárias (boleto) " - + account_move_line.document_number, - "debit": valor_tarifa, - "credit": 0.0, - "type": "tarifa", - "account_id": tariff_charge_account.id, - "payment_line_ids": payment_lines.ids, - "cnab_returned_ref": account_move_line.document_number, - } - ) - # Valor Abatimento if linha_cnab.get("valor_abatimento"): valor_abatimento = self.cnab_str_to_float(linha_cnab["valor_abatimento"]) @@ -595,7 +599,6 @@ def _get_accounting_entries(self, linha_cnab, account_move_line, payment_lines): "cnab_returned_ref": account_move_line.own_number, } ) - # CNAB LOG log_event_payment = { "real_payment_date": data_credito.strftime("%Y-%m-%d"), @@ -603,7 +606,6 @@ def _get_accounting_entries(self, linha_cnab, account_move_line, payment_lines): "discount_value": valor_desconto, "interest_fee_value": valor_juros_mora, "rebate_value": valor_abatimento, - "tariff_charge": valor_tarifa, } return row_list, log_event_payment @@ -620,6 +622,14 @@ def get_move_vals(self): of statement. :return: dict of vals that represent additional infos for the statement """ + for row in self.cnab_return_events: + if "real_payment_date" in row and row["real_payment_date"]: + self.move_date = row["real_payment_date"] + break + elif "occurrence_date" in row: + self.move_date = row["occurrence_date"] + datetime.timedelta( + days=self.journal.floating_days + ) return { # O campo name precisa ser como abaixo ou não ser enviado # se não gera erro no metodo _check_unique_sequence_number, @@ -632,6 +642,7 @@ def get_move_vals(self): + " - Conta " + self.journal.bank_account_id.acc_number, "is_cnab": True, + "date": self.move_date if self.move_date else datetime.date.today(), } def get_move_line_vals(self, line, *args, **kwargs): diff --git a/l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa.RET b/l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa.RET new file mode 100644 index 000000000000..cf23eab74a95 --- /dev/null +++ b/l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa.RET @@ -0,0 +1,4 @@ +08500000 2972316080001691010040040000 0010150123600000000003735 SUA EMPRESA LTDA COOPERATIVA DE CREDITO DO VALE 10912202103080600000608700000 +08500001T01 043 20972316080001691010040040000 0123600000000003735 SUA EMPRESA LTDA 000001752411202323112023 +0850000300023T 2300101500000107131230000000489 00000000029577040711202300000000015285908500101503/01 902043782798000183PONTO FIRMADO TESTE SUA EMPRESA FANTASMA LTDA 0000000000000000000001700000 +0850000300024U 230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002311202300000000 000000000000000 00000000000000000000000 diff --git a/l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa_zero.RET b/l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa_zero.RET new file mode 100644 index 000000000000..ae3748850211 --- /dev/null +++ b/l10n_br_account_payment_brcobranca/tests/data/CNAB240AILOS_tarifa_zero.RET @@ -0,0 +1,4 @@ +08500000 2972316080001691010040040000 0010150123600000000003735 SUA EMPRESA LTDA COOPERATIVA DE CREDITO DO VALE 10912202103080600000608700000 +08500001T01 043 20972316080001691010040040000 0123600000000003735 SUA EMPRESA LTDA 000001752411202323112023 +0850000300023T 2300101500000107131230000000489 00000000029577040711202300000000015285908500101503/01 902043782798000183PONTO TESTE SUA EMPRESA FANTASMA LTDA 0000000000000000000000000000 +0850000300024U 230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002311202300000000 000000000000000 00000000000000000000000 diff --git a/l10n_br_account_payment_brcobranca/tests/data/CNAB400BANCOBRASIL_tarifa.RET b/l10n_br_account_payment_brcobranca/tests/data/CNAB400BANCOBRASIL_tarifa.RET new file mode 100644 index 000000000000..175e51ddc1b4 --- /dev/null +++ b/l10n_br_account_payment_brcobranca/tests/data/CNAB400BANCOBRASIL_tarifa.RET @@ -0,0 +1,3 @@ +02RETORNO01COBRANCA 15298000060533000000EMPRESA TESTE 001BANCO DO BRASIL0602240001657 000002944910772557 2417143 000001 +70000000000000000152980000605332417879 2417143000000001570000900AI 01900000000000 1702060224000001/01 150224000000004000800131747010000000000234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090010000000000000 0000000000000000000000000000000000000000000000001050000002 +9201001 000000050000000039160800000177 000001810000004907912500000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000003 diff --git a/l10n_br_account_payment_brcobranca/tests/test_return_import.py b/l10n_br_account_payment_brcobranca/tests/test_return_import.py index 7044266d06b6..d023de39d22e 100644 --- a/l10n_br_account_payment_brcobranca/tests/test_return_import.py +++ b/l10n_br_account_payment_brcobranca/tests/test_return_import.py @@ -5,6 +5,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import base64 +import datetime import os from unittest import mock @@ -53,6 +54,9 @@ def setUpClass(cls): cls.invoice_ailos_1 = cls.env.ref( "l10n_br_account_payment_order." "demo_invoice_payment_order_ailos_cnab240" ) + cls.invoice_bancobrasil_1 = cls.env.ref( + "l10n_br_account_payment_order." "demo_invoice_payment_order_bb_cnab400" + ) cls.journal = cls.env.ref("l10n_br_account_payment_order.unicred_journal") @@ -60,6 +64,7 @@ def setUpClass(cls): cls.invoice_unicred_1.action_post() cls.invoice_unicred_2.action_post() cls.invoice_ailos_1.action_post() + cls.invoice_bancobrasil_1.action_post() # Para evitar erros nos testes de variação da Sequencia do # Nosso Numero/own_number quando se roda mais de uma vez ou @@ -78,6 +83,10 @@ def setUpClass(cls): for line in cls.invoice_ailos_1.financial_move_line_ids: cls.invoice_ailos_1_own_numbers.append(line.own_number) + cls.invoice_bancobrasil_1_own_numbers = [] + for line in cls.invoice_bancobrasil_1.financial_move_line_ids: + cls.invoice_bancobrasil_1_own_numbers.append(line.own_number) + payment_order_unicred = cls.env["account.payment.order"].search( [("payment_mode_id", "=", cls.invoice_unicred_1.payment_mode_id.id)] ) @@ -130,12 +139,21 @@ def _import_file(self, file_name): else: return self.account_move_obj.browse(action["res_id"]) + def _assert_move_entries(self, expected_move_line_values_list, moves_list): + for expected_move_line_values, move in zip( + expected_move_line_values_list, moves_list + ): + for expected, move_line in zip(expected_move_line_values, move.line_ids): + self.assertEqual(expected["account_name"], move_line.account_id.name) + self.assertEqual(expected["debit"], move_line.debit) + self.assertEqual(expected["credit"], move_line.credit) + def test_valor_menor_1(self): mocked_response = [ { "codigo_registro": "1", "codigo_ocorrencia": "02", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -179,7 +197,7 @@ def test_valor_menor_1(self): { "codigo_registro": "1", "codigo_ocorrencia": "02", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -223,7 +241,7 @@ def test_valor_menor_1(self): { "codigo_registro": "9", "codigo_ocorrencia": "00", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "0000", "cedente_com_dv": "000000000", @@ -275,17 +293,50 @@ def test_valor_menor_1(self): "data", "CNAB400UNICRED_valor_menor_1.RET", ) - # Se não for um codigo cnab de liquidação retorna apenas o LOG criado. - log = self._import_file(file_name) - - self.assertEqual("Banco UNICRED - Conta 371", log.name) + # Apesar de não haver ocorrências de liquidação, + # Há ocorrências que geram cobrança de tarifas e + # Lançamentos contábeis são criados + # Nesse caso o retorno é um move (lançamento contabil) + move = self._import_file(file_name) + self.assertEqual("Banco UNICRED - Conta 371", move.cnab_return_log_id.name) + self.assertEqual(3.6, move.cnab_return_log_id.amount_total_tariff_charge) + self.assertEqual(1000.0, move.cnab_return_log_id.amount_total_title) + self.assertEqual(2, len(move.cnab_return_log_id.move_ids)) + expected_move_line_values_list = [ + [ + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + ], + [ + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + ], + ] + moves = move.cnab_return_log_id.move_ids + self._assert_move_entries(expected_move_line_values_list, moves) def test_valor_menor_2(self): mocked_response = [ { "codigo_registro": "1", "codigo_ocorrencia": "06", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -329,7 +380,7 @@ def test_valor_menor_2(self): { "codigo_registro": "1", "codigo_ocorrencia": "06", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -373,7 +424,7 @@ def test_valor_menor_2(self): { "codigo_registro": "9", "codigo_ocorrencia": "00", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "0000", "cedente_com_dv": "000000000", @@ -425,19 +476,110 @@ def test_valor_menor_2(self): "data", "CNAB400UNICRED_valor_menor_2.RET", ) - # Se for um codigo cnab de liquidação retorna as account.move criadas. - moves = self._import_file(file_name) + # Retorna o primeiro account.move criado. + move = self._import_file(file_name) - self.assertEqual("Retorno CNAB - Banco UNICRED - Conta 371", moves.ref) + self.assertEqual("Retorno CNAB - Banco UNICRED - Conta 371", move.ref) # I check that the invoice state is "Paid" self.assertEqual(self.invoice_unicred_1.payment_state, "paid") + self.assertEqual(2, len(move.cnab_return_log_id.move_ids)) + self.assertEqual(3.6, move.cnab_return_log_id.amount_total_tariff_charge) + self.assertEqual(1000.0, move.cnab_return_log_id.amount_total_title) + expected_move_line_values_list = [ + [ + { + "account_name": "Despesas com Vendas - AVOID_TRAVIS_ERROR", + "debit": 3.0, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 3.0, + }, + { + "account_name": "Outras Despesas Gerais - AVOID_TRAVIS_ERROR", + "debit": 2.0, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 2.0, + }, + { + "account_name": "Account Receivable", + "debit": 0.0, + "credit": 300.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 300.0, + "credit": 0.0, + }, + ], + [ + { + "account_name": "Despesas com Vendas - AVOID_TRAVIS_ERROR", + "debit": 3.0, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 3.0, + }, + { + "account_name": "Outras Despesas Gerais - AVOID_TRAVIS_ERROR", + "debit": 2.0, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 2.0, + }, + { + "account_name": "Account Receivable", + "debit": 0.0, + "credit": 700.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 700.0, + "credit": 0.0, + }, + ], + ] + moves = move.cnab_return_log_id.move_ids + self._assert_move_entries(expected_move_line_values_list, moves) def test_valor_maior_3(self): mocked_response = [ { "codigo_registro": "1", "codigo_ocorrencia": "02", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -481,7 +623,7 @@ def test_valor_maior_3(self): { "codigo_registro": "1", "codigo_ocorrencia": "02", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -525,7 +667,7 @@ def test_valor_maior_3(self): { "codigo_registro": "9", "codigo_ocorrencia": "00", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "0000", "cedente_com_dv": "000000000", @@ -577,17 +719,51 @@ def test_valor_maior_3(self): "data", "CNAB400UNICRED_valor_maior_3.RET", ) - # Se não for um codigo cnab de liquidação retorna apenas o LOG criado. - log = self._import_file(file_name) + # Apesar de não haver ocorrências de liquidação, + # Há ocorrências que geram cobrança de tarifas e + # Lançamentos contábeis são criados + # Nesse caso o retorno é um move (lançamento contabil) + move = self._import_file(file_name) - self.assertEqual("Banco UNICRED - Conta 371", log.name) + self.assertEqual("Banco UNICRED - Conta 371", move.cnab_return_log_id.name) + self.assertEqual(2, len(move.cnab_return_log_id.move_ids)) + self.assertEqual(3.6, move.cnab_return_log_id.amount_total_tariff_charge) + self.assertEqual(1000.0, move.cnab_return_log_id.amount_total_title) + expected_move_line_values_list = [ + [ + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + ], + [ + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + ], + ] + moves = move.cnab_return_log_id.move_ids + self._assert_move_entries(expected_move_line_values_list, moves) def test_valor_maior_4(self): mocked_response = [ { "codigo_registro": "1", "codigo_ocorrencia": "06", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -631,7 +807,7 @@ def test_valor_maior_4(self): { "codigo_registro": "1", "codigo_ocorrencia": "06", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -675,7 +851,7 @@ def test_valor_maior_4(self): { "codigo_registro": "9", "codigo_ocorrencia": "00", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "0000", "cedente_com_dv": "000000000", @@ -727,19 +903,90 @@ def test_valor_maior_4(self): "data", "CNAB400UNICRED_valor_maior_4.RET", ) - # Se for um codigo cnab de liquidação retorna as account.move criadas - moves = self._import_file(file_name) + # Retorna o primeiro account.move criado. + move = self._import_file(file_name) - self.assertEqual("Retorno CNAB - Banco UNICRED - Conta 371", moves.ref) + self.assertEqual("Retorno CNAB - Banco UNICRED - Conta 371", move.ref) # I check that the invoice state is "Paid" self.assertEqual(self.invoice_unicred_2.payment_state, "paid") + self.assertEqual(2, len(move.cnab_return_log_id.move_ids)) + self.assertEqual(3.6, move.cnab_return_log_id.amount_total_tariff_charge) + self.assertEqual(1000.0, move.cnab_return_log_id.amount_total_title) + expected_move_line_values_list = [ + [ + { + "account_name": "Juros Ativos - AVOID_TRAVIS_ERROR", + "debit": 0.0, + "credit": 10.0, + }, + { + "account_name": "Banco Unicred", + "debit": 10.0, + "credit": 0.0, + }, + { + "account_name": "Account Receivable", + "debit": 0.0, + "credit": 300.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 300.0, + "credit": 0.0, + }, + ], + [ + { + "account_name": "Juros Ativos - AVOID_TRAVIS_ERROR", + "debit": 0.0, + "credit": 10.0, + }, + { + "account_name": "Banco Unicred", + "debit": 10.0, + "credit": 0.0, + }, + { + "account_name": "Account Receivable", + "debit": 0.0, + "credit": 700.0, + }, + { + "account_name": "Banco Unicred", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + { + "account_name": "Banco Unicred", + "debit": 700.0, + "credit": 0.0, + }, + ], + ] + moves = move.cnab_return_log_id.move_ids + self._assert_move_entries(expected_move_line_values_list, moves) def test_ailos_return(self): mocked_response = [ { "codigo_registro": "03", "codigo_ocorrencia": "06", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -782,7 +1029,7 @@ def test_ailos_return(self): { "codigo_registro": "03", "codigo_ocorrencia": "06", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "1234", "cedente_com_dv": "000003719", @@ -825,7 +1072,7 @@ def test_ailos_return(self): { "codigo_registro": "9", "codigo_ocorrencia": "00", - "data_ocorrencia": None, + "data_ocorrencia": "210224", "agencia_com_dv": None, "agencia_sem_dv": "0000", "cedente_com_dv": "000000000", @@ -882,11 +1129,302 @@ def test_ailos_return(self): "CNAB240AILOS.RET", ) - # Se for um codigo cnab de liquidação retorna as account.move criadas - moves = self._import_file(file_name) + # Retorna o primeiro account.move criado. + move = self._import_file(file_name) self.assertEqual( - "Retorno CNAB - Banco COOP CENTRAL AILOS - Conta 373", moves.ref + "Retorno CNAB - Banco COOP CENTRAL AILOS - Conta 373", move.ref ) # I check that the invoice state is "Paid" self.assertEqual(self.invoice_ailos_1.payment_state, "paid") + self.assertEqual(3.6, move.cnab_return_log_id.amount_total_tariff_charge) + self.assertEqual(1000.0, move.cnab_return_log_id.amount_total_title) + self.assertEqual(2, len(move.cnab_return_log_id.move_ids)) + expected_move_line_values_list = [ + [ + { + "account_name": "Account Receivable", + "debit": 0.0, + "credit": 300.0, + }, + { + "account_name": "Banco AILOS", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + { + "account_name": "Banco AILOS", + "debit": 300.0, + "credit": 0.0, + }, + ], + [ + { + "account_name": "Account Receivable", + "debit": 0.0, + "credit": 700.0, + }, + { + "account_name": "Banco AILOS", + "debit": 0.0, + "credit": 1.8, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 1.8, + "credit": 0.0, + }, + { + "account_name": "Banco AILOS", + "debit": 700.0, + "credit": 0.0, + }, + ], + ] + moves = move.cnab_return_log_id.move_ids + self._assert_move_entries(expected_move_line_values_list, moves) + + def test_banco_do_brasil_tarifa(self): + mocked_response = [ + { + "codigo_registro": "7", + "codigo_ocorrencia": "02", + "data_ocorrencia": "060224", + "agencia_com_dv": "15298", + "agencia_sem_dv": None, + "cedente_com_dv": "0000060533", + "convenio": None, + "nosso_numero": "00000000000" + + self.invoice_bancobrasil_1_own_numbers[1], + "tipo_cobranca": None, + "tipo_cobranca_anterior": None, + "natureza_recebimento": None, + "carteira_variacao": "019", + "desconto": "0000000000000", + "iof": "0000000000000", + "carteira": "17", + "comando": None, + "data_liquidacao": None, + "data_vencimento": "150224", + "valor_titulo": "0000000040008", + "banco_recebedor": "001", + "agencia_recebedora_com_dv": "31747", + "especie_documento": "01", + "data_credito": "000000", + "valor_tarifa": "0000234", + "outras_despesas": None, + "juros_desconto": None, + "iof_desconto": None, + "valor_abatimento": "0000000000000", + "desconto_concedito": None, + "valor_recebido": "0000000000000", + "juros_mora": "0000000000000", + "outros_recebimento": "0000000000000", + "abatimento_nao_aproveitado": None, + "valor_lancamento": None, + "indicativo_lancamento": None, + "indicador_valor": None, + "valor_ajuste": None, + "sequencial": "00002", + "arquivo": None, + "motivo_ocorrencia": [], + "documento_numero": None, + }, + ] + self.journal = self.env.ref("l10n_br_account_payment_order.bb_journal") + self.journal.floating_days = 2 + with mock.patch( + _provider_class + "._get_brcobranca_retorno", + return_value=mocked_response, + ): + file_name = get_resource_path( + "l10n_br_account_payment_brcobranca", + "tests", + "data", + "CNAB400BANCOBRASIL_tarifa.RET", + ) + # Apesar de não haver ocorrências de liquidação, + # Há ocorrências que geram cobrança de tarifas e + # Lançamentos contábeis são criados + # Nesse caso o retorno é um move (lançamento contabil) + move = self._import_file(file_name) + self.assertEqual(datetime.date(2024, 2, 8), move.date) + self.assertEqual(2, move.journal_id.floating_days) + self.assertEqual(2.34, move.cnab_return_log_id.amount_total_tariff_charge) + self.assertEqual(400.08, move.cnab_return_log_id.amount_total_title) + self.assertEqual(2, len(move.line_ids)) + self.assertEqual( + "Banco BCO DO BRASIL S.A. - Conta 372", move.cnab_return_log_id.name + ) + expected_move_line_values_list = [ + [ + { + "account_name": "Banco do Brasil", + "debit": 0.0, + "credit": 2.34, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 2.34, + "credit": 0.0, + }, + ] + ] + moves = move.cnab_return_log_id.move_ids + self._assert_move_entries(expected_move_line_values_list, moves) + + def test_ailos_return_tarifa(self): + mocked_response = [ + { + "codigo_registro": "3", + "codigo_ocorrencia": "23", + "data_ocorrencia": "23112023", + "agencia_com_dv": "001015", + "agencia_sem_dv": None, + "cedente_com_dv": "0000010713123", + "convenio": None, + "nosso_numero": "00000000000" + self.invoice_ailos_1_own_numbers[0], + "tipo_cobranca": None, + "tipo_cobranca_anterior": None, + "natureza_recebimento": None, + "carteira_variacao": None, + "desconto": "0000000000000", + "iof": None, + "carteira": "1", + "comando": None, + "data_liquidacao": None, + "data_vencimento": "07112023", + "valor_titulo": "000000000152859", + "banco_recebedor": "085", + "agencia_recebedora_com_dv": "001015", + "especie_documento": None, + "data_credito": "06072021", + "valor_tarifa": "00000000001700", + "outras_despesas": "000000000000000", + "juros_desconto": None, + "iof_desconto": None, + "valor_abatimento": "0000000000000", + "desconto_concedito": None, + "valor_recebido": "0000000000000", + "juros_mora": "0000000000000", + "outros_recebimento": None, + "abatimento_nao_aproveitado": None, + "valor_lancamento": None, + "indicativo_lancamento": None, + "indicador_valor": None, + "valor_ajuste": None, + "sequencial": "00023", + "arquivo": None, + "motivo_ocorrencia": [], + "documento_numero": "03/01", + }, + ] + self.journal = self.env.ref("l10n_br_account_payment_order.ailos_journal") + self.journal.floating_days = 2 + with mock.patch( + _provider_class + "._get_brcobranca_retorno", + return_value=mocked_response, + ): + file_name = get_resource_path( + "l10n_br_account_payment_brcobranca", + "tests", + "data", + "CNAB240AILOS_tarifa.RET", + ) + + # Apesar de não haver ocorrências de liquidação, + # Há ocorrências que geram cobrança de tarifas e + # Lançamentos contábeis são criados + # Nesse caso o retorno é um move (lançamento contabil) + move = self._import_file(file_name) + self.assertEqual(datetime.date(2023, 11, 25), move.date) + self.assertEqual(move._name, "account.move") + self.assertEqual( + "Banco COOP CENTRAL AILOS - Conta 373", move.cnab_return_log_id.name + ) + self.assertEqual(17.0, move.cnab_return_log_id.amount_total_tariff_charge) + self.assertEqual(1528.59, move.cnab_return_log_id.amount_total_title) + self.assertEqual(2, len(move.line_ids)) + expected_move_line_values_list = [ + [ + { + "account_name": "Banco AILOS", + "debit": 0.0, + "credit": 17.0, + }, + { + "account_name": "Outras Despesas Financeiras - AVOID_TRAVIS_ERROR", + "debit": 17.0, + "credit": 0.0, + }, + ] + ] + moves = move.cnab_return_log_id.move_ids + self._assert_move_entries(expected_move_line_values_list, moves) + + def test_ailos_return_tarifa_zero(self): + mocked_response = [ + { + "codigo_registro": "3", + "codigo_ocorrencia": "23", + "data_ocorrencia": "23112023", + "agencia_com_dv": "001015", + "agencia_sem_dv": None, + "cedente_com_dv": "0000010713123", + "convenio": None, + "nosso_numero": "00000000000" + self.invoice_ailos_1_own_numbers[0], + "tipo_cobranca": None, + "tipo_cobranca_anterior": None, + "natureza_recebimento": None, + "carteira_variacao": None, + "desconto": "0000000000000", + "iof": None, + "carteira": "1", + "comando": None, + "data_liquidacao": None, + "data_vencimento": "07112023", + "valor_titulo": "000000000152859", + "banco_recebedor": "085", + "agencia_recebedora_com_dv": "001015", + "especie_documento": None, + "data_credito": "06072021", + "valor_tarifa": "00000000000000", + "outras_despesas": "000000000000000", + "juros_desconto": None, + "iof_desconto": None, + "valor_abatimento": "0000000000000", + "desconto_concedito": None, + "valor_recebido": "0000000000000", + "juros_mora": "0000000000000", + "outros_recebimento": None, + "abatimento_nao_aproveitado": None, + "valor_lancamento": None, + "indicativo_lancamento": None, + "indicador_valor": None, + "valor_ajuste": None, + "sequencial": "00023", + "arquivo": None, + "motivo_ocorrencia": [], + "documento_numero": "03/01", + }, + ] + self.journal = self.env.ref("l10n_br_account_payment_order.ailos_journal") + + with mock.patch( + _provider_class + "._get_brcobranca_retorno", + return_value=mocked_response, + ): + file_name = get_resource_path( + "l10n_br_account_payment_brcobranca", + "tests", + "data", + "CNAB240AILOS_tarifa_zero.RET", + ) + log = self._import_file(file_name) + self.assertEqual(1528.59, log.amount_total_title) + self.assertEqual("Banco COOP CENTRAL AILOS - Conta 373", log.name) diff --git a/l10n_br_account_payment_brcobranca/views/account_journal_view.xml b/l10n_br_account_payment_brcobranca/views/account_journal_view.xml index 5bf7833e32d4..06233046c3dd 100644 --- a/l10n_br_account_payment_brcobranca/views/account_journal_view.xml +++ b/l10n_br_account_payment_brcobranca/views/account_journal_view.xml @@ -11,6 +11,7 @@ +