Aller au contenu principal

Documents du Bénéficiaire

Pièces d'identité et justificatifs rattachés à un bénéficiaire. Toutes les routes sont imbriquées sous le bénéficiaire et demandent la permission registre.documents.

MéthodeEndpointDescription
GET/api/beneficiaires/{beneficiaireId}/documentsListe des documents
POST/api/beneficiaires/{beneficiaireId}/documentsTéléverser un document
GET/api/beneficiaires/{beneficiaireId}/documents/typesTypes de documents acceptés
GET/api/beneficiaires/{beneficiaireId}/documents/{documentId}Métadonnées d'un document
GET/api/beneficiaires/{beneficiaireId}/documents/{documentId}/downloadTélécharger le fichier
POST/api/beneficiaires/{beneficiaireId}/documents/{documentId}/verifyVérifier le document
POST/api/beneficiaires/{beneficiaireId}/documents/{documentId}/rejectRejeter le document
DELETE/api/beneficiaires/{beneficiaireId}/documents/{documentId}Supprimer le document

Un bénéficiaire ou un document introuvable renvoie 404 ({"error": "Beneficiaire non trouve"} ou Document non trouve).

GET /api/beneficiaires/{beneficiaireId}/documents​

Paramètres optionnels : type (type de document) et status (pending, verified, rejected). Les documents supprimés sont exclus.

{
"success": true,
"data": [
{
"id": "660e8400-e29b-41d4-a716-446655440001",
"beneficiaireId": "550e8400-e29b-41d4-a716-446655440000",
"type": "cni",
"typeLabel": "Carte Nationale d'Identite",
"originalFilename": "cni.pdf",
"mimeType": "application/pdf",
"fileSize": 245760,
"fileSizeFormatted": "240.00 KB",
"verificationStatus": "verified",
"verifiedAt": "2026-01-20 14:30:00",
"verifiedBy": "Agent Exemple",
"rejectionReason": null,
"notes": null,
"expiryDate": "2030-06-15",
"isExpired": false,
"uploadedBy": "Agent Exemple",
"createdAt": "2026-01-15 10:30:00",
"updatedAt": null
}
],
"total": 1
}

Types de documents​

TypeDescription
cniCarte Nationale d'Identité
certificat_residenceCertificat de Résidence
acte_naissanceActe de Naissance
photoPhoto d'Identité
certificat_scolaireCertificat de Scolarité
certificat_medicalCertificat Médical
justificatif_revenuJustificatif de Revenu
contrat_signeContrat Signé
autreAutre Document

La liste à jour est renvoyée par GET /api/beneficiaires/{beneficiaireId}/documents/types.

POST /api/beneficiaires/{beneficiaireId}/documents​

Envoi en multipart/form-data.

ChampTypeRequisDescription
filefileOuiFichier (PDF, JPEG, PNG ou WebP, 10 Mo au plus)
typestringOuiType de document (liste ci-dessus)
expiryDatedateNonDate d'expiration (AAAA-MM-JJ)
notesstringNonNotes complémentaires

Réponse 201 Created : { "success": true, "message": "Document uploade avec succes", "data": { … } }. Un fichier absent, un type inconnu, un format ou une taille refusés renvoient 400.

curl -X POST https://sig.example.com/api/beneficiaires/550e8400-e29b-41d4-a716-446655440000/documents \
-H "Authorization: Bearer TOKEN" \
-F "type=cni" \
-F "file=@/chemin/vers/cni.pdf" \
-F "expiryDate=2030-06-15"

POST …/documents/{documentId}/verify​

Corps optionnel : { "notes": "…" }. Passe le document en verified. Un document déjà vérifié ou rejeté renvoie 400 Document deja traite.

POST …/documents/{documentId}/reject​

{ "reason": "Document illisible, merci d'envoyer une copie plus nette" }

reason est obligatoire (400 Motif de rejet requis). Même règle que la vérification pour un document déjà traité.

DELETE …/documents/{documentId}​

Suppression logique : le document disparaît des listes mais le fichier est conservé. Un administrateur peut forcer la suppression physique avec ?hard=true ; pour les autres rôles le paramètre est ignoré.

Réponse : { "success": true, "message": "Document supprime" }.

Exemple JavaScript​

const base = (id) => `https://sig.example.com/api/beneficiaires/${id}/documents`;
const headers = { Authorization: `Bearer ${token}` };

const { data } = await (await fetch(base(beneficiaireId), { headers })).json();

const form = new FormData();
form.append('type', 'cni');
form.append('file', fichier);
await fetch(base(beneficiaireId), { method: 'POST', headers, body: form });

await fetch(`${base(beneficiaireId)}/${documentId}/reject`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({ reason: 'Document illisible' }),
});