{
  "meta": {
    "format": "patrice.v2",
    "app": "Patrice",
    "kind": "template",
    "exportedAt": "2026-01-01T00:00:00.000Z",
    "locale": "es"
  },
  "__instructions": "Eres un asistente que rellena un archivo de datos patrimoniales en formato JSON para la aplicación Patrice.\n\nTe doy: (1) este archivo JSON, cuyo bloque \"__schema\" describe cada colección y cada campo, con los valores permitidos (\"enums\"); (2) mis documentos (extractos bancarios, avisos fiscales, cuadros de amortización, extractos de valores, tasaciones…).\n\nTu tarea: rellenar las colecciones \"owners\", \"assets\", \"budgets\", \"savingsGoals\", \"wealthGoals\" y \"taxProfile\" a partir de mis documentos.\n\nReglas, por orden de importancia:\n1. No inventes nada. Un campo que mis documentos no dan queda ausente: sin estimaciones, sin valores de relleno.\n2. Nunca modifiques un \"id\" existente ni crees uno para un elemento nuevo (salvo un número negativo temporal cuando otro elemento nuevo deba referenciarlo, por ejemplo una posición dentro de una cuenta mediante \"parentId\", o un préstamo vinculado mediante \"linkedDebtIds\").\n3. Respeta estrictamente las listas de valores de \"__schema.enums\" (tipos de activos, divisas, frecuencias…). Si nada encaja, elige el tipo más cercano y explícalo en \"details\".\n4. \"value\" es el importe de COMPRA (o el capital prestado), positivo. El valor actual va en \"revaluationValue\" + \"revaluationDate\".\n5. Fechas en formato AAAA-MM-DD, meses en AAAA-MM, importes como números sin símbolo ni separador de miles.\n6. Los propietarios (\"owner\") deben existir en \"owners\"; añádelos si hace falta, con un id corto y estable.\n7. No borres nada. No toques los campos marcados \"readonly\" ni las claves que empiezan por \"__\".\n8. Responde con el archivo JSON completo y nada más: sin comentarios, sin texto alrededor, sin bloque Markdown. Conserva \"meta\" y \"__schema\" tal cual.\n\nSi un documento es ambiguo, escribe lo que entiendes en \"details\" del elemento en lugar de deducir una cifra.",
  "__schema": {
    "format": "patrice.v2",
    "conventions": [
      "Dates are ISO `YYYY-MM-DD`; months are `YYYY-MM`; datetimes are ISO 8601.",
      "Amounts are plain numbers (no currency symbol, no thousands separator, dot as decimal separator), positive for loans as well.",
      "Percent fields are plain numbers: 30 means 30 %.",
      "Fields marked readonly are written by Patrice and ignored on import.",
      "Omit a field you do not know rather than guessing; omitted fields keep their current value on import.",
      "Keys marked `__` (like `__schema`, `__instructions`, `__examples`) are documentation and are never imported."
    ],
    "enums": {
      "assetType": [
        "bank",
        "livret",
        "currency_account",
        "pea",
        "per",
        "cto",
        "assurance_vie",
        "bonds",
        "real_estate_primary",
        "real_estate_rental",
        "real_estate_secondary",
        "real_estate_bare_ownership",
        "stocks",
        "private_equity",
        "scpi",
        "crypto",
        "gold_physical",
        "gold_paper",
        "commodity",
        "car",
        "luxury",
        "loan_real_estate",
        "loan_auto",
        "loan_other",
        "debt_inter_owner",
        "credit_inter_owner"
      ],
      "assetCategory": [
        "savings",
        "real_estate",
        "investments",
        "safehaven",
        "personal",
        "debts"
      ],
      "ownerType": [
        "primary",
        "partner",
        "child",
        "company",
        "couple",
        "other"
      ],
      "currency": [
        "EUR",
        "USD",
        "GBP",
        "CHF",
        "JPY",
        "CAD",
        "AUD",
        "NZD",
        "SEK",
        "NOK",
        "DKK",
        "PLN",
        "CZK",
        "HUF",
        "CNY",
        "SGD",
        "HKD",
        "AED"
      ],
      "usage": [
        "primary",
        "secondary",
        "rental"
      ],
      "loanAmortization": [
        "french",
        "german",
        "bullet"
      ],
      "purchasePriceMode": [
        "total",
        "per_sqm",
        "per_share"
      ],
      "revaluationPriceMode": [
        "total",
        "per_sqm"
      ],
      "marketValuationMode": [
        "auto",
        "manual",
        "index"
      ],
      "cashflowFrequency": [
        "monthly",
        "weekly",
        "semimonthly",
        "quarterly",
        "annual"
      ],
      "autoIncrementFrequency": [
        "weekly",
        "biweekly",
        "monthly",
        "quarterly",
        "semiannual",
        "annual"
      ],
      "historyKind": [
        "purchase",
        "revaluation",
        "manual",
        "close",
        "market_auto",
        "auto_increment",
        "ticker",
        "market_index"
      ],
      "incomeType": [
        "salary",
        "rental",
        "freelance",
        "pension",
        "dividends",
        "other"
      ],
      "expenseType": [
        "loan",
        "dca",
        "rental"
      ],
      "rentalChargeKind": [
        "recurring",
        "exceptional"
      ],
      "goalTargetType": [
        "total",
        "category",
        "type",
        "asset"
      ],
      "goalSource": [
        "free",
        "premium"
      ],
      "taxRegime": [
        "reel",
        "micro_foncier"
      ],
      "companyTaxRegime": [
        "ir",
        "is"
      ],
      "maritalStatus": [
        "single",
        "couple"
      ],
      "tmiMode": [
        "manual",
        "auto"
      ]
    },
    "assetTypeDescriptions": {
      "bank": "current / checking account",
      "livret": "regulated savings account (Livret A, LDDS, LEP…)",
      "currency_account": "account held in a foreign currency",
      "pea": "French equity savings plan (PEA) — a container; positions are child assets with parentId",
      "per": "French retirement savings plan (PER) — container",
      "cto": "securities account — container; positions are child assets with parentId",
      "assurance_vie": "life insurance contract — container",
      "bonds": "bonds or bond funds",
      "real_estate_primary": "main residence",
      "real_estate_rental": "rental property",
      "real_estate_secondary": "second home",
      "real_estate_bare_ownership": "bare ownership (nue-propriété)",
      "stocks": "listed shares or ETFs (use symbol + quantity for automatic pricing)",
      "private_equity": "unlisted shares, start-ups, funds in units",
      "scpi": "real-estate investment trust units (SCPI)",
      "crypto": "crypto-assets (container or single position)",
      "gold_physical": "physical gold, coins, bars",
      "gold_paper": "gold ETF / certificate",
      "commodity": "other commodities",
      "car": "vehicle",
      "luxury": "watches, art, collectibles",
      "loan_real_estate": "mortgage (liability; value = initial amount borrowed, positive)",
      "loan_auto": "car loan (liability)",
      "loan_other": "consumer or other loan (liability)",
      "debt_inter_owner": "money owed by `owner` to `creditorOwnerId` (both are owners of this file)",
      "credit_inter_owner": "money lent by `owner` to another owner (mirror of debt_inter_owner)"
    },
    "propertyTypesByCountry": {
      "FR": [
        "apartment",
        "house"
      ],
      "GB": [
        "detached",
        "semi_detached",
        "terraced",
        "flat"
      ],
      "IT": [
        "apartment",
        "house"
      ],
      "PT": [
        "apartment",
        "house"
      ],
      "ES": [
        "apartment",
        "house"
      ]
    },
    "collections": {
      "owners": {
        "kind": "list",
        "description": "The people and entities who hold assets. `me` is the account holder and always exists. `couple` is the joint holding of `me` and the partner. Assets point to an owner by `id`.",
        "idField": "id",
        "fields": {
          "id": {
            "type": "id",
            "required": true,
            "description": "Stable identifier used by assets.owner (e.g. `me`, `partner`, `couple`, `child_1`, `sci_family`). Never rename an existing id."
          },
          "label": {
            "type": "string",
            "description": "Display name.",
            "required": true
          },
          "type": {
            "type": "enum",
            "enum": "enums.ownerType",
            "description": "Kind of owner. `primary` is the account holder (`me`).",
            "required": true
          },
          "color": {
            "type": "string",
            "description": "Palette key c01…c15 for the badge; leave unset for the default.",
            "readonly": true
          }
        }
      },
      "companies": {
        "kind": "list",
        "description": "Details of the companies (SCI, SARL…) the household holds, one per owner of type `company`. `partners` drives consolidation: only the shares of partners who are household owners count towards the household's wealth. Without partners, the company counts in full.",
        "idField": "ownerId",
        "fields": {
          "ownerId": {
            "type": "ref",
            "ref": "owners",
            "required": true,
            "description": "Id of the owner (type `company`) this record describes."
          },
          "legalForm": {
            "type": "string",
            "description": "Legal form, free text: SCI, SARL, SAS, holding…"
          },
          "taxRegime": {
            "type": "enum",
            "enum": "enums.companyTaxRegime",
            "description": "ir = transparent (profits taxed at the partners' level); is = corporation tax."
          },
          "siren": {
            "type": "string",
            "description": "French company identifier, 9 digits."
          },
          "registeredName": {
            "type": "string",
            "description": "Registered name, as filed."
          },
          "registeredAddress": {
            "type": "string",
            "description": "Registered office address."
          },
          "activity": {
            "type": "string",
            "description": "Main activity."
          },
          "creationDate": {
            "type": "date",
            "description": "Date the company was created."
          },
          "partners": {
            "type": "array",
            "description": "Partners: {ownerId?, label?, sharePct}. `ownerId` = a household owner (their share belongs to the household); `label` alone = an outside partner. The shares add up to 100."
          },
          "notes": {
            "type": "string",
            "description": "Free notes."
          }
        }
      },
      "assets": {
        "kind": "list",
        "description": "Every asset and liability. `value` is the PURCHASE amount (or initial loan amount) in `purchaseCurrency`; today's value is derived from `history`. To record a current valuation, set `revaluationValue` + `revaluationDate` — Patrice turns them into a history point.",
        "idField": "id",
        "fields": {
          "id": {
            "type": "id",
            "description": "Numeric id assigned by Patrice. Keep it on existing assets; OMIT it on new ones (or use a negative temporary number when another new asset must reference it)."
          },
          "type": {
            "type": "enum",
            "enum": "enums.assetType",
            "description": "Asset type. Liabilities are the loan_* and debt_inter_owner types.",
            "required": true
          },
          "name": {
            "type": "string",
            "description": "Name shown in the app.",
            "required": true
          },
          "owner": {
            "type": "ref",
            "ref": "owners",
            "required": true,
            "description": "Owner id from the `owners` list. For a debt_inter_owner, the DEBTOR."
          },
          "value": {
            "type": "number",
            "unit": "money",
            "description": "Purchase amount / initial loan amount, positive, in purchaseCurrency. 0 only for containers (their value is the sum of child positions).",
            "required": true
          },
          "purchaseCurrency": {
            "type": "enum",
            "enum": "enums.currency",
            "description": "Currency of `value` and of the history points (default EUR)."
          },
          "purchaseDate": {
            "type": "date",
            "description": "Purchase / opening date. Defaults to today when omitted."
          },
          "institution": {
            "type": "string",
            "description": "Bank, broker, insurer, notary."
          },
          "details": {
            "type": "string",
            "description": "Free notes."
          },
          "usage": {
            "type": "enum",
            "enum": "enums.usage",
            "description": "Real estate only: main residence, second home or rental."
          },
          "country": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code (FR, CH, GB…). Required for real estate."
          },
          "city": {
            "type": "string",
            "description": "Real estate: city."
          },
          "postalCode": {
            "type": "string",
            "description": "Real estate: postal code."
          },
          "sqm": {
            "type": "number",
            "unit": "sqm",
            "description": "Real estate: surface in square metres."
          },
          "propertyType": {
            "type": "string",
            "description": "Real estate: property type for market estimates — see `propertyTypesByCountry`."
          },
          "marketValuationMode": {
            "type": "enum",
            "enum": "enums.marketValuationMode",
            "description": "Real estate: `manual` (you set the value), `auto` (local market estimate), `index` (national price index applied to your value)."
          },
          "purchasePriceMode": {
            "type": "enum",
            "enum": "enums.purchasePriceMode",
            "description": "How the purchase price was entered; `value` always holds the total."
          },
          "purchasePricePerSqm": {
            "type": "number",
            "unit": "money",
            "description": "Real estate: price per square metre at purchase, when purchasePriceMode = per_sqm."
          },
          "revaluationValue": {
            "type": "number",
            "unit": "money",
            "description": "Latest valuation, in revaluationCurrency (or purchaseCurrency)."
          },
          "revaluationDate": {
            "type": "date",
            "description": "Date of the latest valuation. Required with revaluationValue."
          },
          "revaluationCurrency": {
            "type": "enum",
            "enum": "enums.currency",
            "description": "Currency of revaluationValue."
          },
          "revaluationPriceMode": {
            "type": "enum",
            "enum": "enums.revaluationPriceMode",
            "description": "Real estate: how the revaluation was entered."
          },
          "revaluationPricePerSqm": {
            "type": "number",
            "unit": "money",
            "description": "Real estate: revaluation price per square metre."
          },
          "quantity": {
            "type": "number",
            "description": "Number of shares / units / coins."
          },
          "purchasePrice": {
            "type": "number",
            "unit": "money",
            "description": "Unit price at purchase (shares, crypto, private equity units)."
          },
          "symbol": {
            "type": "string",
            "description": "Ticker symbol (Yahoo Finance format, e.g. `AIR.PA`, `CW8.PA`, `BTC-EUR`) for automatic pricing."
          },
          "tickerEnabled": {
            "type": "boolean",
            "description": "true to price the position from `symbol` × `quantity` automatically."
          },
          "sharePurchases": {
            "type": "array",
            "description": "Private equity: successive purchases `{date, quantity, unitPrice}`; when present they drive quantity, purchasePrice and value."
          },
          "inflationEnabled": {
            "type": "boolean",
            "description": "Index the value on inflation at `inflationRate` per year."
          },
          "inflationRate": {
            "type": "number",
            "unit": "percent",
            "description": "Annual rate for inflationEnabled."
          },
          "depreciationEnabled": {
            "type": "boolean",
            "description": "Depreciate the value at `depreciationRate` per year (vehicles)."
          },
          "depreciationRate": {
            "type": "number",
            "unit": "percent",
            "description": "Annual depreciation rate."
          },
          "loanInterestRate": {
            "type": "number",
            "unit": "percent",
            "description": "Loans: annual interest rate."
          },
          "loanTermMonths": {
            "type": "integer",
            "unit": "months",
            "description": "Loans: total term in months."
          },
          "loanAmortization": {
            "type": "enum",
            "enum": "enums.loanAmortization",
            "description": "Loans: `french` (constant instalment), `german` (constant principal), `bullet` (interest only, principal at the end)."
          },
          "loanRemainingOverride": {
            "type": "number",
            "unit": "money",
            "description": "Loans: outstanding principal today, when the statement says so."
          },
          "loanInsuranceRate": {
            "type": "number",
            "unit": "percent",
            "description": "Loans: annual borrower insurance rate on the INITIAL capital."
          },
          "loanInsuranceTaea": {
            "type": "number",
            "unit": "percent",
            "description": "Loans: TAEA shown on the offer, informative only."
          },
          "loanMonthlyFees": {
            "type": "number",
            "unit": "money",
            "description": "Loans: monthly fees excluding interest and insurance."
          },
          "loanSchedule": {
            "type": "array",
            "description": "Loans: the bank's amortization table, one row per instalment `{date, payment, interest, principal, remaining}` (amounts in the loan currency, `remaining` = outstanding principal AFTER the instalment). When present it overrides the theoretical schedule for the outstanding principal, the monthly instalment and the year's interest."
          },
          "linkedDebtIds": {
            "type": "array",
            "description": "Ids of the loans financing this asset (e.g. the mortgage of a property)."
          },
          "parentId": {
            "type": "ref",
            "ref": "assets",
            "description": "Id of the container account (PEA, CTO, life insurance, crypto wallet) this position belongs to. The container's value is the sum of its positions."
          },
          "creditorOwnerId": {
            "type": "ref",
            "ref": "owners",
            "description": "debt_inter_owner / credit_inter_owner: the other party."
          },
          "linkedInterOwnerId": {
            "type": "ref",
            "ref": "assets",
            "description": "Mirror asset of an inter-owner debt / credit.",
            "readonly": true
          },
          "isLiability": {
            "type": "boolean",
            "description": "true for loans and debts. Derived from `type` when omitted."
          },
          "monthlyRent": {
            "type": "number",
            "unit": "money",
            "description": "Rental property / SCPI: gross rent per `rentFrequency` period."
          },
          "rentFrequency": {
            "type": "enum",
            "enum": "enums.cashflowFrequency",
            "description": "Period of monthlyRent (default monthly)."
          },
          "annualCharges": {
            "type": "number",
            "unit": "money",
            "description": "Rental: recurring annual charges (property tax, co-ownership, insurance, management)."
          },
          "annualExceptionalCharges": {
            "type": "number",
            "unit": "money",
            "description": "Rental: this year's exceptional charges (works)."
          },
          "ownershipShares": {
            "type": "object",
            "description": "Split of ownership in percent by owner id, summing to 100, e.g. {\"me\": 60, \"partner\": 40}. Only for `couple` or company owners."
          },
          "showPerformance": {
            "type": "boolean",
            "description": "Show performance (gain / loss) for this asset in the app."
          },
          "autoIncrement": {
            "type": "object",
            "description": "Recurring contribution: {enabled, amount, currency, frequency (autoIncrementFrequency), startDate, endDate?, paused?}."
          },
          "closeDate": {
            "type": "date",
            "description": "Date the asset was sold / closed. The asset is worth 0 from that date."
          },
          "closeValue": {
            "type": "number",
            "unit": "money",
            "description": "Sale price, when it differs from the last value."
          },
          "history": {
            "type": "array",
            "description": "Valuation history: `{date, value, currency, kind}` with kind in historyKind. Written by Patrice; you may ADD `revaluation` points from statements, never remove existing ones."
          },
          "tickerProvider": {
            "type": "string",
            "description": "Pricing provider.",
            "readonly": true
          },
          "lastTickerUpdate": {
            "type": "datetime",
            "description": "Last automatic price update.",
            "readonly": true
          }
        }
      },
      "budgets": {
        "kind": "list",
        "description": "One entry per month (`YYYY-MM`) with income sources and expense categories. Amounts are MONTHLY equivalents in `currency` (default EUR); `nativeAmount` + `frequency` keep what was entered.",
        "idField": "month",
        "fields": {
          "month": {
            "type": "month",
            "required": true,
            "description": "Month, `YYYY-MM`."
          },
          "incomeItems": {
            "type": "array",
            "description": "Income sources: {id, label, amount, currency?, frequency?, nativeAmount?, type (incomeType), owner? (owner id or `couple`), splitPercent?, linkedAssetId?}."
          },
          "categories": {
            "type": "array",
            "description": "Expense categories: {id, label, amount, currency?, frequency?, nativeAmount?, note?, paidBy? (owner id or `couple`), paidFor?, splitPercent?, isFixed?, type? (expenseType), linkedDebtId?, linkedAssetId?}."
          },
          "monthlyIncome": {
            "type": "number",
            "unit": "money",
            "description": "Legacy total income; ignored when incomeItems is present.",
            "readonly": true
          }
        }
      },
      "savingsGoals": {
        "kind": "list",
        "description": "Short-term savings goals with a target and the amount already set aside.",
        "idField": "id",
        "fields": {
          "id": {
            "type": "id",
            "description": "UUID assigned by Patrice. Omit on new goals."
          },
          "label": {
            "type": "string",
            "description": "Name.",
            "required": true
          },
          "targetAmount": {
            "type": "number",
            "unit": "money",
            "description": "Target, in EUR.",
            "required": true
          },
          "currentAmount": {
            "type": "number",
            "unit": "money",
            "description": "Amount already saved, in EUR."
          },
          "deadline": {
            "type": "month",
            "description": "Target month, `YYYY-MM`."
          },
          "priority": {
            "type": "integer",
            "description": "1 (high) to 3 (low)."
          },
          "icon": {
            "type": "string",
            "description": "Emoji."
          },
          "color": {
            "type": "string",
            "description": "Palette key c01…c15.",
            "readonly": true
          }
        }
      },
      "wealthGoals": {
        "kind": "list",
        "description": "Long-term net-worth targets, on the whole portfolio or on a category, a type or one asset.",
        "idField": "id",
        "fields": {
          "id": {
            "type": "id",
            "description": "Text id assigned by Patrice. Omit on new goals."
          },
          "label": {
            "type": "string",
            "description": "Name.",
            "required": true
          },
          "targetAmount": {
            "type": "number",
            "unit": "money",
            "description": "Target, in EUR.",
            "required": true
          },
          "targetYear": {
            "type": "integer",
            "unit": "years",
            "required": true,
            "description": "Year the target should be reached."
          },
          "targetType": {
            "type": "enum",
            "enum": "enums.goalTargetType",
            "description": "What the target applies to."
          },
          "targetCategoryId": {
            "type": "enum",
            "enum": "enums.assetCategory",
            "description": "When targetType = category."
          },
          "targetTypeId": {
            "type": "enum",
            "enum": "enums.assetType",
            "description": "When targetType = type."
          },
          "targetAssetId": {
            "type": "ref",
            "ref": "assets",
            "description": "When targetType = asset."
          },
          "source": {
            "type": "enum",
            "enum": "enums.goalSource",
            "description": "Origin of the goal.",
            "readonly": true
          },
          "createdAt": {
            "type": "datetime",
            "description": "Creation time.",
            "readonly": true
          },
          "color": {
            "type": "string",
            "description": "Palette key.",
            "readonly": true
          }
        }
      },
      "taxProfile": {
        "kind": "singleton",
        "description": "Household tax profile used by the rental and tax calculations.",
        "idField": "taxResidence",
        "fields": {
          "incomeTaxRate": {
            "type": "number",
            "unit": "percent",
            "description": "Marginal income-tax rate (TMI), e.g. 30."
          },
          "socialLeviesRate": {
            "type": "number",
            "unit": "percent",
            "description": "Social levies rate; null = the legal rate of the year."
          },
          "taxResidence": {
            "type": "string",
            "description": "Country of tax residence, ISO code."
          },
          "taxRegime": {
            "type": "enum",
            "enum": "enums.taxRegime",
            "description": "Rental income regime elected for the household."
          },
          "taxableIncome": {
            "type": "number",
            "unit": "money",
            "description": "Household net taxable income per year, from the tax notice; null = not entered."
          },
          "maritalStatus": {
            "type": "enum",
            "enum": "enums.maritalStatus",
            "description": "single = separate assessment; couple = joint assessment (married, civil partnership)."
          },
          "dependentChildren": {
            "type": "integer",
            "description": "Dependent children counted for the family quotient."
          },
          "tmiMode": {
            "type": "enum",
            "enum": "enums.tmiMode",
            "description": "auto = the marginal rate is derived from the scale; manual = entered by the user."
          }
        }
      }
    },
    "notIncluded": [
      "rental module details (buildings, units, leases, rent transactions, statements)",
      "forecast events and scenarios",
      "shared household membership",
      "generated reports"
    ]
  },
  "owners": [
    {
      "id": "me",
      "label": "Me",
      "type": "primary"
    }
  ],
  "companies": [],
  "assets": [],
  "budgets": [],
  "savingsGoals": [],
  "wealthGoals": [],
  "taxProfile": null,
  "__examples": {
    "assets": [
      {
        "type": "bank",
        "name": "Current account — Example Bank",
        "owner": "me",
        "value": 4200,
        "purchaseCurrency": "EUR",
        "purchaseDate": "2024-01-15",
        "institution": "Example Bank"
      },
      {
        "type": "livret",
        "name": "Livret A",
        "owner": "me",
        "value": 12000,
        "purchaseCurrency": "EUR",
        "purchaseDate": "2021-06-01",
        "revaluationValue": 12850,
        "revaluationDate": "2026-08-31"
      },
      {
        "id": -1,
        "type": "pea",
        "name": "PEA — Example Broker",
        "owner": "me",
        "value": 0,
        "purchaseCurrency": "EUR",
        "purchaseDate": "2022-03-10",
        "institution": "Example Broker"
      },
      {
        "type": "stocks",
        "name": "Amundi MSCI World",
        "owner": "me",
        "parentId": -1,
        "value": 9000,
        "purchaseCurrency": "EUR",
        "purchaseDate": "2022-03-10",
        "symbol": "CW8.PA",
        "quantity": 20,
        "purchasePrice": 450,
        "tickerEnabled": true
      },
      {
        "id": -2,
        "type": "loan_real_estate",
        "name": "Mortgage — main residence",
        "owner": "me",
        "value": 250000,
        "purchaseCurrency": "EUR",
        "purchaseDate": "2020-09-01",
        "loanInterestRate": 1.2,
        "loanTermMonths": 240,
        "loanAmortization": "french",
        "loanInsuranceRate": 0.3,
        "institution": "Example Bank"
      },
      {
        "type": "real_estate_primary",
        "name": "Apartment — Lyon",
        "owner": "me",
        "value": 320000,
        "purchaseCurrency": "EUR",
        "purchaseDate": "2020-09-01",
        "country": "FR",
        "city": "Lyon",
        "postalCode": "69003",
        "sqm": 72,
        "usage": "primary",
        "marketValuationMode": "manual",
        "linkedDebtIds": [
          -2
        ]
      }
    ],
    "budgets": [
      {
        "month": "2026-09",
        "incomeItems": [
          {
            "id": "salary_1",
            "label": "Salary",
            "amount": 3200,
            "currency": "EUR",
            "type": "salary",
            "owner": "me"
          }
        ],
        "categories": [
          {
            "id": "housing",
            "label": "Rent / mortgage",
            "amount": 1100,
            "currency": "EUR",
            "isFixed": true
          },
          {
            "id": "food",
            "label": "Groceries",
            "amount": 450,
            "currency": "EUR"
          }
        ]
      }
    ],
    "savingsGoals": [
      {
        "label": "Emergency fund",
        "targetAmount": 10000,
        "currentAmount": 6500,
        "deadline": "2027-06",
        "priority": 1,
        "icon": "🛟"
      }
    ],
    "wealthGoals": [
      {
        "label": "Net worth 500 k€",
        "targetAmount": 500000,
        "targetYear": 2035,
        "targetType": "total"
      }
    ],
    "taxProfile": [
      {
        "incomeTaxRate": 30,
        "socialLeviesRate": null,
        "taxResidence": "FR",
        "taxRegime": "reel"
      }
    ]
  }
}
