Aller au contenu

sync.commande

Commande envoyée par un téléphone, conservée telle que reçue, en ajout seul. Elle sert de trace et de clé d’idempotence.

Name Type Default Nullable Children Parents Comment
id uuid false sync.commande_resultat sync.controle Identifiant de la commande (UUID v7 généré sur l’appareil). Clé d’idempotence.
organisation_id uuid false sync.commande_resultat sync.controle app.utilisateur app.appareil Organisation propriétaire de la ligne. Sert à l’isolation par RLS (EC-032) et au filtrage de la synchronisation.
appareil_id uuid false app.appareil Appareil émetteur.
utilisateur_id uuid false app.utilisateur Agent auteur.
sequence bigint false Séquence locale de l’appareil, à partir de 1. Unique par appareil.
type text false Type de commande (ex. collecte.enregistrer).
version_schema integer false Version du JSON Schema de la charge utile.
cree_le_appareil timestamp with time zone false Heure du téléphone à la saisie.
date_operation timestamp with time zone false Date d’opération retenue par le serveur, jamais postérieure à la réception (protocole §6.4).
recue_le timestamp with time zone now() false Heure de réception par le serveur.
reference_provisoire text true Référence provisoire du document de terrain (EC-009).
empreinte text false Empreinte SHA-256 de la commande canonique.
enveloppe jsonb false Commande complète en JSON, telle que reçue.
Name Type Definition
commande_check CHECK CHECK ((date_operation <= recue_le))
commande_empreinte_check CHECK CHECK ((empreinte ~ ‘^[0-9a-f]{64}$’::text))
commande_sequence_check CHECK CHECK ((sequence > 0))
commande_type_check CHECK CHECK ((type ~ ‘^[a-z_]+(.[a-z_]+)+$’::text))
commande_version_schema_check CHECK CHECK ((version_schema > 0))
commande_organisation_id_utilisateur_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id, utilisateur_id) REFERENCES app.utilisateur(organisation_id, id)
commande_organisation_id_appareil_id_fkey FOREIGN KEY FOREIGN KEY (organisation_id, appareil_id) REFERENCES app.appareil(organisation_id, id)
commande_pkey PRIMARY KEY PRIMARY KEY (id)
commande_organisation_id_id_key UNIQUE UNIQUE (organisation_id, id)
commande_appareil_id_sequence_key UNIQUE UNIQUE (appareil_id, sequence)
commande_organisation_id_reference_provisoire_key UNIQUE UNIQUE (organisation_id, reference_provisoire)
Name Definition
commande_pkey CREATE UNIQUE INDEX commande_pkey ON sync.commande USING btree (id)
commande_organisation_id_id_key CREATE UNIQUE INDEX commande_organisation_id_id_key ON sync.commande USING btree (organisation_id, id)
commande_appareil_id_sequence_key CREATE UNIQUE INDEX commande_appareil_id_sequence_key ON sync.commande USING btree (appareil_id, sequence)
commande_organisation_id_reference_provisoire_key CREATE UNIQUE INDEX commande_organisation_id_reference_provisoire_key ON sync.commande USING btree (organisation_id, reference_provisoire)
Name Definition
ajout_seul CREATE TRIGGER ajout_seul BEFORE DELETE OR UPDATE ON sync.commande FOR EACH ROW EXECUTE FUNCTION app.tg_ajout_seul()
erDiagram

"sync.commande_resultat" }o--|| "sync.commande" : "FOREIGN KEY (organisation_id, id) REFERENCES sync.commande(organisation_id, id)"
"sync.controle" }o--|| "sync.commande" : "FOREIGN KEY (organisation_id, commande_id) REFERENCES sync.commande(organisation_id, id)"
"sync.commande" }o--|| "app.utilisateur" : "FOREIGN KEY (organisation_id, utilisateur_id) REFERENCES app.utilisateur(organisation_id, id)"
"sync.commande" }o--|| "app.appareil" : "FOREIGN KEY (organisation_id, appareil_id) REFERENCES app.appareil(organisation_id, id)"

