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