mdebs

The Minimalistic Double-Entry Bookkeeping System


Copyright (C) 1997, by Nathan L. Cutler 

Vsechna prava vyhrazena. Tento dokument muze byt volne siren jako
celek. Provedenim jakekoliv zmeny vsak tato moznost zanikne.

Datum posledni aktualizace 31. brezna 1997

Obsah


Uvod

Softwarovy balik s nazvem "mdebs" si klade za cil stat se resenim pro ty, kdo by radi vedli sve podvojne ucetnictvi pod Linuxem.

mdebs je soubor programu v cecku (ANSI C), shell-skriptu a databaze implementovane pomoci Postgres95 (nebo, chcete-li, PostgreSQL).

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

Spolupracuji na projektu

Projektu laskave venovali misto na serverech:

[N.B. pokud jsem zkomolil nektere jmeno ci adresu, predem prosim o prominuti a oznameni spravneho zneni!]


Filozofie

Rozhodl jsem se zacit psat mdebs proto, ze jsem nenasel zadny software volne siritelny pod licenci GPL a bezici pod Linuxem, ktery by umel delat podvojne ucetnictvi. Pritom jako majitel a zaroven hlavni ucetni a vubec jediny zamestnanec male firmy jsem neco takoveho velmi potreboval.

Jednodusene receno, vedeni ucetnictvi je souborem ukonu. Tyto ukony mohou byt od sebe oddeleny a dobre definovany. V nekterem jinem ucetnim softwaru se tyto ukony provadi prostrednictvim jedineho, vetsinou obrovskeho programu s bezpoctem ruzne vnorenych oken a screenu. V mdebsu je kazdy ukon resen jednim mensim programem.

Cely system je koncipovan tak, aby byl "minimalisticky". To znamena, ze nemusi nutne umet to, co zrovna ten ktery uzivatel momentalne potrebuje. Toto je vsak vedlejsi. Podstatne je, aby to umelo uctovat. Vystavovani faktur, sestavovani ucetnich zaverek, vedeni dodavatelskych agend, vytisknuti vyplatnych pasek apod. necht zajistuji jine programy.


Soucasny stav a postup prace

31. brezna 1997

V prubehu dalsiho dne provedeno vyuctovani za cely lonsky rok vcetne ucetni zaverky jedne spolecnosti s rucenim omezenym, takze mdebs uz ma za sebou prvni pouziti "naostro". Toho se docililo za cenu dalsich nepocitanych bugfixu a jinych uprav zdrojaku. Pribyl program odpisplan na vyjeti planu zrychleneho odpisovani.

30. brezna 1997

Nalezen bug v load_denik, jehoz odstraneni vyzaduje podstatne prepracovani programu. Program nyni vypisuje chybne transakce do souboru s priponou .rej. Dopracovana funkce valiDate() v souboru generalized.c. Dale zlidsten skript inputop. Prejmenovano: osninput na inputosn, osndump na dumposn. Doplnen program rmtrans. Doplnen skript printacct.

29. brezna 1997

dumpacct nyni vypisuje i poradove cislo operace a nesnazi se zjistit protiucet. Protiucet lze zjistit prostrednictvim noveho programu dumptrans. dumpacct rozsiren o moznost urcit obdobi, ktere ma byt vypsano. Zasadne prepracovan skript recreate (a prejmenovan na dbinit). create prejmenovano na dbinit_create pro prehlednost. Pridan programek dbinit_validate pro validaci dat.

28. brezna 1997

