{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/lexio-rent/json-schema/lexio-rent-balance-schema.json",
  "title": "Balance",
  "description": "Solde de la location dans sa devise ; la caution n’y entre jamais. Tant que `paidAmount + pendingDebitAmount ≤ totalTTC`, `totalTTC = paidAmount + pendingDebitAmount + dueAmount` ; au-delà, `dueAmount` vaut 0.",
  "x-generated": "2026-11-10",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/lexio-rent-paiements-api-openapi.yml#/components/schemas/Balance",
  "type": "object",
  "properties": {
    "totalTTC": {
      "type": "number",
      "minimum": 0,
      "description": "Montant exigible : `totalTTC` de la location, 0 si elle est annulée."
    },
    "paidAmount": {
      "type": "number",
      "description": "Net encaissé : paiements validés moins remboursements validés, caution exclue."
    },
    "pendingDebitAmount": {
      "type": "number",
      "minimum": 0,
      "description": "Prélèvements SEPA soumis, pas encore réglés : ni dans `paidAmount`, ni dans `dueAmount` ; ils y passent au règlement (rejetés, ils reviennent dans `dueAmount`). 0 sans prélèvement en cours."
    },
    "dueAmount": {
      "type": "number",
      "minimum": 0,
      "description": "Reste à payer : `totalTTC − paidAmount − pendingDebitAmount`, 0 au minimum ; plafond d’un encaissement (`422 PAYMENT_EXCEEDS_DUE`)."
    },
    "overpaidAmount": {
      "type": "number",
      "minimum": 0,
      "description": "Trop-perçu : `paidAmount − totalTTC`, 0 au minimum ; à rembourser ou à conserver par le loueur."
    }
  },
  "required": [
    "totalTTC",
    "paidAmount",
    "pendingDebitAmount",
    "dueAmount",
    "overpaidAmount"
  ]
}