Ligne d’un contrat : un produit, une quantité engagée, un prix par unité, une tolérance et la formule de réfaction. Un produit par contrat.
| Name |
Type |
Default |
Nullable |
Children |
Parents |
Comment |
| id |
uuid |
app.uuid_v7() |
false |
app.prime |
|
Identifiant stable (UUID v7). |
| organisation_id |
uuid |
|
false |
app.prime |
app.organisation app.produit app.contrat |
Organisation propriétaire. Sert à l’isolation par RLS (EC-032). |
| contrat_id |
uuid |
|
false |
|
app.contrat |
Contrat de la ligne (de la même organisation). |
| produit_id |
uuid |
|
false |
|
app.produit |
Produit de la ligne (de la même organisation), unique dans le contrat. |
| quantite_engagee_g |
bigint |
|
false |
|
|
Quantité engagée en grammes (EC-030), strictement positive. |
| prix_unite_mineure |
bigint |
|
false |
|
|
Prix de base en unités mineures de la devise, par unité de prix (par exemple 150 XOF le kilo). Jamais sans devise. |
| devise |
text |
|
false |
app.prime |
app.devise |
Devise du prix, code ISO 4217 connu de app.devise (EC-028). |
| unite_prix |
text |
|
false |
|
app.unite |
Unité du prix (g, kg, t) : le prix vaut par cette unité. Le stock reste en grammes (EC-030). |
| tolerance_cp |
integer |
0 |
false |
|
|
Tolérance sur la quantité engagée, en centièmes de point. L’alerte de solde au-delà est calculée au Lot 2. |
| formule_refaction |
jsonb |
‘{“type”: “aucune”}’::jsonb |
false |
|
|
Formule de réfaction en JSON (aucune, excedent_lineaire, lineaire_simple, bilan_de_masse), forme validée par FormuleRefaction (Ajv) ; le mode d’arrondi en fait partie (EC-051). Lue par calculerPesee à la réception. |
| 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 |
| contrat_ligne_formule_refaction_check |
CHECK |
CHECK (((jsonb_typeof(formule_refaction) = ‘object’::text) AND (formule_refaction ? ‘type’::text))) |
| contrat_ligne_prix_unite_mineure_check |
CHECK |
CHECK ((prix_unite_mineure >= 0)) |
| contrat_ligne_quantite_engagee_g_check |
CHECK |
CHECK ((quantite_engagee_g > 0)) |
| contrat_ligne_tolerance_cp_check |
CHECK |
CHECK (((tolerance_cp >= 0) AND (tolerance_cp <= 10000))) |
| contrat_ligne_organisation_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id) REFERENCES app.organisation(id) |
| contrat_ligne_unite_prix_fkey |
FOREIGN KEY |
FOREIGN KEY (unite_prix) REFERENCES app.unite(code) |
| contrat_ligne_organisation_id_produit_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, produit_id) REFERENCES app.produit(organisation_id, id) |
| contrat_ligne_devise_fkey |
FOREIGN KEY |
FOREIGN KEY (devise) REFERENCES app.devise(code) |
| contrat_ligne_organisation_id_contrat_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id, contrat_id) REFERENCES app.contrat(organisation_id, id) |
| contrat_ligne_pkey |
PRIMARY KEY |
PRIMARY KEY (id) |
| contrat_ligne_organisation_id_id_key |
UNIQUE |
UNIQUE (organisation_id, id) |
| contrat_ligne_organisation_id_id_devise_key |
UNIQUE |
UNIQUE (organisation_id, id, devise) |
| contrat_ligne_organisation_id_contrat_id_produit_id_key |
UNIQUE |
UNIQUE (organisation_id, contrat_id, produit_id) |
| Name |
Definition |
| contrat_ligne_pkey |
CREATE UNIQUE INDEX contrat_ligne_pkey ON app.contrat_ligne USING btree (id) |
| contrat_ligne_organisation_id_id_key |
CREATE UNIQUE INDEX contrat_ligne_organisation_id_id_key ON app.contrat_ligne USING btree (organisation_id, id) |
| contrat_ligne_organisation_id_id_devise_key |
CREATE UNIQUE INDEX contrat_ligne_organisation_id_id_devise_key ON app.contrat_ligne USING btree (organisation_id, id, devise) |
| contrat_ligne_organisation_id_contrat_id_produit_id_key |
CREATE UNIQUE INDEX contrat_ligne_organisation_id_contrat_id_produit_id_key ON app.contrat_ligne USING btree (organisation_id, contrat_id, produit_id) |
| Name |
Definition |
| journal |
CREATE TRIGGER journal AFTER INSERT OR DELETE OR UPDATE ON app.contrat_ligne FOR EACH ROW EXECUTE FUNCTION journal.tg_journaliser() |
| modifie_le |
CREATE TRIGGER modifie_le BEFORE UPDATE ON app.contrat_ligne FOR EACH ROW EXECUTE FUNCTION app.tg_modifie_le() |
| fige |
CREATE TRIGGER fige BEFORE INSERT OR UPDATE ON app.contrat_ligne FOR EACH ROW EXECUTE FUNCTION app.tg_contrat_fige() |
erDiagram
"app.prime" }o--|| "app.contrat_ligne" : "FOREIGN KEY (organisation_id, contrat_ligne_id) REFERENCES app.contrat_ligne(organisation_id, id)"
"app.prime" }o--|| "app.contrat_ligne" : "FOREIGN KEY (organisation_id, contrat_ligne_id, devise) REFERENCES app.contrat_ligne(organisation_id, id, devise)"
"app.contrat_ligne" }o--|| "app.organisation" : "FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)"
"app.contrat_ligne" }o--|| "app.produit" : "FOREIGN KEY (organisation_id, produit_id) REFERENCES app.produit(organisation_id, id)"
"app.contrat_ligne" }o--|| "app.contrat" : "FOREIGN KEY (organisation_id, contrat_id) REFERENCES app.contrat(organisation_id, id)"
"app.contrat_ligne" }o--|| "app.devise" : "FOREIGN KEY (devise) REFERENCES app.devise(code)"
"app.contrat_ligne" }o--|| "app.unite" : "FOREIGN KEY (unite_prix) REFERENCES app.unite(code)"
"app.contrat_ligne" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
uuid contrat_id FK "Contrat de la ligne (de la même organisation)."
uuid produit_id FK "Produit de la ligne (de la même organisation), unique dans le contrat."
bigint quantite_engagee_g "Quantité engagée en grammes (EC-030), strictement positive."
bigint prix_unite_mineure "Prix de base en unités mineures de la devise, par unité de prix (par exemple 150 XOF le kilo). Jamais sans devise."
text devise FK "Devise du prix, code ISO 4217 connu de app.devise (EC-028)."
text unite_prix FK "Unité du prix (`g`, `kg`, `t`) : le prix vaut par cette unité. Le stock reste en grammes (EC-030)."
integer tolerance_cp "Tolérance sur la quantité engagée, en centièmes de point. L'alerte de solde au-delà est calculée au Lot 2."
jsonb formule_refaction "Formule de réfaction en JSON (aucune, excedent_lineaire, lineaire_simple, bilan_de_masse), forme validée par FormuleRefaction (Ajv) ; le mode d'arrondi en fait partie (EC-051). Lue par calculerPesee à la réception."
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.prime" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
uuid contrat_ligne_id FK "Ligne de contrat concernée (de la même organisation)."
text type "`bio`, `equitable` ou `qualite`."
text mode "`montant` (par unité de prix de la ligne, en devise) ou `taux` (centièmes de point du prix de base)."
bigint montant_unite_mineure "Montant par unité de prix, en unités mineures. Renseigné si et seulement si le mode est `montant`."
text devise FK "Devise du montant, égale à celle de la ligne (clé composée). Renseignée si et seulement si le mode est `montant` : aucun montant sans devise."
integer taux_cp "Taux en centièmes de point du prix de base. Renseigné si et seulement si le mode est `taux`."
timestamp_with_time_zone cree_le "Date de création de la ligne."
timestamp_with_time_zone modifie_le "Date de dernière modification."
uuid contrat_id FK "Contrat de la ligne, repris d'elle par la base (jamais une autre valeur). Dénormalisé pour que les règles de synchronisation filtrent les primes d'un contrat sans jointure (protocole §7.3)."
}
"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.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.devise" {
uuid id "Identifiant stable (UUID v7)."
text code "Code ISO 4217 en majuscules (XOF, EUR, USD), cible des clés étrangères de montants."
text libelle_fr "Libellé en français."
text libelle_en "Libellé en anglais."
smallint decimales "Nombre de décimales de la devise : l'unité mineure vaut 10^-décimales unité majeure (EUR 2, XOF 0)."
}
"app.unite" {
uuid id "Identifiant stable (UUID v7)."
text code "Code de l'unité : g, kg, t."
text libelle_fr "Libellé en français."
text libelle_en "Libellé en anglais."
bigint grammes_par_unite "Nombre de grammes dans une unité (entier) : kg 1 000, t 1 000 000."
}
Generated by tbls