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 <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í!]
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?