MOC — Management of Change#
Module OpsFlux reproduisant le Formulaire MOC Perenco (rev. 06, octobre 2025) tel qu'il est aujourd'hui captué dans Daxium. Parité fonctionnelle complète — 6 onglets du Daxium, 9 signatures électroniques (initiator, hierarchy_reviewer, site_chief, production, director, process_engineer, DO, DG, close), renvoi + motif à chaque étape, promotion en projet, export PDF fidèle au gabarit imposé.
Flow#
- Demande (initiateur) — objectifs, description, situation actuelle, modifications proposées, analyse d'impact, nature (OPTIMISATION / SECURITE), métiers, type (permanent/temporaire + dates), pièces jointes typées (PID initial/modifié/ESD/photos/études), signature demandeur.
- Revue hiérarchie + CDS/OM — confirmation que c'est bien un MOC, accord de principe, signature CDS, éventuel renvoi pour modification.
- Production — mise en étude — validation par le service production, priorité réaffectée, signature Production, renvoi possible.
- Étude Process — étude du process engineer,
study_conclusion, drapeaux HAZOP/HAZID/Environmental/MAJ PID/MAJ ESD, coût, niveau de validation déduit (D.O ou D.O + D.G), signature process engineer. - Validation parallèle — HSE, Lead Process, Production Manager, Gaz Manager, Maintenance Manager, Métier(s). Chaque validateur : commentaire, niveau, accord/refus, signature, renvoi possible avec motif. Ajout d'invités ad-hoc (users spécifiques) avec les mêmes capacités.
- Réalisation (D.O / D.G) — accord ou refus par chaque directeur
selon le
cost_bucket, commentaire, signature, renvoi possible.
Endpoints#
| Méthode | Chemin | Description |
|---|---|---|
| GET | /api/v1/moc |
Liste paginée (filtres : status, site, platform, priority, initiator, manager, mine_as_manager, has_project, search) |
| POST | /api/v1/moc |
Créer un MOC (tous les champs Daxium + manager_id + signature initiator) |
| GET | /api/v1/moc/{id} |
Détail avec history + validations + linked_project si promu |
| PATCH | /api/v1/moc/{id} |
Update (limite rôle+status) |
| DELETE | /api/v1/moc/{id} |
Soft delete |
| POST | /api/v1/moc/{id}/transition |
FSM transition (préconditions backend : signature initiator / revue hiérarchie / commentaire CDS / priorité / etc.) |
| POST | /api/v1/moc/{id}/validations |
Upsert d'une ligne validation (comment, approved, signature, return_requested/reason) |
| POST | /api/v1/moc/{id}/validations/invite |
Inviter un user comme validateur ad-hoc |
| POST | /api/v1/moc/{id}/execution-accord |
Accord/refus D.O ou D.G (+ signature + return) |
| POST | /api/v1/moc/{id}/production-validation |
Validation production (Daxium tab 3) |
| POST | /api/v1/moc/{id}/return |
Renvoi + motif (stage: site_chief / production / do / dg / validator) |
| POST | /api/v1/moc/{id}/signature |
Enregistrer une signature (slot: initiator / hierarchy_reviewer / site_chief / production / director / process_engineer / do / dg / close) |
| POST | /api/v1/moc/{id}/promote-to-project |
Crée un Project lié (code = référence MOC, manager = MOC.manager_id), idempotent — 409 si déjà promu |
| GET | /api/v1/moc/{id}/pdf |
Export PDF du formulaire (layout Perenco rev.06 — bandes teal #11A09E, cases à cocher, filigrane anti-extraction sur signatures) |
| GET/POST/PATCH/DELETE | /api/v1/moc/types(/...) |
CRUD catalogue des types + règles |
| GET/POST/DELETE | /api/v1/moc/site-assignments |
Mapping user→rôle→site (notifs) |
| GET | /api/v1/moc/fsm |
Description FSM |
| GET | /api/v1/moc/stats |
Agrégats dashboard |
Modèles de données#
mocs— 95 colonnes, donttitle,nature,metiers(JSONB),initiator_email,initiator_external_name/function, les 6 signatures,production_validated/_by/_at/_comment/_signature,study_conclusion, les 4*_return_requested/_reason(CDS, prod, DO, DG).moc_validations— matrice par rôle, avecsignature,source(matrix/invite/manual),invited_by/at,return_requested/reason.moc_types+moc_type_validation_rules— catalogue customisable par admin, seeded à la création d'un MOC avecmoc_type_id.moc_site_assignments— routage des notifications.moc_reminder_log— idempotency des rappels pour MOC temporaires.
Dictionnaires (customisables via Settings → Dictionary)#
| Category | Usage |
|---|---|
moc_site |
Liste des sites (RDR EAST / RDR WEST / SOUTH / MASSONGO / …) |
moc_modification_type |
permanent / temporaire |
moc_nature |
OPTIMISATION / SECURITE |
moc_metier |
INTEGRITE / INSTRUMENTATION / ELECTRICITE / … |
moc_cost_bucket |
4 tranches MXAF |
moc_validation_role |
HSE / Lead Process / … / process_engineer / metier |
moc_attachment_type |
pid_initial / pid_modified / esd_initial / esd_modified / photo / study / other |
moc_status |
Labels humanisés des 12 statuts FSM |
Paramètres d'entité (Settings → MOCtrack)#
moc.reminders.enabled(bool) — active le cron quotidien de rappels.moc.reminders.days_before(list int) — seuils J-N (défaut[30,14,7,1]).- Types de MOC (catalogue + matrice de validation template).
Permissions#
Granulaires (routes)#
| Permission | Route gatée |
|---|---|
moc.read |
GET liste + détail + PDF + fsm + stats + site-assignments |
moc.create |
POST création |
moc.update |
PATCH, /signature, /return (chaque étape valide via la sous-permission métier) |
moc.delete |
DELETE soft |
moc.transition |
/transition (le FSM applique la perm spécifique) |
moc.validate |
/validations upsert |
moc.validator.invite |
/validations/invite |
moc.production.validate |
/production-validation (Daxium tab 3) |
moc.promote |
/promote-to-project |
moc.signature.view |
Voir le PNG brut des signatures (sinon __REDACTED__) |
moc.manage |
Catalogue types / site-assignments / override admin |
moc.{role}.{action} |
Transitions FSM (cf. GET /moc/fsm) |
Rôles système#
Les rôles sont déclarés au niveau système (pas MOC_*) pour être
réutilisables par d'autres modules :
SITE_CHIEF— approuve, soumet, lance l'exécution, clôture, promote, inviteDIRECTOR— confirme, priorise, valide l'étude, DO/DG accord, promote, inviteLEAD_PROCESS— démarre l'étude, invitePROCESS_ENGINEER— pilote l'étude, soumet, ferme docsPRODUCTION_MANAGER—moc.production.validateHSE,MAINTENANCE_MANAGER— valident leur volet +moc.signature.viewMOC_INITIATOR— crée et suit ses propres MOCMOC_METIER— valide un volet métier (discipline)MOC_ADMIN— toutes les perms du module
Signatures électroniques#
Le composant <SignaturePad> (canvas, multi-touch + souris + stylet)
retourne une data URL base64 PNG. Protégées côté affichage par
<ProtectedSignature> (background-image, pas d'<img> crawlable,
context-menu/drag/copy désactivés, filigrane 3 couches anti-inpaint :
texte rotation ±22° + grille diagonale, auto-flou quand la fenêtre
perd le focus).
9 slots fixes sur la fiche MOC : initiator, hierarchy_reviewer,
site_chief, production, director, process_engineer, do, dg,
close.
1 slot par ligne de validation (HSE, Lead, Production Mgr, Gaz Mgr, Maintenance, Métier, invités).
Côté backend, la redaction route-level (_redact_signatures dans
app/api/routes/modules/moc.py) remplace les data URL par le sentinel
__REDACTED__ pour les users sans moc.signature.view ni moc.manage,
sauf auto-service (le signataire voit toujours la sienne).
Ce ne sont pas des signatures cryptographiques autoritaires — elles reproduisent la signature papier pour complétude du PDF Perenco. Un OS-level screenshot reste techniquement impossible à bloquer depuis un navigateur web ; la défense repose sur le filigrane traçable (email_viewer + timestamp + réf) qui permet de remonter à l'origine d'une fuite.
MOC ↔ Project#
Une fois un MOC dans l'un des statuts validated, execution ou
executed_docs_pending, il peut être promu en Project :
Crée une row projects avec :
- code = MOC_NNN_PF
- name = title ou objectives
- manager_id = moc.manager_id (ou caller par défaut)
- asset_id = installation_id du MOC
- priority = mapping 1→high / 2→medium / 3→low
- external_ref = moc:<uuid>
Le MOC est lié dans les deux sens : mocs.project_id + projects.external_ref.
Synchronisation progress (sens unique Project → MOC, cf.
app/services/modules/moc_sync.py) :
project.progress→moc.metadata_['execution_progress']project.status == 'completed'+moc.status == 'execution'→ auto-avancement àexecuted_docs_pending(le CDS doit ensuite clôturer formellement avecclose_signature)project.status == 'cancelled'→ log d'avertissement, pas d'action automatique (trop destructif)
Tests#
Le script scripts/smoke_moc.sh exerce chaque endpoint via curl :
TOKEN="$(your-login-flow)" ENTITY_ID="your-entity-uuid" \
./scripts/smoke_moc.sh https://api.opsflux.io
13 étapes : list, types CRUD, create avec tous les champs Daxium (title/nature/metiers/signature), get détail, signatures (site_chief, hierarchy_reviewer, close), production-validation, upsert validation, return stage=site_chief, filtres list (mine_as_manager, has_project), promote-to-project, widget catalog, export PDF.