Registre custos pagos antecipadamente como ativos e, em seguida, libere a parcela de cada mês como despesa com transações comuns do Beancount. O script abaixo imprime ledger completos e reproduzíveis para seguros, software, retentores e depreciação de equipamentos. Ele requer Python 3 e nenhuma biblioteca de terceiros.
Por exemplo, uma apólice de seguro de carro de seis meses custa $600 à vista. Seis liberações mensais de $100 separam o pagamento em dinheiro do reconhecimento da despesa e ajudam você a fazer um orçamento eficaz.
O que é Amortização?
A amortização distribui o custo de um ativo intangível ou item pago antecipadamente ao longo dos períodos em que ele traz benefícios. Estes exemplos usam uma convenção mensal simples para relatórios gerenciais. Eles não determinam uma dedução fiscal ou um método de depreciação estatutário.
A Solução Beancount: fava.plugins.amortize_over
Compatibilidade verificada em 2026-09-07: fava.plugins.amortize_over está ausente do diretório de plugins do Fava 1.30.16 padrão. Adicionar sua diretiva plugin a essa instalação padrão produz um erro de importação. Os exemplos portáveis aqui foram testados com Beancount 3.2.3, beanquery 0.2.0 e Fava 1.30.16.
O código-fonte personalizado do Beancount.io contém uma implementação de amortize_over. Ela espera um pagamento separado e uma transação de cronograma com exatamente dois lançamentos e metadados amortize_months. Suas datas mensais seguem o dia original do cronograma e omitem cópias futuras no momento do carregamento. Sua regra de arredondamento distribui os centavos pelos períodos restantes. Esta evidência da fonte não estabelece qual versão uma implantação hospedada executa atualmente. Os cronogramas explícitos abaixo têm suas próprias datas declaradas e regra de arredondamento do período final.
Etapa 1: Habilitar o Plugin
Não há plugin para habilitar neste fluxo de trabalho. Salve o bloco Python da etapa 3 como amortize.py. Instale uv para executar os comandos de validação e consulta com as versões usadas aqui. O Fava só é necessário se você quiser os relatórios web.
O script escreve transações comuns na saída padrão. Redirecione essa saída para um novo arquivo de exemplo, inspecione-o e valide-o antes de incorporar as entradas em seus livros. Executar novamente com > substitui esse arquivo de exemplo gerado; anexar com >> duplicaria as transações.
Etapa 2: Estruturar Suas Contas
Cada arquivo gerado é um ledger de exemplo independente. O exemplo de seguro abre estas contas e fornece um saldo bancário inicial ilustrativo de $600 antes de pagar o prêmio:
| Conta | Finalidade |
|---|---|
Assets:Bank:Checking | Dinheiro usado para o pagamento |
Assets:Prepaid:Insurance | Prêmio aguardando reconhecimento de despesa |
Expenses:Insurance:Auto | Despesa mensal de seguro |
Equity:Opening-Balances | Contrapartida do dinheiro inicial do exemplo |
Ao adaptar as transações geradas para um ledger existente, use suas aberturas de conta e saldo bancário reais. Não adicione o dinheiro inicial do exemplo a uma conta já financiada, nem registre uma compra novamente se ela já estiver em seus livros.
Etapa 3: Registrar a Transação Amortizada
Salve este programa completo como amortize.py. Cada cenário especifica a data do pagamento, o número de liberações mensais, o ativo de compra, a conta de despesa e a conta creditada pelas liberações. A primeira liberação é na data do pagamento; as liberações posteriores caem no mesmo dia dos meses subsequentes, ajustadas para o fim do mês, se necessário.
import argparse
import calendar
from datetime import date
from decimal import Decimal, ROUND_HALF_EVEN
# amount, months, payment date, purchase asset, expense, release credit account
SCENARIOS = {
"insurance": (
"600.00", 6, "2024-06-01", "Assets:Prepaid:Insurance",
"Expenses:Insurance:Auto", "Assets:Prepaid:Insurance",
),
"software": (
"1200.00", 12, "2024-01-15", "Assets:Prepaid:Software",
"Expenses:Software:Adobe", "Assets:Prepaid:Software",
),
"retainer": (
"4500.00", 3, "2024-01-05", "Assets:Prepaid:Professional",
"Expenses:Professional:Legal", "Assets:Prepaid:Professional",
),
"equipment": (
"3000.00", 36, "2024-01-20", "Assets:Equipment:Computers:Cost",
"Expenses:Depreciation:Computers", "Assets:Equipment:Computers:AccumDep",
),
}
parser = argparse.ArgumentParser()
parser.add_argument("scenario", choices=SCENARIOS)
args = parser.parse_args()
amount, months, paid, asset, expense, credit = SCENARIOS[args.scenario]
total = Decimal(amount)
start = date.fromisoformat(paid)
monthly = (total / months).quantize(Decimal("0.01"), rounding=ROUND_HALF_EVEN)
bank = "Assets:Bank:Checking"
equity = "Equity:Opening-Balances"
def transaction(day, narration, debit, credit_account, value):
print(f'\n{day} * "{narration}"')
print(f" {debit} {value:.2f} USD")
print(f" {credit_account} {-value:.2f} USD")
print('option "operating_currency" "USD"')
for account in sorted({bank, equity, asset, expense, credit}):
print(f"2024-01-01 open {account} USD")
transaction("2024-01-01", "Example opening cash", bank, equity, total)
transaction(paid, f"Pay {args.scenario}", asset, bank, total)
for index in range(months):
year, month_index = divmod(start.year * 12 + start.month - 1 + index, 12)
month = month_index + 1
day = min(start.day, calendar.monthrange(year, month)[1])
release_date = date(year, month, day)
# Put the entire rounding remainder into the final release exactly once.
release = monthly if index < months - 1 else total - monthly * (months - 1)
transaction(release_date, f"{args.scenario} release {index + 1}/{months}",
expense, credit, release)Execute este bloco de comandos a partir do diretório que contém amortize.py:
python3 amortize.py insurance > insurance.beancount
uvx --from beancount-io==0.1.0 bea --file insurance.beancount checkO pagamento credita a conta corrente em 600.00 USD e debita o seguro antecipado no mesmo valor. Cada liberação debita a despesa e credita o seguro antecipado em 100.00 USD. Há seis liberações, em 1º de junho, 1º de julho, 1º de agosto, 1º de setembro, 1º de outubro e 1º de novembro de 2024. O saldo antecipado é 500.00 USD após a liberação de junho, 400.00 USD após a de julho e zero após a de novembro.
Exemplos Práticos
Licença de Software Anual
Use o mesmo script salvo para gerar um exemplo de software independente separado:
python3 amortize.py software > software.beancount
uvx --from beancount-io==0.1.0 bea --file software.beancount checkO pagamento da licença de $1.200 é em 15 de janeiro de 2024. Doze liberações de 100.00 USD vão de 15 de janeiro a 15 de dezembro de 2024. Este exemplo reconhece um mês inteiro em cada início mensal; ele não rateia janeiro. Após a última liberação, Assets:Prepaid:Software é zero e Expenses:Software:Adobe totaliza 1200.00 USD.
Retentor de Serviços Profissionais
Este exemplo separado trata o pagamento de $4.500 em 5 de janeiro como uma taxa antecipada consumida igualmente em janeiro, fevereiro e março:
python3 amortize.py retainer > retainer.beancount
uvx --from beancount-io==0.1.0 bea --file retainer.beancount checkTrês liberações de 1500.00 USD, datadas de 5 de janeiro, 5 de fevereiro e 5 de março de 2024, deixam Assets:Prepaid:Professional em zero e Expenses:Professional:Legal em 4500.00 USD. Para um retentor ganho conforme os serviços são entregues, substitua essa premissa pelo cronograma real de serviços.
Depreciação de Equipamentos (Ativos Fixos)
A depreciação de ativos fixos usa uma conta de ativo contraposto para preservar o custo de compra. Este exemplo assume uma vida útil de três anos, valor residual zero e reconhecimento mensal integral começando em 20 de janeiro de 2024:
python3 amortize.py equipment > equipment.beancount
uvx --from beancount-io==0.1.0 bea --file equipment.beancount checkA compra debita Assets:Equipment:Computers:Cost em 3000.00 USD uma vez. As 36 liberações debitam Expenses:Depreciation:Computers e creditam Assets:Equipment:Computers:AccumDep. As liberações 1–35 são 83.33 USD; a liberação 36 em 20 de dezembro de 2026 é 83.45 USD. Assim, 35 × 83.33 + 83.45 = 3000.00. Usar 83.33 USD para todas as 36 deixaria 0.12 USD não depreciado.
Na conclusão, o custo permanece 3000.00 USD, a depreciação acumulada é -3000.00 USD e seu valor contábil líquido é zero. A conta de ativo contraposto em si não retorna a zero enquanto o equipamento ainda estiver registrado.
Relatórios e Verificação
1. Monitorar Saldos Antecipados com Asserções
O Beancount verifica um saldo no início de sua data, antes das transações desse dia. Anexe este bloco de asserção contextual ao insurance.beancount gerado e execute novamente seu comando bea check:
2024-06-02 balance Assets:Prepaid:Insurance 500.00 USD
2024-07-02 balance Assets:Prepaid:Insurance 400.00 USD
2024-07-02 balance Expenses:Insurance:Auto 200.00 USD
2024-11-02 balance Assets:Prepaid:Insurance 0.00 USD
2024-11-02 balance Expenses:Insurance:Auto 600.00 USD2 de julho segue duas liberações, 1º de junho e 1º de julho. Uma asserção de 500.00 USD em 2 de julho está incorreta. Essas asserções precisam do ledger de seguro gerado; elas não são transações independentes.
2. Verificação Avançada com bea query
Com o arquivo de seguro gerado, este comando executável retorna saldos acumulados até 1º de julho, usando um corte exclusivo em 2 de julho:
uvx --from beancount-io==0.1.0 bea --file insurance.beancount query "SELECT account, sum(position) WHERE date < 2024-07-02 AND account ~ '^(Assets:Prepaid:Insurance|Expenses:Insurance:Auto)$' GROUP BY account ORDER BY account"Espere Assets:Prepaid:Insurance em 400.00 USD e Expenses:Insurance:Auto em 200.00 USD. Agrupar por data em vez disso mostraria o movimento de cada dia, em vez de um saldo acumulado.
Para visualizar qualquer arquivo gerado na versão local do Fava testada, use:
uv run --no-project --with beancount==3.2.3 --with beanquery==0.2.0 --with fava==1.30.16 fava insurance.beancountAbra o URL local que o Fava imprime. Consulte a referência de opções do Fava para configuração. Selecione o período de relatório explicitamente: o gerador emite o cronograma inteiro, incluindo datas futuras, então um total irrestrito inclui liberações futuras. Para arquivos de planejamento separados, consulte o fluxo de trabalho de cenário de previsão.
Limitações e Dicas Finais
- As datas são explícitas: Alterar uma data de compra não adia silenciosamente a primeira liberação. Neste script, a primeira liberação é igual à data do pagamento; adapte o início separadamente se o serviço começar mais tarde.
- O arredondamento ocorre uma vez: O script arredonda o valor mensal regular para centavos e coloca o restante na liberação final. Mantenha o cronograma completo gerado para preservar esse ajuste.
- Entradas comuns persistem: Essas liberações são salvas no arquivo gerado. Revise e registre-as uma vez. Não habilite também a amortização automática para o mesmo custo, ou a despesa seria reconhecida duas vezes.
- Escolha o cronograma contábil: Estes são exemplos gerenciais, não regras fiscais específicas de jurisdição. Para benefícios irregulares ou rateio diário, calcule e registre os valores e datas reais em vez disso.