Aller au contenu

app.validation

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