Profil OPCO EP
OPCO EP est le premier OPCO integre. Ce profil documente ses particularites et les transforms appliques pour les compenser.
Configuration globale
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.
// 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.
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 EP | Valeur normalisee |
|---|---|
RUTPURE | RUPTURE |
En cours | EN_COURS_INSTRUCTION |
Valide | ENGAGE |
Refuse | REFUSE |
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)
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 :
cleanNamesur apprenti.nom, prenom, nomUsage, employeur.nom, denominationisoDatesur toutes les dates (contrat, formation, naissance)coerce('string')sur durees hebdostripNulls()
- 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 :
cleanNamesur apprenti +isoDatesur dates contrat +stripNulls()
POST /certificats
- Destination :
/v2/certificats(multipart, metadata =certificat) - Requete :
cleanNamesur 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 /statusConvention : 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.