Registre des dévalidations et des annulations (RG-032, RG-143, RG-144), en ajout seul : quel objet, quelle nature, quel motif, quel mouvement contre-passant, qui et quand. Fait partie du dossier d’audit.
| Name |
Type |
Default |
Nullable |
Children |
Parents |
Comment |
| id |
uuid |
app.uuid_v7() |
false |
|
|
Identifiant de la ligne du registre (UUID v7). |
| organisation_id |
uuid |
|
false |
|
app.organisation app.utilisateur app.mouvement app.campagne app.constat app.lot |
Organisation propriétaire (isolation par ligne). |
| objet_type |
text |
|
false |
|
|
Type d’objet défait : reception, etape_realisee, expedition, vente ou lot. |
| objet_id |
uuid |
|
false |
|
|
Identifiant de l’objet défait. |
| nature |
text |
|
false |
|
|
devalidation (retour à l’état précédent : réception, étape, expédition) ou annulation (clôture : vente, lot). Deux mécanismes distincts (EC-008). |
| motif |
text |
|
false |
|
|
Justification écrite, obligatoire. |
| lot_id |
uuid |
|
true |
|
app.lot |
Lot annulé, avec son numéro conservé (RG-143) ; pour une dévalidation de réception, le lot d’origine annulé. Vide pour une vente, une étape ou une expédition. |
| campagne_id |
uuid |
|
true |
|
app.campagne |
Campagne concernée, pour l’édition du registre par campagne (RG-144) ; vide pour une vente ou une expédition. |
| mouvement_id |
uuid |
|
true |
|
app.mouvement |
Mouvement de contre-passation écrit ; vide pour l’annulation d’une vente, qui n’a pas encore bougé la matière. |
| constat_id |
uuid |
|
true |
|
app.constat |
Constat consigné pour la dévalidation (AM-15) ; vide pour une annulation. |
| cree_par |
uuid |
|
false |
|
app.utilisateur |
Utilisateur qui défait l’objet (direction). |
| cree_le |
timestamp with time zone |
clock_timestamp() |
false |
|
|
Date de la dévalidation ou de l’annulation. |
| Name |
Type |
Definition |
| registre_annulation_check |
CHECK |
CHECK (((nature = ‘devalidation’::text) = (objet_type = ANY (ARRAY[‘reception’::text, ‘etape_realisee’::text, ‘expedition’::text])))) |
| registre_annulation_check1 |
CHECK |
CHECK (((objet_type = ‘vente’::text) OR (mouvement_id IS NOT NULL))) |
| registre_annulation_motif_check |
CHECK |
CHECK ((btrim(motif) <> ‘’::text)) |
| registre_annulation_nature_check |
CHECK |
CHECK ((nature = ANY (ARRAY[‘devalidation’::text, ‘annulation’::text]))) |
| registre_annulation_objet_type_check |
CHECK |
CHECK ((objet_type = ANY (ARRAY[‘reception’::text, ‘etape_realisee’::text, ‘expedition’::text, ‘vente’::text, ‘lot’::text]))) |
| registre_annulation_organisation_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id) REFERENCES app.organisation(id) |
| registre_annulation_organisation_id_cree_par_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, cree_par) REFERENCES app.utilisateur(organisation_id, id) |
| registre_annulation_organisation_id_mouvement_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, mouvement_id) REFERENCES app.mouvement(organisation_id, id) |
| registre_annulation_organisation_id_campagne_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, campagne_id) REFERENCES app.campagne(organisation_id, id) |
| registre_annulation_organisation_id_constat_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, constat_id) REFERENCES app.constat(organisation_id, id) |
| registre_annulation_organisation_id_lot_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id) |
| registre_annulation_pkey |
PRIMARY KEY |
PRIMARY KEY (id) |
| registre_annulation_organisation_id_id_key |
UNIQUE |
UNIQUE (organisation_id, id) |
| Name |
Definition |
| registre_annulation_pkey |
CREATE UNIQUE INDEX registre_annulation_pkey ON app.registre_annulation USING btree (id) |
| registre_annulation_organisation_id_id_key |
CREATE UNIQUE INDEX registre_annulation_organisation_id_id_key ON app.registre_annulation USING btree (organisation_id, id) |
| registre_annulation_objet_idx |
CREATE INDEX registre_annulation_objet_idx ON app.registre_annulation USING btree (organisation_id, objet_type, objet_id) |
| registre_annulation_campagne_idx |
CREATE INDEX registre_annulation_campagne_idx ON app.registre_annulation USING btree (organisation_id, campagne_id, cree_le DESC) |
| Name |
Definition |
| journal |
CREATE TRIGGER journal AFTER INSERT OR DELETE OR UPDATE ON app.registre_annulation FOR EACH ROW EXECUTE FUNCTION journal.tg_journaliser() |
| ajout_seul |
CREATE TRIGGER ajout_seul BEFORE DELETE OR UPDATE ON app.registre_annulation FOR EACH ROW EXECUTE FUNCTION app.tg_ajout_seul() |
erDiagram
"app.registre_annulation" }o--|| "app.organisation" : "FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)"
"app.registre_annulation" }o--|| "app.utilisateur" : "FOREIGN KEY (organisation_id, cree_par) REFERENCES app.utilisateur(organisation_id, id)"
"app.registre_annulation" }o--|| "app.mouvement" : "FOREIGN KEY (organisation_id, mouvement_id) REFERENCES app.mouvement(organisation_id, id)"
"app.registre_annulation" }o--|| "app.campagne" : "FOREIGN KEY (organisation_id, campagne_id) REFERENCES app.campagne(organisation_id, id)"
"app.registre_annulation" }o--|| "app.constat" : "FOREIGN KEY (organisation_id, constat_id) REFERENCES app.constat(organisation_id, id)"
"app.registre_annulation" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.registre_annulation" {
uuid id "Identifiant de la ligne du registre (UUID v7)."
uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
text objet_type "Type d'objet défait : reception, etape_realisee, expedition, vente ou lot."
uuid objet_id "Identifiant de l'objet défait."
text nature "devalidation (retour à l'état précédent : réception, étape, expédition) ou annulation (clôture : vente, lot). Deux mécanismes distincts (EC-008)."
text motif "Justification écrite, obligatoire."
uuid lot_id FK "Lot annulé, avec son numéro conservé (RG-143) ; pour une dévalidation de réception, le lot d'origine annulé. Vide pour une vente, une étape ou une expédition."
uuid campagne_id FK "Campagne concernée, pour l'édition du registre par campagne (RG-144) ; vide pour une vente ou une expédition."
uuid mouvement_id FK "Mouvement de contre-passation écrit ; vide pour l'annulation d'une vente, qui n'a pas encore bougé la matière."
uuid constat_id FK "Constat consigné pour la dévalidation (AM-15) ; vide pour une annulation."
uuid cree_par FK "Utilisateur qui défait l'objet (direction)."
timestamp_with_time_zone cree_le "Date de la dévalidation ou de l'annulation."
}
"app.organisation" {
uuid id "Identifiant de l'organisation (UUID v7)."
text code "Code court en majuscules. Immuable : il figure dans les identifiants Keycloak (coopa.agent01). « EXT » est réservé."
text nom "Nom de l'organisation."
text pays "Pays, code ISO 3166-1 alpha-2."
text langue "Langue de l'organisation : fr ou en."
text fuseau_horaire "Fuseau horaire IANA utilisé pour l'affichage des dates."
text devise_defaut "Devise par défaut des montants, code ISO 4217."
text keycloak_organisation_id "Identifiant de l'organisation dans Keycloak."
text organisme_certificateur "Organisme de certification de l'organisation. Aucun contrôle de format (EC-027)."
text code_operateur "Code d'opérateur attribué par l'organisme certificateur."
uuid logo_fichier_id FK "Fichier du logo (EC-029)."
timestamp_with_time_zone cree_le "Date de création de la ligne."
timestamp_with_time_zone modifie_le "Date de la dernière modification, tenue par un déclencheur."
text source_conformite "Source des décisions de conformité : `interne` (contrôle interne de BioTrace) ou `externe` (outil tiers). Une seule source active à la fois ; app.statut_conformite.source doit lui être égale."
text statut "État du compte client : `active` ou `suspendue`. Une organisation suspendue est refusée par la garde d'authentification (`organisation_suspendue`) ; ses données et ses comptes sont conservés. Décidé par l'équipe de l'éditeur (EC-126)."
timestamp_with_time_zone suspendue_le "Date de la suspension en cours ; nulle tant que l'organisation est active."
}
"app.utilisateur" {
uuid id "Identifiant de l'utilisateur (UUID v7)."
uuid organisation_id FK "Organisation propriétaire de la ligne. Sert à l'isolation par RLS (EC-032) et au filtrage de la synchronisation."
uuid keycloak_sub "Identifiant du compte Keycloak (revendication sub). Identique d'une organisation à l'autre pour un compte externe."
text identifiant "Identifiant local de connexion, sans le code de l'organisation : 3 à 32 caractères parmi a-z, 0-9, _ et -. Unique dans l'organisation."
text nom_affiche "Nom affiché dans l'application."
text telephone "Numéro de téléphone. Attribut du compte, jamais son identifiant."
text statut "Statut du compte : actif, suspendu ou desactive."
timestamp_with_time_zone cree_le "Date de création de la ligne."
timestamp_with_time_zone modifie_le "Date de la dernière modification, tenue par un déclencheur."
}
"app.mouvement" {
uuid id "Identifiant du mouvement (UUID v7)."
uuid organisation_id FK "Organisation propriétaire de la ligne. Sert à l'isolation par RLS (EC-032) et au filtrage de la synchronisation."
text nature "Nature : reception, transfert, transformation, expedition, perte, inventaire ou contrepassation."
timestamp_with_time_zone date_operation "Date de l'opération sur le terrain ou à la balance."
uuid contrepasse_mouvement_id FK "Mouvement annulé par cette contre-passation. Un mouvement n'est contre-passé qu'une fois."
text motif "Motif, obligatoire pour une contre-passation."
uuid commande_id "Commande de synchronisation à l'origine du mouvement."
uuid cree_par FK "Utilisateur auteur du mouvement."
timestamp_with_time_zone cree_le "Date de création de la ligne."
uuid etape_realisee_id FK "Étape réalisée à laquelle se rattache un mouvement de transformation (AM-12) ; obligatoire pour ce type de mouvement, vide pour les autres."
}
"app.campagne" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
text code "Code de campagne inséré dans le numéro officiel. Unique par organisation, toutes années confondues (EC-031)."
text nom "Nom de la campagne."
date date_ouverture_prevue "Date d'ouverture prévue. Détermine « AA » tant que la campagne est en préparation."
date date_cloture_prevue "Date de clôture prévue. Jamais avant la date d'ouverture prévue."
date date_ouverture "Date d'ouverture réelle, renseignée à l'ouverture puis figée."
date date_cloture "Date de clôture réelle, renseignée à la clôture."
smallint annee "Année d'ouverture (réelle, sinon prévue), calculée. Ses deux derniers chiffres forment « AA » du numéro (EC-023)."
uuid pack_version_id FK "Version du pack de la filière. Figée à l'ouverture, qui exige une version publiée."
integer modele_numerotation_version FK "Version du modèle de numérotation de l'organisation. Obligatoire et figée à l'ouverture ; la clé vers le modèle est posée à la séquence A3."
text statut "`preparation`, `ouverte` ou `cloturee`. Pas de retour en préparation."
timestamp_with_time_zone cree_le "Date de création de la ligne."
timestamp_with_time_zone modifie_le "Date de dernière modification."
}
"app.constat" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation concernée. Sert à l'isolation par RLS (EC-032)."
uuid regle_decision_id FK "Ligne de décision évaluée."
text regle_code "Code de la ligne, recopié pour la lecture (instantané, PC-08)."
text version "Version du pack de la ligne, recopiée (instantané, PC-08)."
text source "Source de la ligne, recopiée (instantané, PC-08)."
text accroche "Point d'accroche de l'évaluation."
text objet_type "Nature de l'objet concerné (reception, lot, collecte…)."
uuid objet_id "Identifiant de l'objet concerné."
text resultat "ecart (condition vraie) ou a_verifier (variable, paramètre ou date absents, erreur d'évaluation : jamais de valeur par défaut, PC-07)."
text issue "Issue de la ligne pour un écart ; vide pour « à vérifier »."
text motif "Raison d'un « à vérifier » ; vide pour un écart."
jsonb valeurs "Valeurs lues par la ligne et paramètres utilisés, au moment de l'évaluation."
bigint constatee "Valeur constatée, si la ligne déclare une mesure (entier, unité de la variable)."
bigint attendue "Valeur attendue, si la ligne déclare une mesure."
bigint ecart "Écart constatée − attendue, si la ligne déclare une mesure."
uuid controle_id FK "Entrée de la file de contrôle liée, quand l'issue met une commande en contrôle (EC-091)."
text statut "ouvert, justifie (note exigée), leve, clos (final)."
text note "Justification écrite (RG-308), obligatoire pour « justifié »."
uuid statut_par FK "Auteur du dernier changement de statut."
timestamp_with_time_zone statut_le "Date du dernier changement de statut, posée par la base."
uuid cree_par FK "Utilisateur à l'origine de l'évaluation ; vide pour une évaluation du serveur."
timestamp_with_time_zone cree_le "Date du constat."
timestamp_with_time_zone modifie_le "Date de la dernière modification, tenue par un déclencheur."
text origine "Origine de la règle : pack (ligne d'une table de décision, regle_decision_id renseigné) ou processus (règle codée comme RG-014 ou RG-172, sans ligne de décision)."
}
"app.lot" {
uuid id "Identifiant du lot (UUID v7)."
uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
uuid campagne_id FK "Campagne du lot."
text reference_provisoire "Référence provisoire, tant que le lot n'est pas validé (BR-AAAA-MM-JJ-NNNN dans le cahier)."
bigint numero "Rang du numéro officiel, pris par app.attribuer_numero à la validation, jamais réutilisé (I3). Vide avant la validation."
text nature "Nature de la séquence de numérotation : MP matière première, REC réception, NET nettoyé, PF produit fini (EC-068)."
uuid produit_id FK "Produit du lot."
text qualite "Catégorie d'affichage du lot (EC-090) : saisie à la réception, calculée par le mélange (la plus basse catégorie des entrées et des états du résultat, EC-120). La qualité par référentiel est dans app.lot_qualite."
text statut "Statut : brouillon, en_attente, valide, rejete, annule, consomme, quarantaine, archive. Transitions contrôlées par app.tg_lot_controle."
uuid compte_matiere_id FK "Compte de matière du lot (nature lot) : son solde est la quantité du lot."
uuid mouvement_creation_id FK "Mouvement qui crée le lot (I4) : il crédite le compte du lot et n'est pas une contre-passation."
timestamp_with_time_zone date_operation "Date de l'opération qui crée le lot, saisie sur le terrain."
text motif_annulation "Motif de l'annulation ; renseigné si et seulement si le statut est annule."
uuid annule_par FK "Utilisateur qui a annulé le lot."
timestamp_with_time_zone date_annulation "Date de l'annulation."
uuid cree_par FK "Utilisateur qui a créé le lot."
timestamp_with_time_zone cree_le "Date d'enregistrement du lot."
timestamp_with_time_zone modifie_le "Date de la dernière modification (statut ou numéro)."
}
Generated by tbls