Aller au contenu

app.groupement

Groupement de producteurs. Unité de filtrage des données descendues sur le téléphone de l’agent.

Name Type Default Nullable Children Parents Comment
id uuid app.uuid_v7() false app.producteur app.affectation_agent app.zone_cueillette app.certificat app.contrat app.perimetre_module_agent Identifiant stable (UUID v7).
organisation_id uuid false app.producteur app.affectation_agent app.zone_cueillette app.certificat app.contrat app.perimetre_module_agent app.organisation Organisation propriétaire. Sert à l’isolation par RLS (EC-032).
code text false Code du groupement, unique par organisation.
nom text false Nom du groupement.
actif boolean true false Faux quand le groupement n’est plus utilisé. Un groupement n’est jamais supprimé.
cree_le timestamp with time zone now() false Date de création de la ligne.
modifie_le timestamp with time zone now() false Date de dernière modification.
Name Type Definition
groupement_code_check CHECK CHECK ((code <> ‘’::text))
groupement_nom_check CHECK CHECK ((nom <> ‘’::text))
groupement_organisation_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)
groupement_pkey PRIMARY KEY PRIMARY KEY (id)
groupement_organisation_id_code_key UNIQUE UNIQUE (organisation_id, code)
groupement_organisation_id_id_key UNIQUE UNIQUE (organisation_id, id)
Name Definition
groupement_pkey CREATE UNIQUE INDEX groupement_pkey ON app.groupement USING btree (id)
groupement_organisation_id_code_key CREATE UNIQUE INDEX groupement_organisation_id_code_key ON app.groupement USING btree (organisation_id, code)
groupement_organisation_id_id_key CREATE UNIQUE INDEX groupement_organisation_id_id_key ON app.groupement USING btree (organisation_id, id)
Name Definition
journal CREATE TRIGGER journal AFTER INSERT OR DELETE OR UPDATE ON app.groupement FOR EACH ROW EXECUTE FUNCTION journal.tg_journaliser()
modifie_le CREATE TRIGGER modifie_le BEFORE UPDATE ON app.groupement FOR EACH ROW EXECUTE FUNCTION app.tg_modifie_le()
erDiagram

"app.producteur" }o--|| "app.groupement" : "FOREIGN KEY (organisation_id, groupement_id) REFERENCES app.groupement(organisation_id, id)"
"app.affectation_agent" }o--|| "app.groupement" : "FOREIGN KEY (organisation_id, groupement_id) REFERENCES app.groupement(organisation_id, id)"
"app.zone_cueillette" }o--|| "app.groupement" : "FOREIGN KEY (organisation_id, groupement_id) REFERENCES app.groupement(organisation_id, id)"
"app.certificat" }o--|| "app.groupement" : "FOREIGN KEY (organisation_id, groupement_id) REFERENCES app.groupement(organisation_id, id)"
"app.contrat" }o--|| "app.groupement" : "FOREIGN KEY (organisation_id, groupement_id) REFERENCES app.groupement(organisation_id, id)"
"app.perimetre_module_agent" }o--|| "app.groupement" : "FOREIGN KEY (organisation_id, groupement_id) REFERENCES app.groupement(organisation_id, id)"
"app.groupement" }o--|| "app.organisation" : "FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)"

