Aller au contenu

app.lot

Lot : objet central de la traçabilité (cahier, entité Lot ; AM-03). Un lot a un compte de matière de nature lot et un mouvement de création obligatoire (I4). Sa quantité n’est pas stockée : elle se lit dans app.lot_solde.

Name Type Default Nullable Children Parents Comment
id uuid app.uuid_v7() false app.deplacement_lot app.reception app.quarantaine_lot app.sortie_etape app.lot_qualite app.expedition_ligne app.registre_annulation app.rappel Identifiant du lot (UUID v7).
organisation_id uuid false app.deplacement_lot app.reception app.quarantaine_lot app.sortie_etape app.lot_qualite app.expedition_ligne app.registre_annulation app.rappel app.organisation app.utilisateur app.compte_matiere app.mouvement app.campagne app.produit Organisation propriétaire (isolation par ligne).
campagne_id uuid false app.campagne Campagne du lot.
reference_provisoire text false Référence provisoire, tant que le lot n’est pas validé (BR-AAAA-MM-JJ-NNNN dans le cahier).
numero bigint true Rang du numéro officiel, pris par app.attribuer_numero à la validation, jamais réutilisé (I3). Vide avant la validation.
nature text false Nature de la séquence de numérotation : MP matière première, REC réception, NET nettoyé, PF produit fini (EC-068).
produit_id uuid false app.produit Produit du lot.
qualite text false Catégorie d’affichage du lot (EC-090) : saisie à la réception, calculée par le mélange (la plus basse catégorie des entrées et des états du résultat, EC-120). La qualité par référentiel est dans app.lot_qualite.
statut text ‘brouillon’::text false Statut : brouillon, en_attente, valide, rejete, annule, consomme, quarantaine, archive. Transitions contrôlées par app.tg_lot_controle.
compte_matiere_id uuid false app.compte_matiere Compte de matière du lot (nature lot) : son solde est la quantité du lot.
mouvement_creation_id uuid false app.mouvement Mouvement qui crée le lot (I4) : il crédite le compte du lot et n’est pas une contre-passation.
date_operation timestamp with time zone false Date de l’opération qui crée le lot, saisie sur le terrain.
motif_annulation text true Motif de l’annulation ; renseigné si et seulement si le statut est annule.
annule_par uuid true app.utilisateur Utilisateur qui a annulé le lot.
date_annulation timestamp with time zone true Date de l’annulation.
cree_par uuid false app.utilisateur Utilisateur qui a créé le lot.
cree_le timestamp with time zone now() false Date d’enregistrement du lot.
modifie_le timestamp with time zone now() false Date de la dernière modification (statut ou numéro).
Name Type Definition
lot_check CHECK CHECK (((statut = ‘annule’::text) = (motif_annulation IS NOT NULL)))
lot_check1 CHECK CHECK (((statut = ‘annule’::text) = ((annule_par IS NOT NULL) AND (date_annulation IS NOT NULL))))
lot_motif_annulation_check CHECK CHECK ((motif_annulation <> ‘’::text))
lot_nature_check CHECK CHECK ((nature = ANY (ARRAY[‘MP’::text, ‘REC’::text, ‘NET’::text, ‘PF’::text])))
lot_numero_check CHECK CHECK ((numero > 0))
lot_origine TRIGGER CREATE CONSTRAINT TRIGGER lot_origine AFTER INSERT ON app.lot DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION app.tg_lot_origine()
lot_qualite_check CHECK CHECK ((qualite <> ‘’::text))
lot_reference_provisoire_check CHECK CHECK ((reference_provisoire <> ‘’::text))
lot_statut_check CHECK CHECK ((statut = ANY (ARRAY[‘brouillon’::text, ‘en_attente’::text, ‘valide’::text, ‘rejete’::text, ‘annule’::text, ‘consomme’::text, ‘quarantaine’::text, ‘archive’::text])))
lot_organisation_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)
lot_organisation_id_annule_par_fkey FOREIGN KEY FOREIGN KEY (organisation_id, annule_par) REFERENCES app.utilisateur(organisation_id, id)
lot_organisation_id_cree_par_fkey FOREIGN KEY FOREIGN KEY (organisation_id, cree_par) REFERENCES app.utilisateur(organisation_id, id)
lot_organisation_id_compte_matiere_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id, compte_matiere_id) REFERENCES app.compte_matiere(organisation_id, id)
lot_organisation_id_mouvement_creation_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id, mouvement_creation_id) REFERENCES app.mouvement(organisation_id, id)
lot_organisation_id_campagne_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id, campagne_id) REFERENCES app.campagne(organisation_id, id)
lot_organisation_id_produit_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id, produit_id) REFERENCES app.produit(organisation_id, id)
lot_pkey PRIMARY KEY PRIMARY KEY (id)
lot_organisation_id_id_key UNIQUE UNIQUE (organisation_id, id)
lot_compte_matiere_id_key UNIQUE UNIQUE (compte_matiere_id)
Name Definition
lot_pkey CREATE UNIQUE INDEX lot_pkey ON app.lot USING btree (id)
lot_organisation_id_id_key CREATE UNIQUE INDEX lot_organisation_id_id_key ON app.lot USING btree (organisation_id, id)
lot_compte_matiere_id_key CREATE UNIQUE INDEX lot_compte_matiere_id_key ON app.lot USING btree (compte_matiere_id)
lot_numero_uq CREATE UNIQUE INDEX lot_numero_uq ON app.lot USING btree (organisation_id, campagne_id, nature, produit_id, numero) WHERE (numero IS NOT NULL)
lot_campagne_idx CREATE INDEX lot_campagne_idx ON app.lot USING btree (organisation_id, campagne_id, statut)
Name Definition
journal CREATE TRIGGER journal AFTER INSERT OR DELETE OR UPDATE ON app.lot FOR EACH ROW EXECUTE FUNCTION journal.tg_journaliser()
modifie_le CREATE TRIGGER modifie_le BEFORE UPDATE ON app.lot FOR EACH ROW EXECUTE FUNCTION app.tg_modifie_le()
lot_controle CREATE TRIGGER lot_controle BEFORE INSERT OR UPDATE ON app.lot FOR EACH ROW EXECUTE FUNCTION app.tg_lot_controle()
lot_origine CREATE CONSTRAINT TRIGGER lot_origine AFTER INSERT ON app.lot DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION app.tg_lot_origine()
erDiagram

