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 @@
+