Aller au contenu

app.client

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