Descripció tècnica de GestiONG.
Què
característiques mínimés ha de proporcionar
un programa de gestió?
Pense que un programa de gestió ha de proporcionar el
següent a l´usuari final:
- Un programa complet de contabilitat adaptat al pla contable
vigent.
-
- Comptes, seints i apunts, tipus de seints i conceptes de
apunt.
- Llibres de IVA.
- Seguretat de que les operacions es guarden correctament.
- Posibilitat de gestionar múltiples empreses i
exercicis.
- Un nivell de seguritat que obligui a identificar-se com a
usuari i que permita definir què operacions pot o no dur a
terme cada usuari. A més, ha de proporcionar la
possibilitat de guardar un registre de totes les operacions que
realitzen els usuaris.
- Posibilitat de definir els noms dels fitxers i dels camps de
cada fitxer, la longitud dels mateixos, el seu format, etc i a
més que es puga definir de forma diferent per a cada
usuari.
- Una definició de les bases de dades que hi faça
posible efectuar copies de seguritat fàcilment i que
s´ajuste a la Ley Orgànica de Protección de
Datos de car´cter personal.
- Imposibilitat d´introduir dades incorrectes o
inconsistents, com a dades no vàlides, lletres en vegada
de números, seients sense apunts, etc.
- Posibilitat de comprovar la integritat de les dades, amb
posibilitat de corregir-los si hi ha errors.
- Ajuda sensible al context i enllaços a pàgines
en internet amb informació contable.
Què es
necesita per a realitzar un programa de gestió sota
GNU?
Una base de dades.
Aquest es el requeriment menys complicat. Existeixen
dos servidors de dades SQL de us lliure, PostgreSql amb licencia BSD i Mysql de us lliure encara que
amb licencia propietària.
Un llenguatge orientat a objetes.
Un programa d´aquestes característiques
es un programa que pot tindre facilment trenta formularis de
manteniment de fitxers de la base de dades. El funcionamient
d´aquestos es bàsicament idèntic, per lo
tant, es imprescindible dissenyar un formulari base amb tota la
funcionalitat i derivar la resta de formularis a partir de ell.
Així, qualsevol modificació que hi haja que fer en
tots els formularis de manteniment, només hi ha que
realitzar-la en el formulari base. Aquest objectiu ho he
aconseguit amb C++ y Qt Designer.
Un IDE decent amb una depuració decent.
KDevelop com a editor deixa molt a desitjar, per a
grans edicions faig us de emacs, però com a depurador es
molt fàcil d´usar i funciona molt be.
L´opció de recerca en fitxers està molt be.
La versió 3.0 de KDevelop sembla ser molt bona.
Generació automàtica de codi
Treballar amb trenta fitxers de la base de dades es
un proc$eacute;s molt costos. Dissenyar trenta formularis, trenta
classes per a llegir i gravar en la base de dades, trenta
entrades en el menú, seixanta informés, etc es un
procés imposible durant una vida humana sense una heina de
generació automàtica de codi. I lo que es pitjor,
cualsevol adició o supresió de un simple camp en
una base de dades implica un munt de treball i de probes i, per
suposat, de errors.
En aquest punt, la meua ferramenta de
definició de codi llegeix la definició del fitxer
de la base de dades que està en un fitxer XML i em genera
el fitxer .ui del Qt Designer, per a que jo ho revise
desprès i el deixe bonito, em genera el codi del formulari
que he deixat bonito amb el Qt, em genera la classe per a llegir
i escriure en la base de dades, em genera les entrades en el
menú, la documentació i un munt mès de
coses, pràcticament tot el que te a veure amb esa taula. A
més, pot regenerarlo cada vegada que faig un canvi en la
base de dades i tot s´actualitza automàticament.
D´aquesta forma, afegir una nova taula a la base de dades
amb el seu formulari i tot funcionand perfectament m´ocupa
només unes tres hores.
Un dissenyador de formularis flexible, còmode i que
permeta modificar el codi generat.
Qt Designer es un dels mijors dissenyadors de GUIs
que he probat. (Quan pose un control en un lloc, es queda
ahí :)
Uns controls de edició personalitzats.
Per a que el programa siga àgil de maneixar i
la presentació de dades en pantalla siga clara, es
necessari retocar tots els controls de edició, com llinies
de text, botons, llistes, combos, etc. La redefinició
d´aquestos controls standard de la biblioteca Qt es tan
fàcil com a crear una nova classe derivada i canviar
alguns mètodes i propietats.
La validació de dades es molt important en aquest tipus
de programés en els que la informació que es trata
es de vital importància. Per lo tant, el programa ha de
permetre que les dades, per exemple una data,
s´introduixquen de forma ràpida i sense
ambigüitats i a més que es tinga la certesa de que
sempre son correctes. Es a dir, el control més important
es el que permiteix l´introducció de números,
dates, cadenes amb format, hores, quantitas monetàries,
etc. Aquest control es el IMaskedLineEdit i te les següents
propietats més destacades:
- Edició amb màscares de números, dates,
hores, cadenes amb format i quantitats monetàries.
- Avanç i retroc$eacute;s amb Intro i les tecles del
cursor.
- Diferenciació visible de quan es editable i quan no ho
es.
- Validació de les dades sense permetre que el cursor
ixca del control si les dades no son vàlides.
Un formulari base per als manteniments de les bases de
dades
Aquest formulari s´ha de encarregar de mostrar
una llista amb les dades del fitxer i una vista de edició
de un registre individual. Ha de llegir de la base de dades,
mostrar els botons per a afegir, borrar, etc... i de fer que
funcionen. Vegeu FrmEditRecBase i FrmEditRec.
Un generador d´Informés
Aquest es fins ara el major problema, encara que ja
he començat amb el disseny d´un. No he trobat cap
heina de disseny d´informés que agafe dades de una
base de dades SQL i genere un informe decent, en el que pugues
fer sumés, grups, fórmules, etc.
Aquest projecte tardarà una mica més, pero amb
l´ajuda de la generació automàtica de codi,
qui sap...
Cóm
està organizat GestiONG?
GestiONG està desenvolupant-se en C++, sota
Linux i amb soport de la biblioteca Qt 3.x
El programa pot separar-se en tres nivells:
- Nivell d´acces a la base de dades.
- Nivell d´aplicació
- Nivell d´Interfaz gràfica d´usuari.
La part més difícil del programa es la Interfaz
Gràfica de l´Usuari, encara que la biblioteca Qt
junt amb Qt Designer fan aquesta part menys complicada.
L´acces a les bases de dades es molt fàcil
també gracies a la biblioteca Qt. El nivell
d´aplicació es molt sencill, ja que un programa de
contablitat realment no te grans procesos.
Actualment no hi ha separació en projectes
d´aquestos tres nivells, ja que l´etapa de
desenvolupament en la que estem es encara molt temprana. Pero,
més endavant serà totalment necessari separar estos
nivells en distints projectes.
Nivell d´acces a la base de dades.
per a veure la definició de la base de dades, vegeu
'dictionary.xml'
El programa està dissenyat de forma que es puga fer
servir amb qualsevol servidor de base de dades. Actualment
funciona amb MySQL i PostGreSQL.
L´acces a les bases de dades es molt fàcil amb Qt.
S´han creat una serie de classes per a encapsular les de Qt
i afegir-les algunes funcions útiles.
- ISqlDatabase. Encapsula QSqlDatabase.
- ISqlQuery. Encapsula QSqlQuery.
- ISqlRecord. Aquesta classe representa un registre de una
taula. No s´ utilitzen les clases de Qt per a edició
de registres generals, com a QSqlCursor o QSqlRecord. La
raó es que aquestes traten els registres i camps sense
conèixer el seu tipus, el que pot donar lloc a errors i a
més es menys eficient. Jo he optat per crear una classe
per cada taula en la que els camps estiguen be definits. Com
aixó seria molt dificil de fer a mà, he creat un
programa que genera aquestes clases automàticament,
basànt-se en la definició de la base de dades que
s´almacena en el fitxer 'dictionary.xml'. Per exemple,
/forms/reccuenta.h i /forms/reccuenta.cpp.
- ISqlError. Encapsula QSqlError.
D´aquesta forma, la lógica d´acces a una taula
de la base de dades es aixi:
- connectar amb el servidor.
- Crear un objete RecCuenta, que es un ISqlRecord que te tota
l´informació del registre de la taula 'cuenta'.
- Llegir un registre, amb RecCuenta::read(ID).
- Llegir els camps amb RecCuenta::getNOMBRECUENTA() i
escriure-los amb setNOMBRECUENTA("Mercaderías");
- Guardar les dades amb RecCuenta::save();
- Borrar amb RecCuenta::remove();
Nivell d´aplicació
Aquest nivell està totalmente barrejat amb el GUI, degut
a les característiques de l´aplicació. No
obstant, hi ha algunes clases que es consideren bàsiques i
que es poden definir independientement de l´interfaz
gràfic:
- Compte. Operacions com comprovar la validesa, comprovar si
els comptes pares existeixen, obtindre un nou compte de treball
per a un grup, el següent compte, etc.
- Pla contable Definició de l´estructura en
nivells del pla contable.
- Cif. Operacions com a comprovar la validesa, calcular la
lletra del NIF, etc.
Nivel d´interfaz gràfica d´usuari
(GUI).
Es pot dir sense por que el 90% del desenvolupament del programa
resideix en pelear-se amb el GUI. La part més complicada
consisteix en que els formularis d´introducció de
dades funcionen de la forma que esperem. Per exemple, que la
tecla INTRO i el CURSOR ABAJO avancen al següent camp, que
el cursor no puga eixir de un camp si les dades no son correctes,
que la tecla ESCAPE anule l´edició però
avants mostre un missatge de confirmació, que alguns
formularis siguen modals, etc.
No sé exactament per què, però tant Qt com
GTK no proporcionen això de forma fàcil, ni molt
menys predefinida. No obstant, amb Qt al menys es pot aconseguir,
encara que hi ha que estar constantment investigant, i ací
es on es demostra el principal avantatge del software amb
llicencia GPL, es pot consultar el codi font per a veure
cóm funciona la biblioteca Qt i trobar una
solució.
El programa GestiONG es pot simplificar considerantlo´l
com a la edició dels fitxers de la base de dades.
D´aquesta forma, casi totes les operacions que es
realitzaran sobre el fitxer de comptes serà el seu
manteniment, això es, altes, baixes, modificacions,
consultes, recerques, etc. Per això, el disseny d´un
formulari bàsic per a realitzar el mantenimient dels
fitxers de forma unificada i completa es fonamental i a
més ens completa més de la meitat del programa.
Aquest formulari es el FrmEditRec, que proporciona una finestra
en la que mostrar els camps del fitxer i tota la lògica
per a llegir, editar i gravar les dades. A partir d´aquest
simple formulari, es deriven :
- FrmEditRecMaestro: Afegeix una llista per a mirar tots els
registres del fitxer amb opcions per a filtrar i recercar
registres, i la resta d´operacions sobre el registre, com
borrar, duplicar, afegir, imprimir, etc.
- FrmEditRecMaestroDetalles: Afegeix la lògica per a
editar un fitxer méstre amb un fitxer de detalls.
- FrmEditRecDetalle: Formulari simple per a editar un detall
sota l´auspici d´un FrmEdiRecMaestroDetalles.
¿Qué avantatges i qué inconvenients
presenta Linux com a plataforma de desenvolupament?
Avantatges:
- Accés al codi font de les heines i biblioteques amb les
que es treballa.
- Gratuïtat d´aquestes heines i biblioteques.
- Ajuda per part de la comunitat de desenvolupament.
- Disponibilitat de heines de tractament de fitxers de text, com
sed, diff, patch, tar, etc. molt útils en algunes
ocasions.
- Disponibilitat nativa de CVS.
Inconvenients:
- Poca estabilitat de l´entorn de desenvolupament,
principalment de l´editor.