Cahier des charges
Cahier des charges — Modélisation & Saisie « Table Solaire »
1) Objet et périmètre
Ce document spécifie le modèle de données et les flux de saisie pour gérer les « tables solaires » (grilles perches × fils) exploitées en mer : ajout/déplacement/retrait de fils par lots identifiés, opérations de table (vérification, calage, armement) et gestion du filet anti-dorade.
Le document ne traite pas du code applicatif ; il définit la structure des données, les règles d’intégrité, les cardinalités et l’UX cible côté opérateur.
2) Glossaire
- Table solaire : une grille Perches × Fils située dans un lieu (ville/site), identifiée par un numéro unique par lieu.
- Perche : colonne de la grille (ex. 12 perches).
- Fil : ligne de la grille (ex. 94 fils), regroupés :
- Groupe 0 : fils d’extrémité (début),
- Groupes 1..n : fils par groupe de taille configurable (
group_size).
- Lot : identifiant métier externe (chaîne), auquel appartiennent un ensemble d'huitre d'une même livraison.
- Légende : numéro d’ordre (INT) unique par table qui identifie un ensemble d’actions réalisées sur un seul lot à une date donnée.
- Opération (fils) : action réalisée par un opérateur sur la grille : ajout, déplacement ou retrait de fils.
- Opération (table) : action au niveau de la table entière (vérification, calage, armement).
- Filet anti‑dorade : état/mouvements spécifiques gérés indépendamment des fils.
3) Contraintes métier clés
- Unicité table :
(lieu, numero_de_table)est unique. - Légende :
numero_legendeest unique par table et lié à un seul lot. - Opération fils : une opération concerne une table, une légende, un lot, un type, une date, un opérateur, et un nombre de fils saisi (contrôle).
- Plages : les sélections se font par plages rectangulaires (perche X..Y × fil A..B).
- Ajout (in) : destination uniquement.
- Retrait (out) : source uniquement.
- Déplacement (move) : source + destination (cardinalités identiques).
- Groupes de fils : calculés à partir de
ext_start(fils d’extrémité au début) etgroup_size(taille des groupes). - Filet anti‑dorade : journal d’événements + état courant optionnel recopié sur la table pour lecture rapide.
4) Référentiels existants réutilisés (inchangés)
lieux:id,lieu, … (sert à attacher les tables à une ville/site)utilisateurs:id,user,nom,prenom, … (opérateur, responsable)lots:id,numero(VARCHAR), identifiant métier du lot
5) Nouvelles entités (données structure)
5.1) tables_solaire
Une table physique dans l’eau, identifiée par (lieu, numéro).
Champs :
id(PK)id_lieu(FK →lieux.id)numero(INT) — Unique par (id_lieu,numero)groupe_plan_eau(VARCHAR court) — zone/secteur localgps_latDECIMAL(9,6),gps_lonDECIMAL(9,6) — optionnels dans un premier temps- Paramètres :
nb_perches(INT),nb_fils(INT),ext_start(INT),group_size(INT) - État filet courant (optionnel) :
filet_etat_courant_id(FK →filet_mouvements.id) - Traces :
created_at,updated_at,deleted_at
Notes :
- Les groupes/rangs des fils se déduisent de
ext_start+group_size. Pour accélérer les requêtes, on peut matérialiser via une table optionnelle (voir § 5.7).
5.2) legendes
Numéro d’ordre unique par table, lié à un lot.
Champs :
id(PK)id_table(FK →tables_solaire.id)numero_legende(INT) — Unique par (id_table,numero_legende)id_lot(FK →lots.id)date_legende(DATETIME)commentaire(nullable)created_at,updated_at
5.3) (Référentiel) operation_types
8 types codifiés + « sens » (in/move/out).
Champs :
id(PK) : 1..8libelle(ex : en pregros, en collage, …)sens(ENUM:in|move|out)
Table de correspondance :
1 en pregros→in2 en collage→in3 en stockage→in7 simplification→move4 sortie pregros→out5 sortie recolte→out6 sortie livraison→out8 sortie echantillon→out
5.4) operations_fils
Entête d’intervention d’un opérateur sur une table, un lot, une légende, à une date.
Champs :
id(PK)id_table(FK →tables_solaire.id)id_legende(FK →legendes.id)id_lot(FK →lots.id)id_type(FK →operation_types.id)date_action(DATETIME)id_operateur(FK →utilisateurs.id) — marin qui pose/saisitid_responsable(FK →utilisateurs.id) — optionnelnb_fils_declares(INT) — contrôle : #fils attendu selon les plagescommentaire(nullable)created_at,updated_at,deleted_at
Règles :
- Une seule légende et un seul lot par opération.
5.5) operation_fils_plages
Détail des sélections (plages) d’une opération ; plusieurs plages possibles.
Champs :
id(PK)id_operation(FK →operations_fils.id)- Plage source (nullable) :
fil_src_debut,fil_src_fin,perche_src_debut,perche_src_fin - Plage destination (nullable) :
fil_dst_debut,fil_dst_fin,perche_dst_debut,perche_dst_fin
Règles :
sens = in→ destination uniquementsens = out→ source uniquementsens = move→ source + destination (cardinalités identiques)
5.6) (Option performance) table_cells
État matérialisé cellule par cellule pour lecture/exports rapides.
Champs :
id(PK)id_table(FK)numero_fil(INT),numero_perche(INT)id_lot(FK →lots.id)id_legende(FK →legendes.id)last_operation_id(FK →operations_fils.id)etat(ENUM :present|retire) oudate_pose/date_retrait- UNIQUE (
id_table,numero_fil,numero_perche)
Évolution : table_cells_history (append-only) pour l’audit fin (changement d’état/lot/legende par opération).
5.7) (Option) tables_solaire_perches, tables_solaire_fils
Référentiels internes si besoin de méta/perfs.
tables_solaire_perches:id,id_table,numero_perche(unique par table), métadonnées.tables_solaire_fils:id,id_table,numero_fil(unique par table),groupe,rang_groupe(pré-calculés).
6) Opérations de table (distinct des fils)
6.1) (Référentiel) table_action_types
id(PK) — valeurs :verification,calage,armementlibelle
6.2) table_actions
id(PK)id_table(FK)id_table_action_type(FK)valeur_bool(0/1)valeur_int(nullable)date_action(DATETIME)id_operateur(FK →utilisateurs.id)commentaire(nullable)created_at,updated_at
7) Filet anti‑dorade
7.1) (Référentiel) filet_mouvements
id(PK 1..6)libelle1 mise écarteurs · 2 mise filet · 3 vérif plongeur ok · 4 décrochage filet · 5 retrait filet · 6 écarteurs sur rails
7.2) table_filet_journal
id(PK)id_table(FK)date_evt(DATETIME)id_operateur(FK →utilisateurs.id)valeur_int(nullable)code1_int(nullable)id_mouvement(FK →filet_mouvements.id) — état/mouvement actuelid_prochain_mouvement(FK →filet_mouvements.id) (nullable)commentaire(nullable)created_at,updated_at
Option : recopier l’état courant dans tables_solaire.filet_etat_courant_id pour lecture rapide.
8) Cardinalités (résumé)
lieux (1)—tables_solaire (N)tables_solaire (1)—legendes (N)lots (1)—legendes (N)tables_solaire (1)—operations_fils (N)legendes (1)—operations_fils (N)lots (1)—operations_fils (N)operations_fils (1)—operation_fils_plages (N)tables_solaire (1)—table_actions (N)tables_solaire (1)—table_filet_journal (N)- (option)
tables_solaire (1)—table_cells (N)
9) Règles d’intégrité & contraintes
- Unicités :
tables_solaire: UNIQUE (id_lieu,numero)legendes: UNIQUE (id_table,numero_legende)- (option)
tables_solaire_perches: UNIQUE (id_table,numero_perche) - (option)
tables_solaire_fils: UNIQUE (id_table,numero_fil) - (option)
table_cells: UNIQUE (id_table,numero_fil,numero_perche)
- FK systématiques (suppression logique
deleted_atrecommandée). - Opérations fils :
in→ plages destination uniquement ; collision gérée par règle métier (refus/écrasement/transformer enmove).out→ plages source uniquement ; cellules doivent exister.move→ source + destination et même cardinalité.
- Compteur de fils :
nb_fils_declaresdoit correspondre à la somme des cellules des plages (contrôle applicatif + déclencheurs éventuels).
10) UX opérateur (saisie depuis la grille)
- Choix du lieu → choix de la table (par numéro) ; affichage de la grille (perches × fils) avec regroupements (Groupes 0..n).
- Légende : afficher la dernière légende et proposer la prochaine (auto‑incrément par table). Sélection du lot (autocomplete). Enregistrer la légende (
id_table,numero_legende,id_lot,date). - Type d’opération : 1..8. Indiquer clairement s’il s’agit d’un ajout, retrait ou déplacement.
- Sélection des plages sur la grille :
- Ajout : zones destination.
- Retrait : zones source.
- Déplacement : d’abord source, puis destination (avec compteur et vérification de cardinalité).
- Compteur dynamique du nombre de fils (= cellules) sélectionnés.
- Validation : création de
operations_fils+operation_fils_plages.- (si matérialisation) mise à jour de
table_cells(upsert) et (option)table_cells_history.
- (si matérialisation) mise à jour de
- Actions de table : formulaire simple oui/non + date + valeur + opérateur →
table_actions. - Anti‑dorade : mini‑workflow (mouvement actuel + prochain mouvement + date/opérateur) →
table_filet_journal(+ recopie éventuelle danstables_solaire). - Historique : timeline des dernières opérations (légende, lot, type, nb_fils, opérateur, date), filtres par lot/légende/type/période/perche/groupe/fil.
11) Performances & dénormalisation contrôlée
- Pour des listes/exports rapides, utiliser la table
table_cellsmatérialisée (vue de l’état courant par cellule). - L’état courant du filet peut être recopié dans
tables_solaire.filet_etat_courant_id. - Index recommandés :
operations_fils: (id_table,date_action), (id_legende), (id_lot), (id_operateur)operation_fils_plages: (id_operation) + index composites selon les plagestable_actions: (id_table,id_table_action_type,date_action)table_filet_journal: (id_table,date_evt)table_cells: (id_table,numero_perche), (id_table,numero_fil), (id_lot)
12) Données de référence (à précharger)
operation_types(id, libelle, sens)- 1 en pregros (in)
- 2 en collage (in)
- 3 en stockage (in)
- 7 simplification (move)
- 4 sortie pregros (out)
- 5 sortie recolte (out)
- 6 sortie livraison (out)
- 8 sortie echantillon (out)
table_action_types: verification · calage · armementfilet_mouvements(1..6) : mise écarteurs · mise filet · vérif plongeur ok · décrochage filet · retrait filet · écarteurs sur rails
13) Évolutivité
- GPS : possibilité de passer à un champ géographique (POINT) si besoin SIG.
- Fils d’extrémité fin : ajouter un paramètre
ext_endsi nécessaire pour modéliser aussi une extrémité en bas du tableau. - Rôles/permissions : restreindre les types d’opérations par rôle utilisateur.
- Collisions : politiques configurables (refus, écrasement, conversion automatique en
move).
14) Schémas (à intégrer au cahier des charges)
14.1) Diagramme entité‑association (Mermaid)
Coller tel quel dans un fichier Markdown compatible Mermaid.
erDiagram
LIEUX ||--o{ TABLES_SOLAIRE : "possède"
TABLES_SOLAIRE ||--o{ LEGENDE : "a"
LOTS ||--o{ LEGENDE : "peut être lié à"
TABLES_SOLAIRE ||--o{ OPERATIONS_FILS : "reçoit"
LEGENDE ||--o{ OPERATIONS_FILS : "référence"
LOTS ||--o{ OPERATIONS_FILS : "concerne"
OPERATIONS_FILS ||--o{ OPERATION_FILS_PLAGES : "détaille"
TABLES_SOLAIRE ||--o{ TABLE_ACTIONS : "journal"
TABLES_SOLAIRE ||--o{ TABLE_FILET_JOURNAL : "journal"
TABLES_SOLAIRE ||--o{ TABLE_CELLS : "état matérialisé"
LIEUX {
int id PK
varchar lieu
}
LOTS {
int id PK
varchar numero
}
TABLES_SOLAIRE {
int id PK
int id_lieu FK
int numero
varchar groupe_plan_eau
decimal gps_lat
decimal gps_lon
int nb_perches
int nb_fils
int ext_start
int group_size
int filet_etat_courant_id FK
}
LEGENDE {
int id PK
int id_table FK
int numero_legende
int id_lot FK
datetime date_legende
}
OPERATION_TYPES {
int id PK
varchar libelle
enum sens
}
OPERATIONS_FILS {
int id PK
int id_table FK
int id_legende FK
int id_lot FK
int id_type FK
datetime date_action
int id_operateur FK
int id_responsable FK
int nb_fils_declares
}
OPERATION_FILS_PLAGES {
int id PK
int id_operation FK
int fil_src_debut
int fil_src_fin
int perche_src_debut
int perche_src_fin
int fil_dst_debut
int fil_dst_fin
int perche_dst_debut
int perche_dst_fin
}
TABLE_ACTION_TYPES {
int id PK
varchar libelle
}
TABLE_ACTIONS {
int id PK
int id_table FK
int id_table_action_type FK
tinyint valeur_bool
int valeur_int
datetime date_action
int id_operateur FK
}
FILET_MOUVEMENTS {
int id PK
varchar libelle
}
TABLE_FILET_JOURNAL {
int id PK
int id_table FK
datetime date_evt
int id_operateur FK
int valeur_int
int code1_int
int id_mouvement FK
int id_prochain_mouvement FK
}
TABLE_CELLS {
int id PK
int id_table FK
int numero_fil
int numero_perche
int id_lot FK
int id_legende FK
int last_operation_id FK
enum etat
}
14.2) Diagramme (PlantUML) — alternative
Coller dans un fichier
.pumlet générer l’image via PlantUML.
@enduml
@startuml
skinparam linetype ortho
skinparam classAttributeIconSize 0
class Lieux {
+id: int <<PK>>
+lieu: varchar
}
class Tables_Solaire {
+id: int <<PK>>
+id_lieu: int <<FK>>
+numero: int
+groupe_plan_eau: varchar
+gps_lat: decimal
+gps_lon: decimal
+nb_perches: int
+nb_fils: int
+ext_start: int
+group_size: int
+filet_etat_courant_id: int <<FK>>
}
class Legendes {
+id: int <<PK>>
+id_table: int <<FK>>
+numero_legende: int
+id_lot: int <<FK>>
+date_legende: datetime
}
class Lots {
+id: int <<PK>>
+numero: varchar
}
class Operation_Types {
+id: int <<PK>>
+libelle: varchar
+sens: enum
}
class Operations_Fils {
+id: int <<PK>>
+id_table: int <<FK>>
+id_legende: int <<FK>>
+id_lot: int <<FK>>
+id_type: int <<FK>>
+date_action: datetime
+id_operateur: int <<FK>>
+id_responsable: int <<FK>>
+nb_fils_declares: int
}
class Operation_Fils_Places {
+id: int <<PK>>
+id_operation: int <<FK>>
+fil_src_debut: int
+fil_src_fin: int
+perche_src_debut: int
+perche_src_fin: int
+fil_dst_debut: int
+fil_dst_fin: int
+perche_dst_debut: int
+perche_dst_fin: int
}
class Table_Action_Types {
+id: int <<PK>>
+libelle: varchar
}
class Table_Actions {
+id: int <<PK>>
+id_table: int <<FK>>
+id_table_action_type: int <<FK>>
+valeur_bool: tinyint
+valeur_int: int
+date_action: datetime
+id_operateur: int <<FK>>
}
class Filet_Mouvements {
+id: int <<PK>>
+libelle: varchar
}
class Table_Filet_Journal {
+id: int <<PK>>
+id_table: int <<FK>>
+date_evt: datetime
+id_operateur: int <<FK>>
+valeur_int: int
+code1_int: int
+id_mouvement: int <<FK>>
+id_prochain_mouvement: int <<FK>>
}
class Table_Cells {
+id: int <<PK>>
+id_table: int <<FK>>
+numero_fil: int
+numero_perche: int
+id_lot: int <<FK>>
+id_legende: int <<FK>>
+last_operation_id: int <<FK>>
+etat: enum
}
Lieux ||--o{ Tables_Solaire
Tables_Solaire ||--o{ Legendes
Lots ||--o{ Legendes
Tables_Solaire ||--o{ Operations_Fils
Legendes ||--o{ Operations_Fils
Lots ||--o{ Operations_Fils
Operations_Fils ||--o{ Operation_Fils_Places
Tables_Solaire ||--o{ Table_Actions
Tables_Solaire ||--o{ Table_Filet_Journal
Tables_Solaire ||--o{ Table_Cells
@enduml
15) Acceptation
- La structure proposée réutilise vos tables existantes (
lieux,utilisateurs,lots). - Elle sépare clairement : structure de table, intention d’opération, état courant, opérations de table et filet.
- Elle supporte la saisie UX depuis la grille (plages multiples, compteur, contrôles) et les exigences d’audit.
- Les tables optionnelles (
table_cells,tables_solaire_*) peuvent être ajoutées selon les besoins de performance et de reporting.
No comments to display
No comments to display