Pular para o conteúdo principal

Documentos do Beneficiário

Documentos de identidade e comprovativos ligados a um beneficiário. Todas as rotas estão aninhadas sob o beneficiário e exigem a permissão registre.documents.

MétodoEndpointDescrição
GET/api/beneficiaires/{beneficiaireId}/documentsLista dos documentos
POST/api/beneficiaires/{beneficiaireId}/documentsCarregar um documento
GET/api/beneficiaires/{beneficiaireId}/documents/typesTipos de documentos aceites
GET/api/beneficiaires/{beneficiaireId}/documents/{documentId}Metadados de um documento
GET/api/beneficiaires/{beneficiaireId}/documents/{documentId}/downloadDescarregar o ficheiro
POST/api/beneficiaires/{beneficiaireId}/documents/{documentId}/verifyVerificar o documento
POST/api/beneficiaires/{beneficiaireId}/documents/{documentId}/rejectRejeitar o documento
DELETE/api/beneficiaires/{beneficiaireId}/documents/{documentId}Eliminar o documento

Um beneficiário ou documento inexistente devolve 404 ({"error": "Beneficiaire non trouve"} ou Document non trouve).

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

Parâmetros opcionais: type (tipo de documento) e status (pending, verified, rejected). Os documentos eliminados são excluídos.

{
"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
}

Tipos de documentos​

TipoDescrição
cniBilhete de Identidade
certificat_residenceCertificado de Residência
acte_naissanceCertidão de Nascimento
photoFotografia de Identidade
certificat_scolaireCertificado de Escolaridade
certificat_medicalCertificado Médico
justificatif_revenuComprovativo de Rendimento
contrat_signeContrato Assinado
autreOutro Documento

A lista atualizada é devolvida por GET /api/beneficiaires/{beneficiaireId}/documents/types.

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

Envio em multipart/form-data.

CampoTipoObrigatórioDescrição
filefileSimFicheiro (PDF, JPEG, PNG ou WebP, no máximo 10 MB)
typestringSimTipo de documento (lista acima)
expiryDatedateNãoData de validade (AAAA-MM-DD)
notesstringNãoNotas complementares

Resposta 201 Created: { "success": true, "message": "Document uploade avec succes", "data": { … } }. Ficheiro ausente, tipo desconhecido, formato ou tamanho recusados devolvem 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​

Corpo opcional: { "notes": "…" }. Passa o documento a verified. Um documento já verificado ou rejeitado devolve 400 Document deja traite.

POST …/documents/{documentId}/reject​

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

reason é obrigatório (400 Motif de rejet requis). Mesma regra que a verificação para um documento já tratado.

DELETE …/documents/{documentId}​

Eliminação lógica: o documento desaparece das listas, mas o ficheiro é conservado. Um administrador pode forçar a eliminação física com ?hard=true; para os outros perfis o parâmetro é ignorado.

Resposta: { "success": true, "message": "Document supprime" }.

Exemplo 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' }),
});