Specifications

Marc SCHAEFER schaefer at alphanet.ch
Tue Oct 16 21:38:13 CEST 2001


On Mon, 15 Oct 2001, Frederic Schutz wrote:

> (Question plutôt pour les comptables) Serait-il utile d'avoir un label
> d'exercice "human readable" ? Par exemple, pour pouvoir se référer à la

J'ajoute un libellé UNIQUE, obligatoire.

> >CREATE TABLE lot (id SERIAL NOT NULL, -- interne à la base de données
> >                  libelle TEXT NOT NULL, -- libellé
> >                  UNIQUE(id), PRIMARY KEY(id));
> 
> Inutile à mon avis. Le "lot" représente un paquet d'écritures liées, avec
> la propriété que la somme des montants du lot est nulle. Comme "libellé",
> on peut utiliser le numéro de la première écriture du lot.

J'aimais bien l'idée d'avoir un lot comme concept externe. Par contre, il
est clair qu'il faut ajouter alors un ORDER BY numero à écriture si l'on
veut l'ordre.

Il faudra encore y réfléchir.

> [table "ecriture"]
> >--    - Should that reference exercice, or not ?
> 
> Définitivement ! Il faut pouvoir attribuer chaque écriture a une
> comptabilité distincte, c'est-à-dire à une société et à un exercice. Mais

Ajouté lien exercice, supprimé lien transitivement existant à société.

> >--    - Missing tables: compte, 
> 
> Yep. Et c'est une table plus qu'importante. Je n'étais pas encore au clair
> avec ce qu'Alex avait mis dans les spécifications, je n'ai donc pas mis ça
> au net pour l'instant.

Créé une classe/table temporaire.

> >                       numero INT4 NOT NULL,
> 
> Il faut une numérotation séquentielle différente pour chaque exercice,
> peut-on le faire automatiquement facilement ?

Peux-tu me donner quelques exemples de numérotation valables pour
plusieurs exercices (il n'y a pas de numérotation externe à exercice pour
le moment) ?  Doit-elle être dans tous les cas composée de nombres qui se
suivent ?  De lettres et de nombres ?

> >                       lot INT4 REFERENCES lot NOT NULL,
> 
> Cf plus haut, le lot référence juste un numero antérieur, pas besoin de
> table "lot".

@@@

> montant_devise --> devise

ok

> Je pense que la devise doit pouvoir être nulle; dans ce cas, c'est la
> devise définie dans la table "exercice" qui doit être utilisée (et ça
> implique qu'il ne doit pas y avoir un DEFAULT 'CHF', au contraire, puisque
> le défaut est défini ailleurs).

commentaire ajouté (rule, trigger, ou programme).

