Pular para conteúdo

Encerramento Contábil (Ano Fiscal)

Objetivo

Documentar a rotina de encerramento de exercício contábil que calcula, zera e aloca resultados das contas de receita e despesa para a conta de lucros/prejuízos acumulados.


Faturamento → Faturamento → Ações → Encerramento do Exercício


Implementação Técnica

  • Model: l10n_br_ciel_it_account.year.end.closing — classe YearEndClosing
  • Model linhas: l10n_br_ciel_it_account.year.end.closing.line — classe YearEndClosingLine
  • Arquivo: l10n_br_ciel_it_account/models/l10n_br_ciel_it_year_end_closing.py
  • Views: l10n_br_ciel_it_year_end_closing_views.xml
  • Dados: l10n_br_ciel_it_year_end_closing_data.xml (sequência)

Campos

Cabeçalho

Campo Tipo Descrição
name Char Referência (gerada ao confirmar, padrão ENC/AAAA/XXXX)
company_id Many2one Empresa
date_from Date Data inicial do exercício
date_to Date Data final do exercício
posting_date Date Data do lançamento contábil
journal_id Many2one Diário contábil para lançamentos
profit_loss_account_id Many2one Conta de Lucros/Prejuízos Acumulados
revenue_group_id Many2one Grupo de contas de receita
expense_group_id Many2one Grupo de contas de despesa
allow_zero_result Boolean Permite zeramento sem contrapartida
state Selection draftcalculatedpostedcancelled
move_id Many2one Lançamento contábil gerado
note Text Observações

Linhas (line_ids)

Campo Tipo Descrição
account_id Many2one Conta contábil de resultado
balance Float Saldo da conta no período
adjustment Float Ajuste manual (opcional)
final_balance Float Saldo final (balanço + ajuste)

Sequência de Numeração

Atributo Valor
XML ID seq_l10n_br_ciel_it_year_end_closing
Código l10n_br_ciel_it.year.end.closing
Prefixo ENC/%(year)s/
Padding 4 dígitos
Quando gerada No momento do action_post() (confirmação), não na criação

Regra: A numeração é gerada apenas na confirmação, não na criação do registro. Se name == '/', o sistema busca a próxima sequência. Fallback: Enc/{id}.


Fluxo de Encerramento

flowchart TD
    A["Criar encerramento<br/>(período fiscal)"] --> B["Calcular saldos<br/>de todas as contas de resultado"]
    B --> C["Exibir linhas<br/>com saldo por conta"]
    C --> D["Ajustes manuais<br/>(opcional)"]
    D --> E["Confirmar e Lançar"]
    E --> F{"Contas obsoletas<br/>com saldo?"}
    F -->|"Sim"| G["UserError:<br/>Reative as contas"]
    G --> D
    F -->|"Não"| H["Gerar lançamento<br/>(zera contas de resultado)"]
    H --> I["Aloca resultado em<br/>Lucros/Prejuízos Acumulados"]
    I --> J["Estado: posted"]
    J --> K["Voltar para Rascunho?"]
    K -->|"Sim"| L["action_draft()<br/>Exclui lançamento"]
    L --> A

Botões da Interface

Botão Método Visível quando Permissão
Calcular action_calculate() state = 'draft' Todos
Recalcular action_recalculate() state in ('draft', 'calculated') Todos
Confirmar e Lançar action_post() state = 'calculated' account.group_account_manager
Cancelar Rotina action_cancel() state not in ('draft', 'cancelled') account.group_account_manager
Voltar para Rascunho action_draft() state != 'draft' account.group_account_manager

Regras de Negócio

Seleção de contas

O sistema busca contas nos grupos configurados (revenue_group_id e expense_group_id):

account.account.search([
    ('company_id', '=', company),
    ('group_id', 'in', group_ids),
    # NÃO filtra mais por deprecated=False → inclusão de obsoletas
])

Mudança importante: Contas obsoletas (deprecated = True) agora são incluídas na busca. Se possuírem saldo, o sistema emite um aviso via chatter e bloqueia a confirmação.

Tratamento de contas obsoletas

Etapa Comportamento
Cálculo (action_calculate) Se contas obsoletas têm saldo, posta aviso no chatter com lista das contas e seus saldos
Confirmação (action_post) Se contas obsoletas com saldo existem nas linhas, bloqueia com UserError
Mensagem de bloqueio "Não é possível confirmar o encerramento. As seguintes contas estão obsoletas e possuem saldo: ..."
Solução Reativar as contas ou remover o saldo antes de confirmar

Contas duplicadas

Se uma conta aparece em mais de um grupo de apuração, ela é considerada apenas uma vez. O sistema posta um aviso no chatter.

Resultado zero

Se allow_zero_result = False e o resultado líquido é zero, o sistema bloqueia com UserError.


Ação "Voltar para Rascunho" (action_draft)

Nova funcionalidade que permite reverter um encerramento:

Aspecto Detalhe
Estados aceitos calculated, posted, cancelled
O que faz Reverte o lançamento (se postado → draft → cancel → unlink)
Efeito Limpa move_id, estado volta para draft, linhas removidas
Confirmação Popup de confirmação: "Isso irá excluir o lançamento contábil vinculado"
Permissão account.group_account_manager
Registro no chatter "A rotina foi revertida para rascunho e o lançamento contábil foi excluído"

Substituição: Antes, o encerramento era irreversível. Agora, o botão "Voltar para Rascunho" permite desfazer e refazer.


Cenários de Uso / Troubleshooting

1. Contas de resultado com saldo após encerramento

  • Verificar: O lançamento foi efetivamente postado no diário selecionado
  • Verificar: Todas as faturas do período estão postadas antes do encerramento

2. Contas obsoletas com saldo

  • Sintoma: Aviso no chatter listando contas obsoletas e seus saldos
  • Bloqueio: UserError ao tentar confirmar
  • Solução: Reativar as contas no Plano de Contas ou transferir o saldo

3. Preciso refazer o encerramento

  • Antes: Cancelar e criar novo registro
  • Agora: Clicar "Voltar para Rascunho" → ajustar → Calcular → Confirmar

Referências Cruzadas