Copyright (C) 1997, by Nathan L. CutlerV�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
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 <[email protected]>.
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�!]
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.
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�.
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.
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.
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.
P�id�ny dal�� kontroly. Naps�n program dumpacct pro prohl�en� pohyb� na ��tu. �tvrt� alpha release.
Dopln�ny kontroly v load_denik. Program loguje sv� kecy do souboru, aby nezat�oval jimi u�ivatele. T�et� alpha release.
load_denik funguje, by� polovi�at�. Chyb� kontroly. Program ignoruje informace o ��etn�m obdob�. Druh� alpha release.
Prvn� alpha release. Sice to neum� skoro nic, ale p�esto m� dokumentaci!
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.
P�id�no pol��ko pro analytick� pod��et. Funk�n� load_osnova. Prvn� verze inicializa�n�ho programu recreate dokon�ena.
Funk�n� inputosn a dumposn.
Vznik� velmi pochybn� program, kter� pomoc� knihovny Curses p�edst�r�, �e n�co d�l�.
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/
Hlavn� site: http://www.cise.ufl.edu/~nlc/pro.html
Dal�� sites: 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!)
ftp://ftp.fi.muni.cz/pub/linux/local/mdebs/
(courtesy of Jan "Yenya" Kasprzak -- Thank you!)
You're looking at it.
Navrhuji n�sleduj�c� postup:
dbinit 19970101 19971231
Ne��kal jsem, �e to m� b�t minimalistick�? Ale v�n�, zapomn�l jsem na toto pol��ko a te� se mi nechce p�ed�lat tabulky. Navrhuji d�vat ��slo dokladu na za��tek pole popisu ��etn� operace.
Postgres 4.0 (4.2), lidov� �e�eno "University Postgres" se u� minim�ln� t�i roky neudr�uje. Bohu�el st�le stra�� na ftp serverech (nap�. sunsite.unc.edu!). Tato verze nebude nikdy fungovat s mdebsem, nebo� implementuje jazyk POSTQUEL, a nikoliv SQL.
Postgres95 1.09 je ten Postgres, s kter�m byl mdebs naps�n. O Postgres95 bylo naps�no:
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 v�m) dal��m pokra�ov�n�m ve v�voji. Tuto verzi jsem si je�t� nepo��dil, nebo� �ek�m na debian package, kter� existuje zat�m pouze pro Postgres95 1.09. I tato verze by m�la s mdebsem dob�e spolupracovat.
Toto je z�le�itost nepromy�len�ho v�voje. Psal jsem prost� to, co m� v danou dobu napadlo. Pokud by n�kdo cht�l proj�t zdroj�ky a sjednotit hl�ky, uv�tal bych to. O lokalisaci v�m velmi m�lo, ale v�hledov� bych cht�l zdroj�ky upravit, aby pracovaly spr�vn� s locales en_US a cs_CZ. Pomoc uv�t�m jako v�dycky.
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 |
Popisy jednotliv�ch existuj�c�ch program�, kter� jsou sou��stmi mdebsu.
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:
Program, kter� v existuj�c� "hol�" datab�zi vytvo�� syst�m tabulek. Vol�n z dbinit.
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.
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.
Program, kter� vyp�e celou ��etn� osnovu na stdout.
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.
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.
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.
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.
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)
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.
Tento malinkat� progr�mek vypisuje pl�ny zrychlen�ch odpis�.
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).
Program bere jako argument ozna�en� ��etn� operace. Pokud takov� operace existuje, vyma�e ji.
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.
N�sleduj� n�kter� pozn�mky na adresu zdroj�k�.
generalized.cSoubor generalized.c obsahuje ty funkce, ktere svou obecnou povahou mohou slou�it vice soucastem mdebsu.
Funkce zjistuje existenci, p��padn� popis ��tu. V p��pad� nalezen� ��tu s odpov�daj�c�m ��slem, na�te jeho jm�no do bufferu nam a zarove� vrac� tuto hodnotu. V opa�n�m p��pad�, tedy kdy� ��et nen� nelezen v datab�zi, vrac� hodnotu NULL.
Bere jako argument ozna�en� operace ��etn� osnovy a vrac� 1 pokud takov� operace existuje a v opa�n�m p��pad� vrac� 0.
Funkce p�evede datum ve tvaru 'MM-DD-YYYY' na integer ve tvaru YYYYMMDD. Tvar 'MM-DD-YYYY' pou��v� Postgres, ale mn� se sp� l�b� YYYYMMDD, nebo� lze bez probl�m� set��dit a porovnat.
Tato funkce je opakem funkce NathanConvertDate.
Po�lete t�to funkci �etezec char a ona v�m vr�t� po�et znak�, kter� nejsou ani mezerou, ani tabul�torem ani nov�m ��dkem.
Bere jako parametr datum ve tvaru YYYYMMDD a pokou�� se zjistit, jestli je p�ipustn�. Pou��v� k tomu metodu porovn�n� zadan�ho data s ekvivalent�m syst�mov�m datem. V p��pad� nespr�vn�ho data jako nap�. 19970332 je toto datum po konverzi "p�esunut", aby byl spr�vn� (tj. na 19970401). V p��pad� neshodnosti funkce vrac� hodnotu false. Funkce zarove� zachycuje data, kter� jsou p��li� vzd�len�, aby mohla b�t vyjad�ena syst�mov�m datem (nap�. 18990101).
Vrac� syst�mov� �as - pou��v� se p�i logov�n� nebo pro ozna�ov�n� v�tisk�.
Zjist� ��etn� obdob� a na�te jeho mezn� data do startd a endd.
Zachyb�la mi v string.h funkce, kter� by po��tala tokeny v dan�m �et�zci, tak�e jsem ji napsal s�m. Kolik podobn�ch funkc� u� asi bylo naps�no? Mnoho, jist�, a v�t�ina z nich l�pe implementovan� ne� ta moje. Ale kde jsou? Pro� nen� tato funkce v libc?