"app.deplacement_lot" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.reception" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.quarantaine_lot" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.sortie_etape" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.lot_qualite" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.expedition_ligne" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.registre_annulation" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_id) REFERENCES app.lot(organisation_id, id)"
"app.rappel" }o--|| "app.lot" : "FOREIGN KEY (organisation_id, lot_depart_id) REFERENCES app.lot(organisation_id, id)"
"app.lot" }o--|| "app.organisation" : "FOREIGN KEY (organisation_id) REFERENCES app.organisation(id)"
"app.lot" }o--|| "app.utilisateur" : "FOREIGN KEY (organisation_id, annule_par) REFERENCES app.utilisateur(organisation_id, id)"
"app.lot" }o--|| "app.utilisateur" : "FOREIGN KEY (organisation_id, cree_par) REFERENCES app.utilisateur(organisation_id, id)"
"app.lot" }o--|| "app.compte_matiere" : "FOREIGN KEY (organisation_id, compte_matiere_id) REFERENCES app.compte_matiere(organisation_id, id)"
"app.lot" }o--|| "app.mouvement" : "FOREIGN KEY (organisation_id, mouvement_creation_id) REFERENCES app.mouvement(organisation_id, id)"
"app.lot" }o--|| "app.campagne" : "FOREIGN KEY (organisation_id, campagne_id) REFERENCES app.campagne(organisation_id, id)"
"app.lot" }o--|| "app.produit" : "FOREIGN KEY (organisation_id, produit_id) REFERENCES app.produit(organisation_id, id)"

