AgentSkillsCN

razao-geral-odoo

将Odoo的总账(General Ledger)导出至Excel。通过分页查询account.move.line,利用read_group计算资产负债类账户的期初余额,生成包含会计科目与累计余额的Excel表格。当您需要导出总账、编制财务报表、生成试算表,或批量查询account.move.line时,可使用此技能。

SKILL.md
--- frontmatter
name: razao-geral-odoo
description: "Exporta Razao Geral (General Ledger) do Odoo em Excel. Busca account.move.line com paginacao, calcula saldo inicial para contas patrimoniais via read_group, gera Excel com coluna de conta contabil e saldo acumulado. Use quando: exportar razao geral, relatorio contabil, balancete, consulta account.move.line em massa."

Razão Geral do Odoo (General Ledger)

Skill para exportação do relatório Razão Geral a partir do Odoo via XML-RPC.

QUANDO USAR:

  • Exportar Razão Geral de um período
  • Consultar movimentos contábeis (account.move.line) em massa
  • Calcular saldos acumulados de contas
  • Relatórios contábeis que envolvem account.move.line

Tela Web

URL: /relatorios-fiscais/razao-geral Menu: Financeiro → Central Financeira → Relatórios Contábeis → Razão Geral Blueprint: relatorios_fiscais

Script Standalone

bash
source .venv/bin/activate && python scripts/exportar_razao_geral.py

Configuração (editar no script):

  • DATA_INICIO: Data inicial (YYYY-MM-DD)
  • DATA_FIM: Data final (YYYY-MM-DD)
  • COMPANY_IDS: Lista de company_ids

Service (Importável)

Arquivo: app/relatorios_fiscais/services/razao_geral_service.py

Funções Disponíveis

FunçãoDescriçãoRetorno
calcular_saldos_iniciais(conn, acc_ids, data_ini, company_ids)Saldos via read_groupdict
buscar_movimentos_razao(conn, data_ini, data_fim, company_ids, conta_filter)Busca com ID-cursor + transformação inlinetuple(dados_agrupados, contas_info, saldos, total)
gerar_excel_razao(dados_agrupados, contas_info, saldos, ...)Gera Excel via xlsxwriterBytesIO

Exemplo de Uso

python
from app.odoo.utils.connection import get_odoo_connection
from app.relatorios_fiscais.services.razao_geral_service import (
    buscar_movimentos_razao, gerar_excel_razao
)

connection = get_odoo_connection()
connection.authenticate()

dados_agrupados, contas_info, saldos, total = buscar_movimentos_razao(
    connection,
    data_ini='2024-08-01',
    data_fim='2024-08-31',
    company_ids=[4, 1, 3],
    conta_filter='1010'  # Opcional: filtrar por código de conta
)

excel = gerar_excel_razao(
    dados_agrupados, contas_info, saldos,
    data_ini='2024-08-01', data_fim='2024-08-31', company_ids=[4, 1, 3]
)

# excel é BytesIO pronto para send_file() ou salvar em disco

Modelos Odoo Envolvidos

account.move.line (Modelo Base)

Cada linha representa um débito ou crédito individual.

CampoTipoDescrição
datedateData do lançamento
move_namecharNúmero do lançamento (INV/2024/0001)
account_idmany2one → account.accountConta contábil
partner_idmany2one → res.partnerCliente/Fornecedor
refcharReferência
namecharRótulo/Label da linha
debitmonetaryValor a débito
creditmonetaryValor a crédito
balancemonetarySaldo (debit - credit)
journal_idmany2one → account.journalDiário contábil
matching_numbercharNúmero de conciliação
parent_stateselectionStatus: draft, posted, cancel
account_typeselectionTipo interno da conta
company_idmany2one → res.companyEmpresa

account.account (Plano de Contas)

CampoTipoDescrição
codecharCódigo da conta (ex: 1010100010)
namecharNome da conta
account_typeselectionTipo: asset_, liability_, equity_, income_, expense_*

account.journal (Diários)

