mdebs

The Minimalistic Double-Entry Bookkeeping System


Copyright (C) 1997, by Nathan L. Cutler 

Všechna práva vyhrazena. Tento dokument může být volně šířen jako
celek. Provedením jakékoliv změny však tato možnost zanikne.

Datum poslední aktualizace 29. března 1997

Obsah


Úvod

Softwarový balík s názvem "mdebs" se má někdy v budoucnu stát řešením pro ty, kdo by rádi vedli své podvojné účetnictví pod Linuxem.

mdebs je soubor programů v céčku (ANSI C) a databáze implementované pomocí Postgres95 (nebo, chcete-li, PostgreSQL).

Autorem mdebs je Nathan L. Cutler <ncutler@terminal.cz>.

Spolupracují na projektu

[N.B. pokud jsem zkomolil některé vaše jméno či adresu, předem prosím o prominutí a oznamení správného znění!]


Filozofie

Rozhodl jsem se začít psát mdebs proto, že jsem nenašel žádný software volně šiřitelný pod licencí GPL a běžící pod Linuxem, který by uměl dělat podvojné účetnictví. Přitom jako majitel a zároveň hlavní účetní a vůbec jediný zaměstnanec malé firmy jsem něco takového velmi potřeboval.

Jednodušeně řečeno, vedení účetnictví je souborem úkonů. Tyto úkony mohou být od sebe odděleny a dobře definovány. V některém jiném účetním softwaru se tyto úkony provádí prostřednictvím jediného, většinou obrovského programu s bezpočtem různě vnořených oken a screenů. V mdebsu je každý úkon řešen jedním menším programem.

Celý systém je koncipován tak, aby byl "minimalistický". To znamená, že nemusí nutně umět to, co zrovna ten který uživatel momentálně potřebuje. Toto je však vedlejší. Podstatné je, aby to umělo účtovat. Vystavování faktur, sestavování účetních závěrek, vedení dodavatelských agend, výtisknutí výplatných pásek apod. nechť zajišťují jiné programy.


Současný stav a postup práce

29. března 1997

