Décision d’un validateur sur un objet, en ajout seul (EC-012). Les colonnes cibles s’ajoutent lot par lot.
| Name |
Type |
Default |
Nullable |
Children |
Parents |
Comment |
| id |
uuid |
app.uuid_v7() |
false |
|
|
Identifiant de la validation (UUID v7). |
| organisation_id |
uuid |
|
false |
|
app.utilisateur app.capacite_version |
Organisation propriétaire de la ligne. Sert à l’isolation par RLS (EC-032) et au filtrage de la synchronisation. |
| role_validation |
text |
|
false |
|
|
Rôle sous lequel la validation est donnée. |
| validateur_id |
uuid |
|
false |
|
app.utilisateur |
Utilisateur qui valide. Différent de l’auteur de l’objet. |
| auteur_objet_id |
uuid |
|
false |
|
app.utilisateur |
Auteur de l’objet validé, renseigné par le déclencheur du lot, jamais par l’API. |
| decision |
text |
|
false |
|
|
Décision : approuve ou refuse. |
| commentaire |
text |
|
true |
|
|
Commentaire, obligatoire en cas de refus. |
| cree_le |
timestamp with time zone |
now() |
false |
|
|
Date de création de la ligne. |
| capacite_version_id |
uuid |
|
true |
|
app.capacite_version |
Capacité validée par cette ligne (de la même organisation). Une cible au plus ; une capacité se valide une fois par rôle, direction et rsci, par deux personnes différentes. |
| Name |
Type |
Definition |
| validation_check |
CHECK |
CHECK ((validateur_id <> auteur_objet_id)) |
| validation_check1 |
CHECK |
CHECK (((decision = ‘approuve’::text) OR (commentaire IS NOT NULL))) |
| validation_decision_check |
CHECK |
CHECK ((decision = ANY (ARRAY[‘approuve’::text, ‘refuse’::text]))) |
| validation_role_validation_check |
CHECK |
CHECK ((role_validation ~ ‘^[a-z_]+$’::text)) |
| validation_roles_capacite |
CHECK |
CHECK (((capacite_version_id IS NULL) OR (role_validation = ANY (ARRAY[‘direction’::text, ‘rsci’::text])))) |
| validation_une_cible |
CHECK |
CHECK ((num_nonnulls(capacite_version_id) <= 1)) |
| validation_organisation_id_auteur_objet_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, auteur_objet_id) REFERENCES app.utilisateur(organisation_id, id) |
| validation_organisation_id_validateur_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, validateur_id) REFERENCES app.utilisateur(organisation_id, id) |
| validation_pkey |
PRIMARY KEY |
PRIMARY KEY (id) |
| validation_organisation_id_capacite_version_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, capacite_version_id) REFERENCES app.capacite_version(organisation_id, id) |
| Name |
Definition |
| validation_pkey |
CREATE UNIQUE INDEX validation_pkey ON app.validation USING btree (id) |
| validation_capacite_role_idx |
CREATE UNIQUE INDEX validation_capacite_role_idx ON app.validation USING btree (capacite_version_id, role_validation) WHERE (capacite_version_id IS NOT NULL) |
| validation_capacite_validateur_idx |
CREATE UNIQUE INDEX validation_capacite_validateur_idx ON app.validation USING btree (capacite_version_id, validateur_id) WHERE (capacite_version_id IS NOT NULL) |
| Name |
Definition |
| journal |
CREATE TRIGGER journal AFTER INSERT OR DELETE OR UPDATE ON app.validation FOR EACH ROW EXECUTE FUNCTION journal.tg_journaliser() |
| ajout_seul |
CREATE TRIGGER ajout_seul BEFORE DELETE OR UPDATE ON app.validation FOR EACH ROW EXECUTE FUNCTION app.tg_ajout_seul() |
| auteur |
CREATE TRIGGER auteur BEFORE INSERT ON app.validation FOR EACH ROW EXECUTE FUNCTION app.tg_validation_auteur() |
| solde |
CREATE TRIGGER solde AFTER INSERT ON app.validation FOR EACH ROW WHEN ((new.capacite_version_id IS NOT NULL)) EXECUTE FUNCTION app.tg_validation_solde() |
erDiagram
"app.validation" }o--|| "app.utilisateur" : "FOREIGN KEY (organisation_id, auteur_objet_id) REFERENCES app.utilisateur(organisation_id, id)"
"app.validation" }o--|| "app.utilisateur" : "FOREIGN KEY (organisation_id, validateur_id) REFERENCES app.utilisateur(organisation_id, id)"
"app.validation" }o--|| "app.capacite_version" : "FOREIGN KEY (organisation_id, capacite_version_id) REFERENCES app.capacite_version(organisation_id, id)"
"app.validation" {
uuid id "Identifiant de la validation (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 role_validation "Rôle sous lequel la validation est donnée."
uuid validateur_id FK "Utilisateur qui valide. Différent de l'auteur de l'objet."
uuid auteur_objet_id FK "Auteur de l'objet validé, renseigné par le déclencheur du lot, jamais par l'API."
text decision "Décision : approuve ou refuse."
text commentaire "Commentaire, obligatoire en cas de refus."
timestamp_with_time_zone cree_le "Date de création de la ligne."
uuid capacite_version_id FK "Capacité validée par cette ligne (de la même organisation). Une cible au plus ; une capacité se valide une fois par rôle, `direction` et `rsci`, par deux personnes différentes."
}
"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.capacite_version" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
uuid groupement_id FK "Groupement de la cible, repris d'elle par la base. Le téléphone filtre dessus."
uuid parcelle_id FK "Parcelle cible. Exactement une cible entre parcelle et zone de cueillette."
uuid zone_cueillette_id FK "Zone de cueillette cible (EC-050)."
uuid campagne_id FK "Campagne de la capacité. Deux campagnes la même année portent chacune la leur."
integer version "Numéro de version pour la cible et la campagne, attribué par la base."
uuid parcelle_version_id FK "Version de polygone sur laquelle la capacité est calculée, posée par la base. Si le polygone change, la capacité n'est plus applicable (EC-012)."
bigint surface_mesuree_m2 "Surface mesurée de cette version de polygone, en m², posée par la base. La surface déclarée n'entre jamais dans le calcul (AV1-01)."
bigint rendement_g_ha "Rendement de référence en vigueur lors de la saisie, en g/ha, posé par la base."
bigint capacite_g "Capacité en grammes, calculée : surface mesurée × rendement / 10 000, arrondie au plus proche (RG-020). Seule formule du projet pour la capacité."
uuid cree_par FK "Auteur de la proposition : il ne peut pas la valider (SB-11)."
timestamp_with_time_zone cree_le "Date de création de la version."
}
Generated by tbls