CampoTipoDescrição
codecharCódigo curto (GRA1, SIC, BRAD)
namecharNome do diário
typeselectionbank, cash, sale, purchase, general

Mapeamento de Empresas

IDNomeSiglaCNPJ
1NACOM GOYA - FBFB61.724.241/0001-78
3NACOM GOYA - SCSC61.724.241/0002-59
4NACOM GOYA - CDCD61.724.241/0003-30
5LA FAMIGLIA - LFLF18.467.441/0001-63

Contas Patrimoniais vs Resultado

Patrimoniais (RECEBEM saldo inicial)

TipoDescrição
asset_receivableAtivo - A Receber
asset_cashAtivo - Caixa/Banco
asset_currentAtivo Circulante
asset_non_currentAtivo Não Circulante
asset_prepaymentsAtivo - Adiantamentos
asset_fixedAtivo Fixo
liability_payablePassivo - A Pagar
liability_credit_cardPassivo - Cartão de Crédito
liability_currentPassivo Circulante
liability_non_currentPassivo Não Circulante
equityPatrimônio Líquido
equity_unaffectedLucros/Prejuízos Acumulados

Resultado (SEM saldo inicial)

TipoDescrição
incomeReceita
income_otherOutras Receitas
expenseDespesa
expense_depreciationDepreciação
expense_direct_costCusto Direto

Padrões Técnicos Utilizados

Paginação com ID-cursor

Usa cursor baseado em ID para performance constante O(1) por batch (sem degradação por offset):

python
last_id = 0
while True:
    domain_cursor = domain + [['id', '>', last_id]]
    lote = connection.execute_kw(
        'account.move.line', 'search_read', [domain_cursor],
        {'fields': campos, 'limit': 3000, 'order': 'id asc'},
        timeout_override=120
    )
    if not lote:
        break
    last_id = lote[-1]['id']
    # transformar inline...

Nota: Os dados são ordenados por (date, move_name) dentro de cada conta no momento da geração do Excel.

Saldo Inicial via read_group

Uma ÚNICA query para calcular saldos de todas as contas patrimoniais:

python
result = connection.execute_kw(
    'account.move.line', 'read_group',
    [domain],
    {
        'fields': ['account_id', 'debit:sum', 'credit:sum', 'balance:sum'],
        'groupby': ['account_id'],
        'lazy': False
    },
    timeout_override=180
)

Tratamento de campos Many2one

Campos many2one retornam [id, display_name] ou False:

python
# Extrair display_name
partner_name = reg['partner_id'][1] if isinstance(reg.get('partner_id'), (list, tuple)) else ''

Tratamento de False do Odoo

Campos vazios retornam False (não None):

python
valor = reg.get('ref') or '' if reg.get('ref') is not False else ''

Formato do Excel Gerado

Colunas

Conta Contábil | Data | Lançamento | Diário | Parceiro | Referência | Label | Débito | Crédito | Saldo Acumulado | Conciliação

Estrutura

  • Linha de título + subtítulo
  • Cabeçalho das colunas (fundo azul)
  • Para cada conta (ordenada por código):
    • Se patrimonial: linha "Saldo Inicial" (itálico cinza)
    • Linhas de movimentos com saldo acumulado progressivo
  • Formato numérico: #,##0.00
  • Datas: DD/MM/YYYY

Volume de Dados Observado

PeríodoEmpresasLinhasContasDébito = Crédito
Agosto/20243 (FB, SC, CD)133.526249R$ 324.569.925,49

Tempo de execução estimado: ~100s (ID-cursor ~90s + Excel xlsxwriter ~8s) Pico de memória: ~40MB (transformação inline sem duplicação)


Troubleshooting

ProblemaCausaSolução
Timeout na buscaMuitos registrosAumentar timeout_override ou reduzir período
Timeout no read_groupHistórico grandeJá usa timeout_override=180
Valores FalseCampos vazios no OdooTratar com or '' / or 0
Saldo não bateLançamentos draft incluídosVerificar filtro parent_state='posted'
Conta não apareceSem movimentos no períodoNormal - só lista contas com movimento