dumpacct nyní vypisuje i pořadové číslo operace a nesnaží se zjistit protiúčet. Protiúčet lze zjistit prostřednictvím nového programu dumptrans. dumpacct rozšířen o možnost určit období, které má být vypsáno. Zásadně přepracován skript recreate (a přejmenován na dbinit. createpřejmenováno na dbinit_create pro přehlednost. Přidán prográmek dbinit_validatepro validaci dat.

28. března 1997

Přidán skript inputop, což je pokus o uživatelsky friendly prostředí pro tvorbu vstupního souboru k load_denik. Skript používá dialog. Přidán prográmky times100, který konvertuje částku v korunách na částku v haléřích, a acct_query, který zjišťuje přítomnost účtu v účtové osnově. Zlepšen způsob identifikace databáze (vyňato #define DATABASE ze zdrojáků - doplněna podpora getenv()). Nyní jméno databáze nastavuje sám uživatel prostřednictvím enviro-proměnné $MDEBS.

20. března 1997

Přidány další kontroly. Napsán program dumpacct pro prohlížení pohybů na účtu. Čtvrtá alpha release.

19. března 1997

Doplněny kontroly v load_denik. Program loguje své kecy do souboru, aby nezatěžoval jimi uživatele. Třetí alpha release.

18. března 1997

load_denik funguje, byť polovičatě. Chybí kontroly. Program ignoruje informace o účetním období. Druhá alpha release.

15. března 1997

První alpha release. Sice to neumí skoro nic, ale přesto má dokumentaci!

9. března 1997

Začátek práce na účetním deníku. Přidány nové datové struktury. Napsán program init_fiscyear pro inicializaci účetního období. Začátek práce na load_denik, programu pro vstup účetních operací do databáze.

6. března 1997

Přidáno políčko pro analytický podúčet. Funkční load_osnova. První verze inicializačního programu recreate dokončena.

5. března 1997

Funkční osninput a osndump.

28. února 1997

Vzniká velmi pochybný program, který pomocí knihovny Curses předstírá, že něco dělá.


Předpoklady

Aby mdebs něco dělal na vašem systému musíte mít funkční instalaci gcc a Postgres95 (also known as PostgreSQL). Aby fungoval inputop, uživatelský friendly prostředí pro vstup účetních operací, musí být instalován rovněž dialog.

V Makefile je třeba se předem ujistit, že gcc bude vědět, kde najde include soubor libpq-fe.h a sdílenou knihovnu libpq.so. Můj Makefile by měl fungovat na systémech postavených za základě distribuce Debian 1.2 s použitím balíků postgres95 a postgres95-dev.

Informace o Postgres95 je k dispozici na URL http://www.postgresql.org/


FAQ

  1. Kde si můžu stáhnout nejnovější verze?

    Hlavní site: http://www.cise.ufl.edu/~nlc/pro.html

    Mirror sites (mohou, ale nemusí fungovat): http://WAS.PVTNET.CZ/pub/Software/Accounting/
    (courtesy of Petr Šnajdr -- Thank you!)
    http://noel.feld.cvut.cz/~petrl/www.cise.ufl.edu
    (courtesy of Petr Linke -- Thank you!)

  2. Where's the documentation?

    You're looking at it.

  3. Přečetl jsem dokumentaci, ale pořad nevím, jak mám s tím účtovat.

    Navrhuji následující postup:

    1. Přidat řádek export MDEBSDB="MDEBS97" do uživatelského profilu (např. ~/.bash_profile
    2. Editovat osnova.dat aby vypadal jako vaše účetní osnova
    3. Spustit skript dbinit, např. takto:
               dbinit 19970101 19971231
      
    4. Spustit skript inputop s uvedením jména nějakého výstupního souboru (např. denik.dat, ale toto už záleží jen a jen na vás). Zadat nějaké účetní operace.
    5. Spustit program load_denik na vzniklý soubor
    6. V případě chyby prohlédnout si logovací soubor a upravit vstupní soubor ručně (nejdříve odstranit ty operace, které byly účtovány úspěšně!)
    7. Pomocí dumpacct a dumptrans přesvědčit se, že účtování proběhlo správně.

    Datové struktury

    Struktura jednotlivých databázových tabulek.

    fiscyear je tabulka, která definuje účetní období. startd je první den a endd poslední den tohoto období.

    fiscyear
    startd DATE
    endd DATE

    osnova definuje účetní osnovu. acct je třímístní označení účtu, anal je dvoumístní označení analytického podúčtu, a desig je popis účtu.

    osnova
    acct CHAR(3)
    anal CHAR(2)
    desig VARCHAR(60)

    descs zachycuje jednotlivé operace účetního deníku, a obsahuje políčko ent_date a por_cislo, jež spolu slouží jako odkaz na tabulku denik, a políčko descr, což je popis operace.

    descs
    ent_date DATE
    por_cislo INT
    desig VARCHAR(80)

    porad je zvláštní tabulčička, jejíž existence vynutil systém odkazu mezi tabulkami descs a denik. Při vkládání účetních operací je třeba rychle zjistit poslední použité pořadové číslo pro určité datum. Právě tato informace je zachycena zde.

    porad
    ent_date DATE
    max_cislo INT

    V neposlední řadě je tabulka denik, která obsahuje políčka pro zachycení jednotlivých řádků účetní operace. Políčka ent_date a por_cislo jsou odkazem na tabulku descs. Políčka [m]d_acct a [m]d_anal odkazují na tabulku osnova. Jedna z trojic políček [m]d_acct, [m]d_anal a [m]d_amt vždy obsahuje samé nuly. Částky v políčkách [m]d_amt jsou vyjádřeny v haléřích. Když jsou sečteny všechny zápisy, které mají stejné ent_date a por_cislo, strany Má dáti a Dal si musí být rovny.

    denik
    ent_date DATE
    por_cislo INT
    md_acct CHAR(3)
    md_anal CHAR(2)
    md_amt INT
    d_acct CHAR(3)
    d_anal CHAR(2)
    d_amt INT

    Jednotlivé dílčí programy

    Popisy jednotlivých existujících programů, které jsou součástmi mdebsu.

    dbinit

    shell script pro inicializaci, popř. reinicializaci databáze. Bere dva parametry označující začátek a konec účetního období pro tuto databázi. Nezapomeňte, že pro všechny součásti mdebsu je proměnná environmentu $MDEBSDB závazná. Takže dobře si ji zkontrolujte před spuštěním této dávky.

    Postup dávky:

    1. Zlikvidovat databázi, pokud existuje
    2. Vytvořit databázi, zatím bez dat a tabulek
    3. Vytvořit strukturu tabulek v databázi
    4. Inicializovat účetní období (fiscal year) dle zadaných parametrů
    5. Natáhnout účetní osnovu z ASCII souboru ./osnova.dat do databáze

    dbinit_create

    Program, který v existující "holé" databázi vytvoří systém tabulek. Volán z dbinit.

    dbinit_validate

    Program, který ověří správnost zadaného data prostřednictvím voláním funkce valiDate ze souboru generalized.c. Tato funkce zatím provádí pouze velmi rámcovou kontrolu, např. 19979999 ohodnotí jako správné datum.

    dumpacct

    Tento program bere čtyři argumenty: číslo účtu, číslo analytického podúčtu (nebo "--", pokud neni vedena analytika), počáteční datum a konečné datum období, které má být vypsáno.

    Program pak vypisuje všechny pohyby na tomto účtě během zadaného období. Na konci vypisuje celkové pohyby pro obě strany účtu. Při datech shodných s účetním obdobím by tento prográm měl být užitečný při sestavení účetní závěrky.

    dumptrans

    Program bere jako argumenty datum a pořadové číslo nějaké účetní operace a vypíše ji na obrazovku. Zatím jediný způsob, jak zjistit protiúčet.

    fiscyear

    Program, který do tabulky fiscyear zapíše počáteční a konečná data účetního období. Pokud je uveden bez parametru, vypíše stav této tabulky. Pokud je uveden s parametry a účetní období je již inicializováno, účetní období se změní na hodnoty uvedené v parametrech.

    load_denik

    Program, který natáhne účetní operace z libovolného ASCII souboru a cpe je jednu po druhé do tabulek tvořících účetní deník.

    Program bere zatím jeden argument, který interpretuje jako jméno ASCII souboru, který má zpracovat. Formát tohoto souboru je možné dočíst ze vzorového souboru load_denik.dat, který je součástí distribuce.

    Vzhledem k tomu, že tento prográmek byl nejnáročnější ze všech, došlo během debugování k tomu, že program vypisuje množství verbózních hlášek, které nemusí uživatele ve všech případech zajímat. Proto jsou tyto hlášky směrovány do souboru, jehož jméno je shodné se zadaným jménem datového souboru s přidáním přípony ".dat".

    Program je napsán tak, že když dojde ke chybě při zpracování nějaké operace, ať už tuto chybu zavinil autor datového souboru nebo autor programu, místo vzniku chyby je víceméně patrné z logovacího souboru - poslední hláška v něm obsažená označuje poslední úspěšně provedený úkon před chybou.

    Protože Postgres95 umí transakční zpracování dotazů, nemělo by dojít k částečnému uložení chybně zadané účetní operace.

    inputop

    Tento shell-script používá utilitku dialog k zajištění pohodlnému způsobu pořízení primárních dat účetního deníku od uživatele. Skript zatím má řadu nevýhod, např. není možné zadat složenou operaci, skript nekontroluje shodnost částek atd. Možná, že největší nevýhodou tohoto programu je to, že je implementován jako skript.

    load_osnova

    Program, který natáhne z ASCII souboru účetní osnovu a cpe ji do tabulky osnova. Tento prográmek se vůbec neohlíží po tom, zda je, či není tato tabulka prázdná, a vůbec nekontroluje případnou duplicitu účtů. Proto je moudré ho spustit pouze jako součást scriptu dbinit s tím, že účetní osnovu pro dané účetní období se vkládá do souboru OSNOVA_DAT (viz níže) celou.

    Prozatím je jméno ASCII souboru doslova uvedené v zdrojáku load_osnova.h jako OSNOVA_DAT.

    Formát souboru OSNOVA_DAT je následující:

    Součástí distribuce je i vzorový soubor osnova.dat.

    osndump

    Program, který vypíše celou účetní osnovu na stdout.

    osninput

    Program, jehož prostřednictvím lze vymazávat, přidávat a dotazovat jednotlivé účty účetní osnovy podle jejich čísla (včetně případného analytického podčísla)

    times100

    Program bere jeden argument, string ve tvaru ####.##, což má být částka v korunách, a vypíše na stdout odpovídající částku v haléřích. Volán z inputop.


    Poznámky ke zdrojovému kódu

    Následují některé poznámky na adresu zdrojáků.

    generalized.c

    Soubor generalized.c obsahuje ty funkce, ktere svou obecnou povahou mohou slouzit vice soucastem mdebsu.