Copyright (C) 1997, by Nathan L. CutlerVsechna prava vyhrazena. Tento dokument muze byt volne siren jako celek. Provedenim jakekoliv zmeny vsak tato moznost zanikne.
Datum posledni aktualizace 31. brezna 1997
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!]
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.
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.
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.
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.
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.
Pridany dalsi kontroly. Napsan program dumpacct pro prohlizeni pohybu na uctu. Ctvrta alpha release.
Doplneny kontroly v load_denik. Program loguje sve kecy do souboru, aby nezatezoval jimi uzivatele. Treti alpha release.
load_denik funguje, byt polovicate. Chybi kontroly. Program ignoruje informace o ucetnim obdobi. Druha alpha release.
Prvni alpha release. Sice to neumi skoro nic, ale presto ma dokumentaci!
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.
Pridano policko pro analyticky poducet. Funkcni load_osnova. Prvni verze inicializacniho programu recreate dokoncena.
Funkcni inputosn a dumposn.
Vznika velmi pochybny program, ktery pomoci knihovny Curses predstira, ze neco dela.
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/
Hlavni site: http://www.cise.ufl.edu/~nlc/pro.html
Dalsi sites: http://WAS.PVTNET.CZ/pub/Software/Accounting/
(courtesy of Petr Snajdr -- Thank you!)
http://noel.feld.cvut.cz/~petrl/www.cise.ufl.edu
(courtesy of Petr Linke -- Thank you!)
ftp://ftp.fi.muni.cz/pub/linux/local/mdebs/
(courtesy of Jan "Yenya" Kasprzak -- Thank you!)
You're looking at it.
Navrhuji nasledujici postup:
dbinit 19970101 19971231
Nerikal jsem, ze to ma byt minimalisticky? Ale vazne, zapomnel jsem na toto policko a ted se mi nechce predelat tabulky. Navrhuji davat cislo dokladu na zacatek pole popisu ucetni operace.
Postgres 4.0 (4.2), lidove receno "University Postgres" se uz minimalne tri roky neudrzuje. Bohuzel stale strasi na ftp serverech (napr. sunsite.unc.edu!). Tato verze nebude nikdy fungovat s mdebsem, nebot implementuje jazyk POSTQUEL, a nikoliv SQL.
Postgres95 1.09 je ten Postgres, s kterym byl mdebs napsan. O Postgres95 bylo napsano:
Background of the Postgres95 Project
After the Postgres Project officially ended in 1994, the authors Jolly Chen and Andrew Yu saw a need to clean up the postgres code for their own needs. . . . The postgres 4.2 code base had become bloated and unmanageable. Postgres95 (originally dubbed pglite) is a step towards making the code base extensible again, that is, extensible from the implementers' perspective. Also, there was (and still is) considerable interest in an SQL version so we made that happen.
PostgreSQL 6.0 je (pokud vim) dalsim pokracovanim ve vyvoji. Tuto verzi jsem si jeste neporidil, nebot cekam na debian package, ktera existuje zatim pouze pro Postgres95 1.09. I tato verze by mela s mdebsem dobre spolupracovat.
Toto je zalezitost nepromysleneho vyvoje. Psal jsem proste to, co me v danou dobu napadlo. Pokud by nekdo chtel projit zdrojaky a sjednotit hlasky, uvital bych to. O lokalisaci vim velmi malo, ale vyhledove bych chtel zdrojaky upravit, aby pracovaly spravne s locales en_US a cs_CZ. Pomoc uvitam jako vzdycky.
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 |
Popisy jednotlivych existujicich programu, ktere jsou soucastmi mdebsu.
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:
Program, ktery v existujici "hole" databazi vytvori system tabulek. Volan z dbinit.
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.
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.
Program, ktery vypise celou ucetni osnovu na stdout.
Program bere jako argumenty datum a poradove cislo nejake ucetni operace a vypise ji na obrazovku. Zatim jediny zpusob, jak zjistit protiucet.
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.
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.
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.
Program, jehoz prostrednictvim lze vymazavat, pridavat a dotazovat jednotlive ucty ucetni osnovy podle jejich cisla (vcetne pripadneho analytickeho podcisla)
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.
Tento malinkaty programek vypisuje plany zrychlenych odpisu.
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).
Program bere jako argument oznaceni ucetni operace. Pokud takova operace existuje, vymaze ji.
Program bere jeden argument, string ve tvaru ####.##, coz ma byt castka v korunach, a vypise na stdout odpovidajici castku v halerich. Volan z inputop.
Nasleduji nektere poznamky na adresu zdrojaku.
generalized.cSoubor generalized.c obsahuje ty funkce, ktere svou obecnou povahou mohou slouzit vice soucastem mdebsu.
Funkce zjistuje existenci, pripadne popis uctu. V pripade nalezeni uctu s odpovidajicim cislem, nacte jeho jmeno do bufferu nam a zaroven vraci tuto hodnotu. V opacnem pripade, tedy kdyz ucet neni nelezen v databazi, vraci hodnotu NULL.
Bere jako argument oznaceni operace ucetni osnovy a vraci 1 pokud takova operace existuje a v opacnem pripade vraci 0.
Funkce prevede datum ve tvaru 'MM-DD-YYYY' na integer ve tvaru YYYYMMDD. Tvar 'MM-DD-YYYY' pouziva Postgres, ale mne se spis libi YYYYMMDD, nebot lze bez problemu setridit a porovnat.
Tato funkce je opakem funkce NathanConvertDate.
Poslete teto funkci retezec char a ona vam vrati pocet znaku, ktere nejsou ani mezerou, ani tabulatorem ani novym radkem.
Bere jako parametr datum ve tvaru YYYYMMDD a pokousi se zjistit, jestli je pripustne. Pouziva k tomu metodu porovnani zadaneho data s ekvivalentim systemovym datem. V pripade nespravneho data jako napr. 19970332 je toto datum po konverzi "presunut", aby byl spravne (tj. na 19970401). V pripade neshodnosti funkce vraci hodnotu false. Funkce zaroven zachycuje data, ktera jsou prilis vzdalena, aby mohla byt vyjadrena systemovym datem (napr. 18990101).
Vraci systemovy cas - pouziva se pri logovani nebo pro oznacovani vytisku.
Zjisti ucetni obdobi a nacte jeho mezni data do startd a endd.
Zachybela mi v string.h funkce, ktera by pocitala tokeny v danem retezci, takze jsem ji napsal sam. Kolik podobnych funkci uz asi bylo napsano? Mnoho, jiste, a vetsina z nich lepe implementovane nez ta moje. Ale kde jsou? Proc neni tato funkce v libc?