Preskočiť na hlavný obsah

Amortizácia

Naučte sa efektívne spravovať amortizáciu v Beancount, čo vám umožní rozložiť výdavky v čase pre lepšiu finančnú prehľadnosť a riadenie.

Účtujte platby vopred ako aktíva a potom uvoľňujte mesačný podiel do nákladov bežnými transakciami v Beancount. Skript nižšie vytlačí kompletné, reprodukovateľné účtovné knihy pre poistenie, softvér, retainer a odpisy zariadení. Vyžaduje Python 3 a žiadne knižnice tretích strán.

Napríklad šesťmesačná poistka na auto stojí 600 USD vopred. Šesť mesačných uvoľnení po 100 USD oddeľuje hotovostnú platbu od uznania nákladov a pomáha vám efektívne rozpočtovať.

Čo je amortizácia?

Amortizácia rozkladá náklady na nehmotné aktívum alebo položku platenú vopred na obdobia, ktorým prináša úžitok. Tieto príklady používajú jednoduchý mesačný konvent pre manažérske výkazníctvo. Neurčujú daňový odpočet ani zákonnú metódu odpisovania.

Beancount riešenie: fava.plugins.amortize_over

Kontrola kompatibility 2026-09-07: fava.plugins.amortize_over chýba v adresári pluginov štandardnej Fava 1.30.16. Pridanie direktívy plugin do tejto štandardnej inštalácie spôsobí importnú chybu. Prenosné príklady tu boli testované s Beancount 3.2.3, beanquery 0.2.0 a Fava 1.30.16.

Vlastný zdroj Beancount.io obsahuje implementáciu amortize_over. Očakáva samostatnú platbu a plánovaciu transakciu s presne dvoma zápismi a metadátami amortize_months. Jeho mesačné dátumy sledujú pôvodný deň plánu a pri načítaní vynecháva budúce kópie. Jeho pravidlo zaokrúhľovania rozdeľuje centy medzi zostávajúce obdobia. Tento dôkaz zo zdroja neurčuje, ktorú verziu hostovaná inštalácia momentálne prevádzkuje. Explicitné plány nižšie majú vlastné uvedené dátumy a pravidlo zaokrúhľovania pre posledné obdobie.

Krok 1: Povolenie pluginu

Pre tento pracovný postup nie je potrebné povoliť žiadny plugin. Uložte Python blok z kroku 3 ako amortize.py. Nainštalujte uv na spustenie validačných a dotazovacích príkazov s verziami použitými tu. Fava je potrebná len vtedy, ak chcete webové prehľady.

Skript zapisuje bežné transakcie na štandardný výstup. Presmerujte tento výstup do nového príkladového súboru, skontrolujte ho a overte pred začlenením záznamov do svojich kníh. Opätovné spustenie s > nahradí tento vygenerovaný príkladový súbor; pripojenie s >> by duplikovalo transakcie.

Krok 2: Štruktúra vašich účtov

Každý vygenerovaný súbor je samostatná príkladová účtovná kniha. Príklad poistenia otvára tieto účty a poskytuje ilustračný zostatok na bankovom účte 600 USD pred zaplatením poistného:

ÚčetÚčel
Assets:Bank:CheckingHotovosť použitá na platbu
Assets:Prepaid:InsurancePoistné čakajúce na uznanie nákladov
Expenses:Insurance:AutoMesačné poistné náklady
Equity:Opening-BalancesProtistrana počiatočnej hotovosti príkladu

Pri adaptácii vygenerovaných transakcií na existujúcu účtovnú knihu použite svoje skutočné otvorené účty a bankový zostatok. Nepridávajte počiatočnú hotovosť z príkladu na už financovaný účet ani nezaznamenávajte nákup znova, ak už vo svojich knihách je.

Krok 3: Zaznamenanie amortizovanej transakcie

Uložte tento kompletný program ako amortize.py. Každý scenár špecifikuje dátum platby, počet mesačných uvoľnení, nakúpené aktívum, nákladový účet a účet kreditovaný uvoľneniami. Prvé uvoľnenie je v deň platby; neskoršie uvoľnenia pripadajú na rovnaký deň nasledujúcich mesiacov, v prípade potreby upravené na koniec mesiaca.

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)

Spustite tento blok príkazov z adresára obsahujúceho amortize.py:

python3 amortize.py insurance > insurance.beancount
uvx --from beancount-io==0.1.0 bea --file insurance.beancount check

Platba kredituje bežný účet sumou 600.00 USD a debetuje poistné platené vopred rovnakou sumou. Každé uvoľnenie debetuje náklady a kredituje poistné platené vopred sumou 100.00 USD. Je šesť uvoľnení, 1. júna, 1. júla, 1. augusta, 1. septembra, 1. októbra a 1. novembra 2024. Zostatok poistného plateného vopred je 500.00 USD po júnovom uvoľnení, 400.00 USD po júlovom a nula po novembrovom.

Praktické príklady

Ročná softvérová licencia

Použite rovnaký uložený skript na vygenerovanie samostatného príkladu softvéru:

python3 amortize.py software > software.beancount
uvx --from beancount-io==0.1.0 bea --file software.beancount check

