AgentSkillsCN

executando-odoo-financeiro

在Odoo中执行财务操作:创建付款、对账流水、下载票据。 适用场景: - 在Odoo中创建付款:“为NF 12345创建付款”、“在Odoo中下载票据” - 对账银行流水:“对账31615的流水”、“将付款与流水关联” - 带利息的付款:“创建带利息的付款”、“以冲销方式结清” - 修正未对账的流水:“is_reconciled=False的流水” - 下载待收票据:“在Odoo中标记为已付” 不适用场景: - 仅需查询/追踪单据 → 可使用“追踪Odoo”技能 - 发现模型字段 → 可使用“发现Odoo结构”技能 - 创建CTe或处理费用 → 可使用“Odoo集成”技能

SKILL.md
--- frontmatter
name: executando-odoo-financeiro
description: |
  EXECUTA operacoes financeiras no Odoo: criar pagamentos, reconciliar extratos, baixar titulos.

  USAR QUANDO:
  - Criar pagamento no Odoo: "crie pagamento para NF 12345", "baixe titulo no Odoo"
  - Reconciliar extrato bancario: "reconcilie extrato 31615", "vincule pagamento ao extrato"
  - Pagamento COM juros: "crie pagamento com juros", "baixe com write-off"
  - Corrigir extrato nao reconciliado: "extrato is_reconciled=False"
  - Baixar titulo a receber: "marque como pago no Odoo"

  NAO USAR QUANDO:
  - Apenas consultar/rastrear documentos → usar rastreando-odoo
  - Descobrir campos de modelo → usar descobrindo-odoo-estrutura
  - Criar CTe ou despesas → usar integracao-odoo

Executando Odoo Financeiro

Skill para EXECUTAR operacoes financeiras no Odoo (diferente de rastreando-odoo que apenas consulta).

Operacoes Suportadas

OperacaoMetodoResultado
Criar pagamento simples_criar_pagamento()Payment draft → precisa postar
Criar pagamento com juros_criar_pagamento_com_writeoff_juros()Payment posted + reconciliado
Reconciliar tituloreconcile() em account.move.lineFull/Partial reconcile
Reconciliar extratoreconcile() linha transitoria <-> paymentis_reconciled=True

Fluxo Completo de Recebimento

code
┌─────────────────────────────────────────────────────────────────────┐
│ 1. IDENTIFICAR DADOS                                                │
│    → Titulo: account.move.line (asset_receivable, not reconciled)  │
│    → Extrato: account.bank.statement.line (is_reconciled=False)    │
│    → Partner: res.partner (via extrato ou titulo)                  │
│    → Calcular: valor_juros = valor_extrato - saldo_titulo          │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│ 2. CRIAR PAGAMENTO                                                  │
│    → SEM juros: _criar_pagamento() → postar → reconcile manual     │
│    → COM juros: _criar_pagamento_com_writeoff_juros()              │
│      ↳ Wizard account.payment.register ja faz TUDO automatico     │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│ 3. RECONCILIAR EXTRATO                                              │
│    → Buscar linha PENDENTES (conta 26868) do payment               │
│    → Buscar linha TRANSITORIA (conta 22199) do extrato             │
│    → Executar reconcile() entre as duas linhas                     │
└─────────────────────────────────────────────────────────────────────┘

Referencias

ArquivoConteudo
fluxo-recebimento.mdCodigo validado para criar pagamentos e reconciliar
erros-comuns.mdArmadilhas e como evita-las
contas-por-empresa.mdIDs de contas por company

Dados Criticos

Contas por Empresa (Juros de Recebimento)

python
CONTA_JUROS_RECEBIMENTOS_POR_COMPANY = {
    1: 22778,  # NACOM GOYA - FB
    3: 24061,  # NACOM GOYA - SC
    4: 25345,  # NACOM GOYA - CD
    5: 26629,  # LA FAMIGLIA - LF
}

Contas Importantes

IDCodigoNomeUso
268681110100004PENDENTESContrapartida do payment
221991110100003TRANSITORIAContrapartida do extrato
248011120100001CLIENTES NACIONAISTitulo a receber
253453702010003JUROS DE RECEBIMENTOSReceita de juros (CD)

