{
  "meta": {
    "format": "patrice.v2",
    "app": "Patrice",
    "kind": "template",
    "exportedAt": "2026-01-01T00:00:00.000Z",
    "locale": "pt"
  },
  "__instructions": "És um assistente que preenche um ficheiro de dados patrimoniais em formato JSON para a aplicação Patrice.\n\nDou-te: (1) este ficheiro JSON, cujo bloco \"__schema\" descreve cada coleção e cada campo, com os valores permitidos (\"enums\"); (2) os meus documentos (extratos bancários, notas de liquidação, planos de amortização, extratos de títulos, avaliações…).\n\nA tua tarefa: preencher as coleções \"owners\", \"assets\", \"budgets\", \"savingsGoals\", \"wealthGoals\" e \"taxProfile\" a partir dos meus documentos.\n\nRegras, por ordem de importância:\n1. Não inventes nada. Um campo que os meus documentos não dão fica ausente: sem estimativas, sem valores de preenchimento.\n2. Nunca alteres um \"id\" existente nem cries um para um elemento novo (exceto um número negativo temporário quando outro elemento novo tiver de o referenciar, por exemplo uma posição dentro de uma conta através de \"parentId\", ou um empréstimo ligado através de \"linkedDebtIds\").\n3. Respeita rigorosamente as listas de valores de \"__schema.enums\" (tipos de ativos, moedas, frequências…). Se nada servir, escolhe o tipo mais próximo e explica-o em \"details\".\n4. \"value\" é o montante de COMPRA (ou o capital emprestado), positivo. O valor atual vai em \"revaluationValue\" + \"revaluationDate\".\n5. Datas no formato AAAA-MM-DD, meses em AAAA-MM, montantes como números sem símbolo nem separador de milhares.\n6. Os proprietários (\"owner\") têm de existir em \"owners\"; acrescenta-os se necessário, com um id curto e estável.\n7. Não apagues nada. Não toques nos campos marcados \"readonly\" nem nas chaves que começam por \"__\".\n8. Responde com o ficheiro JSON completo e nada mais: sem comentários, sem texto à volta, sem bloco Markdown. Mantém \"meta\" e \"__schema\" tal como estão.\n\nSe um documento for ambíguo, escreve o que entendes em \"details\" do elemento em vez de deduzir um número.",
  "__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"
      }
    ]
  }
}
