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.
Menu do Sistema¶
Faturamento → Faturamento → Ações → Encerramento do Exercício
Implementação Técnica¶
- Model:
l10n_br_ciel_it_account.year.end.closing— classeYearEndClosing - Model linhas:
l10n_br_ciel_it_account.year.end.closing.line— classeYearEndClosingLine - 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 | draft → calculated → posted → cancelled |
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:
UserErrorao 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¶
- Anterior: Apuração de Impostos
- Próximo: Posição Fiscal e Diários
- ECD (SPED): ECD — Registro I355 (exclusão de encerramentos)
- Índice: Sumário Geral