> >                       taux_change MONEY, -- BUGS: type
> >                       montant_devise_signe MONEY NOT NULL,
> 
> Les deux sont redondants, mais je peux imaginer qu'on veuille garder les
> deux (pour éviter des différences d'arrondi, etc), est-ce vraiment

faut-il automatiquement avoir un rounding au 20ème par exemple (MONEY ne
fait-il pas déjà ça) ?

> nécessaire ?

Effectivement:

   Le 22 à 13:30 j'ai versé 30 US$ sur le compte 42, ce qui donne
   42 CHF.

Soit on mémorise devise, montant_signe et montant_devise_signe, soit
on mémorise devise, montage_signe et taux_change. Le reste est redondant.
A moins qu'il y ait des règles précises qui m'échappent.

> >                       date_modification DATE DEFAULT CURRENT_DATE NOT NULL,
> [...]
> >                       modificateur INT4 REFERENCES utilisateur NOT NULL,
> 
> Comment faire si plusieurs modifications ont lieu ?

Il faut alors créer une table ecriture_modification, c'est ce que j'ai
fait, qui référence ecriture (cardinalité n-1).

> Ouf, pour des premiers commentaires, ça fait beaucoup à la fois.

merci!

Voilà la nouvelle version, testée rapidement sur PostgreSQL 7.

-- Projet GULL Compta
-- initial.sql -- Définitions des structures de données de la BD
-- AUTHOR
--    Marc SCHAEFER <schaefer at alphanet.ch>
-- LICENSE
--    (C) 2001 by Marc SCHAEFER, licensed under the terms of the
--    GNU General Public License as published by the Free Software
--    Foundation; either version 2 or later (at your option).
-- DESCRIPTION
--    Ceci définit les structures de données, en fonction des contraintes
--    décrites sur: http://www.linux-gull.ch/projets/compta/.
-- NOTES
--    - Cette première version suppose:
--         - une base de données PostgreSQL 7.x
--         - une allocation assez large des données (utilisation de TEXT
--           plutôt que VARCHAR p.ex.)
--         - une insistance sur l'adéquation à la spécification.
--         - pour l'instant une simplification: on évite la prolifération
--           de tables adresse, code_pays, localité, etc. Ce qui pourra être
--           fait dans une deuxième étape.
--         - il manque des contraintes/triggers pour empêcher la modification
--           de données sensibles.
--         - il faut décider si l'on autorise des valeurs par défaut.
-- BUGS
--    - Mix of French and English
--    - INT4 in REFERENCES to SERIAL must be specified.
-- TODO
-- BASED-ON
--    Original work
-- $Id: initial.sql,v 1.3 2001/10/16 19:37:50 schaefer Exp $
-- 

-- BUGS
--    - This shouldn't be an active table, it's just inherited. Alternatively
--      this could be REFERRED to.
CREATE TABLE adresse (adresse_1 TEXT NOT NULL,
                      adresse_2 TEXT,
                      adresse_3 TEXT,
                      localite TEXT NOT NULL,
                      code_ville TEXT NOT NULL,
                      code_pays TEXT DEFAULT 'CH' NOT NULL);

-- BUGS
--    - libellé not unique in the specification.
CREATE TABLE societe (id SERIAL NOT NULL, -- interne à la base de données
                      libelle TEXT NOT NULL,  -- libellé
                      UNIQUE(libelle),
                      UNIQUE(id), PRIMARY KEY(id))
   INHERITS (adresse);

-- NOTES
--    - REFERENCES ensures societe exists.
-- BUGS
--    - libellé not unique in the specification.
-- TODO
--    - Add trigger to disable add/modify once clotured, probably
--      on another table.
--    - Add trigger so that the devise cannot be changed once set.
--    - Add trigger to check that (societe, [intervalle]) is not
--      within any other intervalle (debut, fin).
CREATE TABLE exercice (id SERIAL NOT NULL, -- interne à la base de données
                       societe INT4 REFERENCES societe NOT NULL,
                       debut DATE DEFAULT CURRENT_DATE NOT NULL,
                       fin DATE NOT NULL,
                       cloture BOOLEAN DEFAULT 'f' NOT NULL,
                       devise VARCHAR(3) DEFAULT 'CHF' NOT NULL,
		       libelle TEXT NOT NULL,  -- libellé
		       UNIQUE(libelle),
                       UNIQUE(id), PRIMARY KEY(id));

-- BUGS
--    - libellé not unique in the specification.
CREATE TABLE provenance (id SERIAL NOT NULL, -- interne à la base de données
                         libelle TEXT NOT NULL, -- libellé
                         UNIQUE(libelle),
                         UNIQUE(id), PRIMARY KEY(id));

-- BUGS
--    - libellé not unique in the specification.
--    - Not in the specification AFAIK.
--    - Some way to order ecriture in a lot (ORDER BY numero), or
--      forget this altogether and use some numbering scheme ?
CREATE TABLE lot (id SERIAL NOT NULL, -- interne à la base de données
                  libelle TEXT NOT NULL, -- libellé
                  UNIQUE(libelle),
                  UNIQUE(id), PRIMARY KEY(id));

-- BUGS
--    - Not in the specification.
CREATE TABLE compte(id SERIAL NOT NULL, -- interne à la base de données
		    libelle TEXT NOT NULL, -- libellé
		    UNIQUE(libelle),
                    UNIQUE(id), PRIMARY KEY(id));

CREATE TABLE utilisateur(id SERIAL NOT NULL,
			 nom TEXT NOT NULL,                         
                         pw_hash CHAR(32), -- md5sum en texte par exemple.
			 UNIQUE(nom),
			 UNIQUE(id), PRIMARY KEY(id));

-- BUGS
--    - This shouldn't be an active table
-- TODO
--    - Complete, inclusive comments for triggers. See specification.
--      This is the most complicated table.
--    - Add trigger/rules which if device is NULL, takes the one of
--      the exercice ... or code other programs accordingly.
--    - Check if MONEY has a 1/20th rounding.
--    - See if devise, montant_signe et montant_devise_signe and
--      taux_change are not redundant.  
CREATE TABLE ecriture (id SERIAL NOT NULL, -- interne à la base de données
                       libelle TEXT NOT NULL,

                       exercice INT4 REFERENCES exercice NOT NULL,
                       provenance INT4 REFERENCES provenance NOT NULL,

                       numero INT4 NOT NULL, -- One sequence per exercice?
                       lot INT4 REFERENCES lot NOT NULL,

                       date_valeur DATE NOT NULL,

                       date_saisie DATE DEFAULT CURRENT_DATE NOT NULL,

                       compte INT4 REFERENCES compte NOT NULL,

                       montant_signe MONEY NOT NULL,
                       devise VARCHAR(3),
                       taux_change MONEY, -- BUGS: type
                       montant_devise_signe MONEY NOT NULL,

                       createur INT4 REFERENCES utilisateur NOT NULL, -- ??

                       comptabilise BOOLEAN NOT NULL,

                       UNIQUE(id), PRIMARY KEY(id));

-- NOTES
-- BUGS
--    - Not in the specification.
--    - This allows multiple modifications on the same day, and multiple
--      modifications by the same utilisateur on the same day to the
--      same ecriture.
-- TODO
--    - Inherits from a (date, utilisateur) table that could be used
--      within ecriture.
CREATE TABLE ecriture_modification(ecriture INT4 REFERENCES ecriture NOT NULL,
                                   date_modification DATE
                                      DEFAULT CURRENT_DATE NOT NULL,
                                   modificateur INT4 REFERENCES utilisateur
                                      NOT NULL);

CREATE TABLE groupe(id SERIAL NOT NULL, -- interne à la base de données
                    nom TEXT NOT NULL,
                    UNIQUE(nom),
                    UNIQUE(id), PRIMARY KEY(id));

CREATE TABLE membre_de(utilisateur INT4 REFERENCES utilisateur NOT NULL,
                       groupe INT4 REFERENCES groupe NOT NULL,
                       UNIQUE(utilisateur, groupe));

CREATE TABLE autorisation(groupe INT4 REFERENCES groupe NOT NULL,
                          societe INT4 REFERENCES societe NOT NULL,
                          exercice INT4 REFERENCES exercice NOT NULL,
                          lecture BOOLEAN NOT NULL,
                          ecriture BOOLEAN NOT NULL,
                          modification BOOLEAN NOT NULL,
                          cloture BOOLEAN NOT NULL,
                          comptabilisation BOOLEAN NOT NULL,
                          UNIQUE(groupe, societe, exercice));

-- BUGS
--    - Not clear to me. Is that a session ?
CREATE TABLE parametre (id SERIAL NOT NULL, -- interne à la base de données
                        societe INT4 REFERENCES societe NOT NULL,
                        utilisateur INT4 REFERENCES utilisateur NOT NULL,
                        parametre TEXT, -- peut être NULL
                        UNIQUE(id), PRIMARY KEY(id));







More information about the compta mailing list