Baixas, Retornos e Sincronizações¶
Objetivo¶
Documentar os fluxos de baixa de boletos, retorno de situação, sincronização de status e verificação automática de cobrança escritural.
Baixa de Boletos em Lote¶
Método: action_baixar_boletos() (linha 2020 de account.py)¶
| Aspecto | Detalhe |
|---|---|
| Endpoint | POST /api/v1/boletos/baixa/lote |
| Payload | Lista JSON de idintegracao |
| Autenticação | Headers CNPJ + Token |
Pré-requisitos¶
- Parcela deve ter
l10n_br_cobranca_idintegracaopreenchido - Situação deve ser diferente de:
REJEITADO,BAIXADO,LIQUIDADO
Fluxo¶
flowchart TD
A["action_baixar_boletos()"] --> B["Filtra parcelas com idintegracao"]
B --> C["Monta lista de idintegracoes"]
C --> D{"Lista vazia?"}
D -->|Sim| E["Retorna sem ação"]
D -->|Não| F["POST /api/v1/boletos/baixa/lote"]
F --> G{"_status == sucesso?"}
G -->|Sim| H["Baixa aceita"]
G -->|Não| I["UserError com mensagem"]
Consulta de Situação de Boletos¶
Método: action_boleto_nfe_situacao() (região linha ~2200)¶
Chamado automaticamente após geração de boletos e pelo cron de verificação.
| Aspecto | Detalhe |
|---|---|
| Endpoint | GET /api/v1/boletos?situacao={situacao}&nossonumero={nossonumero} (ou similar) |
| Função | Consulta status atualizado no banco |
Status possíveis da parcela (l10n_br_cobranca_situacao)¶
| Status | Significado | Ação do sistema |
|---|---|---|
SALVO |
Registro salvo no integrador | Aguarda processamento |
PENDENTE_RETENTATIVA |
Pendente de retentativa | Será reprocessado pelo cron |
EMITIDO |
Boleto emitido | Disponível para pagamento |
REGISTRADO |
Registrado no banco | Disponível para pagamento |
REJEITADO |
Rejeitado pelo banco | Necessita reprocessamento |
LIQUIDADO |
Pago pelo sacado | Concluído |
BAIXADO |
Baixado pelo cedente | Concluído |
Verificação Automática (Cron)¶
Método: _check_boleto_naodisponivel() (linha 2188)¶
| Aspecto | Detalhe |
|---|---|
| Tipo | Cron job (execução periódica) |
| Filtro | Parcelas com situação SALVO, PENDENTE_RETENTATIVA, EMITIDO |
| Ação | Chama action_boleto_nfe_situacao() para cada fatura |
# Filtro de busca
invoice_payments = self.env['account.move.line'].search([
('l10n_br_cobranca_situacao', 'in', ['SALVO','PENDENTE_RETENTATIVA','EMITIDO']),
('account_id.account_type', '=', 'asset_receivable'),
('date_maturity', '!=', False),
('l10n_br_cobranca_idintegracao', '!=', False)
])
Campos de Rastreamento na Parcela¶
Cada parcela (account.move.line) tem os seguintes campos de rastreamento de cobrança:
| Campo | Tipo | Descrição |
|---|---|---|
l10n_br_cobranca_parcela |
Integer | Número sequencial da parcela |
l10n_br_cobranca_nossonumero |
Char | Nosso número gerado |
l10n_br_cobranca_idintegracao |
Char | ID de integração no PlugBoleto |
l10n_br_cobranca_protocolo |
Char | Protocolo de registro |
l10n_br_cobranca_situacao |
Char | Status atual (SALVO, EMITIDO, etc.) |
l10n_br_cobranca_situacao_mensagem |
Char | Mensagem de erro/retorno |
l10n_br_cobranca_transmissao |
Char | Tipo de transmissão (webservice, etc.) |
l10n_br_cobranca_tipo_desconto |
Char | Tipo de desconto configurado |
l10n_br_cobranca_valor_desconto |
Float | Valor do desconto |
l10n_br_cobranca_data_desconto |
Date | Data limite do desconto |
l10n_br_cobranca_numero_cartao |
Char | Número do cartão (para parcelas cartão) |
Reprocessamento de Boletos Rejeitados¶
Fluxo em action_gerar_boleto_nfe() (linhas 2104-2112)¶
Quando uma parcela tem l10n_br_cobranca_situacao == 'REJEITADO':
- Gera novo nosso número (via sequência)
- Limpa campos:
situacao,situacao_mensagem,idintegracao,protocolo - Reprocessa com
_gerar_cobranca_escritural()
Regra: O reprocessamento é automático ao clicar novamente em "Gerar Boleto".
Retorno de Sucesso vs. Falha na Geração¶
Dados de Sucesso¶
Quando _status == 'sucesso' e _dados._sucesso contém itens:
| Campo retornado | Destino Odoo |
|---|---|
idintegracao |
l10n_br_cobranca_idintegracao |
situacao |
l10n_br_cobranca_situacao |
TituloNossoNumero |
Match para identificar parcela |
Dados de Falha¶
Quando _dados._falha contém itens:
| Campo retornado | Destino Odoo |
|---|---|
_dados.idintegracao |
l10n_br_cobranca_idintegracao |
_dados.situacao |
l10n_br_cobranca_situacao |
_erro.erros.boleto |
l10n_br_cobranca_situacao_mensagem |
Parcela Única vs. Múltiplas¶
Regra especial: Se a fatura tem apenas uma parcela a receber: - O valor do boleto é
amount_residual(saldo residual da fatura) - Em vez dedebitda parcela - Isso garante que pagamentos parciais sejam corretamente refletidos
Troubleshooting¶
| Problema | Causa | Solução |
|---|---|---|
| Boleto não aparece como EMITIDO | Cron não executou | Verificar cron _check_boleto_naodisponivel |
| Baixa não refletiu no Odoo | Baixa no banco mas sem sync | Executar action_boleto_nfe_situacao() |
| REJEITADO sem mensagem | API retornou sem detalhes | Verificar log do chatter da fatura |
| Nosso número não gerado | Sequência sem próximo valor | Verificar sequência l10n_br_nosso_numero_id |
| Parcela com status antigo | Sem idintegracao |
Parcela nunca foi transmitida |
| Delay de 5s entre parcelas | time.sleep(5) no código |
Comportamento intencional para evitar rate limit |
Referências¶
- Cobrança Escritural — geração detalhada
- Cancelamentos — cancelamento de NF
- Pagamentos e Integrações — visão geral
- Índice