"sync.commande" {
  uuid id "Identifiant de la commande (UUID v7 généré sur l'appareil). Clé d'idempotence."
  uuid organisation_id FK "Organisation propriétaire de la ligne. Sert à l'isolation par RLS (EC-032) et au filtrage de la synchronisation."
  uuid appareil_id FK "Appareil émetteur."
  uuid utilisateur_id FK "Agent auteur."
  bigint sequence "Séquence locale de l'appareil, à partir de 1. Unique par appareil."
  text type "Type de commande (ex. collecte.enregistrer)."
  integer version_schema "Version du JSON Schema de la charge utile."
  timestamp_with_time_zone cree_le_appareil "Heure du téléphone à la saisie."
  timestamp_with_time_zone date_operation "Date d'opération retenue par le serveur, jamais postérieure à la réception (protocole §6.4)."
  timestamp_with_time_zone recue_le "Heure de réception par le serveur."
  text reference_provisoire "Référence provisoire du document de terrain (EC-009)."
  text empreinte "Empreinte SHA-256 de la commande canonique."
  jsonb enveloppe "Commande complète en JSON, telle que reçue."
}
"sync.commande_resultat" {
  uuid id FK "Identifiant de la commande concernée (PowerSync exige une colonne id)."
  uuid organisation_id FK "Organisation propriétaire de la ligne. Sert à l'isolation par RLS (EC-032) et au filtrage de la synchronisation."
  uuid appareil_id FK "Appareil destinataire."
  text issue "Issue : acceptee, acceptee_controle ou rejetee."
  text__ motifs "Motifs de contrôle ou de rejet. Vide si la commande est acceptée."
  text__ alertes "Alertes non bloquantes."
  text numero_officiel "Numéro officiel attribué par le serveur."
  jsonb entites "Entités créées, par identifiant, en JSON."
  timestamp_with_time_zone date_operation "Date d'opération retenue."
  timestamp_with_time_zone traitee_le "Date de traitement par le serveur."
}
"sync.controle" {
  uuid id "Identifiant du contrôle (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 commande_id FK "Commande à l'origine du contrôle."
  text motif "Motif du contrôle, parmi le catalogue du protocole (§9). « module_inactif » (EC-096) : commande d'un module inactif, conservée sans écriture métier."
  jsonb details "Éléments de contexte, en JSON."
  text statut "Statut : ouvert, en_cours ou leve."
  text decision "Décision de levée. Renseignée si et seulement si le contrôle est levé."
  text motif_decision "Motif de la décision."
  uuid decide_par FK "Utilisateur qui a levé le contrôle. Jamais l'auteur de la commande."
  timestamp_with_time_zone decide_le "Date de la levée."
  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."
  uuid producteur_id FK "Producteur concerné par le contrôle (de la même organisation), par exemple pour un doublon de pièce d'identité (AV1-02)."
  uuid parcelle_version_id FK "Version de polygone concernée par le contrôle (de la même organisation) : polygone invalide ou chevauchement."
}
"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.appareil" {
  uuid id "Identifiant de l'appareil (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 code "Code court unique de l'appareil, utilisé dans les références provisoires (EC-009)."
  uuid utilisateur_id FK "Agent titulaire de l'appareil."
  text modele "Modèle du téléphone."
  boolean gnss_bifrequence "Vrai si le téléphone dispose d'un récepteur GNSS bifréquence (GPS-03, GPS-05)."
  text version_application "Dernière version de l'application terrain connue."
  text statut "Statut : actif, revoque ou remplace."
  timestamp_with_time_zone enrole_le "Date d'enrôlement."
  timestamp_with_time_zone revoque_le "Date de révocation. Nulle si l'appareil n'est pas révoqué."
  uuid revoque_par FK "Utilisateur qui a révoqué l'appareil."
  text motif_revocation "Motif de la révocation, obligatoire dès qu'elle a lieu."
  bigint derniere_sequence "Dernière séquence de commande traitée pour cet appareil. Ne diminue jamais."
  timestamp_with_time_zone derniere_synchro "Date de la dernière synchronisation."
  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."
}

Generated by tbls