Parcelle d’un producteur. Son polygone vit dans app.parcelle_version, versionné et en ajout seul. Le téléphone filtre sur organisation_id et groupement_id.
| Name |
Type |
Definition |
| parcelle_code_check |
CHECK |
CHECK ((code <> ‘’::text)) |
| parcelle_mode_culture_facteur_check |
CHECK |
CHECK ((mode_culture_facteur = ‘mode_culture’::text)) |
| parcelle_region_facteur_check |
CHECK |
CHECK ((region_facteur = ‘region’::text)) |
| parcelle_surface_declaree_m2_check |
CHECK |
CHECK ((surface_declaree_m2 > 0)) |
| parcelle_type_sol_facteur_check |
CHECK |
CHECK ((type_sol_facteur = ‘type_sol’::text)) |
| parcelle_type_surface_check |
CHECK |
CHECK ((type_surface = ANY (ARRAY[‘cultures’::text, ‘serres’::text, ‘prairies’::text]))) |
| parcelle_organisation_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id) REFERENCES app.organisation(id) |
| parcelle_mode_culture_facteur_mode_culture_fkey |
FOREIGN KEY |
FOREIGN KEY (mode_culture_facteur, mode_culture) REFERENCES app.facteur_valeur(facteur_code, code) |
| parcelle_region_facteur_region_fkey |
FOREIGN KEY |
FOREIGN KEY (region_facteur, region) REFERENCES app.facteur_valeur(facteur_code, code) |
| parcelle_type_sol_facteur_type_sol_fkey |
FOREIGN KEY |
FOREIGN KEY (type_sol_facteur, type_sol) REFERENCES app.facteur_valeur(facteur_code, code) |
| parcelle_organisation_id_produit_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, produit_id) REFERENCES app.produit(organisation_id, id) |
| parcelle_organisation_id_groupement_id_producteur_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, groupement_id, producteur_id) REFERENCES app.producteur(organisation_id, groupement_id, id) |
| parcelle_pkey |
PRIMARY KEY |
PRIMARY KEY (id) |
| parcelle_organisation_id_code_key |
UNIQUE |
UNIQUE (organisation_id, code) |
| parcelle_organisation_id_id_key |
UNIQUE |
UNIQUE (organisation_id, id) |
| parcelle_organisation_id_groupement_id_id_key |
UNIQUE |
UNIQUE (organisation_id, groupement_id, id) |
| Name |
Definition |
| parcelle_pkey |
CREATE UNIQUE INDEX parcelle_pkey ON app.parcelle USING btree (id) |
| parcelle_organisation_id_code_key |
CREATE UNIQUE INDEX parcelle_organisation_id_code_key ON app.parcelle USING btree (organisation_id, code) |
| parcelle_organisation_id_id_key |
CREATE UNIQUE INDEX parcelle_organisation_id_id_key ON app.parcelle USING btree (organisation_id, id) |
| parcelle_organisation_id_groupement_id_id_key |
CREATE UNIQUE INDEX parcelle_organisation_id_groupement_id_id_key ON app.parcelle USING btree (organisation_id, groupement_id, id) |
| parcelle_producteur_idx |
CREATE INDEX parcelle_producteur_idx ON app.parcelle USING btree (organisation_id, producteur_id) |
| Name |
Definition |
| journal |
CREATE TRIGGER journal AFTER INSERT OR DELETE OR UPDATE ON app.parcelle FOR EACH ROW EXECUTE FUNCTION journal.tg_journaliser() |
| modifie_le |
CREATE TRIGGER modifie_le BEFORE UPDATE ON app.parcelle FOR EACH ROW EXECUTE FUNCTION app.tg_modifie_le() |
erDiagram
"app.parcelle_version" }o--|| "app.parcelle" : "FOREIGN KEY (organisation_id, groupement_id, parcelle_id) REFERENCES app.parcelle(organisation_id, groupement_id, id)"
"app.statut_conformite" }o--|| "app.parcelle" : "FOREIGN KEY (organisation_id, groupement_id, parcelle_id) REFERENCES app.parcelle(organisation_id, groupement_id, id)"
"app.rendement_parcelle" }o--|| "app.parcelle" : "FOREIGN KEY (organisation_id, groupement_id, parcelle_id) REFERENCES app.parcelle(organisation_id, groupement_id, id)"
"app.capacite_version" }o--|| "app.parcelle" : "FOREIGN KEY (organisation_id, groupement_id, parcelle_id) REFERENCES app.parcelle(organisation_id, groupement_id, id)"
"app.solde_capacite" }o--|| "app.parcelle" : "FOREIGN KEY (organisation_id, groupement_id, parcelle_id) REFERENCES app.parcelle(organisation_id, groupement_id, id)"
"app.certificat_portee" }o--|| "app.parcelle" : "FOREIGN KEY (organisation_id, parcelle_id) REFERENCES app.parcelle(organisation_id, id)"
"app.parcelle" }o--|| "app.organisation" : "FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)"
"app.parcelle" }o--|| "app.produit" : "FOREIGN KEY (organisation_id, produit_id) REFERENCES app.produit(organisation_id, id)"
"app.parcelle" }o--|| "app.producteur" : "FOREIGN KEY (organisation_id, groupement_id, producteur_id) REFERENCES app.producteur(organisation_id, groupement_id, id)"
"app.parcelle" }o--|| "app.facteur_valeur" : "FOREIGN KEY (region_facteur, region) REFERENCES app.facteur_valeur(facteur_code, code)"
"app.parcelle" }o--|| "app.facteur_valeur" : "FOREIGN KEY (mode_culture_facteur, mode_culture) REFERENCES app.facteur_valeur(facteur_code, code)"
"app.parcelle" }o--|| "app.facteur_valeur" : "FOREIGN KEY (type_sol_facteur, type_sol) REFERENCES app.facteur_valeur(facteur_code, code)"
"app.parcelle" {
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 parcelle, identique à celui de son producteur (clé composée) : un producteur qui a des parcelles ne change pas de groupement."
uuid producteur_id FK "Producteur propriétaire de la parcelle (de la même organisation)."
uuid produit_id FK "Produit cultivé (de la même organisation)."
text code "Code de la parcelle, unique par organisation."
text type_surface "`cultures`, `serres` ou `prairies` : sert aux seuils d'éligibilité au groupe (RG-024)."
bigint surface_declaree_m2 "Surface déclarée par le producteur, en m² (EC-030). Jamais la base d'une capacité : c'est la surface mesurée (AV1-01)."
text region_facteur FK "Constante `region` : nom du facteur de la clé étrangère composée vers facteur_valeur."
text region FK "Région (valeur du facteur `region`), facultative."
text mode_culture_facteur FK "Constante `mode_culture` : nom du facteur de la clé étrangère composée vers facteur_valeur."
text mode_culture FK "Mode de culture (`pluvial` ou `irrigue`), facultatif."
text type_sol_facteur FK "Constante `type_sol` : nom du facteur de la clé étrangère composée vers facteur_valeur."
text type_sol FK "Type de sol (valeur du facteur `type_sol`), facultatif."
boolean actif "Faux quand la parcelle n'est plus utilisée. Une parcelle 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.parcelle_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 quand il n'est pas donné. 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. Exactement une cible entre parcelle et zone de cueillette."
integer version "Numéro de version de la cible, à partir de 1, attribué par la base quand il n'est pas donné. La plus élevée est la version en vigueur."
geometry_Polygon_4326_ geom "Polygone en WGS 84 (SRID 4326). Peut être invalide : il est alors signalé, jamais réparé."
jsonb geojson "Le même polygone en GeoJSON, tenu par la base : c'est ce que le téléphone reçoit."
boolean valide "Résultat de ST_IsValid sur le polygone, calculé par la base."
text motif_invalidite "Raison donnée par ST_IsValidReason quand le polygone est invalide, sinon vide."
bigint surface_mesuree_m2 "Surface mesurée en m² (ST_Area en géographie, arrondie). Vide si le polygone est invalide. Base de toute capacité (AV1-01)."
bigint perimetre_m "Périmètre en mètres (ST_Perimeter en géographie, arrondi). Vide si le polygone est invalide."
text methode "Méthode de relevé (GPS-03) : `sommets`, `marche`, `dessin` ou `import` (EC-048)."
integer precision_mediane_cm "Précision médiane déclarée du relevé, en centimètres (GPS-03). Pour un import, la précision lue dans le fichier."
text appareil "Appareil ou récepteur utilisé pour le relevé (GPS-03), en texte libre."
uuid trace_fichier_id FK "Trace brute du relevé (fichier de la même organisation), conservée pour l'audit (GPS-03)."
bigint incertitude_m2 "Incertitude de la surface mesurée (GPS-04) : périmètre × précision médiane, calculée. Un écart avec la surface déclarée plus petit n'est pas une anomalie."
uuid cree_par FK "Utilisateur qui a importé ou relevé la version."
timestamp_with_time_zone cree_le "Date de création de la version : début de sa période de vigueur."
}
"app.statut_conformite" {
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 l'unité, repris d'elle par la base. Le téléphone filtre dessus."
uuid producteur_id FK "Unité producteur. Exactement une unité entre producteur, parcelle et zone de cueillette (EC-025)."
uuid parcelle_id FK "Unité parcelle."
uuid zone_cueillette_id FK "Unité zone de cueillette."
uuid referentiel_id FK "Référentiel coché par l'organisation (app.organisation_referentiel) pour lequel le statut vaut (EC-101)."
text etat "État de conformité, défini par le pack référentiel (AM-16) : bio, conversion_annee_2_et_plus, conversion_annee_1, conventionnel, suspendu, retiré pour l'UE. Contrôlé par la base contre les états publiés."
date debut_conversion "Début de la conversion. Obligatoire pour les deux états de conversion."
date date_eligibilite "Date à laquelle l'unité devient éligible (fin de conversion prévue), facultative."
date date_effet "Date d'effet du statut : il vaut à partir de ce jour, jusqu'à la ligne suivante."
text source "`interne` ou `externe`. Doit égaler organisation.source_conformite."
text reference_decision "Référence de la décision de la source (par exemple du contrôle interne)."
text motif "Justification écrite. Absente pour la première ligne d'une unité, obligatoire pour toute révision (RG-150)."
timestamp_with_time_zone mis_a_jour_le "Date de réception de la mise à jour par BioTrace. Départage deux lignes de même date d'effet."
uuid cree_par FK "Utilisateur qui a enregistré ou révisé le statut."
}
"app.rendement_parcelle" {
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."
integer version "Numéro de version de la cible, à partir de 1, attribué par la base. La plus élevée est en vigueur."
bigint valeur_g_ha "Rendement de référence en grammes par hectare (EC-030), strictement positif."
text motif "Justification écrite de la valeur, obligatoire à chaque ligne (RG-023)."
uuid cree_par FK "Utilisateur qui a fixé ou révisé le rendement."
timestamp_with_time_zone cree_le "Date de création de la version."
}
"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."
}
"app.solde_capacite" {
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. Le téléphone filtre dessus."
uuid parcelle_id FK "Parcelle du solde. Exactement une cible entre parcelle et zone de cueillette."
uuid zone_cueillette_id FK "Zone de cueillette du solde."
uuid campagne_id FK "Campagne du solde."
uuid capacite_version_id FK "Version de capacité validée qui fonde le solde."
bigint capacite_g "Capacité validée, en grammes."
bigint consomme_g "Quantité déjà collectée, en grammes. Jamais écrasée par une nouvelle capacité."
bigint reste_g "Capacité moins consommé, en grammes. Négatif en cas de dépassement : un dépassement n'est jamais masqué (RG-022)."
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_portee" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
uuid certificat_id FK "Certificat dont la ligne précise la portée (de la même organisation)."
text dimension "`activite`, `produit`, `site` ou `unite`. Détermine la seule colonne d'élément renseignée."
text activite_code FK "Activité du catalogue fermé (dimension `activite`)."
uuid produit_id FK "Produit du catalogue de l'organisation (dimension `produit`). Les produits sont listés un à un : le catalogue n'a pas de catégorie (EC-102)."
uuid site_id FK "Site de l'organisation (dimension `site`)."
uuid producteur_id FK "Unité producteur (dimension `unite`). Exactement une unité entre producteur, parcelle et zone de cueillette."
uuid parcelle_id FK "Unité parcelle (dimension `unite`)."
uuid zone_cueillette_id FK "Unité zone de cueillette (dimension `unite`)."
boolean inclus "Vrai : l'élément est couvert par le certificat. Faux : il est exclu expressément, et l'exclusion l'emporte sur une inclusion plus large."
uuid cree_par FK "Utilisateur qui a déclaré la ligne."
timestamp_with_time_zone cree_le "Date de création de la ligne."
}
"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.produit" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
text code "Code du produit, inséré dans le numéro officiel (segment « produit »). Unique par organisation (EC-063)."
text nom_fr "Nom en français."
text nom_en "Nom en anglais."
text unite_code FK "Unité de saisie et d'affichage."
boolean est_matiere_premiere "Vrai pour une matière première, faux pour un produit fini."
uuid matiere_premiere_liee_id FK "Matière première dont le produit fini est issu. Réservé aux produits finis, de la même organisation."
text code_modele "Code du modèle de produit du pack qui a servi à créer la ligne. Nul pour un produit créé à la main."
uuid pack_version_id FK "Version de pack d'origine. Nulle pour un produit créé à la main ; nulle exactement quand code_modele l'est."
boolean actif "Faux quand le produit n'est plus utilisé. Un produit 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.facteur_valeur" {
uuid id "Identifiant stable (UUID v7), cible des clés étrangères des parcelles (séquence A5)."
text facteur_code FK "Facteur dont la valeur fait partie."
text code "Code de la valeur, unique dans son facteur : TG, lateritique, irrigue…"
text libelle_fr "Libellé en français."
text libelle_en "Libellé en anglais."
uuid pack_id FK "Pack qui a déclaré la valeur. Nul pour une valeur du noyau."
timestamp_with_time_zone cree_le "Date de création de la ligne."
}
Generated by tbls