Project owner company (emprunteur)¶
Contrôleur HTTP de gestion de la société emprunteuse (ProjectOwnerCompany) attachée à une demande de financement côté porteur de projet : informations entreprise et représentants. Deux statuts : draft (édition libre) et completed (verrouillé après validation des champs requis).
La société est facultative pour la soumission : le porteur peut soumettre son dossier en analyse (POST /submit) sans l'avoir complétée. Elle reste alors remplissable jusqu'au macro-statut finalization inclus tant qu'elle n'est pas completed — règle isBorrowerEditable : éditable sur draft / in-analysis / blocked / offer / finalization ; figée dès completed ou rejected. Si la société était encore draft à la soumission, isBorrowerStepDeferred est posé à true (immuable) et l'app PDP affiche l'étape emprunteur en phase 2 après l'offre. La règle est vérifiée sous lock (projet + société) dans save/complete. Compléter la société ne déclenche plus la soumission (découplée dans POST /submit).
Source : project-owner-company.controller.ts.
Tous les endpoints requièrent un porteur de projet authentifié via better-auth (ProjectFinancingRequestOwnerGuard). Comme la route porte un :projectId, le guard vérifie aussi que le projet appartient à ce porteur (sinon 403 Forbidden) et qu'il existe (sinon 404 Not Found).
GET /project-financing-request/:projectId/project-owner-company¶
Récupère la société du projet. Si elle n'existe pas encore, en crée une vide en status='draft' avec company={} et representatives=[] (idempotent : pattern getOrCreate). Voir project-owner-company.controller.ts.
Path params¶
projectId— id de la demande de financement
Response¶
Renvoie directement le ProjectOwnerCompanyPgSchema.Json (pas de mapper) :
{
"id": "uuid",
"projectId": "uuid",
"status": "draft | completed",
"company": {
"companyName": "string?",
"siren": "string?",
"headquartersAddress": "string?",
"postalCode": "string?",
"city": "string?",
"country": "string?"
},
"representatives": [
{
"id": "string",
"isCurrentUser": true,
"projectOwnerId": "string?",
"firstName": "string?",
"lastName": "string?",
"birthDate": "string?",
"birthPlace": "string?",
"residenceCountry": "string?",
"professionalEmail": "string?"
}
],
"createdAt": "Date",
"updatedAt": "Date"
}
Erreurs¶
Aucune erreur métier nominale (création faite à la volée si absente). Erreurs DB renvoyées telles quelles via throwApiError.
PATCH /project-financing-request/:projectId/project-owner-company/:projectOwnerCompanyId¶
Auto-save de la société. Le statut est forcé à draft. Note : à la différence du save de présentation, ce handler remplace intégralement company et representatives (pas de merge champ par champ : body.company ?? {} et body.representatives ?? []). Voir project-owner-company.controller.ts.
Path params¶
projectId— id de la demande de financementprojectOwnerCompanyId— id de la société à mettre à jour (utilisé comme id pour upsert)
Request body¶
Validé via saveProjectBorrowerBodySchema :
{
"company": {
"companyName": "string?",
"siren": "string?",
"headquartersAddress": "string?",
"postalCode": "string?",
"city": "string?",
"country": "string?"
},
"representatives": [
{
"id": "string",
"isCurrentUser": true,
"firstName": "string?",
"lastName": "string?",
"birthDate": "string?",
"birthPlace": "string?",
"residenceCountry": "string?",
"professionalEmail": "string?"
}
]
}
Les deux champs racine sont optionnels (omis = remplacé par {} / []).
Response¶
Le draft persisté (ProjectOwnerCompanyPgSchema.Draft) — même shape que GET mais en draft.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
validation-body |
400 | Body invalide |
PUT /project-financing-request/:projectId/project-owner-company/:projectOwnerCompanyId/complete¶
Verrouille la société en status='completed'. Re-valide tous les champs requis via ProjectOwnerCompanyPgSchema.completedSchema. Vérifie que le :projectOwnerCompanyId correspond bien à la société trouvée pour le projet (sinon mismatch). Voir project-owner-company.controller.ts.
Path params¶
projectId— id de la demande de financementprojectOwnerCompanyId— id de la société à compléter
Response¶
La société en version completed (branche completed de ProjectOwnerCompanyPgSchema.Json).
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
project-owner-company-not-found |
404 | Aucune société pour ce projet |
project-owner-company-id-mismatch |
404 | Le projectOwnerCompanyId du path ne correspond pas à la société stockée pour ce projet |
project-owner-company-incomplete |
400 | Champs requis manquants (le détail Zod est dans body) |
borrower-not-editable |
409 | Société ou projet hors fenêtre d'édition (isBorrowerEditable) |
PUT …/complete ne déclenche plus la soumission en analyse. Voir Phase 1 — soumission (POST /submit).
Liens¶
- Service :
project-owner-company.service.ts - Repository :
project-owner-company.repository.ts - Endpoint DTO :
saveProjectBorrower.endpoint.ts, schémasprojectBorrower.schemas.ts - Guard :
project-financing-request-owner.guard.ts