"app.lot" {
  uuid id "Identifiant du lot (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  uuid campagne_id FK "Campagne du lot."
  text reference_provisoire "Référence provisoire, tant que le lot n'est pas validé (BR-AAAA-MM-JJ-NNNN dans le cahier)."
  bigint numero "Rang du numéro officiel, pris par app.attribuer_numero à la validation, jamais réutilisé (I3). Vide avant la validation."
  text nature "Nature de la séquence de numérotation : MP matière première, REC réception, NET nettoyé, PF produit fini (EC-068)."
  uuid produit_id FK "Produit du lot."
  text qualite "Catégorie d'affichage du lot (EC-090) : saisie à la réception, calculée par le mélange (la plus basse catégorie des entrées et des états du résultat, EC-120). La qualité par référentiel est dans app.lot_qualite."
  text statut "Statut : brouillon, en_attente, valide, rejete, annule, consomme, quarantaine, archive. Transitions contrôlées par app.tg_lot_controle."
  uuid compte_matiere_id FK "Compte de matière du lot (nature lot) : son solde est la quantité du lot."
  uuid mouvement_creation_id FK "Mouvement qui crée le lot (I4) : il crédite le compte du lot et n'est pas une contre-passation."
  timestamp_with_time_zone date_operation "Date de l'opération qui crée le lot, saisie sur le terrain."
  text motif_annulation "Motif de l'annulation ; renseigné si et seulement si le statut est annule."
  uuid annule_par FK "Utilisateur qui a annulé le lot."
  timestamp_with_time_zone date_annulation "Date de l'annulation."
  uuid cree_par FK "Utilisateur qui a créé le lot."
  timestamp_with_time_zone cree_le "Date d'enregistrement du lot."
  timestamp_with_time_zone modifie_le "Date de la dernière modification (statut ou numéro)."
}
"app.deplacement_lot" {
  uuid id "Identifiant du déplacement (UUID v7, ordonné dans le temps)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  uuid lot_id FK "Lot déplacé."
  uuid de_emplacement_id FK "Emplacement de départ ; vide pour le premier placement. Doit être l'emplacement courant du lot."
  uuid emplacement_id FK "Emplacement d'arrivée : actif, et qui accepte la qualité du lot (RG-154)."
  timestamp_with_time_zone date_operation "Date du déplacement, saisie sur le terrain."
  text motif "Motif du déplacement, facultatif."
  uuid cree_par FK "Utilisateur qui a enregistré le déplacement."
  timestamp_with_time_zone cree_le "Date d'enregistrement du déplacement."
}
"app.reception" {
  uuid id "Identifiant de la réception (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  uuid campagne_id FK "Campagne de la réception."
  uuid produit_id FK "Produit reçu."
  uuid producteur_id FK "Producteur qui livre ; vide si la matière vient d'un fournisseur (l'un ou l'autre, jamais les deux)."
  uuid fournisseur_id FK "Fournisseur qui livre ; vide si la matière vient d'un producteur."
  uuid contrat_id FK "Contrat dont la formule de réfaction s'applique ; vide si aucun contrat (aucune réfaction)."
  uuid lot_id FK "Lot créé par la réception, avec son mouvement de création (I4). Un lot naît d'une seule réception."
  timestamp_with_time_zone date_operation "Date de la réception, saisie sur le terrain : c'est elle qui sert à apprécier l'état du certificat (RG-014)."
  text statut "Statut : en_attente, validee ou rejetee. Ne revient jamais en arrière ; une erreur se corrige par annulation (L2-6)."
  jsonb formule_refaction "Formule de réfaction retenue, copiée du contrat à l'enregistrement : c'est elle qui est imprimée sur le bon de réception (RG-171)."
  jsonb detail_calcul "Détail du calcul du poids net marchand (brut, tare, net, excédent, réfaction), figé tel qu'imprimé (RG-171)."
  bigint net_marchand_g "Poids net marchand en grammes : net de pesée moins la réfaction du contrat. Copie du détail pour les lectures."
  uuid ticket_fichier_id FK "Ticket de pesée conservé (RG-170), facultatif tant que le stockage objet n'est pas en place."
  text derogation_motif "Justification de la dérogation de la direction quand une règle bloque la réception (RG-014) ; vide sans dérogation."
  uuid derogation_par FK "Utilisateur de la direction qui a donné la dérogation."
  timestamp_with_time_zone derogation_le "Date de la dérogation."
  uuid decide_par FK "Utilisateur qui a validé ou rejeté la réception ; vide tant qu'elle est en attente."
  timestamp_with_time_zone decide_le "Date de la décision ; vide tant que la réception est en attente."
  uuid cree_par FK "Utilisateur qui a enregistré la réception."
  timestamp_with_time_zone cree_le "Date d'enregistrement de la réception."
  timestamp_with_time_zone modifie_le "Date de la dernière modification (décision ou dérogation)."
}
"app.quarantaine_lot" {
  uuid id "Identifiant de l'événement (UUID v7, ordonné dans le temps)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  uuid lot_id FK "Lot concerné."
  text evenement "Événement : mise (le lot validé passe en quarantaine) ou levee (il redevient validé)."
  text motif "Motif de la mise ou de la levée ; toujours renseigné."
  uuid constat_id FK "Constat de la règle qui a déclenché la mise en quarantaine ; vide pour une mise ou une levée manuelle."
  uuid cree_par FK "Utilisateur qui a mis le lot en quarantaine ou levé la quarantaine."
  timestamp_with_time_zone cree_le "Date de l'événement."
}
"app.sortie_etape" {
  uuid id "Identifiant stable (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  uuid etape_realisee_id FK "Étape qui produit la sortie ; elle doit être en cours ou réalisée, pas encore validée."
  text nature "produit_principal (au plus un par étape), coproduit, sous_produit, rebut ou perte."
  uuid produit_id FK "Produit de la sortie."
  bigint quantite_g "Quantité en grammes, strictement positive."
  uuid lot_id FK "Lot créé par un mouvement de l'étape, pour la même quantité ; vide pour un rebut ou une perte, qui ne deviennent jamais un lot."
  text destination "Destination du rebut (obligatoire pour un rebut)."
  text motif "Motif de la perte déclarée (obligatoire pour une perte)."
  uuid cree_par FK "Utilisateur qui a déclaré la sortie."
  timestamp_with_time_zone cree_le "Date de la déclaration."
  boolean reintegre_flux_bio "Vrai si l'opérateur déclare que ce rebut réintègre un flux biologique (EC-120) ; réservé à la nature rebut. Lu par la variable etape.rebut_reintegre_flux_bio des normes."
  uuid mouvement_id FK "Mouvement de transformation qui a produit la sortie. Une sortie dont le mouvement est contre-passé (étape dévalidée) ne compte plus dans le bilan ; vide pour les sorties antérieures à L2-6 sans mouvement retrouvé."
}
"app.lot_qualite" {
  uuid id "Identifiant de la ligne (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire du lot (isolation par ligne)."
  uuid lot_id FK "Lot dont la qualité est décrite ; se pose tant que le lot est en brouillon ou en attente."
  text referentiel_code FK "Code du référentiel du catalogue global (UE, NOP…), coché par l'organisation."
  text etat "Code d'un état de qualité du référentiel (bio, conversion_annee_1…), pris dans les états de la dernière version publiée de son pack ; un état « hors statut » est refusé."
  uuid cree_par FK "Utilisateur qui a posé la qualité."
  timestamp_with_time_zone cree_le "Date de pose de la qualité."
}
"app.expedition_ligne" {
  uuid id "Identifiant de la ligne (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  uuid expedition_id FK "Expédition à laquelle la ligne appartient."
  uuid lot_id FK "Lot validé prélevé (RG-081) ; un lot ne figure qu'une fois par expédition."
  bigint quantite_g "Quantité prélevée en grammes, strictement positive, jamais supérieure à ce que contient le lot."
  timestamp_with_time_zone cree_le "Date d'enregistrement de la ligne."
}
"app.registre_annulation" {
  uuid id "Identifiant de la ligne du registre (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  text objet_type "Type d'objet défait : reception, etape_realisee, expedition, vente ou lot."
  uuid objet_id "Identifiant de l'objet défait."
  text nature "devalidation (retour à l'état précédent : réception, étape, expédition) ou annulation (clôture : vente, lot). Deux mécanismes distincts (EC-008)."
  text motif "Justification écrite, obligatoire."
  uuid lot_id FK "Lot annulé, avec son numéro conservé (RG-143) ; pour une dévalidation de réception, le lot d'origine annulé. Vide pour une vente, une étape ou une expédition."
  uuid campagne_id FK "Campagne concernée, pour l'édition du registre par campagne (RG-144) ; vide pour une vente ou une expédition."
  uuid mouvement_id FK "Mouvement de contre-passation écrit ; vide pour l'annulation d'une vente, qui n'a pas encore bougé la matière."
  uuid constat_id FK "Constat consigné pour la dévalidation (AM-15) ; vide pour une annulation."
  uuid cree_par FK "Utilisateur qui défait l'objet (direction)."
  timestamp_with_time_zone cree_le "Date de la dévalidation ou de l'annulation."
}
"app.rappel" {
  uuid id "Identifiant du rappel (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire (isolation par ligne)."
  uuid lot_depart_id FK "Lot à partir duquel le rappel est lancé."
  text motif "Raison du rappel, obligatoire."
  boolean simule "Vrai pour un exercice à blanc (RG-163) : aucun lot n'est mis en quarantaine."
  text statut "ouvert, clos (décision de clôture consignée) ou simule (exercice à blanc, archivé tel quel)."
  jsonb plan "Plan figé à l'ouverture : lots descendants et ascendants avec leur profondeur, clients touchés, quantités livrées en grammes."
  integer duree_calcul_ms "Durée mesurée du calcul du plan, en millisecondes (RG-160, RG-163 : délai de réponse)."
  text decision_cloture "Décision de clôture, obligatoire pour clore (RG-162)."
  timestamp_with_time_zone organisme_informe_le "Date à laquelle l'organisme certificateur a été informé (RG-162) ; vide s'il ne l'est pas."
  text organisme_reference "Référence de l'échange avec l'organisme certificateur (texte libre)."
  bigint quantite_retournee_g "Quantité retournée par les clients, en grammes (RG-162)."
  bigint quantite_detruite_g "Quantité détruite, en grammes (RG-162)."
  bigint quantite_declassee_g "Quantité déclassée, en grammes (RG-162)."
  uuid clos_par FK "Utilisateur qui clôt le rappel."
  timestamp_with_time_zone clos_le "Date de la clôture."
  uuid cree_par FK "Utilisateur qui ouvre le rappel (direction)."
  timestamp_with_time_zone cree_le "Date d'ouverture."
  timestamp_with_time_zone modifie_le "Dernière modification (clôture)."
}
"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.utilisateur" {
  uuid id "Identifiant de l'utilisateur (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire de la ligne. Sert à l'isolation par RLS (EC-032) et au filtrage de la synchronisation."
  uuid keycloak_sub "Identifiant du compte Keycloak (revendication sub). Identique d'une organisation à l'autre pour un compte externe."
  text identifiant "Identifiant local de connexion, sans le code de l'organisation : 3 à 32 caractères parmi a-z, 0-9, _ et -. Unique dans l'organisation."
  text nom_affiche "Nom affiché dans l'application."
  text telephone "Numéro de téléphone. Attribut du compte, jamais son identifiant."
  text statut "Statut du compte : actif, suspendu ou desactive."
  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."
}
"app.compte_matiere" {
  uuid id "Identifiant du compte (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire de la ligne. Sert à l'isolation par RLS (EC-032) et au filtrage de la synchronisation."
  text nature "Nature du compte. Un seul compte technique par nature et par organisation ; les lots sont illimités."
  text libelle "Libellé du compte."
  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."
}
"app.mouvement" {
  uuid id "Identifiant du mouvement (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire de la ligne. Sert à l'isolation par RLS (EC-032) et au filtrage de la synchronisation."
  text nature "Nature : reception, transfert, transformation, expedition, perte, inventaire ou contrepassation."
  timestamp_with_time_zone date_operation "Date de l'opération sur le terrain ou à la balance."
  uuid contrepasse_mouvement_id FK "Mouvement annulé par cette contre-passation. Un mouvement n'est contre-passé qu'une fois."
  text motif "Motif, obligatoire pour une contre-passation."
  uuid commande_id "Commande de synchronisation à l'origine du mouvement."
  uuid cree_par FK "Utilisateur auteur du mouvement."
  timestamp_with_time_zone cree_le "Date de création de la ligne."
  uuid etape_realisee_id FK "Étape réalisée à laquelle se rattache un mouvement de transformation (AM-12) ; obligatoire pour ce type de mouvement, vide pour les autres."
}
"app.campagne" {
  uuid id "Identifiant stable (UUID v7)."
  uuid organisation_id FK "Organisation propriétaire. Sert à l'isolation par RLS (EC-032)."
  text code "Code de campagne inséré dans le numéro officiel. Unique par organisation, toutes années confondues (EC-031)."
  text nom "Nom de la campagne."
  date date_ouverture_prevue "Date d'ouverture prévue. Détermine « AA » tant que la campagne est en préparation."
  date date_cloture_prevue "Date de clôture prévue. Jamais avant la date d'ouverture prévue."
  date date_ouverture "Date d'ouverture réelle, renseignée à l'ouverture puis figée."
  date date_cloture "Date de clôture réelle, renseignée à la clôture."
  smallint annee "Année d'ouverture (réelle, sinon prévue), calculée. Ses deux derniers chiffres forment « AA » du numéro (EC-023)."
  uuid pack_version_id FK "Version du pack de la filière. Figée à l'ouverture, qui exige une version publiée."
  integer modele_numerotation_version FK "Version du modèle de numérotation de l'organisation. Obligatoire et figée à l'ouverture ; la clé vers le modèle est posée à la séquence A3."
  text statut "`preparation`, `ouverte` ou `cloturee`. Pas de retour en préparation."
  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.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."
}

Generated by tbls