Skip to content

Profil OPCO EP ​

OPCO EP est le premier OPCO integre. Ce profil documente ses particularites et les transforms appliques pour les compenser.

Configuration globale ​

typescript
defineProfile('opco-ep', {
  sync: { batchSize: 50 },       // 50 dossiers par batch de synchro
  poll: { intervalMs: 300_000 },  // polling toutes les 5 minutes
})

Rate limit : 60 requetes/minute sur tous les endpoints.

Particularites OPCO EP ​

Noms en majuscules ​

L'API OPCO EP exige que tous les noms de personnes soient en majuscules. Le profil applique cleanName (trim + uppercase) sur les champs nom/prenom.

typescript
// shared-transforms.ts
export const cleanName = t.trim().uppercase()

Dates en YYYY-MM-DD ​

L'API refuse les dates ISO completes (2024-01-15T12:00:00Z). Elle attend uniquement YYYY-MM-DD.

typescript
export const isoDate = t.dateFormat('YYYY-MM-DD')

Crash sur null ​

L'API plante quand elle recoit des champs null. Tous les endpoints POST appliquent t.stripNulls().

Typos dans les enums d'etat ​

L'API renvoie des etats non standards. Le profil les corrige en reponse :

Valeur OPCO EPValeur normalisee
RUTPURERUPTURE
En coursEN_COURS_INSTRUCTION
ValideENGAGE
RefuseREFUSE

Durees en string ​

dureeTravailHebdoHeures et dureeTravailHebdoMinutes sont attendues comme string, pas number.

Reponses non paginee (GET /dossiers/etats) ​

L'API peut renvoyer un array brut au lieu de l'objet pagine attendu. Le profil normalise la reponse.

Routes ​

GET /dossiers ​

  • Destination : /v2/dossiers
  • Cache : 600s
  • Requete : aucune transformation
  • Reponse : correction des etats via mapDeep

GET /dossiers/etats ​

  • Destination : /v2/dossiers/etats
  • Cache : 300s
  • Requete : aucune transformation
  • Reponse : correction des etats + normalisation pagination (array brut -> objet pagine)
typescript
t.editData((data) => {
  if (!Array.isArray(data)) return data
  return {
    status: 'success',
    total: data.length,
    count: data.length,
    page: 1,
    EtatDossierResult: data,
  }
})

GET /dossiers/liste ​

  • Destination : /v1/dossiers/liste
  • Cache : 600s
  • Requete : aucune transformation
  • Reponse : correction des etats via mapDeep

POST /dossiers ​

  • Destination : /v1/dossiers
  • Requete :
    • cleanName sur apprenti.nom, prenom, nomUsage, employeur.nom, denomination
    • isoDate sur toutes les dates (contrat, formation, naissance)
    • coerce('string') sur durees hebdo
    • stripNulls()
  • Reponse : correction des etats via mapDeep

POST /factures ​

  • Destination : /v1/factures (multipart, metadata = facture)
  • Aucune transformation : le payload est envoye tel quel

POST /conventions ​

  • Destination : /v1/conventions (multipart, metadata = convention)
  • Requete : cleanName sur apprenti + isoDate sur dates contrat + stripNulls()

POST /certificats ​

  • Destination : /v2/certificats (multipart, metadata = certificat)
  • Requete : cleanName sur apprenti + stripNulls()

POST /documents ​

  • Destination : /v1/documents (multipart, metadata = infosFichier)
  • Aucune transformation

GET /status ​

  • Destination : /v1/status
  • Aucune transformation : simple proxy

Structure des fichiers ​

opco-ep/
  index.ts               — defineProfile, assemble les routes
  shared-transforms.ts   — cleanName, isoDate, ETAT_CORRECTIONS
  get-dossiers.ts        — GET /dossiers
  get-dossiers-etats.ts  — GET /dossiers/etats
  get-dossiers-liste.ts  — GET /dossiers/liste
  post-dossiers.ts       — POST /dossiers
  post-factures.ts       — POST /factures
  post-conventions.ts    — POST /conventions
  post-certificats.ts    — POST /certificats
  post-documents.ts      — POST /documents
  get-status.ts          — GET /status

Convention : 1 fichier par route. Les transforms partages dans shared-transforms.ts.

Note sur la duplication des corrections d'etat ​

Les corrections d'etat (RUTPURE -> RUPTURE, etc.) sont definies dans shared-transforms.ts comme ETAT_CORRECTIONS, mais certaines routes (get-dossiers.ts, get-dossiers-liste.ts) re-declarent le mapping inline au lieu d'utiliser la constante partagee. C'est de la duplication mineure a nettoyer.