{
  "meta": {
    "format": "patrice.v2",
    "app": "Patrice",
    "kind": "template",
    "exportedAt": "2026-01-01T00:00:00.000Z",
    "locale": "fr"
  },
  "__instructions": "Tu es un assistant qui remplit un fichier de données patrimoniales au format JSON pour l'application Patrice.\n\nJe te donne : (1) ce fichier JSON, qui contient dans \"__schema\" la description de chaque collection et de chaque champ, avec les valeurs permises (\"enums\") ; (2) mes documents (relevés bancaires, avis d'imposition, tableaux d'amortissement, relevés de titres, estimations…).\n\nTa tâche : remplir les collections \"owners\", \"assets\", \"budgets\", \"savingsGoals\", \"wealthGoals\" et \"taxProfile\" à partir de mes documents.\n\nRègles, dans l'ordre d'importance :\n1. N'invente rien. Un champ que mes documents ne donnent pas reste absent — pas de valeur estimée, pas de placeholder.\n2. Ne modifie jamais un \"id\" existant et n'en crée pas pour un nouvel élément (sauf un nombre négatif temporaire quand un autre nouvel élément doit y faire référence, par exemple une position dans un compte via \"parentId\", ou un prêt lié via \"linkedDebtIds\").\n3. Respecte strictement les listes de valeurs de \"__schema.enums\" (types d'actifs, devises, fréquences…). Si rien ne convient, choisis le type le plus proche et explique-le dans \"details\".\n4. \"value\" est le montant à l'ACHAT (ou le capital emprunté), positif. La valeur actuelle se donne par \"revaluationValue\" + \"revaluationDate\".\n5. Dates au format AAAA-MM-JJ, mois au format AAAA-MM, montants en nombres sans symbole ni séparateur de milliers.\n6. Les propriétaires (\"owner\") doivent exister dans \"owners\" ; ajoute-les si besoin, avec un id court et stable.\n7. Ne supprime rien. Ne touche pas aux champs marqués \"readonly\", ni aux clés commençant par \"__\".\n8. Réponds avec le fichier JSON complet, et rien d'autre : pas de commentaire, pas de texte autour, pas de bloc Markdown. Conserve \"meta\" et \"__schema\" tels quels.\n\nSi un document est ambigu, mets ce que tu comprends dans \"details\" de l'élément concerné plutôt que d'en déduire un chiffre.",
  "__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"
      }
    ]
  }
}
