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 31. března 1997

Obsah


Úvod

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

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

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

Spolupracují na projektu

Projektu laskavě věnovali místo na serverech:

[N.B. pokud jsem zkomolil některé 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

31. března 1997

V průběhu dalšího dne provedeno vyúčtování za celý loňský rok včetně účetní závěrky jedné společnosti s ručením omezeným, takže mdebs už má za sebou první použití "naostro". Toho se docílilo za cenu dalších nepočítaných bugfixů a jiných úprav zdrojáků. Přibyl program odpisplan na vyjetí plánů zrychleného odpisování.

30. března 1997

Nalezen bug v load_denik, jehož odstranění vyžaduje podstatné přepracování programu. Program nyní vypisuje chybné transakce do souboru s příponou .rej. Dopracována funkce valiDate() v souboru generalized.c. Dále zlidštěn skript inputop. Přejmenováno: osninput na inputosn, osndump na dumposn. Doplněn program rmtrans. Doplněn skript printacct.

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). create přejmenováno na dbinit_create pro přehlednost. Přidán prográmek dbinit_validate pro 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í inputosn a dumposn.

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


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.

dumposn

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

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.

inputosn

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)

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.

odpisplan

Tento malinkatý prográmek vypisuje plány zrychlených odpisů.

printacct

Tento skript je zde pouze jako ilustrace toho, jak lze kombinovat základní funkce mdebsu s jinými programy (v tomto případě program a2ps) a tím doplnit mdebs o chybějící funkce (v tomto případě tisk).

rmtrans

Program bere jako argument označení účetní operace. Pokud taková operace existuje, vymaže ji.

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 sloužit vice soucastem mdebsu.