Aller au contenu

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 :

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 depuis company.banking (null tant que la société est encore draft)
  • documents — une entrée nullable par catégorie (signedCompanyStatutes, rib, kbis, beneficialOwnersDeclaration), avec URL de téléchargement presignée
  • notary, 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 / investorBenefits sur le projet
  • Réponse 200 sans corps

POST /project-financing-request/:projectId/finalization/complete

Valide et fige le dossier :

  1. Les 4 catégories de documents finalization sont présentes (une pièce live par catégorie)
  2. iban et bic non vides (validés via finalizedSchema)
  3. Société → status: 'finalized' (banque requise ; LEI optionnelle)
  4. Projet reste finalization ; steps.finalization → completed, steps.signature → draft
  5. 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 PUT
  • POST …/documents/confirm-upload — corps avec context: { 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-expected si documents.length !== 1)
  • Projet finalization + société pas encore finalized

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