Client acheteur. Tous les champs du cahier v1.2 §11 sont obligatoires (EC-053).
| Name |
Type |
Default |
Nullable |
Children |
Parents |
Comment |
| id |
uuid |
app.uuid_v7() |
false |
app.contrat app.vente |
|
Identifiant stable (UUID v7). |
| organisation_id |
uuid |
|
false |
app.contrat app.vente |
app.organisation |
Organisation propriétaire. Sert à l’isolation par RLS (EC-032). |
| code |
text |
|
false |
|
|
Code du client, unique par organisation. |
| nom |
text |
|
false |
|
|
Nom du client. |
| pays |
text |
|
false |
|
|
Pays, code ISO 3166-1 alpha-2. |
| adresse_livraison |
text |
|
false |
|
|
Adresse de livraison habituelle. |
| contact |
text |
|
false |
|
|
Personne à contacter. |
| telephone |
text |
|
false |
|
|
Téléphone du client. |
| email |
text |
|
false |
|
|
Adresse électronique du client. |
| incoterm_habituel |
text |
|
false |
|
|
Incoterm 2020 habituel du client (EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF). |
| devise |
text |
|
false |
|
|
Devise de facturation, code ISO 4217 (EC-028). |
| conditions_reglement |
text |
|
false |
|
|
Conditions de règlement habituelles, en texte. |
| actif |
boolean |
true |
false |
|
|
Faux quand le client n’est plus utilisé. Un client 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 |
| client_adresse_livraison_check |
CHECK |
CHECK ((adresse_livraison <> ‘’::text)) |
| client_code_check |
CHECK |
CHECK ((code <> ‘’::text)) |
| client_conditions_reglement_check |
CHECK |
CHECK ((conditions_reglement <> ‘’::text)) |
| client_contact_check |
CHECK |
CHECK ((contact <> ‘’::text)) |
| client_devise_check |
CHECK |
CHECK ((devise ~ ‘^[A-Z]{3}$’::text)) |
| client_email_check |
CHECK |
CHECK ((email ~ ‘^[^@[:space:]]+@[^@[:space:]]+$’::text)) |
| client_incoterm_habituel_check |
CHECK |
CHECK ((incoterm_habituel = ANY (ARRAY[‘EXW’::text, ‘FCA’::text, ‘CPT’::text, ‘CIP’::text, ‘DAP’::text, ‘DPU’::text, ‘DDP’::text, ‘FAS’::text, ‘FOB’::text, ‘CFR’::text, ‘CIF’::text]))) |
| client_nom_check |
CHECK |
CHECK ((nom <> ‘’::text)) |
| client_pays_check |
CHECK |
CHECK ((pays ~ ‘^[A-Z]{2}$’::text)) |
| client_telephone_check |
CHECK |
CHECK ((telephone <> ‘’::text)) |
| client_organisation_id_fkey |
FOREIGN KEY |
FOREIGN KEY (organisation_id) REFERENCES app.organisation(id) |
| client_pkey |
PRIMARY KEY |
PRIMARY KEY (id) |
| client_organisation_id_code_key |
UNIQUE |
UNIQUE (organisation_id, code) |
| client_organisation_id_id_key |
UNIQUE |
UNIQUE (organisation_id, id) |
| Name |
Definition |
| client_pkey |
CREATE UNIQUE INDEX client_pkey ON app.client USING btree (id) |
| client_organisation_id_code_key |
CREATE UNIQUE INDEX client_organisation_id_code_key ON app.client USING btree (organisation_id, code) |
| client_organisation_id_id_key |
CREATE UNIQUE INDEX client_organisation_id_id_key ON app.client USING btree (organisation_id, id) |
| Name |
Definition |
| journal |
CREATE TRIGGER journal AFTER INSERT OR DELETE OR UPDATE ON app.client FOR EACH ROW EXECUTE FUNCTION journal.tg_journaliser() |
| modifie_le |
CREATE TRIGGER modifie_le BEFORE UPDATE ON app.client FOR EACH ROW EXECUTE FUNCTION app.tg_modifie_le() |
erDiagram
"app.contrat" }o--|| "app.client" : "FOREIGN KEY (organisation_id, client_id) REFERENCES app.client(organisation_id, id)"
"app.vente" }o--|| "app.client" : "FOREIGN KEY (organisation_id, client_id) REFERENCES app.client(organisation_id, id)"
"app.client" }o--|| "app.organisation" : "FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)"
"app.client" {
uuid id "Identifiant stable (UUID v7)."
uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
text code "Code du client, unique par organisation."
text nom "Nom du client."
text pays "Pays, code ISO 3166-1 alpha-2."
text adresse_livraison "Adresse de livraison habituelle."
text contact "Personne à contacter."
text telephone "Téléphone du client."
text email "Adresse électronique du client."
text incoterm_habituel "Incoterm 2020 habituel du client (EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF)."
text devise "Devise de facturation, code ISO 4217 (EC-028)."
text conditions_reglement "Conditions de règlement habituelles, en texte."
boolean actif "Faux quand le client n'est plus utilisé. Un client 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.vente" {
uuid id "Identifiant de la vente (UUID v7)."
uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
uuid client_id FK "Client acheteur."
uuid contrat_id FK "Contrat de vente actif du même client, facultatif : vide pour une vente « spot ». Sa tolérance s'ajoute à la quantité engagée."
uuid produit_id FK "Produit vendu : celui de tous les lots expédiés."
text referentiel_code FK "Référentiel revendiqué sur la vente (RG-156, AV1-03) ; vide si la vente ne revendique aucun référentiel."
bigint quantite_engagee_g "Quantité vendue en grammes. Le total expédié ne la dépasse pas, tolérance du contrat comprise."
bigint prix_unite_mineure "Prix par unité de prix, en unités mineures de la devise."
text unite_prix FK "Unité à laquelle le prix s'applique (kilogramme, tonne…)."
text devise FK "Devise du prix."
date date_operation "Date de la vente."
text statut "Statut : brouillon, validee, soldee ou annulee. Une vente annulée ne peut plus avoir d'expédition validée."
uuid valide_par FK "Utilisateur qui a validé la vente ; vide tant qu'elle est en brouillon."
timestamp_with_time_zone valide_le "Date de validation de la vente."
uuid cree_par FK "Utilisateur qui a saisi la vente."
timestamp_with_time_zone cree_le "Date de saisie de la vente."
timestamp_with_time_zone modifie_le "Date de la dernière modification de la vente."
}
"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