{
  "openapi": "3.0.0",
  "info": {
    "title": "Loctavia API",
    "description": "API de gestion locative Loctavia : mandataires, baux, quittancements,\nmandats, patrimoine (immeubles/lots), tiers, paiements et incidents.\n\n## Authentification\n\nToutes les requêtes exigent un token `Bearer` (PAT, ex. via le device\nflow CLI) avec le scope adapté au verbe HTTP : `read` pour les `GET`,\n`write` pour les mutations. L'obtention des tokens est documentée sur\nla page [Authentification](../authentication/).\n\n## Multi-tenant : `X-Mandataire-Id`\n\nTous les endpoints (sauf `GET /loctavia/api/v1/mandataires`, qui sert\njustement à les découvrir) exigent l'en-tête `X-Mandataire-Id`\nidentifiant le mandataire (tenant) sur lequel opérer. Un mandataire\ninaccessible à l'utilisateur renvoie un `403`.\n",
    "version": "1.0.0",
    "contact": {
      "name": "API Support",
      "email": "support@sinoia.fr"
    }
  },
  "servers": [
    {
      "url": "http://localhost:3000",
      "description": "Serveur de développement"
    },
    {
      "url": "https://rec.hubdoc.sinoia.cloud",
      "description": "Serveur de recette"
    }
  ],
  "security": [
    {
      "OAuth2Password": [
        "read"
      ]
    },
    {
      "OAuth2AuthCode": [
        "read"
      ]
    }
  ],
  "tags": [
    {
      "name": "Loctavia — Mandataires",
      "x-displayName": "Mandataires",
      "description": "Point d'entrée de l'API Loctavia : liste les mandataires (tenants)\naccessibles à l'utilisateur. L'`id` retourné alimente l'en-tête\n`X-Mandataire-Id` requis par tous les autres endpoints Loctavia.\nAuth Bearer (PAT, ex. via le device flow CLI).\n"
    },
    {
      "name": "Loctavia — Baux",
      "x-displayName": "Baux",
      "description": "Baux (leases) — création avec conditions financières par lot, terme d'indexation et locataire."
    },
    {
      "name": "Loctavia — Quittancements",
      "x-displayName": "Quittancements",
      "description": "Quittancements (billing runs). Cycle : `POST /billing_runs` (calcul\nasynchrone — poller le détail jusqu'au statut `computed`/`review`),\nrelecture des lignes (`/lines`, exclusion ou acquittement d'anomalies),\npuis `validate` et `apply`.\n"
    },
    {
      "name": "Loctavia — Mandats",
      "x-displayName": "Mandats",
      "description": "Mandats de gestion (propriétaire × immeuble, honoraires)."
    },
    {
      "name": "Loctavia — Patrimoine",
      "x-displayName": "Patrimoine",
      "description": "Immeubles (properties) et lots (units)."
    },
    {
      "name": "Loctavia — Tiers",
      "x-displayName": "Tiers",
      "description": "Propriétaires et locataires (recherche texte libre via `q`)."
    },
    {
      "name": "Loctavia — Paiements",
      "x-displayName": "Paiements",
      "description": "Encaissements (lecture seule)."
    },
    {
      "name": "Loctavia — Incidents",
      "x-displayName": "Incidents",
      "description": "Incidents locataires (lecture seule — la déclaration passe par le portail)."
    },
    {
      "name": "Loctavia — Comptabilité",
      "x-displayName": "Comptabilité",
      "description": "Écritures comptables en partie double (immuables, correction par\nextourne, cinq journaux : LOYERS, CHARGES, BANQUE, PROPRIO, OD) et\nexport FEC réglementaire (arrêté du 29 juillet 2013). La génération\ndu FEC est synchrone : le `201` du `POST /fec_exports` signifie que\nle fichier est prêt au téléchargement.\n"
    }
  ],
  "paths": {
    "/loctavia/api/v1/mandataires": {
      "get": {
        "summary": "Lister les mandataires accessibles à l'utilisateur",
        "operationId": "listMandataires",
        "tags": [
          "Loctavia — Mandataires"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Mandataire"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          }
        }
      }
    },
    "/loctavia/api/v1/leases": {
      "get": {
        "summary": "Lister les baux",
        "operationId": "listLeases",
        "tags": [
          "Loctavia — Baux"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Lease"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Créer un bail",
        "operationId": "createLease",
        "tags": [
          "Loctavia — Baux"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LeaseMutation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Lease"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/leases/{id}": {
      "get": {
        "summary": "Détail d'un bail",
        "operationId": "getLease",
        "tags": [
          "Loctavia — Baux"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeaseDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/billing_runs": {
      "get": {
        "summary": "Lister les quittancements",
        "operationId": "listBillingRuns",
        "tags": [
          "Loctavia — Quittancements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BillingRun"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Créer un quittancement (calcul asynchrone)",
        "operationId": "createBillingRun",
        "description": "Le calcul est asynchrone (job). Le run renvoyé démarre en draft/scheduled\navec linesCount 0 ; interroger GET /billing_runs/{id} jusqu au statut\ncomputed/review avant de valider.\n",
        "tags": [
          "Loctavia — Quittancements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BillingRunMutation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillingRun"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/billing_runs/{id}": {
      "get": {
        "summary": "Détail d'un quittancement",
        "operationId": "getBillingRun",
        "tags": [
          "Loctavia — Quittancements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillingRunDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/billing_runs/{id}/lines": {
      "get": {
        "summary": "Lignes d'un quittancement",
        "operationId": "listBillingRunLines",
        "tags": [
          "Loctavia — Quittancements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "tenant",
                "owner"
              ],
              "default": "tenant"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total de lignes",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BillingLine"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/billing_runs/{id}/lines/{line_id}": {
      "patch": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Mettre à jour une ligne (exclure/inclure ou acquitter)",
        "operationId": "updateBillingLine",
        "tags": [
          "Loctavia — Quittancements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          },
          {
            "name": "line_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BillingLineUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillingLine"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/billing_runs/{id}/validate": {
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Valider un quittancement",
        "operationId": "validateBillingRun",
        "tags": [
          "Loctavia — Quittancements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          },
          {
            "name": "force",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Valide malgré des anomalies non acquittées (présence du paramètre = activé)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillingRun"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/billing_runs/{id}/apply": {
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Appliquer un quittancement (génère les appels de loyer)",
        "operationId": "applyBillingRun",
        "tags": [
          "Loctavia — Quittancements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillingRun"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/mandates": {
      "get": {
        "summary": "Lister les mandats",
        "operationId": "listMandates",
        "tags": [
          "Loctavia — Mandats"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Mandate"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Créer un mandat",
        "operationId": "createMandate",
        "tags": [
          "Loctavia — Mandats"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MandateMutation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Mandate"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/mandates/{id}": {
      "get": {
        "summary": "Détail d'un mandat",
        "operationId": "getMandate",
        "tags": [
          "Loctavia — Mandats"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MandateDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/properties": {
      "get": {
        "summary": "Lister les immeubles",
        "operationId": "listProperties",
        "tags": [
          "Loctavia — Patrimoine"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Property"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Créer un immeuble",
        "operationId": "createPropertie",
        "tags": [
          "Loctavia — Patrimoine"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PropertyMutation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Property"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/properties/{id}": {
      "get": {
        "summary": "Détail d'un immeuble",
        "operationId": "getProperty",
        "tags": [
          "Loctavia — Patrimoine"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PropertyDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/units": {
      "get": {
        "summary": "Lister les lots",
        "operationId": "listUnits",
        "tags": [
          "Loctavia — Patrimoine"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Unit"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Créer un lot",
        "operationId": "createUnit",
        "tags": [
          "Loctavia — Patrimoine"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnitMutation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Unit"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/units/{id}": {
      "get": {
        "summary": "Détail d'un lot",
        "operationId": "getUnit",
        "tags": [
          "Loctavia — Patrimoine"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnitDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/owners": {
      "get": {
        "summary": "Lister les propriétaires",
        "operationId": "listOwners",
        "tags": [
          "Loctavia — Tiers"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Recherche texte libre (prénom, nom, raison sociale, SIRET)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Owner"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      },
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Créer un propriétaire",
        "operationId": "createOwner",
        "tags": [
          "Loctavia — Tiers"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OwnerMutation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Owner"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/owners/{id}": {
      "get": {
        "summary": "Détail d'un propriétaire",
        "description": "Fiche complète du propriétaire : identité, coordonnées, comptes\nbancaires, biens détenus, ownerships, mandats de gestion, redditions\n(owner payments) et CGP courant. Le paramètre `id` est l'identifiant de\nl'acteur propriétaire (le même que le champ `id` du payload de liste).\n",
        "operationId": "getOwner",
        "tags": [
          "Loctavia — Tiers"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OwnerDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/tenants": {
      "get": {
        "summary": "Lister les locataires",
        "operationId": "listTenants",
        "tags": [
          "Loctavia — Tiers"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Recherche texte libre (prénom, nom, email)"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Tenant"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/tenants/{id}": {
      "get": {
        "summary": "Détail d'un locataire",
        "description": "Fiche complète du locataire : identité, coordonnées, comptes bancaires,\nbaux (multi-baux consolidés), appels de loyer (rent calls), paiements et\ninformations de facturation. Le paramètre `id` est l'identifiant de\nl'acteur locataire (le même que le champ `id` du payload de liste).\n",
        "operationId": "getTenant",
        "tags": [
          "Loctavia — Tiers"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TenantDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/payments": {
      "get": {
        "summary": "Lister les encaissements",
        "operationId": "listPayments",
        "tags": [
          "Loctavia — Paiements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Payment"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/payments/{id}": {
      "get": {
        "summary": "Détail d'un encaissement",
        "operationId": "getPayment",
        "tags": [
          "Loctavia — Paiements"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/incidents": {
      "get": {
        "summary": "Lister les incidents",
        "operationId": "listIncidents",
        "tags": [
          "Loctavia — Incidents"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Incident"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/incidents/{id}": {
      "get": {
        "summary": "Détail d'un incident",
        "operationId": "getIncident",
        "tags": [
          "Loctavia — Incidents"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IncidentDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/journal_entries": {
      "get": {
        "summary": "Lister les écritures comptables",
        "operationId": "listJournalEntries",
        "description": "Écritures en partie double, immuables (correction par extourne),\ngénérées automatiquement par les quittancements, encaissements et\nreversements. Cinq journaux : LOYERS, CHARGES, BANQUE, PROPRIO, OD.\nFiltres fins via Ransack : `q[status_eq]=posted`,\n`q[accounting_date_gteq]=2026-01-01`…\n",
        "tags": [
          "Loctavia — Comptabilité"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "name": "journal",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "LOYERS",
                "CHARGES",
                "BANQUE",
                "PROPRIO",
                "OD"
              ]
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "direction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "style": "deepObject",
            "explode": true,
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "Total-Count": {
                "description": "Nombre total d'éléments",
                "schema": {
                  "type": "integer"
                }
              },
              "Total-Pages": {
                "description": "Nombre total de pages",
                "schema": {
                  "type": "integer"
                }
              },
              "Current-Page": {
                "description": "Page courante",
                "schema": {
                  "type": "integer"
                }
              },
              "Page-Items": {
                "description": "Éléments par page",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/JournalEntry"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/journal_entries/{id}": {
      "get": {
        "summary": "Détail d'une écriture et de ses lignes",
        "operationId": "getJournalEntry",
        "tags": [
          "Loctavia — Comptabilité"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JournalEntryDetails"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/fec_exports": {
      "post": {
        "security": [
          {
            "OAuth2Password": [
              "write"
            ]
          },
          {
            "OAuth2AuthCode": [
              "write"
            ]
          }
        ],
        "summary": "Générer un export FEC pour un exercice",
        "operationId": "createFecExport",
        "description": "Fichier des Écritures Comptables au format réglementaire (18 colonnes,\narrêté du 29 juillet 2013). Périmètre : écritures `validated` + `posted`\nde l'exercice civil. La génération est synchrone : la réponse `201`\nsignifie que le fichier est prêt, à récupérer via\n`GET /fec_exports/{id}/download`.\n",
        "tags": [
          "Loctavia — Comptabilité"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/ContentTypeHeader"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FecExportMutation"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Créé (fichier prêt au téléchargement)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FecExport"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/loctavia/api/v1/fec_exports/{id}/download": {
      "get": {
        "summary": "Télécharger le fichier FEC",
        "operationId": "downloadFecExport",
        "description": "Renvoie le fichier `.txt` FEC en pièce jointe (`Content-Disposition:\nattachment`, nom réglementaire `<siren>FEC<AAAA1231>.txt`).\n",
        "tags": [
          "Loctavia — Comptabilité"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/MandataireIdHeader"
          },
          {
            "$ref": "#/components/parameters/IdParameter"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string",
                  "description": "Contenu FEC (18 colonnes séparées par des pipes)"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "422": {
            "$ref": "#/components/responses/UnprocessableEntity"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "IdParameter": {
        "name": "id",
        "in": "path",
        "required": true,
        "description": "Identifiant de la ressource",
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "example": "019951a3-01b7-7eb9-88bb-f872a01ed886"
      },
      "ContentTypeHeader": {
        "name": "Content-Type",
        "in": "header",
        "required": true,
        "description": "Type de contenu de la requête",
        "schema": {
          "type": "string",
          "enum": [
            "application/json"
          ]
        },
        "example": "application/json"
      },
      "MandataireIdHeader": {
        "name": "X-Mandataire-Id",
        "in": "header",
        "required": true,
        "description": "Identifiant UUID du mandataire (tenant) sur lequel opérer. Renvoie 403 si\nl'utilisateur n'est pas membre du mandataire indiqué. Obligatoire sauf sur\nGET /loctavia/api/v1/mandataires (qui sert justement à le découvrir).\nTolérances côté serveur, non recommandées pour les clients générés :\nomission acceptée quand l'utilisateur n'a qu'un seul mandataire, et le\nparamètre de requête `mandataire_id` est accepté en équivalent du header.\n",
        "schema": {
          "type": "string",
          "format": "uuid"
        }
      }
    },
    "schemas": {
      "LoctaviaMandataire": {
        "$ref": "#/components/schemas/Mandataire"
      },
      "LoctaviaLease": {
        "$ref": "#/components/schemas/Lease"
      },
      "LoctaviaLeaseDetails": {
        "$ref": "#/components/schemas/LeaseDetails"
      },
      "LoctaviaLeaseMutation": {
        "$ref": "#/components/schemas/LeaseMutation"
      },
      "LoctaviaBillingRun": {
        "$ref": "#/components/schemas/BillingRun"
      },
      "LoctaviaBillingRunDetails": {
        "$ref": "#/components/schemas/BillingRunDetails"
      },
      "LoctaviaBillingRunMutation": {
        "$ref": "#/components/schemas/BillingRunMutation"
      },
      "LoctaviaBillingLine": {
        "$ref": "#/components/schemas/BillingLine"
      },
      "LoctaviaBillingLineUpdate": {
        "$ref": "#/components/schemas/BillingLineUpdate"
      },
      "LoctaviaMandate": {
        "$ref": "#/components/schemas/Mandate"
      },
      "LoctaviaMandateDetails": {
        "$ref": "#/components/schemas/MandateDetails"
      },
      "LoctaviaMandateMutation": {
        "$ref": "#/components/schemas/MandateMutation"
      },
      "LoctaviaProperty": {
        "$ref": "#/components/schemas/Property"
      },
      "LoctaviaPropertyDetails": {
        "$ref": "#/components/schemas/PropertyDetails"
      },
      "LoctaviaPropertyMutation": {
        "$ref": "#/components/schemas/PropertyMutation"
      },
      "LoctaviaUnit": {
        "$ref": "#/components/schemas/Unit"
      },
      "LoctaviaUnitDetails": {
        "$ref": "#/components/schemas/UnitDetails"
      },
      "LoctaviaUnitMutation": {
        "$ref": "#/components/schemas/UnitMutation"
      },
      "LoctaviaOwner": {
        "$ref": "#/components/schemas/Owner"
      },
      "LoctaviaOwnerDetails": {
        "$ref": "#/components/schemas/OwnerDetails"
      },
      "LoctaviaOwnerMutation": {
        "$ref": "#/components/schemas/OwnerMutation"
      },
      "LoctaviaTenant": {
        "$ref": "#/components/schemas/Tenant"
      },
      "LoctaviaTenantDetails": {
        "$ref": "#/components/schemas/TenantDetails"
      },
      "LoctaviaPayment": {
        "$ref": "#/components/schemas/Payment"
      },
      "LoctaviaPaymentDetails": {
        "$ref": "#/components/schemas/PaymentDetails"
      },
      "LoctaviaIncident": {
        "$ref": "#/components/schemas/Incident"
      },
      "LoctaviaIncidentDetails": {
        "$ref": "#/components/schemas/IncidentDetails"
      },
      "LoctaviaJournalEntry": {
        "$ref": "#/components/schemas/JournalEntry"
      },
      "LoctaviaJournalEntryDetails": {
        "$ref": "#/components/schemas/JournalEntryDetails"
      },
      "LoctaviaJournalEntryLine": {
        "$ref": "#/components/schemas/JournalEntryLine"
      },
      "LoctaviaMoney": {
        "$ref": "#/components/schemas/Money"
      },
      "LoctaviaFecExport": {
        "$ref": "#/components/schemas/FecExport"
      },
      "LoctaviaFecExportMutation": {
        "$ref": "#/components/schemas/FecExportMutation"
      },
      "Error": {
        "type": "object",
        "required": [
          "error",
          "message"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Type d'erreur",
            "example": "validation_error"
          },
          "message": {
            "type": "string",
            "description": "Message d'erreur lisible",
            "example": "The request contains invalid parameters"
          },
          "details": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Détails supplémentaires de l'erreur",
            "example": [
              "Name is required",
              "Workspace ID must be a valid integer"
            ]
          }
        }
      },
      "Mandataire": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "accountingCode": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "Money": {
        "type": "object",
        "nullable": true,
        "description": "Montant monétaire tel que sérialisé par Loctavia (`MoneySerializer`).\n`null` quand le montant n'est pas défini.\n",
        "properties": {
          "cents": {
            "type": "integer",
            "description": "Montant en centimes (entier, devise dans `currency`).",
            "example": 120000
          },
          "currency": {
            "type": "string",
            "description": "Code devise ISO 4217.",
            "example": "EUR"
          },
          "formatted": {
            "type": "string",
            "description": "Montant formaté pour affichage (séparateur de milliers, symbole).",
            "example": "1 200,00 €"
          }
        }
      },
      "Lease": {
        "type": "object",
        "additionalProperties": true,
        "description": "Bail en payload de liste (attributs légers). Version condensée retournée par l'endpoint d'index des baux.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant unique du bail",
            "example": "3f8a1c2e-9b4d-4e5f-8a1b-2c3d4e5f6a7b"
          },
          "reference": {
            "type": "string",
            "description": "Référence lisible du bail",
            "example": "BL-2024-00042"
          },
          "leaseType": {
            "type": "string",
            "description": "Type de bail (habitation, commercial, professionnel…)",
            "example": "residential"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "terminated",
              "renewed",
              "closed_pending"
            ],
            "description": "Statut du bail",
            "example": "active"
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de début du bail",
            "example": "2024-01-01"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de fin du bail",
            "example": "2027-01-01"
          },
          "tenantName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du locataire principal",
            "example": "Jean Dupont"
          },
          "tenantId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de l'entité locataire principale (partyable)",
            "example": "7a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d"
          },
          "unitIdentifier": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant du premier lot rattaché au bail",
            "example": "A-101"
          },
          "propertyName": {
            "type": "string",
            "nullable": true,
            "description": "Nom de l'immeuble du premier lot",
            "example": "Résidence Les Tilleuls"
          },
          "propertyId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de l'immeuble du premier lot",
            "example": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d"
          },
          "monthlyRent": {
            "$ref": "#/components/schemas/Money"
          },
          "paymentTiming": {
            "type": "string",
            "nullable": true,
            "description": "Terme de paiement (à échoir / échu)",
            "example": "in_advance"
          },
          "units": {
            "type": "array",
            "description": "Lots rattachés au bail (aperçu)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "identifier": {
                  "type": "string",
                  "description": "Identifiant du lot",
                  "example": "A-101"
                },
                "propertyName": {
                  "type": "string",
                  "nullable": true,
                  "description": "Nom de l'immeuble du lot",
                  "example": "Résidence Les Tilleuls"
                }
              }
            }
          }
        }
      },
      "LeaseMutation": {
        "type": "object",
        "required": [
          "lease"
        ],
        "properties": {
          "lease": {
            "type": "object",
            "required": [
              "lease_type",
              "start_date"
            ],
            "properties": {
              "lease_type": {
                "type": "string"
              },
              "reference": {
                "type": "string"
              },
              "start_date": {
                "type": "string",
                "format": "date"
              },
              "end_date": {
                "type": "string",
                "format": "date"
              },
              "signature_date": {
                "type": "string",
                "format": "date"
              },
              "payment_day": {
                "type": "integer"
              },
              "payment_frequency": {
                "type": "string",
                "enum": [
                  "monthly",
                  "quarterly",
                  "annual"
                ]
              },
              "payment_timing": {
                "type": "string",
                "enum": [
                  "advance",
                  "arrears"
                ]
              },
              "auto_renewal": {
                "type": "boolean"
              },
              "notice_months": {
                "type": "integer"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "active"
                ]
              }
            }
          },
          "term": {
            "type": "object",
            "properties": {
              "revision_month": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12
              },
              "effective_from": {
                "type": "string",
                "format": "date"
              },
              "effective_to": {
                "type": "string",
                "format": "date"
              }
            }
          },
          "units": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "base_rent_cents": {
                  "type": "integer"
                },
                "charge_provision_cents": {
                  "type": "integer"
                },
                "vat_applicable": {
                  "type": "boolean"
                },
                "vat_rate": {
                  "type": "number"
                },
                "index_type": {
                  "type": "string",
                  "enum": [
                    "irl",
                    "ilc",
                    "ilat",
                    "icc"
                  ]
                }
              }
            }
          },
          "tenant_id": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "LeaseDetails": {
        "type": "object",
        "additionalProperties": true,
        "description": "Bail en payload de détail (attributs complets). Déroule toutes les structures imbriquées : termes, parties, lots, indicateur de révision, révisions, dépôt de garantie, polices GLI, dates de rupture, franchises, plafonnements et mesures d'accompagnement.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant unique du bail",
            "example": "3f8a1c2e-9b4d-4e5f-8a1b-2c3d4e5f6a7b"
          },
          "reference": {
            "type": "string",
            "description": "Référence lisible du bail",
            "example": "BL-2024-00042"
          },
          "externalId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant externe (système d'origine / reprise)",
            "example": "LEGACY-88213"
          },
          "leaseType": {
            "type": "string",
            "description": "Type de bail (habitation, commercial, professionnel…)",
            "example": "residential"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "terminated",
              "renewed",
              "closed_pending"
            ],
            "description": "Statut du bail",
            "example": "active"
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de début du bail",
            "example": "2024-01-01"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de fin du bail",
            "example": "2027-01-01"
          },
          "signatureDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de signature du bail",
            "example": "2023-12-15"
          },
          "revisionMode": {
            "type": "string",
            "nullable": true,
            "description": "Mode de révision (indexation) du bail",
            "example": "automatic"
          },
          "initialBalance": {
            "$ref": "#/components/schemas/Money"
          },
          "cafAllocataireNumber": {
            "type": "string",
            "nullable": true,
            "description": "Numéro d'allocataire CAF",
            "example": "1234567"
          },
          "paymentDay": {
            "type": "integer",
            "nullable": true,
            "description": "Jour du mois de prélèvement / échéance",
            "example": 5
          },
          "paymentFrequency": {
            "type": "string",
            "nullable": true,
            "description": "Fréquence de paiement",
            "example": "monthly"
          },
          "paymentTiming": {
            "type": "string",
            "nullable": true,
            "description": "Terme de paiement (à échoir / échu)",
            "example": "in_advance"
          },
          "noticeMonths": {
            "type": "integer",
            "nullable": true,
            "description": "Durée de préavis en mois",
            "example": 3
          },
          "terms": {
            "type": "array",
            "description": "Termes du bail (ordonnés du plus récent au plus ancien)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du terme"
                },
                "baseRent": {
                  "$ref": "#/components/schemas/Money"
                },
                "chargeProvision": {
                  "$ref": "#/components/schemas/Money"
                },
                "totalMonthly": {
                  "$ref": "#/components/schemas/Money"
                },
                "effectiveFrom": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date d'entrée en vigueur du terme",
                  "example": "2024-01-01"
                },
                "effectiveTo": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de fin du terme",
                  "example": "2024-12-31"
                },
                "revisionMonth": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Mois de révision (1-12)",
                  "example": 1
                },
                "revisionFrequencyYears": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Fréquence de révision en années",
                  "example": 1
                }
              }
            }
          },
          "parties": {
            "type": "array",
            "description": "Parties au bail (locataires, garants, propriétaires…)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la partie"
                },
                "partyType": {
                  "type": "string",
                  "description": "Type de partie (tenant, owner, guarantor…)",
                  "example": "tenant"
                },
                "partyableType": {
                  "type": "string",
                  "description": "Type polymorphe de l'entité rattachée",
                  "example": "Loctavia::Contact"
                },
                "role": {
                  "type": "string",
                  "description": "Rôle de la partie dans le bail",
                  "example": "main"
                },
                "name": {
                  "type": "string",
                  "nullable": true,
                  "description": "Nom affichable de l'entité rattachée",
                  "example": "Jean Dupont"
                },
                "email": {
                  "type": "string",
                  "nullable": true,
                  "description": "Adresse email de l'entité rattachée",
                  "example": "jean.dupont@example.com"
                },
                "partyableId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Identifiant de l'entité rattachée"
                },
                "shareNumerator": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Numérateur de la quote-part",
                  "example": 1
                },
                "shareDenominator": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Dénominateur de la quote-part",
                  "example": 2
                },
                "validFrom": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Début de validité de la partie",
                  "example": "2024-01-01"
                },
                "validTo": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Fin de validité de la partie",
                  "example": "2027-01-01"
                },
                "tenantProfileId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Identifiant du profil locataire associé"
                }
              }
            }
          },
          "units": {
            "type": "array",
            "description": "Lots rattachés au bail (détail par lot)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du lot de bail (lease_unit)"
                },
                "unitId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du lot (unit)"
                },
                "identifier": {
                  "type": "string",
                  "description": "Identifiant lisible du lot",
                  "example": "A-101"
                },
                "propertyName": {
                  "type": "string",
                  "nullable": true,
                  "description": "Nom de l'immeuble du lot",
                  "example": "Résidence Les Tilleuls"
                },
                "propertyId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Identifiant de l'immeuble du lot"
                },
                "areaSqm": {
                  "type": "number",
                  "nullable": true,
                  "description": "Surface du lot en mètres carrés",
                  "example": 45.5
                },
                "entryDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date d'entrée du lot dans le bail",
                  "example": "2024-01-01"
                },
                "exitDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de sortie du lot du bail",
                  "example": null
                },
                "baseRentCents": {
                  "type": "integer",
                  "description": "Loyer de base du lot en centimes",
                  "example": 60000
                },
                "annualAmountCents": {
                  "type": "integer",
                  "description": "Montant annuel du lot en centimes",
                  "example": 720000
                },
                "chargeProvisionCents": {
                  "type": "integer",
                  "description": "Provision de charges du lot en centimes",
                  "example": 10000
                },
                "vatApplicable": {
                  "type": "boolean",
                  "description": "TVA applicable sur le lot",
                  "example": false
                },
                "vatRate": {
                  "type": "number",
                  "nullable": true,
                  "description": "Taux de TVA appliqué",
                  "example": 20
                },
                "indexType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type d'indice de révision (ILC, ILAT, IRL…)",
                  "example": "IRL"
                },
                "indexBaseDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de base de l'indice",
                  "example": "2023-01-01"
                },
                "indexBaseValue": {
                  "type": "number",
                  "nullable": true,
                  "description": "Valeur de base de l'indice",
                  "example": 138.61
                }
              }
            }
          },
          "revisionIndicator": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Indicateur de révision (indexation). Nul si l'indexation est désactivée ou si aucun terme / indice effectif n'est disponible.",
            "properties": {
              "indexCode": {
                "type": "string",
                "description": "Code de l'indice retenu (premier lot en multi-indices)",
                "example": "IRL"
              },
              "revisionDue": {
                "type": "boolean",
                "description": "Une révision est due selon la fréquence contractuelle",
                "example": true
              },
              "lastRevisionDate": {
                "type": "string",
                "format": "date",
                "nullable": true,
                "description": "Date de la dernière révision effectuée",
                "example": "2024-01-01"
              },
              "estimatedIncrease": {
                "type": "number",
                "nullable": true,
                "description": "Augmentation estimée en pourcentage à partir des derniers indices",
                "example": 3.5
              },
              "revisionMonth": {
                "type": "integer",
                "nullable": true,
                "description": "Mois de révision du terme courant",
                "example": 1
              },
              "indexAvailable": {
                "type": "boolean",
                "description": "L'indice de révision le plus récent est disponible",
                "example": true
              },
              "latestPeriod": {
                "type": "string",
                "nullable": true,
                "description": "Dernière période d'indice attendue (ex. 2024-Q1)",
                "example": "2024-Q1"
              },
              "nextPublicationInfo": {
                "type": "object",
                "nullable": true,
                "additionalProperties": true,
                "description": "Prochaine publication d'indice attendue (si indice indisponible)",
                "properties": {
                  "period": {
                    "type": "string",
                    "description": "Période concernée",
                    "example": "2024-Q2"
                  },
                  "expectedDate": {
                    "type": "string",
                    "format": "date",
                    "nullable": true,
                    "description": "Date de publication attendue",
                    "example": "2024-07-15"
                  }
                }
              }
            }
          },
          "revisions": {
            "type": "array",
            "description": "Révisions du bail (5 plus récentes, ordonnées par date décroissante)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la révision"
                },
                "revisionDate": {
                  "type": "string",
                  "format": "date",
                  "description": "Date d'effet de la révision",
                  "example": "2024-01-01"
                },
                "indexCode": {
                  "type": "string",
                  "nullable": true,
                  "description": "Code de l'indice (nul en révision multi-indices)",
                  "example": "IRL"
                },
                "indexCodes": {
                  "type": "array",
                  "description": "Codes d'indices distincts couverts par la révision",
                  "items": {
                    "type": "string",
                    "example": "IRL"
                  }
                },
                "multiIndex": {
                  "type": "boolean",
                  "description": "La révision couvre plusieurs indices distincts",
                  "example": false
                },
                "referencePeriod": {
                  "type": "string",
                  "nullable": true,
                  "description": "Période de référence de l'indice",
                  "example": "2023-Q1"
                },
                "revisionPeriod": {
                  "type": "string",
                  "nullable": true,
                  "description": "Période de révision de l'indice",
                  "example": "2024-Q1"
                },
                "referenceValue": {
                  "type": "number",
                  "nullable": true,
                  "description": "Valeur de l'indice de référence",
                  "example": 138.61
                },
                "revisionValue": {
                  "type": "number",
                  "nullable": true,
                  "description": "Valeur de l'indice de révision",
                  "example": 143.46
                },
                "effectiveRatio": {
                  "type": "number",
                  "nullable": true,
                  "description": "Ratio de révision effectivement appliqué",
                  "example": 1.035
                },
                "oldRent": {
                  "$ref": "#/components/schemas/Money"
                },
                "newRent": {
                  "$ref": "#/components/schemas/Money"
                },
                "increasePercent": {
                  "type": "number",
                  "nullable": true,
                  "description": "Pourcentage d'augmentation",
                  "example": 3.5
                },
                "computationTrace": {
                  "type": "object",
                  "nullable": true,
                  "additionalProperties": true,
                  "description": "Trace de calcul détaillée de la révision (audit du calcul)"
                },
                "lines": {
                  "type": "array",
                  "description": "Détail de la révision par lot",
                  "items": {
                    "type": "object",
                    "additionalProperties": true,
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant de la ligne de révision"
                      },
                      "leaseUnitId": {
                        "type": "string",
                        "format": "uuid",
                        "nullable": true,
                        "description": "Identifiant du lot de bail concerné"
                      },
                      "unitIdentifier": {
                        "type": "string",
                        "nullable": true,
                        "description": "Identifiant lisible du lot",
                        "example": "A-101"
                      },
                      "indexCode": {
                        "type": "string",
                        "nullable": true,
                        "description": "Code de l'indice appliqué à ce lot",
                        "example": "IRL"
                      },
                      "referencePeriod": {
                        "type": "string",
                        "nullable": true,
                        "description": "Période de référence de l'indice",
                        "example": "2023-Q1"
                      },
                      "revisionPeriod": {
                        "type": "string",
                        "nullable": true,
                        "description": "Période de révision de l'indice",
                        "example": "2024-Q1"
                      },
                      "referenceValue": {
                        "type": "number",
                        "nullable": true,
                        "description": "Valeur de l'indice de référence",
                        "example": 138.61
                      },
                      "revisionValue": {
                        "type": "number",
                        "nullable": true,
                        "description": "Valeur de l'indice de révision",
                        "example": 143.46
                      },
                      "oldCents": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Ancien loyer du lot en centimes",
                        "example": 60000
                      },
                      "newCents": {
                        "type": "integer",
                        "nullable": true,
                        "description": "Nouveau loyer du lot en centimes",
                        "example": 62100
                      },
                      "increasePercent": {
                        "type": "number",
                        "nullable": true,
                        "description": "Pourcentage d'augmentation du lot",
                        "example": 3.5
                      }
                    }
                  }
                },
                "createdBy": {
                  "type": "object",
                  "nullable": true,
                  "additionalProperties": true,
                  "description": "Auteur de la révision (nul si non renseigné)",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Identifiant de l'utilisateur"
                    },
                    "name": {
                      "type": "string",
                      "description": "Nom affichable de l'utilisateur",
                      "example": "Marie Martin"
                    }
                  }
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Date de création de la révision",
                  "example": "2024-01-02T09:30:00Z"
                }
              }
            }
          },
          "securityDeposit": {
            "$ref": "#/components/schemas/Money"
          },
          "gliPolicies": {
            "type": "array",
            "description": "Polices d'assurance garantie loyers impayés (GLI)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la police"
                },
                "insurerName": {
                  "type": "string",
                  "description": "Nom de l'assureur",
                  "example": "Assur'Loyer"
                },
                "policyNumber": {
                  "type": "string",
                  "description": "Numéro de police",
                  "example": "GLI-2024-001"
                },
                "premium": {
                  "$ref": "#/components/schemas/Money"
                },
                "premiumFrequency": {
                  "type": "string",
                  "description": "Fréquence de la prime",
                  "example": "monthly"
                },
                "coverageRate": {
                  "type": "number",
                  "nullable": true,
                  "description": "Taux de couverture",
                  "example": 3.5
                },
                "startDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de début de la police",
                  "example": "2024-01-01"
                },
                "endDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de fin de la police",
                  "example": "2025-01-01"
                },
                "status": {
                  "type": "string",
                  "description": "Statut de la police",
                  "example": "active"
                },
                "expiringSoon": {
                  "type": "boolean",
                  "description": "La police expire sous 30 jours",
                  "example": false
                }
              }
            }
          },
          "breakDates": {
            "type": "array",
            "description": "Dates de rupture / faculté de résiliation du bail",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la date de rupture"
                },
                "breakDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de rupture",
                  "example": "2025-01-01"
                },
                "breakType": {
                  "type": "string",
                  "description": "Type de rupture (triennale, dérogatoire…)",
                  "example": "triennial"
                },
                "noticeDeadline": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date limite de préavis",
                  "example": "2024-07-01"
                },
                "status": {
                  "type": "string",
                  "description": "Statut de la date de rupture",
                  "example": "upcoming"
                },
                "daysUntilBreak": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Nombre de jours avant la date de rupture",
                  "example": 180
                },
                "noticePeriodStarted": {
                  "type": "boolean",
                  "description": "Le préavis a commencé",
                  "example": false
                }
              }
            }
          },
          "franchisePeriods": {
            "type": "array",
            "description": "Périodes de franchise (loyer réduit / offert)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la période de franchise"
                },
                "startDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de début de la franchise",
                  "example": "2024-01-01"
                },
                "endDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de fin de la franchise",
                  "example": "2024-03-31"
                },
                "franchiseType": {
                  "type": "string",
                  "description": "Type de franchise (totale, partielle)",
                  "example": "total"
                },
                "reductionPercent": {
                  "type": "number",
                  "nullable": true,
                  "description": "Pourcentage de réduction",
                  "example": 100
                },
                "reason": {
                  "type": "string",
                  "nullable": true,
                  "description": "Motif de la franchise",
                  "example": "Travaux d'aménagement"
                },
                "scopeType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Périmètre d'application de la franchise",
                  "example": "rent"
                }
              }
            }
          },
          "cappingRules": {
            "type": "array",
            "description": "Règles de plafonnement (Pinel, dérogatoire, encadrement…)",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la règle de plafonnement"
                },
                "cappingType": {
                  "type": "string",
                  "description": "Type de plafonnement",
                  "example": "cap_pinel"
                },
                "referenceAmount": {
                  "$ref": "#/components/schemas/Money"
                },
                "maxIncreasePercent": {
                  "type": "number",
                  "nullable": true,
                  "description": "Pourcentage maximal d'augmentation autorisé",
                  "example": 3.5
                },
                "startDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de début d'application de la règle",
                  "example": "2024-01-01"
                },
                "zone": {
                  "type": "string",
                  "nullable": true,
                  "description": "Zone géographique concernée",
                  "example": "A_bis"
                }
              }
            }
          },
          "supportMeasures": {
            "type": "array",
            "description": "Mesures d'accompagnement (modificateurs hors indexation et ajustement de charges), ordonnées par priorité.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du modificateur"
                },
                "modifierType": {
                  "type": "string",
                  "description": "Type de modificateur",
                  "example": "discount"
                },
                "category": {
                  "type": "string",
                  "description": "Catégorie (franchise, capping, discount, adjustment, penalty, other)",
                  "example": "discount"
                },
                "status": {
                  "type": "string",
                  "description": "Statut de la mesure (active, cancelled, expired, upcoming)",
                  "example": "active"
                },
                "label": {
                  "type": "string",
                  "nullable": true,
                  "description": "Libellé de la mesure (motif ou libellé auto-généré)",
                  "example": "Remise commerciale"
                },
                "validFrom": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de début de validité",
                  "example": "2024-01-01"
                },
                "validTo": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de fin de validité",
                  "example": "2024-06-30"
                },
                "priority": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Priorité d'application du modificateur",
                  "example": 10
                },
                "impactLabel": {
                  "type": "string",
                  "nullable": true,
                  "description": "Libellé de l'impact (ex. \"-10%\", \"+50,00 €/mois\")",
                  "example": "-10%"
                },
                "configuration": {
                  "type": "object",
                  "nullable": true,
                  "additionalProperties": true,
                  "description": "Configuration brute du modificateur"
                },
                "sourceType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type de la source du modificateur (démodulisé)",
                  "example": "SupportMeasure"
                },
                "sourceId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Identifiant de la source du modificateur"
                }
              }
            }
          },
          "autoRenewal": {
            "type": "boolean",
            "nullable": true,
            "description": "Reconduction tacite activée",
            "example": true
          },
          "renewalNoticePeriod": {
            "type": "integer",
            "nullable": true,
            "description": "Durée du préavis de reconduction (mois)",
            "example": 6
          },
          "renewalNoticeDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de préavis de reconduction",
            "example": "2026-07-01"
          }
        }
      },
      "BillingRun": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du run de facturation"
          },
          "reference": {
            "type": "string",
            "description": "Référence du run",
            "example": "FACT-2026-05"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "review",
              "validated",
              "applied",
              "cancelled",
              "scheduled",
              "computed"
            ],
            "description": "Statut du run de facturation"
          },
          "periodStart": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Début de la période facturée"
          },
          "periodEnd": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Fin de la période facturée"
          },
          "totalTenantAmount": {
            "type": "number",
            "description": "Montant total locataires"
          },
          "totalOwnerAmount": {
            "type": "number",
            "description": "Montant total propriétaires"
          },
          "linesCount": {
            "type": "integer",
            "description": "Nombre de lignes de quittancement (appels de loyer locataires)"
          },
          "anomaliesCount": {
            "type": "integer",
            "description": "Nombre d'anomalies détectées"
          },
          "validatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de validation du run"
          },
          "validatedBy": {
            "type": "string",
            "nullable": true,
            "description": "Auteur de la validation du run"
          },
          "appliedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'application du run"
          },
          "billingFrequency": {
            "type": "string",
            "nullable": true,
            "description": "Fréquence de facturation du run"
          },
          "editable": {
            "type": "boolean",
            "description": "Indique si le run est modifiable"
          },
          "cancellable": {
            "type": "boolean",
            "description": "Indique si le run est annulable"
          },
          "currentStep": {
            "type": "integer",
            "nullable": true,
            "description": "Étape courante dans le workflow du run"
          },
          "allAnomaliesAcknowledged": {
            "type": "boolean",
            "description": "Indique si toutes les anomalies ont été acquittées"
          },
          "scheduledAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de planification du run"
          },
          "computedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de calcul du run"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de création du run"
          },
          "totalRentAmount": {
            "type": "number",
            "description": "Montant total des loyers (hors provisions de charges)"
          },
          "totalChargesAmount": {
            "type": "number",
            "description": "Montant total des provisions de charges"
          }
        }
      },
      "BillingRunMutation": {
        "type": "object",
        "required": [
          "period_start"
        ],
        "properties": {
          "period_start": {
            "type": "string",
            "format": "date",
            "description": "Premier jour du mois facturé (YYYY-MM-DD)"
          },
          "grouping_mode": {
            "type": "string",
            "enum": [
              "per_lease",
              "per_tenant"
            ]
          },
          "property_id": {
            "type": "string",
            "format": "uuid"
          },
          "schedule": {
            "type": "boolean"
          },
          "frequencies": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "monthly",
                "quarterly",
                "annual"
              ]
            }
          },
          "timings": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "advance",
                "arrears"
              ]
            }
          },
          "lease_types": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "lease_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "exclude_lease_ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        }
      },
      "BillingRunDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du run de facturation"
          },
          "reference": {
            "type": "string",
            "description": "Référence du run",
            "example": "FACT-2026-05"
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "review",
              "validated",
              "applied",
              "cancelled",
              "scheduled",
              "computed"
            ],
            "description": "Statut du run de facturation"
          },
          "periodStart": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Début de la période facturée"
          },
          "periodEnd": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Fin de la période facturée"
          },
          "totalTenantAmount": {
            "type": "number",
            "description": "Montant total locataires"
          },
          "totalOwnerAmount": {
            "type": "number",
            "description": "Montant total propriétaires"
          },
          "linesCount": {
            "type": "integer",
            "description": "Nombre de lignes de quittancement (appels de loyer locataires)"
          },
          "anomaliesCount": {
            "type": "integer",
            "description": "Nombre d'anomalies détectées"
          },
          "validatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de validation du run"
          },
          "validatedBy": {
            "type": "string",
            "nullable": true,
            "description": "Auteur de la validation du run"
          },
          "appliedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'application du run"
          },
          "billingFrequency": {
            "type": "string",
            "nullable": true,
            "description": "Fréquence de facturation du run"
          },
          "editable": {
            "type": "boolean",
            "description": "Indique si le run est modifiable"
          },
          "cancellable": {
            "type": "boolean",
            "description": "Indique si le run est annulable"
          },
          "currentStep": {
            "type": "integer",
            "nullable": true,
            "description": "Étape courante dans le workflow du run"
          },
          "allAnomaliesAcknowledged": {
            "type": "boolean",
            "description": "Indique si toutes les anomalies ont été acquittées"
          },
          "scheduledAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de planification du run"
          },
          "computedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de calcul du run"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de création du run"
          },
          "totalRentAmount": {
            "type": "number",
            "description": "Montant total des loyers (hors provisions de charges)"
          },
          "totalChargesAmount": {
            "type": "number",
            "description": "Montant total des provisions de charges"
          },
          "groupingMode": {
            "type": "string",
            "nullable": true,
            "description": "Mode de regroupement des lignes du run"
          },
          "cancelledAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'annulation du run"
          },
          "cancellationReason": {
            "type": "string",
            "nullable": true,
            "description": "Motif d'annulation du run"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Métadonnées libres du run"
          },
          "ownerPaymentsSummary": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Synthèse des reversements propriétaires",
            "properties": {
              "count": {
                "type": "integer",
                "description": "Nombre de reversements"
              },
              "totalGross": {
                "type": "number",
                "description": "Montant brut total des reversements"
              },
              "totalNet": {
                "type": "number",
                "description": "Montant net total des reversements"
              }
            }
          },
          "billingNoticesSummary": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Synthèse des avis de facturation (mode groupé par locataire)",
            "properties": {
              "count": {
                "type": "integer",
                "description": "Nombre d'avis"
              },
              "totalAmountCents": {
                "type": "integer",
                "description": "Montant total des avis en centimes"
              },
              "notices": {
                "type": "array",
                "description": "Liste des avis de facturation",
                "items": {
                  "type": "object",
                  "additionalProperties": true,
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Identifiant de l'avis"
                    },
                    "reference": {
                      "type": "string",
                      "description": "Référence de l'avis"
                    },
                    "tenantName": {
                      "type": "string",
                      "nullable": true,
                      "description": "Nom du locataire"
                    },
                    "totalAmountCents": {
                      "type": "integer",
                      "description": "Montant total de l'avis en centimes"
                    },
                    "linesCount": {
                      "type": "integer",
                      "description": "Nombre de lignes de l'avis"
                    }
                  }
                }
              }
            }
          },
          "receiptsMetadata": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Métadonnées des quittances (extrait de metadata.receipts)"
          },
          "scopeSummary": {
            "type": "object",
            "additionalProperties": true,
            "description": "Synthèse du périmètre du run",
            "properties": {
              "period": {
                "type": "string",
                "nullable": true,
                "description": "Libellé de la période (mois année)",
                "example": "mai 2026"
              },
              "frequencies": {
                "type": "array",
                "description": "Fréquences incluses dans le périmètre",
                "items": {
                  "type": "string"
                }
              },
              "timings": {
                "type": "array",
                "description": "Temporalités incluses dans le périmètre",
                "items": {
                  "type": "string"
                }
              },
              "leaseTypes": {
                "type": "array",
                "description": "Types de baux inclus dans le périmètre",
                "items": {
                  "type": "string"
                }
              },
              "propertyId": {
                "type": "string",
                "format": "uuid",
                "nullable": true,
                "description": "Identifiant du bien filtré, le cas échéant"
              },
              "linesCount": {
                "type": "integer",
                "description": "Nombre total de lignes locataires du périmètre"
              },
              "excludedCount": {
                "type": "integer",
                "description": "Nombre de lignes locataires exclues"
              },
              "totalLeases": {
                "type": "integer",
                "description": "Nombre de baux distincts du périmètre"
              }
            }
          },
          "vatBreakdown": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Ventilation de la TVA calculée pour le run"
          }
        }
      },
      "BillingLine": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "lineType": {
            "type": "string",
            "enum": [
              "tenant",
              "owner"
            ]
          },
          "billingCategory": {
            "type": "string"
          },
          "computedAmount": {
            "type": "number"
          },
          "baseAmount": {
            "type": "number"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "validated",
              "anomaly",
              "excluded"
            ]
          },
          "leaseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "unitIdentifier": {
            "type": "string",
            "nullable": true
          },
          "hasAnomaly": {
            "type": "boolean"
          },
          "anomalyType": {
            "type": "string",
            "nullable": true
          }
        }
      },
      "BillingLineUpdate": {
        "type": "object",
        "description": "Fournir soit `excluded` (inclure/exclure), soit `review_status` (acquitter une anomalie).",
        "properties": {
          "excluded": {
            "type": "boolean"
          },
          "review_status": {
            "type": "string",
            "enum": [
              "ok",
              "flagged"
            ]
          },
          "comment": {
            "type": "string"
          }
        }
      },
      "Mandate": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du mandat de gestion"
          },
          "reference": {
            "type": "string",
            "description": "Référence du mandat",
            "example": "MG-2026-0042"
          },
          "mandateType": {
            "type": "string",
            "description": "Type de mandat de gestion",
            "example": "gestion_locative"
          },
          "status": {
            "type": "string",
            "description": "Statut du mandat",
            "example": "active"
          },
          "ownerId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du propriétaire (Owner) rattaché au mandat"
          },
          "ownerActorId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de l'acteur propriétaire sous-jacent"
          },
          "ownerName": {
            "type": "string",
            "nullable": true,
            "description": "Nom affiché du propriétaire",
            "example": "SCI Les Tilleuls"
          },
          "propertyId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du bien géré"
          },
          "propertyName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du bien géré",
            "example": "Résidence Bellevue"
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de début du mandat"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de fin du mandat"
          },
          "managementFeeRate": {
            "type": "number",
            "nullable": true,
            "description": "Taux d'honoraires de gestion",
            "example": 7.5
          },
          "paymentTiming": {
            "type": "string",
            "nullable": true,
            "description": "Modalité de temporalité des paiements",
            "example": "term_echu"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de création du mandat"
          }
        }
      },
      "MandateMutation": {
        "type": "object",
        "required": [
          "owner_profile_id",
          "reference",
          "start_date"
        ],
        "properties": {
          "owner_profile_id": {
            "type": "string",
            "format": "uuid"
          },
          "property_id": {
            "type": "string",
            "format": "uuid"
          },
          "reference": {
            "type": "string",
            "example": "MAN-2026-001"
          },
          "mandate_type": {
            "type": "string",
            "enum": [
              "full_management",
              "rental_only",
              "charges_only"
            ],
            "default": "full_management"
          },
          "start_date": {
            "type": "string",
            "format": "date"
          },
          "end_date": {
            "type": "string",
            "format": "date"
          },
          "management_fee_rate": {
            "type": "number",
            "example": 0.08
          }
        }
      },
      "MandateDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du mandat de gestion"
          },
          "reference": {
            "type": "string",
            "description": "Référence du mandat",
            "example": "MG-2026-0042"
          },
          "mandateType": {
            "type": "string",
            "description": "Type de mandat de gestion",
            "example": "gestion_locative"
          },
          "status": {
            "type": "string",
            "description": "Statut du mandat",
            "example": "active"
          },
          "ownerId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du propriétaire (Owner) rattaché au mandat"
          },
          "ownerActorId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de l'acteur propriétaire sous-jacent"
          },
          "ownerName": {
            "type": "string",
            "nullable": true,
            "description": "Nom affiché du propriétaire",
            "example": "SCI Les Tilleuls"
          },
          "propertyId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du bien géré"
          },
          "propertyName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du bien géré",
            "example": "Résidence Bellevue"
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de début du mandat"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de fin du mandat"
          },
          "managementFeeRate": {
            "type": "number",
            "nullable": true,
            "description": "Taux d'honoraires de gestion",
            "example": 7.5
          },
          "paymentTiming": {
            "type": "string",
            "nullable": true,
            "description": "Modalité de temporalité des paiements",
            "example": "term_echu"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de création du mandat"
          },
          "mandataireId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du mandataire gestionnaire"
          },
          "signatureDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de signature du mandat"
          },
          "vatRateOnFees": {
            "type": "number",
            "nullable": true,
            "description": "Taux de TVA appliqué sur les honoraires",
            "example": 20
          },
          "renewalMode": {
            "type": "string",
            "nullable": true,
            "description": "Mode de renouvellement du mandat",
            "example": "tacit"
          },
          "noticeMonths": {
            "type": "integer",
            "nullable": true,
            "description": "Durée du préavis en mois",
            "example": 3
          },
          "specialConditions": {
            "type": "string",
            "nullable": true,
            "description": "Conditions particulières du mandat"
          },
          "distributionMode": {
            "type": "string",
            "nullable": true,
            "description": "Mode de reversement au propriétaire"
          },
          "distributionFrequency": {
            "type": "string",
            "nullable": true,
            "description": "Fréquence de reversement au propriétaire"
          },
          "distributionDay": {
            "type": "integer",
            "nullable": true,
            "description": "Jour du mois pour le reversement",
            "example": 5
          },
          "distributionMarginDays": {
            "type": "integer",
            "nullable": true,
            "description": "Nombre de jours de marge avant reversement"
          },
          "depotGarantieDetention": {
            "type": "string",
            "nullable": true,
            "description": "Détenteur du dépôt de garantie"
          },
          "retenueDestination": {
            "type": "string",
            "nullable": true,
            "description": "Destination des retenues"
          },
          "accountingMode": {
            "type": "string",
            "nullable": true,
            "description": "Mode comptable configuré"
          },
          "effectiveAccountingMode": {
            "type": "string",
            "nullable": true,
            "description": "Mode comptable effectif résolu"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Métadonnées libres du mandat"
          },
          "mandateServices": {
            "type": "array",
            "description": "Prestations (services) associées au mandat, ordonnées",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la prestation"
                },
                "serviceType": {
                  "type": "string",
                  "description": "Type de prestation"
                },
                "label": {
                  "type": "string",
                  "description": "Libellé de la prestation"
                },
                "billingMode": {
                  "type": "string",
                  "description": "Mode de facturation de la prestation"
                },
                "rate": {
                  "type": "number",
                  "nullable": true,
                  "description": "Taux appliqué"
                },
                "amountCents": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Montant en centimes"
                },
                "calculationBase": {
                  "type": "string",
                  "nullable": true,
                  "description": "Base de calcul"
                },
                "frequency": {
                  "type": "string",
                  "nullable": true,
                  "description": "Fréquence de facturation"
                },
                "triggerEvent": {
                  "type": "string",
                  "nullable": true,
                  "description": "Événement déclencheur"
                },
                "target": {
                  "type": "string",
                  "nullable": true,
                  "description": "Cible de la prestation"
                },
                "deliveryMode": {
                  "type": "string",
                  "nullable": true,
                  "description": "Mode de délivrance"
                },
                "vatApplicable": {
                  "type": "boolean",
                  "nullable": true,
                  "description": "Indique si la TVA s'applique"
                },
                "vatRate": {
                  "type": "number",
                  "nullable": true,
                  "description": "Taux de TVA de la prestation"
                },
                "priority": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Priorité d'application"
                },
                "active": {
                  "type": "boolean",
                  "nullable": true,
                  "description": "Indique si la prestation est active"
                },
                "configuration": {
                  "type": "object",
                  "additionalProperties": true,
                  "nullable": true,
                  "description": "Configuration spécifique de la prestation"
                },
                "position": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Position d'ordre d'affichage"
                }
              }
            }
          }
        }
      },
      "Property": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'immeuble"
          },
          "name": {
            "type": "string",
            "description": "Nom de l'immeuble",
            "example": "Résidence Les Tilleuls"
          },
          "propertyType": {
            "type": "string",
            "nullable": true,
            "description": "Type d'immeuble",
            "example": "residence"
          },
          "address": {
            "type": "string",
            "nullable": true,
            "description": "Adresse de l'immeuble",
            "example": "12 rue des Lilas"
          },
          "city": {
            "type": "string",
            "nullable": true,
            "description": "Ville",
            "example": "Lyon"
          },
          "postalCode": {
            "type": "string",
            "nullable": true,
            "description": "Code postal",
            "example": "69003"
          },
          "hasElevator": {
            "type": "boolean",
            "nullable": true,
            "description": "Présence d'un ascenseur"
          },
          "floorCount": {
            "type": "integer",
            "nullable": true,
            "description": "Nombre d'étages",
            "example": 5
          },
          "active": {
            "type": "boolean",
            "nullable": true,
            "description": "Immeuble actif"
          },
          "externalId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant externe (système source / reprise)"
          },
          "shareKeys": {
            "type": "array",
            "description": "Clés de répartition (tantièmes) de l'immeuble",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la clé de répartition"
                },
                "name": {
                  "type": "string",
                  "description": "Libellé de la clé de répartition",
                  "example": "Charges générales"
                },
                "total": {
                  "type": "integer",
                  "description": "Total des tantièmes (dénominateur de la clé)",
                  "example": 10000
                },
                "chargeNatureId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Nature de charge rattachée à la clé"
                },
                "distributionStrategy": {
                  "type": "integer",
                  "description": "Stratégie de distribution (enum manual, by_area, by_floors_climbed, by_habitable_area, by_unit_count, by_residential_lots)",
                  "example": 0
                },
                "excludedUnitTypes": {
                  "type": "array",
                  "description": "Types de lots exclus de la répartition",
                  "items": {
                    "type": "string"
                  }
                },
                "lastModifiedAt": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Date de la dernière modification d'une allocation"
                },
                "activeVersionsCount": {
                  "type": "integer",
                  "description": "Nombre d'allocations en version active à ce jour"
                },
                "historicalVersionsCount": {
                  "type": "integer",
                  "description": "Nombre d'allocations historiques (versions clôturées)"
                }
              }
            }
          },
          "unitsCount": {
            "type": "integer",
            "description": "Nombre de lots de l'immeuble",
            "example": 24
          },
          "activeLeaseCount": {
            "type": "integer",
            "description": "Nombre de baux actifs",
            "example": 18
          },
          "occupiedCount": {
            "type": "integer",
            "description": "Nombre de lots occupés",
            "example": 18
          },
          "vacantCount": {
            "type": "integer",
            "description": "Nombre de lots vacants",
            "example": 6
          },
          "totalSurface": {
            "type": "number",
            "description": "Surface totale de l'immeuble en m²",
            "example": 1240.5
          },
          "occupancyRate": {
            "type": "number",
            "description": "Taux d'occupation en pourcentage",
            "example": 75
          }
        }
      },
      "PropertyMutation": {
        "type": "object",
        "required": [
          "name",
          "address"
        ],
        "properties": {
          "name": {
            "type": "string",
            "example": "Résidence de la Paix"
          },
          "address": {
            "type": "string",
            "example": "1 rue de la Paix, 75002 Paris"
          },
          "city": {
            "type": "string"
          },
          "postal_code": {
            "type": "string"
          },
          "property_type": {
            "type": "string",
            "enum": [
              "residential",
              "commercial",
              "mixed"
            ],
            "default": "commercial"
          },
          "has_elevator": {
            "type": "boolean"
          },
          "floor_count": {
            "type": "integer"
          }
        }
      },
      "PropertyDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'immeuble"
          },
          "name": {
            "type": "string",
            "description": "Nom de l'immeuble",
            "example": "Résidence Les Tilleuls"
          },
          "propertyType": {
            "type": "string",
            "nullable": true,
            "description": "Type d'immeuble",
            "example": "residence"
          },
          "address": {
            "type": "string",
            "nullable": true,
            "description": "Adresse de l'immeuble",
            "example": "12 rue des Lilas"
          },
          "city": {
            "type": "string",
            "nullable": true,
            "description": "Ville",
            "example": "Lyon"
          },
          "postalCode": {
            "type": "string",
            "nullable": true,
            "description": "Code postal",
            "example": "69003"
          },
          "hasElevator": {
            "type": "boolean",
            "nullable": true,
            "description": "Présence d'un ascenseur"
          },
          "floorCount": {
            "type": "integer",
            "nullable": true,
            "description": "Nombre d'étages",
            "example": 5
          },
          "active": {
            "type": "boolean",
            "nullable": true,
            "description": "Immeuble actif"
          },
          "externalId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant externe (système source / reprise)"
          },
          "shareKeys": {
            "type": "array",
            "description": "Clés de répartition (tantièmes) de l'immeuble",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la clé de répartition"
                },
                "name": {
                  "type": "string",
                  "description": "Libellé de la clé de répartition",
                  "example": "Charges générales"
                },
                "total": {
                  "type": "integer",
                  "description": "Total des tantièmes (dénominateur de la clé)",
                  "example": 10000
                },
                "chargeNatureId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Nature de charge rattachée à la clé"
                },
                "distributionStrategy": {
                  "type": "integer",
                  "description": "Stratégie de distribution (enum manual, by_area, by_floors_climbed, by_habitable_area, by_unit_count, by_residential_lots)",
                  "example": 0
                },
                "excludedUnitTypes": {
                  "type": "array",
                  "description": "Types de lots exclus de la répartition",
                  "items": {
                    "type": "string"
                  }
                },
                "lastModifiedAt": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Date de la dernière modification d'une allocation"
                },
                "activeVersionsCount": {
                  "type": "integer",
                  "description": "Nombre d'allocations en version active à ce jour"
                },
                "historicalVersionsCount": {
                  "type": "integer",
                  "description": "Nombre d'allocations historiques (versions clôturées)"
                }
              }
            }
          },
          "units": {
            "type": "array",
            "description": "Lots de l'immeuble (détail complet, cf. UnitDetails)",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du lot"
                },
                "identifier": {
                  "type": "string",
                  "description": "Identifiant fonctionnel du lot",
                  "example": "A-102"
                },
                "unitType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type de lot",
                  "example": "apartment"
                },
                "areaSqm": {
                  "type": "number",
                  "nullable": true,
                  "description": "Surface en m²",
                  "example": 45.5
                },
                "floor": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Étage du lot",
                  "example": 2
                },
                "lotNumber": {
                  "type": "string",
                  "nullable": true,
                  "description": "Numéro de lot au règlement de copropriété",
                  "example": "102"
                },
                "active": {
                  "type": "boolean",
                  "nullable": true,
                  "description": "Lot actif"
                },
                "externalId": {
                  "type": "string",
                  "nullable": true,
                  "description": "Identifiant externe"
                },
                "dateReception": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de réception du lot"
                },
                "allocations": {
                  "type": "array",
                  "description": "Répartitions de tantièmes actives (version courante)",
                  "items": {
                    "type": "object",
                    "properties": {
                      "shareKeyId": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant de la clé de répartition"
                      },
                      "shareKeyName": {
                        "type": "string",
                        "description": "Libellé de la clé de répartition",
                        "example": "Charges générales"
                      },
                      "shares": {
                        "type": "integer",
                        "description": "Nombre de tantièmes attribués",
                        "example": 120
                      }
                    }
                  }
                },
                "description": {
                  "type": "string",
                  "nullable": true,
                  "description": "Description libre du lot"
                },
                "owners": {
                  "type": "array",
                  "description": "Propriétaires actifs du lot",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant du propriétaire"
                      },
                      "name": {
                        "type": "string",
                        "description": "Nom affiché du propriétaire",
                        "example": "SCI Les Tilleuls"
                      },
                      "shareRatio": {
                        "type": "string",
                        "description": "Quote-part de propriété (numérateur/dénominateur)",
                        "example": "1/2"
                      }
                    }
                  }
                },
                "activeLease": {
                  "type": "object",
                  "nullable": true,
                  "description": "Bail actif en cours sur le lot",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Identifiant du bail"
                    },
                    "reference": {
                      "type": "string",
                      "description": "Référence du bail",
                      "example": "BAIL-2026-014"
                    },
                    "status": {
                      "type": "string",
                      "description": "Statut du bail",
                      "example": "active"
                    }
                  }
                },
                "propertyId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de l'immeuble parent"
                },
                "propertyName": {
                  "type": "string",
                  "nullable": true,
                  "description": "Nom de l'immeuble parent",
                  "example": "Résidence Les Tilleuls"
                },
                "ownerships": {
                  "type": "array",
                  "description": "Propriétés actives (quotes-parts en cours)",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant de la propriété"
                      },
                      "ownerId": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant du propriétaire"
                      },
                      "ownerName": {
                        "type": "string",
                        "description": "Nom affiché du propriétaire",
                        "example": "SCI Les Tilleuls"
                      },
                      "shareNumerator": {
                        "type": "integer",
                        "description": "Numérateur de la quote-part",
                        "example": 1
                      },
                      "shareDenominator": {
                        "type": "integer",
                        "description": "Dénominateur de la quote-part",
                        "example": 2
                      },
                      "shareRatio": {
                        "type": "number",
                        "description": "Quote-part de propriété (ratio décimal)",
                        "example": 0.5
                      },
                      "sharePercent": {
                        "type": "number",
                        "description": "Quote-part de propriété en pourcentage",
                        "example": 50
                      },
                      "validFrom": {
                        "type": "string",
                        "format": "date",
                        "nullable": true,
                        "description": "Date de début de validité"
                      },
                      "acquisitionType": {
                        "type": "string",
                        "nullable": true,
                        "description": "Type d'acquisition",
                        "example": "purchase"
                      }
                    }
                  }
                },
                "ownershipHistory": {
                  "type": "array",
                  "description": "Historique des propriétés clôturées",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant de la propriété"
                      },
                      "ownerId": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant du propriétaire"
                      },
                      "ownerName": {
                        "type": "string",
                        "description": "Nom affiché du propriétaire",
                        "example": "SCI Les Tilleuls"
                      },
                      "shareNumerator": {
                        "type": "integer",
                        "description": "Numérateur de la quote-part",
                        "example": 1
                      },
                      "shareDenominator": {
                        "type": "integer",
                        "description": "Dénominateur de la quote-part",
                        "example": 2
                      },
                      "shareRatio": {
                        "type": "number",
                        "description": "Quote-part de propriété (ratio décimal)",
                        "example": 0.5
                      },
                      "sharePercent": {
                        "type": "number",
                        "description": "Quote-part de propriété en pourcentage",
                        "example": 50
                      },
                      "validFrom": {
                        "type": "string",
                        "format": "date",
                        "nullable": true,
                        "description": "Date de début de validité"
                      },
                      "acquisitionType": {
                        "type": "string",
                        "nullable": true,
                        "description": "Type d'acquisition",
                        "example": "purchase"
                      },
                      "validTo": {
                        "type": "string",
                        "format": "date",
                        "nullable": true,
                        "description": "Date de fin de validité"
                      }
                    }
                  }
                },
                "sharesComplete": {
                  "type": "boolean",
                  "description": "Indique si la somme des quotes-parts actives couvre 100 %"
                },
                "totalSharePercent": {
                  "type": "number",
                  "description": "Somme des quotes-parts actives en pourcentage",
                  "example": 100
                },
                "leases": {
                  "type": "array",
                  "description": "Baux rattachés au lot (les plus récents d'abord)",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant du bail"
                      },
                      "leaseUnitId": {
                        "type": "string",
                        "format": "uuid",
                        "description": "Identifiant du lien bail-lot"
                      },
                      "reference": {
                        "type": "string",
                        "description": "Référence du bail",
                        "example": "BAIL-2026-014"
                      },
                      "status": {
                        "type": "string",
                        "description": "Statut du bail",
                        "example": "active"
                      },
                      "startDate": {
                        "type": "string",
                        "format": "date",
                        "nullable": true,
                        "description": "Date de début du bail"
                      },
                      "endDate": {
                        "type": "string",
                        "format": "date",
                        "nullable": true,
                        "description": "Date de fin du bail"
                      }
                    }
                  }
                },
                "qrCode": {
                  "type": "object",
                  "nullable": true,
                  "description": "QR code rattaché au lot",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Identifiant du QR code"
                    },
                    "token": {
                      "type": "string",
                      "description": "Jeton du QR code"
                    },
                    "generatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Date de génération du QR code"
                    }
                  }
                },
                "dpe": {
                  "type": "object",
                  "description": "Diagnostic de performance énergétique du lot",
                  "properties": {
                    "rating": {
                      "type": "string",
                      "nullable": true,
                      "description": "Étiquette DPE",
                      "example": "D"
                    },
                    "issuedOn": {
                      "type": "string",
                      "format": "date",
                      "nullable": true,
                      "description": "Date d'établissement du DPE"
                    },
                    "degraded": {
                      "type": "boolean",
                      "description": "DPE dégradé (étiquette F ou G)"
                    },
                    "daysUntilBan": {
                      "type": "integer",
                      "nullable": true,
                      "description": "Nombre de jours avant interdiction de location (loi Climat)",
                      "example": 540
                    },
                    "documentId": {
                      "type": "string",
                      "format": "uuid",
                      "nullable": true,
                      "description": "Identifiant du document DPE"
                    },
                    "documentUrl": {
                      "type": "string",
                      "nullable": true,
                      "description": "URL de téléchargement du document DPE",
                      "example": "/documents/files/2b1c.../download"
                    },
                    "documentName": {
                      "type": "string",
                      "nullable": true,
                      "description": "Nom du document DPE"
                    }
                  }
                },
                "cgpOverride": {
                  "type": "object",
                  "nullable": true,
                  "description": "Surcharge du CGP au niveau du lot",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Identifiant du contact CGP"
                    },
                    "displayName": {
                      "type": "string",
                      "description": "Nom affiché du CGP",
                      "example": "Jean Dupont"
                    },
                    "email": {
                      "type": "string",
                      "nullable": true,
                      "description": "Adresse e-mail du CGP"
                    },
                    "phoneNumber": {
                      "type": "string",
                      "nullable": true,
                      "description": "Numéro de téléphone du CGP"
                    },
                    "companyName": {
                      "type": "string",
                      "nullable": true,
                      "description": "Raison sociale du CGP"
                    },
                    "validFrom": {
                      "type": "string",
                      "format": "date",
                      "nullable": true,
                      "description": "Date de début de validité de la surcharge"
                    }
                  }
                },
                "effectiveCgp": {
                  "type": "object",
                  "nullable": true,
                  "description": "CGP effectif à ce jour",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Identifiant du contact CGP"
                    },
                    "displayName": {
                      "type": "string",
                      "description": "Nom affiché du CGP",
                      "example": "Jean Dupont"
                    },
                    "companyName": {
                      "type": "string",
                      "nullable": true,
                      "description": "Raison sociale du CGP"
                    },
                    "source": {
                      "type": "string",
                      "description": "Origine du CGP effectif",
                      "enum": [
                        "unit_override",
                        "owner_referent"
                      ],
                      "example": "owner_referent"
                    }
                  }
                }
              }
            }
          },
          "entrances": {
            "type": "array",
            "description": "Entrées / cages d'escalier de l'immeuble",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de l'entrée"
                },
                "name": {
                  "type": "string",
                  "description": "Nom de l'entrée",
                  "example": "Bâtiment A"
                },
                "address": {
                  "type": "string",
                  "nullable": true,
                  "description": "Adresse de l'entrée"
                },
                "postalCode": {
                  "type": "string",
                  "nullable": true,
                  "description": "Code postal de l'entrée"
                },
                "city": {
                  "type": "string",
                  "nullable": true,
                  "description": "Ville de l'entrée"
                },
                "active": {
                  "type": "boolean",
                  "nullable": true,
                  "description": "Entrée active"
                },
                "propertyId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de l'immeuble parent"
                },
                "unitsCount": {
                  "type": "integer",
                  "description": "Nombre de lots visibles rattachés à l'entrée",
                  "example": 8
                },
                "patrimonyCode": {
                  "type": "string",
                  "nullable": true,
                  "description": "Code patrimoine de l'entrée"
                },
                "qrCode": {
                  "type": "object",
                  "nullable": true,
                  "description": "QR code rattaché à l'entrée",
                  "properties": {
                    "id": {
                      "type": "string",
                      "format": "uuid",
                      "description": "Identifiant du QR code"
                    },
                    "token": {
                      "type": "string",
                      "description": "Jeton du QR code"
                    },
                    "generatedAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Date de génération du QR code"
                    }
                  }
                }
              }
            }
          },
          "patrimonyCode": {
            "type": "string",
            "nullable": true,
            "description": "Code patrimoine de l'immeuble"
          },
          "qrCode": {
            "type": "object",
            "nullable": true,
            "description": "QR code rattaché à l'immeuble",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Identifiant du QR code"
              },
              "token": {
                "type": "string",
                "description": "Jeton du QR code"
              },
              "generatedAt": {
                "type": "string",
                "format": "date-time",
                "description": "Date de génération du QR code"
              }
            }
          }
        }
      },
      "Unit": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du lot"
          },
          "identifier": {
            "type": "string",
            "description": "Identifiant fonctionnel du lot (numéro / repère)",
            "example": "A-102"
          },
          "unitType": {
            "type": "string",
            "nullable": true,
            "description": "Type de lot (appartement, cave, parking, commerce…)",
            "example": "apartment"
          },
          "areaSqm": {
            "type": "number",
            "nullable": true,
            "description": "Surface en m²",
            "example": 45.5
          },
          "floor": {
            "type": "integer",
            "nullable": true,
            "description": "Étage du lot",
            "example": 2
          },
          "lotNumber": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de lot au règlement de copropriété",
            "example": "102"
          },
          "active": {
            "type": "boolean",
            "nullable": true,
            "description": "Lot actif"
          },
          "externalId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant externe (système source / reprise)"
          },
          "dateReception": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de réception du lot"
          },
          "allocations": {
            "type": "array",
            "description": "Répartitions de tantièmes actives (version courante)",
            "items": {
              "type": "object",
              "properties": {
                "shareKeyId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la clé de répartition"
                },
                "shareKeyName": {
                  "type": "string",
                  "description": "Libellé de la clé de répartition",
                  "example": "Charges générales"
                },
                "shares": {
                  "type": "integer",
                  "description": "Nombre de tantièmes attribués au lot pour cette clé",
                  "example": 120
                }
              }
            }
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Description libre du lot"
          },
          "owners": {
            "type": "array",
            "description": "Propriétaires actifs du lot",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du propriétaire"
                },
                "name": {
                  "type": "string",
                  "description": "Nom affiché du propriétaire",
                  "example": "SCI Les Tilleuls"
                },
                "shareRatio": {
                  "type": "string",
                  "description": "Quote-part de propriété (numérateur/dénominateur)",
                  "example": "1/2"
                }
              }
            }
          },
          "activeLease": {
            "type": "object",
            "nullable": true,
            "description": "Bail actif en cours sur le lot, le cas échéant",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Identifiant du bail"
              },
              "reference": {
                "type": "string",
                "description": "Référence du bail",
                "example": "BAIL-2026-014"
              },
              "status": {
                "type": "string",
                "description": "Statut du bail",
                "example": "active"
              }
            }
          }
        }
      },
      "UnitMutation": {
        "type": "object",
        "required": [
          "property_id",
          "identifier"
        ],
        "properties": {
          "property_id": {
            "type": "string",
            "format": "uuid"
          },
          "identifier": {
            "type": "string",
            "example": "Lot 12"
          },
          "unit_type": {
            "type": "string",
            "enum": [
              "apartment",
              "office",
              "retail",
              "parking",
              "storage"
            ],
            "default": "retail"
          },
          "area_sqm": {
            "type": "number"
          },
          "floor": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "UnitDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du lot"
          },
          "identifier": {
            "type": "string",
            "description": "Identifiant fonctionnel du lot (numéro / repère)",
            "example": "A-102"
          },
          "unitType": {
            "type": "string",
            "nullable": true,
            "description": "Type de lot (appartement, cave, parking, commerce…)",
            "example": "apartment"
          },
          "areaSqm": {
            "type": "number",
            "nullable": true,
            "description": "Surface en m²",
            "example": 45.5
          },
          "floor": {
            "type": "integer",
            "nullable": true,
            "description": "Étage du lot",
            "example": 2
          },
          "lotNumber": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de lot au règlement de copropriété",
            "example": "102"
          },
          "active": {
            "type": "boolean",
            "nullable": true,
            "description": "Lot actif"
          },
          "externalId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant externe (système source / reprise)"
          },
          "dateReception": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date de réception du lot"
          },
          "allocations": {
            "type": "array",
            "description": "Répartitions de tantièmes actives (version courante)",
            "items": {
              "type": "object",
              "properties": {
                "shareKeyId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la clé de répartition"
                },
                "shareKeyName": {
                  "type": "string",
                  "description": "Libellé de la clé de répartition",
                  "example": "Charges générales"
                },
                "shares": {
                  "type": "integer",
                  "description": "Nombre de tantièmes attribués au lot pour cette clé",
                  "example": 120
                }
              }
            }
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Description libre du lot"
          },
          "owners": {
            "type": "array",
            "description": "Propriétaires actifs du lot",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du propriétaire"
                },
                "name": {
                  "type": "string",
                  "description": "Nom affiché du propriétaire",
                  "example": "SCI Les Tilleuls"
                },
                "shareRatio": {
                  "type": "string",
                  "description": "Quote-part de propriété (numérateur/dénominateur)",
                  "example": "1/2"
                }
              }
            }
          },
          "activeLease": {
            "type": "object",
            "nullable": true,
            "description": "Bail actif en cours sur le lot, le cas échéant",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Identifiant du bail"
              },
              "reference": {
                "type": "string",
                "description": "Référence du bail",
                "example": "BAIL-2026-014"
              },
              "status": {
                "type": "string",
                "description": "Statut du bail",
                "example": "active"
              }
            }
          },
          "propertyId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'immeuble parent"
          },
          "propertyName": {
            "type": "string",
            "nullable": true,
            "description": "Nom de l'immeuble parent",
            "example": "Résidence Les Tilleuls"
          },
          "ownerships": {
            "type": "array",
            "description": "Propriétés actives (quotes-parts en cours)",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la propriété"
                },
                "ownerId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du propriétaire"
                },
                "ownerName": {
                  "type": "string",
                  "description": "Nom affiché du propriétaire",
                  "example": "SCI Les Tilleuls"
                },
                "shareNumerator": {
                  "type": "integer",
                  "description": "Numérateur de la quote-part",
                  "example": 1
                },
                "shareDenominator": {
                  "type": "integer",
                  "description": "Dénominateur de la quote-part",
                  "example": 2
                },
                "shareRatio": {
                  "type": "number",
                  "description": "Quote-part de propriété (ratio décimal)",
                  "example": 0.5
                },
                "sharePercent": {
                  "type": "number",
                  "description": "Quote-part de propriété en pourcentage",
                  "example": 50
                },
                "validFrom": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de début de validité de la propriété"
                },
                "acquisitionType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type d'acquisition",
                  "example": "purchase"
                }
              }
            }
          },
          "ownershipHistory": {
            "type": "array",
            "description": "Historique des propriétés clôturées",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la propriété"
                },
                "ownerId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du propriétaire"
                },
                "ownerName": {
                  "type": "string",
                  "description": "Nom affiché du propriétaire",
                  "example": "SCI Les Tilleuls"
                },
                "shareNumerator": {
                  "type": "integer",
                  "description": "Numérateur de la quote-part",
                  "example": 1
                },
                "shareDenominator": {
                  "type": "integer",
                  "description": "Dénominateur de la quote-part",
                  "example": 2
                },
                "shareRatio": {
                  "type": "number",
                  "description": "Quote-part de propriété (ratio décimal)",
                  "example": 0.5
                },
                "sharePercent": {
                  "type": "number",
                  "description": "Quote-part de propriété en pourcentage",
                  "example": 50
                },
                "validFrom": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de début de validité de la propriété"
                },
                "acquisitionType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type d'acquisition",
                  "example": "purchase"
                },
                "validTo": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de fin de validité de la propriété"
                }
              }
            }
          },
          "sharesComplete": {
            "type": "boolean",
            "description": "Indique si la somme des quotes-parts actives couvre 100 %"
          },
          "totalSharePercent": {
            "type": "number",
            "description": "Somme des quotes-parts actives en pourcentage",
            "example": 100
          },
          "leases": {
            "type": "array",
            "description": "Baux rattachés au lot (les plus récents d'abord)",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du bail"
                },
                "leaseUnitId": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant du lien bail-lot"
                },
                "reference": {
                  "type": "string",
                  "description": "Référence du bail",
                  "example": "BAIL-2026-014"
                },
                "status": {
                  "type": "string",
                  "description": "Statut du bail",
                  "example": "active"
                },
                "startDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de début du bail"
                },
                "endDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de fin du bail"
                }
              }
            }
          },
          "qrCode": {
            "type": "object",
            "nullable": true,
            "description": "QR code rattaché au lot",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Identifiant du QR code"
              },
              "token": {
                "type": "string",
                "description": "Jeton du QR code"
              },
              "generatedAt": {
                "type": "string",
                "format": "date-time",
                "description": "Date de génération du QR code"
              }
            }
          },
          "dpe": {
            "type": "object",
            "description": "Diagnostic de performance énergétique du lot",
            "properties": {
              "rating": {
                "type": "string",
                "nullable": true,
                "description": "Étiquette DPE",
                "example": "D"
              },
              "issuedOn": {
                "type": "string",
                "format": "date",
                "nullable": true,
                "description": "Date d'établissement du DPE"
              },
              "degraded": {
                "type": "boolean",
                "description": "DPE dégradé (étiquette F ou G)"
              },
              "daysUntilBan": {
                "type": "integer",
                "nullable": true,
                "description": "Nombre de jours avant interdiction de location (loi Climat)",
                "example": 540
              },
              "documentId": {
                "type": "string",
                "format": "uuid",
                "nullable": true,
                "description": "Identifiant du document DPE"
              },
              "documentUrl": {
                "type": "string",
                "nullable": true,
                "description": "URL de téléchargement du document DPE",
                "example": "/documents/files/2b1c.../download"
              },
              "documentName": {
                "type": "string",
                "nullable": true,
                "description": "Nom du document DPE"
              }
            }
          },
          "cgpOverride": {
            "type": "object",
            "nullable": true,
            "description": "Surcharge du conseiller en gestion de patrimoine au niveau du lot",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Identifiant du contact CGP"
              },
              "displayName": {
                "type": "string",
                "description": "Nom affiché du CGP",
                "example": "Jean Dupont"
              },
              "email": {
                "type": "string",
                "nullable": true,
                "description": "Adresse e-mail du CGP"
              },
              "phoneNumber": {
                "type": "string",
                "nullable": true,
                "description": "Numéro de téléphone du CGP"
              },
              "companyName": {
                "type": "string",
                "nullable": true,
                "description": "Raison sociale du CGP"
              },
              "validFrom": {
                "type": "string",
                "format": "date",
                "nullable": true,
                "description": "Date de début de validité de la surcharge"
              }
            }
          },
          "effectiveCgp": {
            "type": "object",
            "nullable": true,
            "description": "Conseiller en gestion de patrimoine effectif à ce jour",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Identifiant du contact CGP"
              },
              "displayName": {
                "type": "string",
                "description": "Nom affiché du CGP",
                "example": "Jean Dupont"
              },
              "companyName": {
                "type": "string",
                "nullable": true,
                "description": "Raison sociale du CGP"
              },
              "source": {
                "type": "string",
                "description": "Origine du CGP effectif",
                "enum": [
                  "unit_override",
                  "owner_referent"
                ],
                "example": "owner_referent"
              }
            }
          }
        }
      },
      "Owner": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'acteur propriétaire (Actor)."
          },
          "ownerProfileId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du profil propriétaire (OwnerProfile) par mandataire."
          },
          "displayName": {
            "type": "string",
            "description": "Nom d'affichage du propriétaire.",
            "example": "SCI Les Tilleuls"
          },
          "firstName": {
            "type": "string",
            "nullable": true,
            "description": "Prénom."
          },
          "lastName": {
            "type": "string",
            "nullable": true,
            "description": "Nom de famille."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Adresse e-mail.",
            "example": "contact@lestilleuls.fr"
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de téléphone."
          },
          "ownerType": {
            "type": "string",
            "description": "Type de propriétaire (personne physique / morale)."
          },
          "companyName": {
            "type": "string",
            "nullable": true,
            "description": "Raison sociale."
          },
          "siret": {
            "type": "string",
            "nullable": true,
            "description": "Numéro SIRET.",
            "example": "81234567800012"
          },
          "taxId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant fiscal."
          },
          "address": {
            "type": "string",
            "nullable": true,
            "description": "Adresse postale."
          },
          "accountingCode": {
            "type": "string",
            "nullable": true,
            "description": "Code comptable du propriétaire."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de création du profil."
          }
        }
      },
      "OwnerMutation": {
        "type": "object",
        "required": [
          "first_name"
        ],
        "properties": {
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "email_address": {
            "type": "string",
            "format": "email"
          },
          "phone_number": {
            "type": "string"
          },
          "owner_type": {
            "type": "string",
            "enum": [
              "individual",
              "company",
              "sci"
            ],
            "default": "individual"
          },
          "company_name": {
            "type": "string"
          },
          "siret": {
            "type": "string"
          },
          "address": {
            "type": "string"
          }
        }
      },
      "OwnerDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'acteur propriétaire (Actor)."
          },
          "profileId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du profil propriétaire (OwnerProfile)."
          },
          "name": {
            "type": "string",
            "description": "Nom complet (prénom + nom).",
            "example": "Jean Dupont"
          },
          "firstName": {
            "type": "string",
            "nullable": true,
            "description": "Prénom."
          },
          "lastName": {
            "type": "string",
            "nullable": true,
            "description": "Nom de famille."
          },
          "contactType": {
            "type": "string",
            "description": "Type de contact (toujours \"owner\").",
            "example": "owner"
          },
          "subType": {
            "type": "string",
            "description": "Sous-type (type de propriétaire)."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Adresse e-mail.",
            "example": "jean.dupont@example.fr"
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de téléphone."
          },
          "companyName": {
            "type": "string",
            "nullable": true,
            "description": "Raison sociale."
          },
          "siret": {
            "type": "string",
            "nullable": true,
            "description": "Numéro SIRET.",
            "example": "81234567800012"
          },
          "address": {
            "type": "string",
            "nullable": true,
            "description": "Adresse postale."
          },
          "taxId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant fiscal."
          },
          "bankAccounts": {
            "type": "array",
            "description": "Comptes bancaires du propriétaire.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "label": {
                  "type": "string",
                  "nullable": true,
                  "description": "Libellé du compte."
                },
                "iban": {
                  "type": "string",
                  "nullable": true
                },
                "bic": {
                  "type": "string",
                  "nullable": true
                },
                "bankName": {
                  "type": "string",
                  "nullable": true,
                  "description": "Nom de la banque."
                },
                "isDefault": {
                  "type": "boolean",
                  "description": "Compte par défaut."
                }
              }
            }
          },
          "ownerships": {
            "type": "array",
            "description": "Détentions de tantièmes par lot.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "propertyName": {
                  "type": "string",
                  "description": "Nom de l'immeuble."
                },
                "propertyId": {
                  "type": "string",
                  "format": "uuid"
                },
                "unitIdentifier": {
                  "type": "string",
                  "description": "Identifiant du lot."
                },
                "unitId": {
                  "type": "string",
                  "format": "uuid"
                },
                "shareNumerator": {
                  "type": "integer",
                  "description": "Numérateur de la quote-part."
                },
                "shareDenominator": {
                  "type": "integer",
                  "description": "Dénominateur de la quote-part."
                }
              }
            }
          },
          "properties": {
            "type": "array",
            "description": "Immeubles détenus par le propriétaire.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "name": {
                  "type": "string",
                  "description": "Nom de l'immeuble."
                },
                "propertyType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type d'immeuble."
                },
                "address": {
                  "type": "string",
                  "nullable": true
                },
                "city": {
                  "type": "string",
                  "nullable": true
                },
                "unitsOwned": {
                  "type": "integer",
                  "description": "Nombre de lots détenus dans cet immeuble."
                }
              }
            }
          },
          "ownerPayments": {
            "type": "array",
            "description": "10 derniers reversements au propriétaire.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "reference": {
                  "type": "string",
                  "nullable": true
                },
                "billingRunReference": {
                  "type": "string",
                  "nullable": true,
                  "description": "Référence de la campagne de facturation associée."
                },
                "periodStart": {
                  "type": "string",
                  "format": "date",
                  "nullable": true
                },
                "periodEnd": {
                  "type": "string",
                  "format": "date",
                  "nullable": true
                },
                "grossAmountCents": {
                  "type": "integer",
                  "description": "Montant brut en centimes."
                },
                "netAmountCents": {
                  "type": "integer",
                  "description": "Montant net en centimes."
                },
                "status": {
                  "type": "string"
                },
                "executedAt": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                }
              }
            }
          },
          "mandates": {
            "type": "array",
            "description": "10 derniers mandats de gestion.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "reference": {
                  "type": "string",
                  "nullable": true
                },
                "mandateType": {
                  "type": "string",
                  "description": "Type de mandat."
                },
                "status": {
                  "type": "string"
                },
                "startDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true
                },
                "endDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true
                }
              }
            }
          },
          "currentCgp": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "CGP (conseiller en gestion de patrimoine) actuellement affecté au propriétaire.",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "displayName": {
                "type": "string"
              },
              "email": {
                "type": "string",
                "nullable": true
              },
              "phoneNumber": {
                "type": "string",
                "nullable": true
              },
              "companyName": {
                "type": "string",
                "nullable": true
              },
              "activity": {
                "type": "string",
                "nullable": true
              },
              "validFrom": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Début de validité de l'affectation."
              }
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création du profil."
          }
        }
      },
      "Tenant": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'acteur locataire (Actor)."
          },
          "tenantProfileId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du profil locataire (TenantProfile) par mandataire."
          },
          "displayName": {
            "type": "string",
            "description": "Nom d'affichage du locataire.",
            "example": "Dupont Jean"
          },
          "firstName": {
            "type": "string",
            "nullable": true,
            "description": "Prénom."
          },
          "lastName": {
            "type": "string",
            "nullable": true,
            "description": "Nom de famille."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Adresse e-mail effective de facturation (billing_email, sinon profil, sinon acteur).",
            "example": "jean.dupont@example.fr"
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de téléphone."
          },
          "tenantType": {
            "type": "string",
            "description": "Type de locataire (personne physique / morale)."
          },
          "tradeName": {
            "type": "string",
            "nullable": true,
            "description": "Nom commercial (locataire professionnel)."
          },
          "siret": {
            "type": "string",
            "nullable": true,
            "description": "Numéro SIRET.",
            "example": "81234567800012"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de création du profil."
          }
        }
      },
      "TenantDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'acteur locataire (Actor)."
          },
          "profileId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant du profil locataire (TenantProfile)."
          },
          "name": {
            "type": "string",
            "description": "Nom d'affichage du locataire.",
            "example": "Jean Dupont"
          },
          "firstName": {
            "type": "string",
            "nullable": true,
            "description": "Prénom."
          },
          "lastName": {
            "type": "string",
            "nullable": true,
            "description": "Nom de famille."
          },
          "contactType": {
            "type": "string",
            "description": "Type de contact (toujours \"tenant\").",
            "example": "tenant"
          },
          "subType": {
            "type": "string",
            "description": "Sous-type (type de locataire)."
          },
          "email": {
            "type": "string",
            "nullable": true,
            "description": "Adresse e-mail effective de facturation (billing_email, sinon profil, sinon acteur).",
            "example": "jean.dupont@example.fr"
          },
          "phone": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de téléphone."
          },
          "tradeName": {
            "type": "string",
            "nullable": true,
            "description": "Nom commercial (locataire professionnel)."
          },
          "siret": {
            "type": "string",
            "nullable": true,
            "description": "Numéro SIRET.",
            "example": "81234567800012"
          },
          "vatNumber": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de TVA intracommunautaire."
          },
          "billingEmail": {
            "type": "string",
            "nullable": true,
            "description": "E-mail dédié à la facturation."
          },
          "billingAddress": {
            "type": "string",
            "nullable": true,
            "description": "Adresse de facturation."
          },
          "bankAccounts": {
            "type": "array",
            "description": "Comptes bancaires du locataire.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "label": {
                  "type": "string",
                  "nullable": true,
                  "description": "Libellé du compte."
                },
                "iban": {
                  "type": "string",
                  "nullable": true
                },
                "bic": {
                  "type": "string",
                  "nullable": true
                },
                "bankName": {
                  "type": "string",
                  "nullable": true,
                  "description": "Nom de la banque."
                },
                "isDefault": {
                  "type": "boolean",
                  "description": "Compte par défaut."
                }
              }
            }
          },
          "leases": {
            "type": "array",
            "description": "Baux du locataire.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "reference": {
                  "type": "string",
                  "nullable": true
                },
                "status": {
                  "type": "string"
                },
                "leaseType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type de bail."
                },
                "startDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true
                },
                "endDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true
                },
                "unitIdentifier": {
                  "type": "string",
                  "nullable": true,
                  "description": "Identifiant du premier lot (fallback legacy)."
                },
                "propertyName": {
                  "type": "string",
                  "nullable": true,
                  "description": "Nom de l'immeuble du premier lot (fallback legacy)."
                },
                "units": {
                  "type": "array",
                  "description": "Lots rattachés au bail.",
                  "items": {
                    "type": "object",
                    "additionalProperties": true,
                    "properties": {
                      "identifier": {
                        "type": "string",
                        "nullable": true,
                        "description": "Identifiant du lot."
                      },
                      "propertyName": {
                        "type": "string",
                        "nullable": true,
                        "description": "Nom de l'immeuble."
                      }
                    }
                  }
                },
                "securityDepositId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Identifiant du dépôt de garantie associé."
                }
              }
            }
          },
          "rentCalls": {
            "type": "array",
            "description": "Appels de loyer du locataire.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "reference": {
                  "type": "string",
                  "nullable": true
                },
                "periodStart": {
                  "type": "string",
                  "format": "date"
                },
                "periodEnd": {
                  "type": "string",
                  "format": "date"
                },
                "totalAmountCents": {
                  "type": "integer",
                  "description": "Montant total appelé en centimes."
                },
                "rentAmountCents": {
                  "type": "integer",
                  "description": "Part loyer en centimes."
                },
                "chargesAmountCents": {
                  "type": "integer",
                  "description": "Part charges en centimes."
                },
                "paidAmountCents": {
                  "type": "integer",
                  "description": "Montant réglé en centimes (projeté du grand livre)."
                },
                "remainingAmountCents": {
                  "type": "integer",
                  "description": "Reste à payer en centimes."
                },
                "fullyPaid": {
                  "type": "boolean",
                  "description": "Appel intégralement soldé."
                },
                "overdue": {
                  "type": "boolean",
                  "description": "Appel en retard."
                },
                "dueDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true
                },
                "status": {
                  "type": "string"
                },
                "sentAt": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true
                }
              }
            }
          },
          "payments": {
            "type": "array",
            "description": "10 derniers paiements du locataire.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "amountCents": {
                  "type": "integer",
                  "description": "Montant en centimes."
                },
                "currency": {
                  "type": "string",
                  "description": "Devise."
                },
                "date": {
                  "type": "string",
                  "format": "date",
                  "description": "Date du paiement."
                },
                "reference": {
                  "type": "string",
                  "nullable": true
                },
                "status": {
                  "type": "string"
                },
                "leaseReference": {
                  "type": "string",
                  "nullable": true,
                  "description": "Référence du bail associé."
                },
                "leaseId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true
                }
              }
            }
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création du profil."
          }
        }
      },
      "Payment": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "reference": {
            "type": "string",
            "nullable": true,
            "description": "Référence du paiement",
            "example": "PAY-2026-00042"
          },
          "amountCents": {
            "type": "integer",
            "description": "Montant en centimes",
            "example": 120000
          },
          "currency": {
            "type": "string",
            "description": "Devise ISO 4217",
            "example": "EUR"
          },
          "amount": {
            "$ref": "#/components/schemas/Money"
          },
          "paymentDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date du paiement"
          },
          "paymentMethod": {
            "type": "string",
            "nullable": true,
            "description": "Moyen de paiement (ex. virement, prélèvement, chèque)",
            "example": "virement"
          },
          "direction": {
            "type": "string",
            "enum": [
              "inflow",
              "outflow"
            ],
            "description": "Sens du flux : entrant (encaissement) ou sortant (reversement)",
            "example": "inflow"
          },
          "status": {
            "type": "string",
            "description": "Statut du paiement",
            "example": "allocated"
          },
          "leaseReference": {
            "type": "string",
            "nullable": true,
            "description": "Référence du bail rattaché"
          },
          "leaseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du bail rattaché"
          },
          "bankAccountId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Compte bancaire associé"
          },
          "tenantName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du locataire"
          }
        }
      },
      "PaymentDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "reference": {
            "type": "string",
            "nullable": true,
            "description": "Référence du paiement",
            "example": "PAY-2026-00042"
          },
          "amountCents": {
            "type": "integer",
            "description": "Montant en centimes",
            "example": 120000
          },
          "currency": {
            "type": "string",
            "description": "Devise ISO 4217",
            "example": "EUR"
          },
          "amount": {
            "$ref": "#/components/schemas/Money"
          },
          "paymentDate": {
            "type": "string",
            "format": "date",
            "nullable": true,
            "description": "Date du paiement"
          },
          "paymentMethod": {
            "type": "string",
            "nullable": true,
            "description": "Moyen de paiement (ex. virement, prélèvement, chèque)",
            "example": "virement"
          },
          "direction": {
            "type": "string",
            "enum": [
              "inflow",
              "outflow"
            ],
            "description": "Sens du flux : entrant (encaissement) ou sortant (reversement)",
            "example": "inflow"
          },
          "status": {
            "type": "string",
            "description": "Statut du paiement",
            "example": "allocated"
          },
          "leaseReference": {
            "type": "string",
            "nullable": true,
            "description": "Référence du bail rattaché"
          },
          "leaseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du bail rattaché"
          },
          "bankAccountId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Compte bancaire associé"
          },
          "tenantName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du locataire"
          },
          "bankTransaction": {
            "type": "object",
            "nullable": true,
            "additionalProperties": true,
            "description": "Transaction bancaire rapprochée, le cas échéant",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "label": {
                "type": "string",
                "nullable": true,
                "description": "Libellé de la transaction"
              },
              "amount": {
                "$ref": "#/components/schemas/Money"
              },
              "transactionDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date de la transaction"
              }
            }
          },
          "allocations": {
            "type": "array",
            "description": "Imputations du paiement sur les lignes de facturation",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid"
                },
                "allocatedAmountCents": {
                  "type": "integer",
                  "description": "Montant imputé en centimes",
                  "example": 60000
                },
                "allocatedAmount": {
                  "$ref": "#/components/schemas/Money"
                },
                "billingLineId": {
                  "type": "string",
                  "format": "uuid",
                  "nullable": true,
                  "description": "Ligne de facturation imputée"
                },
                "billingLinePeriod": {
                  "type": "string",
                  "nullable": true,
                  "description": "Période de la ligne de facturation",
                  "example": "2026-01-01 - 2026-01-31"
                },
                "billingLineComputedAmount": {
                  "type": "number",
                  "nullable": true,
                  "description": "Montant calculé de la ligne de facturation, en euros"
                },
                "allocationDate": {
                  "type": "string",
                  "format": "date",
                  "nullable": true,
                  "description": "Date de l'imputation"
                },
                "status": {
                  "type": "string",
                  "description": "Statut de l'imputation",
                  "example": "confirmed"
                }
              }
            }
          },
          "allocatedAmount": {
            "$ref": "#/components/schemas/Money"
          },
          "remainingAmount": {
            "$ref": "#/components/schemas/Money"
          }
        }
      },
      "Incident": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant unique de l'incident."
          },
          "reference": {
            "type": "string",
            "description": "Référence interne de l'incident (unique par mandataire).",
            "example": "INC-2026-000421"
          },
          "flexicielReference": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de réclamation Flexiciel/PREM (Aareon) quand la déclaration a été matérialisée.",
            "example": "1015299"
          },
          "title": {
            "type": "string",
            "nullable": true,
            "description": "Titre court de l'incident.",
            "example": "Écoulement continu"
          },
          "status": {
            "type": "string",
            "description": "Statut courant dans le cycle de vie de l'incident.",
            "enum": [
              "submitted",
              "acknowledged",
              "in_progress",
              "pending_info",
              "pending_intervention",
              "intervention_in_progress",
              "resolved",
              "closed",
              "reopened"
            ],
            "example": "in_progress"
          },
          "priority": {
            "type": "string",
            "description": "Priorité de traitement de l'incident.",
            "enum": [
              "low",
              "normal",
              "high",
              "urgent"
            ],
            "example": "high"
          },
          "scopeType": {
            "type": "string",
            "description": "Type d'entité localisant l'incident (logement, immeuble ou montée).",
            "enum": [
              "Loctavia::Unit",
              "Loctavia::Property",
              "Loctavia::Entrance"
            ],
            "example": "Loctavia::Unit"
          },
          "scopeId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'entité de localisation (selon scopeType)."
          },
          "categoryId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de la catégorie d'incident."
          },
          "categoryName": {
            "type": "string",
            "nullable": true,
            "description": "Libellé de la catégorie d'incident.",
            "example": "Plomberie"
          },
          "assignedToId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du gestionnaire assigné."
          },
          "assignedToName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du gestionnaire assigné."
          },
          "reporterId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de l'acteur déclarant."
          },
          "reporterName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du déclarant."
          },
          "reporterType": {
            "type": "string",
            "nullable": true,
            "description": "Type de l'acteur déclarant (classe de l'acteur)."
          },
          "leaseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du bail associé à l'incident."
          },
          "room": {
            "type": "string",
            "nullable": true,
            "description": "Pièce ou localisation précise dans le logement.",
            "example": "Salle de bain"
          },
          "contactEmail": {
            "type": "string",
            "nullable": true,
            "description": "Email de contact rattaché à l'incident."
          },
          "contactPhone": {
            "type": "string",
            "nullable": true,
            "description": "Téléphone de contact rattaché à l'incident."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création de l'incident."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Date de dernière modification de l'incident."
          },
          "acknowledgedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'accusé de réception (passage en acknowledged)."
          },
          "resolvedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de résolution de l'incident."
          },
          "closedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de clôture de l'incident."
          },
          "escalatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'escalade de l'incident."
          },
          "dueAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'échéance cible de traitement."
          },
          "flexicielType": {
            "type": "string",
            "nullable": true,
            "description": "Type de la typologie Flexiciel (référentiel TNM Aareon)."
          },
          "flexicielNature": {
            "type": "string",
            "nullable": true,
            "description": "Nature de la typologie Flexiciel (référentiel TNM Aareon)."
          },
          "flexicielMotif": {
            "type": "string",
            "nullable": true,
            "description": "Motif de la typologie Flexiciel (référentiel TNM Aareon)."
          },
          "aareonSyncState": {
            "type": "string",
            "description": "État de transmission de la déclaration vers Aareon/PREM.",
            "enum": [
              "pending",
              "sent",
              "materialized",
              "skipped",
              "failed"
            ],
            "example": "sent"
          },
          "aareonSkipReason": {
            "type": "string",
            "nullable": true,
            "description": "Raison du skip de transmission Aareon, le cas échéant.",
            "example": "category_unmapped"
          },
          "aareonSyncRepairable": {
            "type": "boolean",
            "description": "Indique si le skip de transmission Aareon est réparable après enrichissement."
          },
          "aareonSyncStale": {
            "type": "boolean",
            "description": "Indique une déclaration poussée mais jamais matérialisée depuis trop longtemps."
          },
          "aareonPulled": {
            "type": "boolean",
            "description": "Indique si l'incident provient d'un pull Aareon (matérialisé côté PREM)."
          },
          "aareonFollowupsSummary": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Résumé d'état des étapes de follow-up Aareon (verify-after-emission).",
            "properties": {
              "total": {
                "type": "integer",
                "description": "Nombre total d'étapes de follow-up."
              },
              "verified": {
                "type": "integer",
                "description": "Nombre d'étapes confirmées attachées côté Aareon."
              },
              "pending": {
                "type": "integer",
                "description": "Nombre d'étapes en attente de vérification."
              },
              "failed": {
                "type": "integer",
                "description": "Nombre d'étapes en échec."
              },
              "status": {
                "type": "string",
                "description": "Statut global des follow-ups.",
                "enum": [
                  "none",
                  "all_verified",
                  "failed",
                  "partial",
                  "pending"
                ],
                "example": "partial"
              }
            }
          }
        }
      },
      "IncidentDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant unique de l'incident."
          },
          "reference": {
            "type": "string",
            "description": "Référence interne de l'incident (unique par mandataire).",
            "example": "INC-2026-000421"
          },
          "flexicielReference": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de réclamation Flexiciel/PREM (Aareon) quand la déclaration a été matérialisée.",
            "example": "1015299"
          },
          "title": {
            "type": "string",
            "nullable": true,
            "description": "Titre court de l'incident.",
            "example": "Écoulement continu"
          },
          "status": {
            "type": "string",
            "description": "Statut courant dans le cycle de vie de l'incident.",
            "enum": [
              "submitted",
              "acknowledged",
              "in_progress",
              "pending_info",
              "pending_intervention",
              "intervention_in_progress",
              "resolved",
              "closed",
              "reopened"
            ],
            "example": "in_progress"
          },
          "priority": {
            "type": "string",
            "description": "Priorité de traitement de l'incident.",
            "enum": [
              "low",
              "normal",
              "high",
              "urgent"
            ],
            "example": "high"
          },
          "scopeType": {
            "type": "string",
            "description": "Type d'entité localisant l'incident (logement, immeuble ou montée).",
            "enum": [
              "Loctavia::Unit",
              "Loctavia::Property",
              "Loctavia::Entrance"
            ],
            "example": "Loctavia::Unit"
          },
          "scopeId": {
            "type": "string",
            "format": "uuid",
            "description": "Identifiant de l'entité de localisation (selon scopeType)."
          },
          "categoryId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de la catégorie d'incident."
          },
          "categoryName": {
            "type": "string",
            "nullable": true,
            "description": "Libellé de la catégorie d'incident.",
            "example": "Plomberie"
          },
          "assignedToId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du gestionnaire assigné."
          },
          "assignedToName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du gestionnaire assigné."
          },
          "reporterId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant de l'acteur déclarant."
          },
          "reporterName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du déclarant."
          },
          "reporterType": {
            "type": "string",
            "nullable": true,
            "description": "Type de l'acteur déclarant (classe de l'acteur)."
          },
          "leaseId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du bail associé à l'incident."
          },
          "room": {
            "type": "string",
            "nullable": true,
            "description": "Pièce ou localisation précise dans le logement.",
            "example": "Salle de bain"
          },
          "contactEmail": {
            "type": "string",
            "nullable": true,
            "description": "Email de contact rattaché à l'incident."
          },
          "contactPhone": {
            "type": "string",
            "nullable": true,
            "description": "Téléphone de contact rattaché à l'incident."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création de l'incident."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Date de dernière modification de l'incident."
          },
          "acknowledgedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'accusé de réception (passage en acknowledged)."
          },
          "resolvedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de résolution de l'incident."
          },
          "closedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de clôture de l'incident."
          },
          "escalatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'escalade de l'incident."
          },
          "dueAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'échéance cible de traitement."
          },
          "flexicielType": {
            "type": "string",
            "nullable": true,
            "description": "Type de la typologie Flexiciel (référentiel TNM Aareon)."
          },
          "flexicielNature": {
            "type": "string",
            "nullable": true,
            "description": "Nature de la typologie Flexiciel (référentiel TNM Aareon)."
          },
          "flexicielMotif": {
            "type": "string",
            "nullable": true,
            "description": "Motif de la typologie Flexiciel (référentiel TNM Aareon)."
          },
          "aareonSyncState": {
            "type": "string",
            "description": "État de transmission de la déclaration vers Aareon/PREM.",
            "enum": [
              "pending",
              "sent",
              "materialized",
              "skipped",
              "failed"
            ],
            "example": "sent"
          },
          "aareonSkipReason": {
            "type": "string",
            "nullable": true,
            "description": "Raison du skip de transmission Aareon, le cas échéant.",
            "example": "category_unmapped"
          },
          "aareonSyncRepairable": {
            "type": "boolean",
            "description": "Indique si le skip de transmission Aareon est réparable après enrichissement."
          },
          "aareonSyncStale": {
            "type": "boolean",
            "description": "Indique une déclaration poussée mais jamais matérialisée depuis trop longtemps."
          },
          "aareonPulled": {
            "type": "boolean",
            "description": "Indique si l'incident provient d'un pull Aareon (matérialisé côté PREM)."
          },
          "aareonFollowupsSummary": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Résumé d'état des étapes de follow-up Aareon (verify-after-emission).",
            "properties": {
              "total": {
                "type": "integer",
                "description": "Nombre total d'étapes de follow-up."
              },
              "verified": {
                "type": "integer",
                "description": "Nombre d'étapes confirmées attachées côté Aareon."
              },
              "pending": {
                "type": "integer",
                "description": "Nombre d'étapes en attente de vérification."
              },
              "failed": {
                "type": "integer",
                "description": "Nombre d'étapes en échec."
              },
              "status": {
                "type": "string",
                "description": "Statut global des follow-ups.",
                "enum": [
                  "none",
                  "all_verified",
                  "failed",
                  "partial",
                  "pending"
                ],
                "example": "partial"
              }
            }
          },
          "description": {
            "type": "string",
            "nullable": true,
            "description": "Description détaillée de l'incident."
          },
          "outcomeMessage": {
            "type": "string",
            "nullable": true,
            "description": "Message de résolution/issue communiqué."
          },
          "categoryPath": {
            "type": "string",
            "nullable": true,
            "description": "Arborescence complète de la catégorie (racine vers feuille).",
            "example": "Plomberie · Fuite · Fenêtre PVC"
          },
          "scope": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Résumé de l'entité de localisation de l'incident (logement, immeuble ou montée).",
            "properties": {
              "type": {
                "type": "string",
                "description": "Classe de l'entité de localisation.",
                "enum": [
                  "Loctavia::Property",
                  "Loctavia::Unit",
                  "Loctavia::Entrance"
                ]
              },
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Identifiant de l'entité de localisation."
              },
              "name": {
                "type": "string",
                "nullable": true,
                "description": "Nom de l'entité (immeuble ou montée)."
              },
              "identifier": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant du logement (pour un Loctavia::Unit)."
              },
              "address": {
                "type": "string",
                "nullable": true,
                "description": "Adresse de l'entité."
              },
              "propertyId": {
                "type": "string",
                "format": "uuid",
                "nullable": true,
                "description": "Identifiant de l'immeuble parent (logement/montée)."
              },
              "propertyName": {
                "type": "string",
                "nullable": true,
                "description": "Nom de l'immeuble parent."
              },
              "propertyAddress": {
                "type": "string",
                "nullable": true,
                "description": "Adresse de l'immeuble parent."
              },
              "patrimonyCode": {
                "type": "string",
                "nullable": true,
                "description": "Code long patrimoine PRH (code_long, code_bati ou code_montee)."
              }
            }
          },
          "leaseReference": {
            "type": "string",
            "nullable": true,
            "description": "Référence du bail associé à l'incident."
          },
          "routedMaintenanceContractId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Identifiant du contrat de maintenance vers lequel l'incident a été routé."
          },
          "routedMaintenanceContractName": {
            "type": "string",
            "nullable": true,
            "description": "Nom du contrat de maintenance de routage."
          },
          "llmAnalysis": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Analyse LLM structurée de l'incident (enrichissement automatique)."
          },
          "funnelData": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Données de parcours de déclaration (funnel) collectées côté portail."
          },
          "allowedTransitions": {
            "type": "array",
            "description": "Transitions de statut autorisées depuis le statut courant.",
            "items": {
              "type": "string"
            },
            "example": [
              "pending_info",
              "pending_intervention",
              "intervention_in_progress",
              "resolved"
            ]
          },
          "aareonFollowups": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Résumé du dernier envoi de follow-ups Aareon (null tant qu'aucun envoi).",
            "properties": {
              "event": {
                "type": "string",
                "nullable": true,
                "description": "Type d'événement de follow-up émis."
              },
              "posted": {
                "type": "integer",
                "description": "Nombre de follow-ups postés avec succès."
              },
              "errored": {
                "type": "integer",
                "description": "Nombre de follow-ups refusés par Aareon."
              },
              "errors": {
                "type": "array",
                "description": "Détail des erreurs rencontrées.",
                "items": {
                  "type": "object",
                  "additionalProperties": true
                }
              },
              "at": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Horodatage du dernier envoi de follow-ups."
              }
            }
          },
          "aareonFollowupsFailed": {
            "type": "boolean",
            "description": "Indique qu'au moins un follow-up du dernier envoi a été refusé par Aareon."
          },
          "aareonFollowupSteps": {
            "type": "array",
            "description": "Détail granulaire verify-after-emission, une entrée par (code, source) émis vers Aareon.",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "code": {
                  "type": "string",
                  "nullable": true,
                  "description": "Code du follow-up émis."
                },
                "source": {
                  "type": "string",
                  "nullable": true,
                  "description": "Source de l'émission du follow-up."
                },
                "status": {
                  "type": "string",
                  "nullable": true,
                  "description": "État de l'étape (emitted, verified, failed)."
                },
                "emittedAt": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Horodatage d'émission de l'étape."
                },
                "verifiedAt": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "description": "Horodatage de confirmation d'attachement côté Aareon."
                },
                "attempts": {
                  "type": "integer",
                  "nullable": true,
                  "description": "Nombre de tentatives de vérification."
                },
                "error": {
                  "type": "string",
                  "nullable": true,
                  "description": "Message d'erreur de l'étape le cas échéant."
                }
              }
            }
          },
          "attachments": {
            "type": "array",
            "description": "Pièces jointes de l'incident (photos, documents).",
            "items": {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Identifiant de la pièce jointe."
                },
                "filename": {
                  "type": "string",
                  "description": "Nom du fichier.",
                  "example": "fuite-cuisine.jpg"
                },
                "contentType": {
                  "type": "string",
                  "nullable": true,
                  "description": "Type MIME de la pièce jointe.",
                  "example": "image/jpeg"
                },
                "byteSize": {
                  "type": "integer",
                  "description": "Taille du fichier en octets."
                },
                "image": {
                  "type": "boolean",
                  "description": "Indique si la pièce jointe est une image."
                },
                "url": {
                  "type": "string",
                  "description": "Chemin d'accès au blob de la pièce jointe."
                }
              }
            }
          },
          "messagesCount": {
            "type": "integer",
            "description": "Nombre de messages échangés sur l'incident."
          },
          "activeAssignmentsCount": {
            "type": "integer",
            "description": "Nombre d'assignations actives sur l'incident."
          }
        }
      },
      "JournalEntry": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "reference": {
            "type": "string",
            "description": "Numérotation `<journal>-<société>-AAAA-NNN` (ex. LOYERS-CABMAR-2026-042)"
          },
          "journal": {
            "type": "string",
            "enum": [
              "LOYERS",
              "CHARGES",
              "BANQUE",
              "PROPRIO",
              "OD"
            ]
          },
          "societyCode": {
            "type": "string",
            "nullable": true,
            "description": "Code de la société comptable émettrice",
            "example": "CABMAR"
          },
          "entryDate": {
            "type": "string",
            "format": "date-time"
          },
          "accountingDate": {
            "type": "string",
            "format": "date"
          },
          "periodStart": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "periodEnd": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "validated",
              "posted",
              "reversed"
            ]
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "totalDebit": {
            "type": "number",
            "description": "Somme des débits des lignes, en euros"
          },
          "totalCredit": {
            "type": "number",
            "description": "Somme des crédits des lignes, en euros"
          },
          "linesCount": {
            "type": "integer"
          },
          "sourceType": {
            "type": "string",
            "nullable": true,
            "description": "Pièce d'origine (ex. Loctavia::BillingLine, Loctavia::Payment)"
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        }
      },
      "JournalEntryLine": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "lineNumber": {
            "type": "integer"
          },
          "accountId": {
            "type": "string",
            "format": "uuid"
          },
          "accountCode": {
            "type": "string",
            "nullable": true,
            "description": "Numéro de compte PCG (ex. 411000, 706000)"
          },
          "accountName": {
            "type": "string",
            "nullable": true
          },
          "debit": {
            "type": "number",
            "description": "Montant débité, en euros"
          },
          "credit": {
            "type": "number",
            "description": "Montant crédité, en euros"
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "entityType": {
            "type": "string",
            "nullable": true,
            "description": "Entité analytique rattachée (ex. Loctavia::TenantProfile)"
          },
          "entityId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "letteringCode": {
            "type": "string",
            "nullable": true
          },
          "letteringStatus": {
            "type": "string",
            "nullable": true,
            "enum": [
              "unlettered",
              "partially_lettered",
              "lettered",
              null
            ]
          }
        }
      },
      "JournalEntryDetails": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "reference": {
            "type": "string",
            "description": "Numérotation `<journal>-<société>-AAAA-NNN` (ex. LOYERS-CABMAR-2026-042)"
          },
          "journal": {
            "type": "string",
            "enum": [
              "LOYERS",
              "CHARGES",
              "BANQUE",
              "PROPRIO",
              "OD"
            ]
          },
          "societyCode": {
            "type": "string",
            "nullable": true,
            "description": "Code de la société comptable émettrice",
            "example": "CABMAR"
          },
          "entryDate": {
            "type": "string",
            "format": "date-time"
          },
          "accountingDate": {
            "type": "string",
            "format": "date"
          },
          "periodStart": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "periodEnd": {
            "type": "string",
            "format": "date",
            "nullable": true
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "validated",
              "posted",
              "reversed"
            ]
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "totalDebit": {
            "type": "number",
            "description": "Somme des débits des lignes, en euros"
          },
          "totalCredit": {
            "type": "number",
            "description": "Somme des crédits des lignes, en euros"
          },
          "linesCount": {
            "type": "integer"
          },
          "sourceType": {
            "type": "string",
            "nullable": true,
            "description": "Pièce d'origine (ex. Loctavia::BillingLine, Loctavia::Payment)"
          },
          "sourceId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "validatedBy": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Utilisateur ayant validé l'écriture"
          },
          "validatedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de validation de l'écriture"
          },
          "reversalOfId": {
            "type": "string",
            "format": "uuid",
            "nullable": true,
            "description": "Écriture extournée par celle-ci"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": true,
            "nullable": true,
            "description": "Métadonnées libres de l'écriture"
          },
          "lines": {
            "type": "array",
            "description": "Lignes en partie double",
            "items": {
              "$ref": "#/components/schemas/JournalEntryLine"
            }
          }
        }
      },
      "FecExportMutation": {
        "type": "object",
        "required": [
          "fiscal_year"
        ],
        "properties": {
          "fiscal_year": {
            "type": "integer",
            "description": "Exercice civil à exporter (ex. 2026)"
          },
          "siren": {
            "type": "string",
            "description": "SIREN émetteur (9 chiffres). Défaut : 000000000"
          }
        }
      },
      "FecExport": {
        "type": "object",
        "additionalProperties": true,
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "fiscalYear": {
            "type": "integer",
            "description": "Exercice fiscal concerné",
            "example": 2026
          },
          "siren": {
            "type": "string",
            "description": "SIREN émetteur (9 chiffres), normalisé",
            "example": "123456789"
          },
          "filename": {
            "type": "string",
            "description": "Nom réglementaire `<siren>FEC<AAAA1231>.txt`",
            "example": "123456789FEC20261231.txt"
          },
          "entriesCount": {
            "type": "integer",
            "description": "Nombre d'écritures incluses",
            "example": 342
          },
          "linesCount": {
            "type": "integer",
            "description": "Nombre de lignes incluses",
            "example": 918
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Requête incorrecte - paramètres invalides",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "bad_request",
              "message": "Paramètres de requête invalides"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Authentification requise",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "unauthorized",
              "message": "Authentification requise"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Accès refusé - permissions insuffisantes",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "forbidden",
              "message": "Accès refusé"
            }
          }
        }
      },
      "NotFound": {
        "description": "Ressource introuvable",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "not_found",
              "message": "Ressource introuvable"
            }
          }
        }
      },
      "UnprocessableEntity": {
        "description": "Erreurs de validation",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "validation_error",
              "message": "La validation a échoué",
              "details": [
                "Le nom est requis",
                "L'identifiant d'espace de travail doit être valide"
              ]
            }
          }
        }
      },
      "InternalError": {
        "description": "Erreur interne du serveur",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "internal_error",
              "message": "Une erreur inattendue s'est produite"
            }
          }
        }
      }
    },
    "securitySchemes": {
      "OAuth2Password": {
        "type": "oauth2",
        "description": "Flow password pour applications de confiance (mobile, CLI, tests)",
        "flows": {
          "password": {
            "tokenUrl": "/oauth/token",
            "scopes": {
              "read": "Lecture des ressources",
              "write": "Modification des ressources",
              "admin": "Accès administratif"
            }
          }
        }
      },
      "OAuth2AuthCode": {
        "type": "oauth2",
        "description": "Flow authorization code pour applications frontend/tierce",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "/oauth/authorize",
            "tokenUrl": "/oauth/token",
            "scopes": {
              "read": "Lecture des ressources",
              "write": "Modification des ressources",
              "admin": "Accès administratif"
            }
          }
        }
      }
    }
  }
}