Pridan skript inputop, coz je pokus o uzivatelsky friendly prostredi pro tvorbu vstupniho souboru k load_denik. Skript pouziva dialog. Pridan programky times100, ktery konvertuje castku v korunach na castku v halerich, a acct_query, ktery zjistuje pritomnost uctu v uctove osnove. Zlepsen zpusob identifikace databaze (vynato #define DATABASE ze zdrojaku - doplnena podpora getenv()). Nyni jmeno databaze nastavuje sam uzivatel prostrednictvim enviro-promenne $MDEBS.

20. brezna 1997

Pridany dalsi kontroly. Napsan program dumpacct pro prohlizeni pohybu na uctu. Ctvrta alpha release.

19. brezna 1997

Doplneny kontroly v load_denik. Program loguje sve kecy do souboru, aby nezatezoval jimi uzivatele. Treti alpha release.

18. brezna 1997

load_denik funguje, byt polovicate. Chybi kontroly. Program ignoruje informace o ucetnim obdobi. Druha alpha release.

15. brezna 1997

Prvni alpha release. Sice to neumi skoro nic, ale presto ma dokumentaci!

9. brezna 1997

Zacatek prace na ucetnim deniku. Pridany nove datove struktury. Napsan program init_fiscyear pro inicializaci ucetniho obdobi. Zacatek prace na load_denik, programu pro vstup ucetnich operaci do databaze.

6. brezna 1997

Pridano policko pro analyticky poducet. Funkcni load_osnova. Prvni verze inicializacniho programu recreate dokoncena.

5. brezna 1997

Funkcni inputosn a dumposn.

28. unora 1997

Vznika velmi pochybny program, ktery pomoci knihovny Curses predstira, ze neco dela.


Predpoklady

Aby mdebs neco delal na vasem systemu musite mit funkcni instalaci gcc a Postgres95 (also known as PostgreSQL). Aby fungoval inputop, uzivatelsky friendly prostredi pro vstup ucetnich operaci, musi byt instalovan rovnez dialog.

V Makefile je treba se predem ujistit, ze gcc bude vedet, kde najde include soubor libpq-fe.h a sdilenou knihovnu libpq.so. Muj Makefile by mel fungovat na systemech postavenych za zaklade distribuce Debian 1.2 s pouzitim baliku postgres95 a postgres95-dev.

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


FAQ


Datove struktury

Struktura jednotlivych databazovych tabulek.

fiscyear je tabulka, ktera definuje ucetni obdobi. startd je prvni den a endd posledni den tohoto obdobi.

fiscyear
startd DATE
endd DATE

osnova definuje ucetni osnovu. acct je trimistni oznaceni uctu, anal je dvoumistni oznaceni analytickeho poductu, a desig je popis uctu.

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

descs zachycuje jednotlive operace ucetniho deniku, a obsahuje policko ent_date a por_cislo, jez spolu slouzi jako odkaz na tabulku denik, a policko descr, coz je popis operace.

descs
ent_date DATE
por_cislo INT
desig VARCHAR(80)

porad je zvlastni tabulcicka, jejiz existence vynutil system odkazu mezi tabulkami descs a denik. Pri vkladani ucetnich operaci je treba rychle zjistit posledni pouzite poradove cislo pro urcite datum. Prave tato informace je zachycena zde.

porad
ent_date DATE
max_cislo INT

V neposledni rade je tabulka denik, ktera obsahuje policka pro zachyceni jednotlivych radku ucetni operace. Policka ent_date a por_cislo jsou odkazem na tabulku descs. Policka [m]d_acct a [m]d_anal odkazuji na tabulku osnova. Jedna z trojic policek [m]d_acct, [m]d_anal a [m]d_amt vzdy obsahuje same nuly. Castky v polickach [m]d_amt jsou vyjadreny v halerich. Kdyz jsou secteny vsechny zapisy, ktere maji stejne ent_date a por_cislo, strany Ma dati a Dal si musi byt 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

Jednotlive dilci programy

Popisy jednotlivych existujicich programu, ktere jsou soucastmi mdebsu.

dbinit

shell script pro inicializaci, popr. reinicializaci databaze. Bere dva parametry oznacujici zacatek a konec ucetniho obdobi pro tuto databazi. Nezapomente, ze pro vsechny soucasti mdebsu je promenna environmentu $MDEBSDB zavazna. Takze dobre si ji zkontrolujte pred spustenim teto davky.

Postup davky:

  1. Zlikvidovat databazi, pokud existuje
  2. Vytvorit databazi, zatim bez dat a tabulek
  3. Vytvorit strukturu tabulek v databazi
  4. Inicializovat ucetni obdobi (fiscal year) dle zadanych parametru
  5. Natahnout ucetni osnovu z ASCII souboru ./osnova.dat do databaze

dbinit_create

Program, ktery v existujici "hole" databazi vytvori system tabulek. Volan z dbinit.

dbinit_validate

Program, ktery overi spravnost zadaneho data prostrednictvim volanim funkce valiDate ze souboru generalized.c. Tato funkce zatim provadi pouze velmi ramcovou kontrolu, napr. 19979999 ohodnoti jako spravne datum.

dumpacct

Tento program bere ctyri argumenty: cislo uctu, cislo analytickeho poductu (nebo "--", pokud neni vedena analytika), pocatecni datum a konecne datum obdobi, ktere ma byt vypsano.

Program pak vypisuje vsechny pohyby na tomto ucte behem zadaneho obdobi. Na konci vypisuje celkove pohyby pro obe strany uctu. Pri datech shodnych s ucetnim obdobim by tento program mel byt uzitecny pri sestaveni ucetni zaverky.

dumposn

Program, ktery vypise celou ucetni osnovu na stdout.

dumptrans

Program bere jako argumenty datum a poradove cislo nejake ucetni operace a vypise ji na obrazovku. Zatim jediny zpusob, jak zjistit protiucet.

fiscyear

Program, ktery do tabulky fiscyear zapise pocatecni a konecna data ucetniho obdobi. Pokud je uveden bez parametru, vypise stav teto tabulky. Pokud je uveden s parametry a ucetni obdobi je jiz inicializovano, ucetni obdobi se zmeni na hodnoty uvedene v parametrech.

load_denik

Program, ktery natahne ucetni operace z libovolneho ASCII souboru a cpe je jednu po druhe do tabulek tvoricich ucetni denik.

Program bere zatim jeden argument, ktery interpretuje jako jmeno ASCII souboru, ktery ma zpracovat. Format tohoto souboru je mozne docist ze vzoroveho souboru load_denik.dat, ktery je soucasti distribuce.

Vzhledem k tomu, ze tento programek byl nejnarocnejsi ze vsech, doslo behem debugovani k tomu, ze program vypisuje mnozstvi verboznich hlasek, ktere nemusi uzivatele ve vsech pripadech zajimat. Proto jsou tyto hlasky smerovany do souboru, jehoz jmeno je shodne se zadanym jmenem datoveho souboru s pridanim pripony ".dat".

Program je napsan tak, ze kdyz dojde ke chybe pri zpracovani nejake operace, at uz tuto chybu zavinil autor datoveho souboru nebo autor programu, misto vzniku chyby je vicemene patrne z logovaciho souboru - posledni hlaska v nem obsazena oznacuje posledni uspesne provedeny ukon pred chybou.

Protoze Postgres95 umi transakcni zpracovani dotazu, nemelo by dojit k castecnemu ulozeni chybne zadane ucetni operace.

inputop

Tento shell-script pouziva utilitku dialog k zajisteni pohodlnemu zpusobu porizeni primarnich dat ucetniho deniku od uzivatele. Skript zatim ma radu nevyhod, napr. neni mozne zadat slozenou operaci, skript nekontroluje shodnost castek atd. Mozna, ze nejvetsi nevyhodou tohoto programu je to, ze je implementovan jako skript.

inputosn

Program, jehoz prostrednictvim lze vymazavat, pridavat a dotazovat jednotlive ucty ucetni osnovy podle jejich cisla (vcetne pripadneho analytickeho podcisla)

load_osnova

Program, ktery natahne z ASCII souboru ucetni osnovu a cpe ji do tabulky osnova. Tento programek se vubec neohlizi po tom, zda je, ci neni tato tabulka prazdna, a vubec nekontroluje pripadnou duplicitu uctu. Proto je moudre ho spustit pouze jako soucast scriptu dbinit s tim, ze ucetni osnovu pro dane ucetni obdobi se vklada do souboru OSNOVA_DAT (viz nize) celou.

Prozatim je jmeno ASCII souboru doslova uvedene v zdrojaku load_osnova.h jako OSNOVA_DAT.

Format souboru OSNOVA_DAT je nasledujici:

Soucasti distribuce je i vzorovy soubor osnova.dat.

odpisplan

Tento malinkaty programek vypisuje plany zrychlenych odpisu.

printacct

Tento skript je zde pouze jako ilustrace toho, jak lze kombinovat zakladni funkce mdebsu s jinymi programy (v tomto pripade program a2ps) a tim doplnit mdebs o chybejici funkce (v tomto pripade tisk).

rmtrans

Program bere jako argument oznaceni ucetni operace. Pokud takova operace existuje, vymaze ji.

times100

Program bere jeden argument, string ve tvaru ####.##, coz ma byt castka v korunach, a vypise na stdout odpovidajici castku v halerich. Volan z inputop.


Poznamky ke zdrojovemu kodu

Nasleduji nektere poznamky na adresu zdrojaku.

generalized.c

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