Platba za licenciu 1 200 USD je 15. januára 2024. Dvanásť uvoľnení po 100.00 USD prebieha od 15. januára do 15. decembra 2024. Tento príklad uznáva jeden celý mesiac na začiatku každého mesiaca; nepomerne nerozdeľuje január. Po poslednom uvoľnení je Assets:Prepaid:Software nulový a Expenses:Software:Adobe dosahuje 1200.00 USD.

Retainer za profesionálne služby

Tento samostatný príklad považuje platbu 4 500 USD z 5. januára za poplatok platený vopred, ktorý sa rovnomerne spotrebúva v januári, februári a marci:

python3 amortize.py retainer > retainer.beancount
uvx --from beancount-io==0.1.0 bea --file retainer.beancount check

Tri uvoľnenia po 1500.00 USD s dátumami 5. januára, 5. februára a 5. marca 2024 ponechávajú Assets:Prepaid:Professional na nule a Expenses:Professional:Legal na 4500.00 USD. Pre retainer, ktorý sa zarába poskytovaním služieb, nahraďte tento predpoklad skutočným harmonogramom služieb.

Odpisy zariadení (dlhodobý hmotný majetok)

Odpisy dlhodobého hmotného majetku používajú korekčný účet na zachovanie obstarávacej ceny. Tento príklad predpokladá životnosť tri roky, nulovú zostatkovú hodnotu a plné mesačné uznávanie počnúc 20. januárom 2024:

python3 amortize.py equipment > equipment.beancount
uvx --from beancount-io==0.1.0 bea --file equipment.beancount check

Nákup debetuje Assets:Equipment:Computers:Cost sumou 3000.00 USD raz. Tridsaťšesť uvoľnení debetuje Expenses:Depreciation:Computers a kredituje Assets:Equipment:Computers:AccumDep. Uvoľnenia 1–35 sú 83.33 USD; uvoľnenie 36 z 20. decembra 2026 je 83.45 USD. Teda 35 × 83.33 + 83.45 = 3000.00. Použitie 83.33 USD pre všetkých 36 by ponechalo 0.12 USD neodpísaných.

Po dokončení zostáva obstarávacia cena 3000.00 USD, oprávky sú -3000.00 USD a ich čistá účtovná hodnota je nula. Korekčný účet sa sám nevráti na nulu, kým je zariadenie stále evidované.

Výkazníctvo a overovanie

1. Sledovanie predplatených zostatkov pomocou asercií

Beancount kontroluje zostatok na začiatku svojho dátumu, pred transakciami daného dňa. Pripojte tento kontextový blok asercií k vygenerovanému insurance.beancount a potom znova spustite jeho príkaz 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 USD
  1. júl nasleduje po dvoch uvoľneniach, 1. júna a 1. júla. Asercia 500.00 USD k 2. júlu je nesprávna. Tieto asercie potrebujú vygenerovanú účtovnú knihu poistenia; nie sú to samostatné transakcie.

2. Pokročilé overovanie pomocou bea query

S vygenerovaným súborom poistenia tento spustiteľný príkaz vráti kumulatívne zostatky do 1. júla s použitím výhradného limitu 2. júla:

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"

Očakávajte Assets:Prepaid:Insurance na 400.00 USD a Expenses:Insurance:Auto na 200.00 USD. Zoskupenie podľa dátumu by namiesto kumulatívneho zostatku ukázalo pohyb každého dňa.

Na zobrazenie akéhokoľvek vygenerovaného súboru v testovanej lokálnej verzii Fava použite:

uv run --no-project --with beancount==3.2.3 --with beanquery==0.2.0 --with fava==1.30.16 fava insurance.beancount

Otvorte lokálnu URL, ktorú Fava vytlačí. Pozrite si referenciu možností Fava pre konfiguráciu. Vyberte vykazované obdobie explicitne: generátor emituje celý plán, vrátane budúcich dátumov, takže neobmedzený súčet zahŕňa budúce uvoľnenia. Pre samostatné plánovacie súbory pozrite pracovný postup scenárov prognóz.

Obmedzenia a záverečné tipy

  • Dátumy sú explicitné: Zmena dátumu nákupu ticho neposunie prvé uvoľnenie. V tomto skripte sa prvé uvoľnenie rovná dátumu platby; prispôsobte začiatok samostatne, ak služba začína neskôr.
  • Zaokrúhľovanie prebieha raz: Skript zaokrúhli pravidelnú mesačnú sumu na centy a potom zvyšok vloží do posledného uvoľnenia. Zachovajte kompletný vygenerovaný plán, aby ste zachovali túto úpravu.
  • Bežné záznamy pretrvávajú: Tieto uvoľnenia sú uložené vo vygenerovanom súbore. Skontrolujte a zaznamenajte ich raz. Nezapínajte tiež automatickú amortizáciu pre rovnaké náklady, inak by sa náklady vykázali dvakrát.
  • Vyberte účtovný plán: Toto sú manažérske príklady, nie jurisdikčné daňové pravidlá. Pre nepravidelné úžitky alebo denné pomerovanie vypočítajte a zaznamenajte skutočné sumy a dátumy.

Zdroj: https://beancount.io/sk/docs/Tips/amortize