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.