{ "version": "0.10.0", "notes": "### Added\n\n- Balance: **per-security snapshot entry**. A *detailed* account is now entered title by title — each holding has its own row with a security picker (autocomplete over your existing securities, with inline creation of a new ticker), quantity, price (with the optional automatic price fetch), cost basis, and a live unrealized-gain figure. The account's value is the displayed sum of its positions. Simple accounts are unchanged. The security picker accepts any normalized symbol (UPPER/TRIM) — there is no live ticker validation, since the price fetch is a separate, best-effort step; you choose the asset class (Stock / Crypto) when creating a new symbol (#214).\n- Balance: **detail an aggregated account into securities** (wizard). A *simple* account can be switched to *detailed* via a \"Detail into securities\" action in the accounts table. The switch is one-way: it sets the account to detailed and stamps today as the pivot date (`detailed_since`) — past aggregated history stays frozen and read-only, and the individual securities are entered at your next normal snapshot (the wizard does not capture an initial portfolio). Once any holding is entered, the account can no longer revert to simple (enforced both in the UI and in the service) (#215).\n- Balance: **per-security drill-down and unrealized gain in the accounts table and overview**. A detailed account can be expanded to show its securities (value + unrealized gain %), and the unrealized gain (value − cost basis) is aggregated by account, by asset class, and by fiscal envelope in the accounts table and the balance overview card. Positions without a cost basis are flagged \"N/A\" and excluded from the percentage (no division by zero); the per-account Modified Dietz return is unchanged (#216).\n- Balance: an existing snapshot's date can now be moved. The date field is editable in edit mode — change it and save, and the snapshot (with all its lines) is moved to the new date inside a single atomic transaction. If another snapshot already occupies the target date, the move is rejected with a clear message and nothing changes (#200).\n- Balance: **fiscal envelope on accounts**. An account can now carry an optional fiscal envelope (Non-registered, TFSA, RRSP, RRIF, FHSA, RESP — or none), set via a dropdown in the account form. This is a separate axis from the account's type (asset class), so an account holding stocks inside a TFSA is finally expressible — type *Stocks* + envelope *TFSA*. Migration v12 adds the nullable `balance_accounts.vehicle_type` column with a CHECK on the enum and backfills the former TFSA/RRSP accounts (#202, #203).\n- Balance: **stacked-chart envelope axis**. The stacked evolution chart gains an axis sub-toggle — **By asset class** (default, unchanged behaviour) or **By envelope** (groups by fiscal envelope, with a \"None\" bucket for accounts without one). Read your net worth by what you hold *or* by where it's sheltered (#204).\n- Balance: **collapsible return columns**. The accounts table's four Modified Dietz return columns (3M / 1Y / since inception / unadjusted) are now collapsed by default behind a show/hide toggle; the choice is persisted across sessions (`user_preferences.balance_show_returns`) to reduce visual noise for users who only track values (#204).\n\n### Changed\n\n- Balance: clearer terminology. Account groupings (Cash, TFSA, RRSP, etc.) are now consistently called **types** across the balance UI and user guide, to avoid confusion with transaction *categories* (a separate module). The \"Cash\" type is now labelled **Cash** (FR: Liquidités) and \"Mutual fund\" becomes **Funds / ETF** (FR: Fonds / FNB). The wording of *snapshot* is unchanged but glossed on first use (#198).\n- Balance: **a type is now a pure asset class**. The standard types are the five asset classes — Cash, Funds / ETF, Stocks, Crypto, Other. The fiscal envelopes that used to be types (TFSA, RRSP) are no longer types: they moved to the new per-account fiscal-envelope attribute. On migration, existing TFSA/RRSP accounts are reclassed to the **Other** asset class while carrying their envelope (`tfsa`/`rrsp`); the `tfsa`/`rrsp` seed types are deactivated and disappear from the type dropdowns (migrations v12 + v13). New profiles seed five asset classes; the TFSA/RRSP starter accounts now sit under *Other* with their envelope set. Your amounts and history are unchanged — only the grouping changes (#202).\n- Balance: **historical reclass note**. The \"by asset class\" chart axis is recomputed on each account's *current* type, so a snapshot taken *before* this migration for a former TFSA/RRSP account now appears under **Other** on that axis (it no longer shows under \"TFSA\"/\"RRSP\"). This is expected — the new **by envelope** axis still surfaces those CELI/REER, and no value or history is altered (#204).\n- Balance: **renaming a type no longer breaks the translation** (bug fix). Renaming a type used to overwrite its i18n key with the free text, clobbering the FR/EN translation. The custom name is now stored separately in `balance_categories.custom_label`, and the original translation key is never touched (and reappears if you clear the custom name). Migration v12 also defensively recovers any seed type whose translation key had already been clobbered by an earlier rename (#202, #203).\n- Balance: **existing priced accounts auto-converted to detailed**. On migration, every existing priced account (one with an asset class and a symbol) becomes a *detailed* account with a single position — its historical quantity/price lines are mirrored into per-security holdings with no value or history loss, and the aggregated line keeps the total. Priced accounts without an asset class or without a symbol are left untouched. The account's value and all aggregations are unchanged; you can now add further securities to the same account (migrations v14/v15/v16) (#211).\n\n### Fixed\n\n- Balance: the symbol (ticker) is now optional for accounts in a priced type. A priced account can be created or edited without a symbol — manual valuation (quantity × unit price) never needed it; a symbol is only required to use the automatic price-fetch button (#199).", "pub_date": "2026-06-29T21:42:25Z", "platforms": { "linux-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVUakFVTzBFb0RYZ21hTVRtYUQ1a3FSS25jenF0ZlpUdVNEODE3ajBJKyt6S2FQYnVaZ1pyclhUYzZBMVpBOWplaUNQTjkzUWtzZmV1eWVjN0JHRjJwUGtWWG1Db1ZocGdRPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzgyNzY4NzMzCWZpbGU6U2ltcGwgUmVzdWx0YXRfMC4xMC4wX2FtZDY0LmRlYgpUQlVzVnhPMTJhaUtqRHlGNlFtWnFOWkk2bXNFNlM2THhvUDlQVTg5ZUxhcmNMOTIyYURTdG5neTQ1Ykt5bFdXdWhZclU2T2dsL3Z1NkNTS2g5em9BUT09Cg==", "url": "https://git.lacompagniemaximus.com/maximus/Simpl-Resultat/releases/download/v0.10.0/Simpl Resultat_0.10.0_amd64.deb" }, "windows-x86_64": { "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVUakFVTzBFb0RYZ3BIVmJzSlllSXF2MWprMk92TGJWTU9lSkNzZkhaaVUwUGlTaXN2R3R2cFNGVmxsMGxRT09hRURzR0ZYeTJSMmRqQjJOUEZIejFxMHluV0xwYzNZUXdZPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzgyNzY5MzQzCWZpbGU6U2ltcGwgUmVzdWx0YXRfMC4xMC4wX3g2NC1zZXR1cC5leGUKYmpSaGZiQXkrOUV0QnFoblJQQVU5b1JxQkZvakR6OUNpM0U1NTYzWDVxVXdsNWRYL0ZGKzZBazJCWVliVXk5aVBMVk9aNFlMWHNhMk5vWm5iZmJNQWc9PQo=", "url": "https://git.lacompagniemaximus.com/maximus/Simpl-Resultat/releases/download/v0.10.0/Simpl Resultat_0.10.0_x64-setup.exe" } } }