Aller au contenu

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 financement
  • projectOwnerCompanyId — 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 financement
  • projectOwnerCompanyId — 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