Journals Bancarios

IDCodigoNomeBanco CNAB
883GRAFENOBanco Grafeno274 (BMP Money Plus)

FLUXO TESTADO (22/01/2026): Retorno CNAB do Banco Grafeno (codigo 274). Outros bancos devem ser mapeados em CNAB_BANCO_PARA_JOURNAL conforme configurados.

Mapeamento CNAB → Journal

python
# app/financeiro/services/baixa_titulos_service.py
CNAB_BANCO_PARA_JOURNAL = {
    '274': {  # BMP Money Plus / Banco Grafeno
        'journal_id': 883,
        'journal_code': 'GRAFENO',
        'journal_name': 'Banco Grafeno',
    },
    # Adicionar outros bancos conforme configurados:
    # '001': {'journal_id': ???, 'journal_code': 'BB', 'journal_name': 'Banco do Brasil'},
    # '341': {'journal_id': ???, 'journal_code': 'ITAU', 'journal_name': 'Itaú'},
}

Para adicionar novo banco:

  1. Descobrir o journal_id no Odoo: account.journal com type='bank'
  2. Adicionar entrada em CNAB_BANCO_PARA_JOURNAL
  3. Testar importacao de arquivo CNAB do novo banco

Uso Rapido

Criar Pagamento COM Juros (Recomendado)

python
from app.odoo.utils.connection import get_odoo_connection

odoo = get_odoo_connection()

# IDs necessarios
titulo_line_id = 2514959  # account.move.line do titulo (asset_receivable)
partner_id = 204534
valor_total = 1342.52  # Valor do extrato (principal + juros)
journal_id = 883       # GRAFENO
company_id = 4         # NACOM CD
conta_juros = 25345    # Conta de juros da empresa
data = '2026-01-19'
ref = 'NF-e: 140743 Serie: 1'

# Wizard com Write-Off (JA faz tudo!)
wizard_context = {
    'active_model': 'account.move.line',
    'active_ids': [titulo_line_id],
}

wizard_data = {
    'payment_type': 'inbound',
    'partner_type': 'customer',
    'partner_id': partner_id,
    'amount': valor_total,
    'journal_id': journal_id,
    'payment_date': data,
    'communication': ref,
    'payment_difference_handling': 'reconcile',
    'writeoff_account_id': conta_juros,
    'writeoff_label': 'Juros de recebimento em atraso',
}

wizard_id = odoo.execute_kw(
    'account.payment.register',
    'create',
    [wizard_data],
    {'context': wizard_context}
)

# Executar wizard
try:
    odoo.execute_kw(
        'account.payment.register',
        'action_create_payments',
        [[wizard_id]],
        {'context': wizard_context}
    )
except Exception as e:
    if "cannot marshal None" not in str(e):
        raise
    # Erro "cannot marshal None" e NORMAL - operacao foi executada!

Reconciliar Extrato com Payment

python
# Buscar linha PENDENTES do payment
payment_move_id = 474858  # Move do payment criado
linhas = odoo.search_read(
    'account.move.line',
    [
        ['move_id', '=', payment_move_id],
        ['account_id', '=', 26868],  # PENDENTES
    ],
    ['id', 'debit', 'reconciled'],
    limit=5
)

payment_line_id = None
for l in linhas:
    if l['debit'] > 0 and not l['reconciled']:
        payment_line_id = l['id']
        break

# Linha do extrato (transitoria)
extrato_line_id = 2968184  # account.move.line do extrato (conta TRANSITORIA)

# Reconciliar
try:
    odoo.execute_kw(
        'account.move.line',
        'reconcile',
        [[payment_line_id, extrato_line_id]],
        {}
    )
except Exception as e:
    if "cannot marshal None" not in str(e):
        raise
    # Erro "cannot marshal None" = SUCESSO!

Skills Relacionadas

SkillQuando usar
rastreando-odooConsultar/rastrear documentos (leitura)
descobrindo-odoo-estruturaDescobrir campos de modelos
integracao-odooCriar CTe, despesas extras