diff --git a/l10n_br_account_payment_brcobranca/constants/br_cobranca.py b/l10n_br_account_payment_brcobranca/constants/br_cobranca.py index 2f061a5aee97..a320c1933e86 100644 --- a/l10n_br_account_payment_brcobranca/constants/br_cobranca.py +++ b/l10n_br_account_payment_brcobranca/constants/br_cobranca.py @@ -85,3 +85,20 @@ def get_brcobranca_api_url(env): ) return brcobranca_api_url + + +def handle_brcobranca_response(res): + if res.ok: + return True + + error_msg = res.text + if " # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import io import json import logging -import tempfile import requests from erpbrasil.base import misc @@ -19,6 +19,7 @@ TIMEOUT, get_brcobranca_api_url, get_brcobranca_bank, + handle_brcobranca_response, ) _logger = logging.getLogger(__name__) @@ -171,10 +172,8 @@ def generate_payment_file(self): def _get_brcobranca_remessa(self, bank_brcobranca, remessa_values, cnab_type): content = json.dumps(remessa_values) - f = open(tempfile.mktemp(), "w") - f.write(content) - f.close() - files = {"data": open(f.name, "rb")} + data_file = io.BytesIO(content.encode("utf-8")) + files = {"data": ("remessa.json", data_file)} brcobranca_api_url = get_brcobranca_api_url(self.env) # EX.: "http://boleto_cnab_api:9292/api/remessa" @@ -194,6 +193,8 @@ def _get_brcobranca_remessa(self, bank_brcobranca, remessa_values, cnab_type): timeout=TIMEOUT, ) + handle_brcobranca_response(res) + if cnab_type == "240" and "R01" in res.text[242:254]: # Todos os header de lote cnab 240 tem conteúdo: R01, # verificar observações G025 e G028 do manual cnab 240 febraban. @@ -206,7 +207,14 @@ def _get_brcobranca_remessa(self, bank_brcobranca, remessa_values, cnab_type): # https://github.com/kivanio/brcobranca/tree/master/spec/fixtures/remessa remessa = res.content else: - raise ValidationError(res.text) + raise ValidationError( + _( + "The BRCobranca service returned a success status, but the " + "content of the generated CNAB file is invalid or unexpected.\n\n" + "Response content: %s", + res.text[:500], + ) + ) return remessa 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 f3913c0c3aa1..8932a5c426ee 100644 --- a/l10n_br_account_payment_brcobranca/parser/cnab_file_parser.py +++ b/l10n_br_account_payment_brcobranca/parser/cnab_file_parser.py @@ -9,11 +9,13 @@ import requests -from odoo.exceptions import UserError - from odoo.addons.account_move_base_import.parser.file_parser import FileParser -from ..constants.br_cobranca import TIMEOUT, get_brcobranca_api_url +from ..constants.br_cobranca import ( + TIMEOUT, + get_brcobranca_api_url, + handle_brcobranca_response, +) logger = logging.getLogger(__name__) @@ -94,8 +96,7 @@ def _get_brcobranca_retorno(self, files): timeout=TIMEOUT, ) - if res.status_code != 201: - raise UserError(res.text) + handle_brcobranca_response(res) string_result = res.json() data = json.loads(string_result) @@ -239,7 +240,10 @@ def process_return_file(self, data): { "occurrences": descricao_ocorrencia, "occurrence_date": data_ocorrencia, - "str_motiv_a": " * - BOLETO NÃO ENCONTRADO.", + "str_motiv_a": ( + f" * - BOLETO NÃO ENCONTRADO para o " + f"Nosso Número {linha_cnab['nosso_numero']}." + ), "own_number": linha_cnab["nosso_numero"], "your_number": linha_cnab["documento_numero"], "title_value": valor_titulo,