Project Finalization (collecte)¶
Étape phase 2 après acceptation de l'offre : coordonnées bancaires, pièces KYB, notaire et avantages investisseurs. POST …/finalization/complete passe le dossier en signature, ce qui ouvre l'étape signature (voir phase-one-steps.md). La société passe en finalized à la première validation, et n'est pas réécrite si elle l'est déjà. Les pièces KYB appartiennent au dossier qui les dépose : un autre dossier de la même société ne les voit pas et dépose les siennes.
Sources :
- Métadonnées :
project-finalization.controller.ts - Upload pièces : même pipeline S3 que les documents onboarding, avec
context.type = 'finalization'— voir project-documents.md
Tous les endpoints requièrent ProjectFinancingRequestUserGuard (rôle actif sur project_financing_request_user_role), réservé aux rôles representative et collaborator : la finalisation ne concerne pas l'apporteur d'affaires, qui reçoit un 403. Un 403 ici ne signifie donc pas forcément « pas d'accès au projet ». Matrice : README du module users.
Prérequis¶
| Condition | Erreur si manquante |
|---|---|
Projet status === 'finalization' |
project-not-in-finalization (409) dès que le dossier a quitté ce statut |
Société présente, completed ou déjà finalized au complete |
company-not-completed (409) |
La banque (iban, bic) est persistée sur project_owner_company.banking via PATCH …/finalization. Le notaire et les avantages investisseurs vivent sur le JSON projet (notary, investorBenefits).
GET /project-financing-request/:projectId/finalization¶
Retourne l'état de l'écran collecte (contrat getProjectFinalizationResponseSchema) :
iban,bic,leiNumber,leiObtainedAt— lus depuiscompany.banking(nulltant que la société est encoredraft)documents— une entrée nullable par catégorie (signedCompanyStatutes,rib,kbis,beneficialOwnersDeclaration), avec URL de téléchargement presignéenotary,investorBenefits— depuis le projet
PATCH /project-financing-request/:projectId/finalization¶
Auto-save partiel. Corps (saveProjectFinalizationBodySchema) : tous les champs optionnels / nullish (iban, bic, leiNumber, leiObtainedAt, notary, investorBenefits).
- Met à jour
project_owner_company.banking(merge champ par champ) - Met à jour
notary/investorBenefitssur le projet - Réponse
200sans corps
POST /project-financing-request/:projectId/finalization/complete¶
Valide et fige le dossier :
- Les 4 catégories de documents finalization sont présentes (une pièce live par catégorie)
ibanetbicnon vides (validés viafinalizedSchema)- Société →
status: 'finalized'(banque requise ; LEI optionnelle) - Projet reste
finalization;steps.finalization→completed,steps.signature→draft - Ping Projet Analyse
notifyProjectUpdated({ reason: 'finalized' })
Réponse : { status: 'finalization', steps } — le front peut enchaîner sur l'écran signature sans refetch projet.
| Erreur | HTTP | Cause |
|---|---|---|
project-not-found |
404 | Projet inconnu |
project-not-in-finalization |
409 | Macro-statut incompatible |
company-not-completed |
409 | Société absente ou pas completed |
finalization-documents-incomplete |
409 | Moins de 4 catégories uploadées |
finalization-banking-incomplete |
409 | IBAN/BIC manquants ou schéma finalized invalide |
project-not-in-finalization |
409 | Le dossier n'est plus en finalization — plus de save, d'upload ni de suppression de pièce |
Après complete, les uploads finalization sont refusés (finalization-already-completed) même si le projet est encore en macro-statut finalization (en attente de signature).
Upload des pièces KYB¶
Même endpoints que l'onboarding :
POST …/documents/request-upload— presign PUTPOST …/documents/confirm-upload— corps aveccontext: { type: 'finalization', category: '<catégorie>' }
Contraintes spécifiques :
- Une seule pièce par catégorie — un re-upload soft-delete la précédente (last-wins), ou suppression explicite via
DELETE …/documents/:documentId(voir project-documents.md) - Un seul document par batch (
finalization-single-document-expectedsidocuments.length !== 1) - Projet
finalization+ société pas encorefinalized
L'état agrégé des pièces est lu via GET …/finalization, pas via GET …/documents (qui ne liste que l'onboarding).
Bloc Projet Analyse¶
GET /internal/projet-analyse/project/:projectId expose un bloc finalization (banque, notaire, avantages, 4 pièces) une fois la société finalized — même vue que get-project-finalization.view.ts. Avant validation porteur, le bloc vaut null.
Liens¶
- Service :
project-finalization.service.ts - Schéma société :
project-owner-company.schema.ts(completed→finalized) - Contrat :
projectFinalization.endpoint.ts - PDP : étape UI
collect—projectSteps.ts(getFunnel)