"app.groupement" {
  uuid id "Identifiant stable (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
  text code "Code du groupement, unique par organisation."
  text nom "Nom du groupement."
  boolean actif "Faux quand le groupement n'est plus utilisé. Un groupement n'est jamais supprimé."
  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.producteur" {
  uuid id "Identifiant stable (UUID v7), clé d'échange avec le système de contrôle interne."
  uuid organisation_id FK "Organisation qui enrôle le producteur. Sert à l'isolation par RLS (EC-032)."
  uuid groupement_id FK "Groupement d'appartenance (de la même organisation). Le téléphone filtre sur ce groupement."
  text code "Code du producteur, unique par organisation et définitif (RG-010, EC-031)."
  text nom_complet "Nom complet du producteur."
  text telephone "Téléphone. Donnée personnelle : accès réservé aux rôles qui en ont l'usage (EX-063)."
  text village "Village."
  text canton "Canton."
  text zone_production "Zone de production."
  date date_inscription "Date d'inscription du producteur, transmise au système de contrôle interne."
  text type_piece_identite "Type de la pièce d'identité (carte nationale, passeport…). Vocabulaire non contrôlé pour l'instant. Renseigné avec le numéro, ou absent avec lui."
  text numero_piece_identite "Numéro de la pièce d'identité, tel que saisi. Le doublon ne bloque rien : il ouvre un contrôle (AV1-02)."
  text numero_piece_normalise "Numéro de pièce en majuscules, sans espace ni tiret, calculé. Sert à rapprocher deux saisies du même numéro."
  uuid photo_fichier_id FK "Photo du producteur (fichier de la même organisation)."
  uuid piece_fichier_id FK "Image de la pièce d'identité (fichier de la même organisation)."
  bigint chiffre_affaires_valeur "Chiffre d'affaires annuel, en unités mineures de sa devise (EC-028). Sert à l'éligibilité au groupe (EC-014)."
  text chiffre_affaires_devise "Devise ISO 4217 du chiffre d'affaires. Renseignée avec la valeur, ou absente avec elle."
  boolean actif "Faux quand le producteur est retiré des listes de saisie sans altérer l'historique (RG-011). Toujours faux pour une fiche fusionnée."
  text statut "`actif` ou `fusionnee`. Une fiche fusionnée renvoie à la fiche retenue et ne se réactive pas."
  uuid fusionnee_dans_id FK "Fiche retenue quand celle-ci a été absorbée par une fusion. Renseignée si et seulement si le statut est `fusionnee`."
  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.affectation_agent" {
  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 confié à l'agent (de la même organisation)."
  uuid utilisateur_id FK "Agent affecté (utilisateur de la même organisation)."
  date debut "Premier jour de l'affectation."
  date fin "Dernier jour de l'affectation. Absent : affectation en cours."
  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.zone_cueillette" {
  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 qui exploite la zone (de la même organisation)."
  uuid produit_id FK "Produit cueilli (de la même organisation)."
  text code "Code de la zone, unique par organisation."
  text nom "Nom de la zone."
  boolean actif "Faux quand la zone n'est plus utilisée. Une zone n'est jamais supprimée."
  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.certificat" {
  uuid id "Identifiant stable (UUID v7)."
  uuid organisation_id FK "Organisation qui enregistre le certificat. Sert à l'isolation par RLS (EC-032)."
  uuid referentiel_id FK "Référentiel coché par l'organisation (app.organisation_referentiel) que le certificat atteste (EC-101)."
  uuid operateur_id FK "Titulaire opérateur : l'organisation elle-même. Exactement un titulaire entre opérateur, groupement et fournisseur (EC-025)."
  uuid groupement_id FK "Titulaire groupement (de la même organisation). Un certificat de groupe couvre ses membres."
  uuid fournisseur_id FK "Titulaire fournisseur (de la même organisation). Un fournisseur ne se crée pas sans son certificat (EC-053)."
  text organisme_nom "Nom de l'organisme certificateur."
  text organisme_code "Code de l'organisme certificateur, sans contrôle de format (EC-027)."
  text numero "Numéro du certificat, sans contrôle de format."
  date date_debut "Premier jour de validité, inclus."
  date date_fin "Dernier jour de validité, inclus. Jamais avant date_debut. L'expiration se calcule depuis cette date."
  text statut "`valide`, `suspendu` ou `retire`. Pas de valeur « expiré » : il se calcule. La date d'une suspension ou d'un retrait n'est pas stockée (EC-072) ; le journal d'audit en garde la trace."
  uuid fichier_id FK "PDF du certificat (fichier de la même organisation). Obligatoire pour un fournisseur (EC-053)."
  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.contrat" {
  uuid id "Identifiant stable (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
  text code "Code du contrat, unique par organisation."
  text type "`achat` (producteur, groupement ou fournisseur), `vente` (client) ou `prestation` (client ou fournisseur, EC-052)."
  uuid producteur_id FK "Contrepartie producteur (achat). Exactement une contrepartie entre producteur, groupement, fournisseur et client."
  uuid groupement_id FK "Contrepartie groupement (achat)."
  uuid fournisseur_id FK "Contrepartie fournisseur (achat ou prestation)."
  uuid client_id FK "Contrepartie client (vente ou prestation)."
  uuid campagne_id FK "Campagne du contrat (de la même organisation)."
  date date_debut "Premier jour de la période du contrat."
  date date_fin "Dernier jour de la période du contrat. Jamais avant le début."
  text statut "`brouillon`, `actif`, `solde` ou `resilie`. Pas de retour en arrière ; l'activation exige une ligne."
  text conditions_paiement "Conditions de paiement, en texte, facultatives."
  uuid fichier_id FK "Pièce jointe du contrat (fichier de la même organisation), facultative."
  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.perimetre_module_agent" {
  uuid id "Identifiant de la ligne."
  uuid organisation_id FK "Organisation."
  uuid groupement_id FK "Groupement où l'agent est affecté."
  uuid utilisateur_id FK "Agent affecté."
  text module_code FK "Module actif de l'organisation (le noyau, toujours actif, n'y figure pas)."
  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.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."
}

Generated by tbls