Skip to main content

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

  1. Unicité table : (lieu, numero_de_table) est unique.
  2. Légende : numero_legende est unique par table et lié à un seul lot.
  3. 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).
  4. 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).
  5. Groupes de fils : calculés à partir de ext_start (fils d’extrémité au début) et group_size (taille des groupes).
  6. 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 local
  • gps_lat DECIMAL(9,6), gps_lon DECIMAL(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..8
  • libelle (ex : en pregros, en collage, …)
  • sens (ENUM: in | move | out)

Table de correspondance :

  • 1 en pregrosin
  • 2 en collagein
  • 3 en stockagein
  • 7 simplificationmove
  • 4 sortie pregrosout
  • 5 sortie recolteout
  • 6 sortie livraisonout
  • 8 sortie echantillonout

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/saisit
  • id_responsable (FK → utilisateurs.id) — optionnel
  • nb_fils_declares (INT) — contrôle : #fils attendu selon les plages
  • commentaire (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 uniquement
  • sens = outsource uniquement
  • sens = movesource + 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) ou date_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, armement
  • libelle

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)
  • libelle 1 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 actuel
  • id_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_at recommandée).
  • Opérations fils :
    • in → plages destination uniquement ; collision gérée par règle métier (refus/écrasement/transformer en move).
    • out → plages source uniquement ; cellules doivent exister.
    • move → source + destination et même cardinalité.
  • Compteur de fils : nb_fils_declares doit correspondre à la somme des cellules des plages (contrôle applicatif + déclencheurs éventuels).

10) UX opérateur (saisie depuis la grille)

  1. Choix du lieuchoix de la table (par numéro) ; affichage de la grille (perches × fils) avec regroupements (Groupes 0..n).
  2. 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).
  3. Type d’opération : 1..8. Indiquer clairement s’il s’agit d’un ajout, retrait ou déplacement.
  4. 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.
  5. Validation : création de operations_fils + operation_fils_plages.
    • (si matérialisation) mise à jour de table_cells (upsert) et (option) table_cells_history.
  6. Actions de table : formulaire simple oui/non + date + valeur + opérateurtable_actions.
  7. Anti‑dorade : mini‑workflow (mouvement actuel + prochain mouvement + date/opérateur) → table_filet_journal (+ recopie éventuelle dans tables_solaire).
  8. 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_cells maté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 plages
    • table_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 · armement
  • filet_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_end si 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 .puml et 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.