Commit Graph
2085 Commits
Author SHA1 Message Date
Herculino Trotta dea8cfee4e test(net-worth): assert share text instead of badge markup 2026-11-11 14:02:56 -03:00
Herculino Trotta 4bf2c2552b feat(net-worth): collapse consolidated breakdown and align share badges
Consolidated rows are collapsible and remember their state per currency in localStorage. Share percentages render as badges on a shared subgrid column so they line up regardless of amount width. Currency and account menus drop their extra padding to align with the card title.
2026-11-11 13:57:21 -03:00
Asish Kumar d590dc39ab feat(net-worth): break consolidated totals down by currency share
A consolidated total on the Net Worth page was a single number: it said
what everything is worth in one currency, but not how much of it each
currency makes up, which is what you want to know when you hold the same
money in several currencies (or in currencies standing for gold, stocks
or crypto).

calculate_currency_totals now keeps, next to each consolidated total, the
components it was built from: the currency's own total and the exchanged
total of every currency that exchanges into it, all in the consolidated
currency. calculate_consolidated_shares gives each of them its share of
the total as a percentage, drops the ones that add nothing and sorts the
rest from largest to smallest. Shares are taken over the absolute total,
so a currency that adds to it always has a positive share and one that
takes from it (debt) a negative one; with a zero total there's no share.

Currencies that hide their exchanged amounts still show up, since they
still count towards the consolidated total, and so do exchange targets
that only exist through the deep search.

On the Net Worth page, each Consolidated row now lists its components
with their share and amount in the consolidated currency. Clicking one
shows that currency's line on the charts, like the currency rows above.
2026-11-11 21:27:17 +05:30
Herculino Trotta 6c3c4c03ec Merge pull request #668 from eitchtee/fix/insights-overview-exchanged
fix(insights): show exchanged amounts in the overview
2026-11-11 10:53:21 -03:00
Herculino Trotta 220ccee140 fix(insights): show exchanged amounts in the overview 2026-11-11 10:53:15 -03:00
Herculino Trotta 1c7bc3db1d Merge pull request #667 from eitchtee/fix/yearly-filter-pills-wrap
fix(yearly-overview): wrap long names in account and currency filters
2026-11-11 10:53:13 -03:00
Herculino Trotta bf83975b97 fix(yearly-overview): wrap long names in account and currency filters 2026-11-11 10:53:04 -03:00
Herculino Trotta 1ab06d544d Merge pull request #666 from eitchtee/fix/badge-overflow
fix(ui): let badges grow to fit long text
2026-11-11 10:52:58 -03:00
Herculino Trotta d2cd4d577a fix(ui): let badges grow to fit long text 2026-11-11 10:52:50 -03:00
eitchtee 4d886a4fea chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-11 13:41:24 +00:00
Herculino Trotta 3a619dc197 Merge pull request #665 from eitchtee/feat/investments-exchanged-amounts
feat(investments): show exchanged amounts in movements and honor the display switch
2026-11-11 10:40:56 -03:00
Herculino Trotta cd33b82b4e feat(investments): show exchanged amounts in movements and honor the display switch
Movements without an other-currency transfer side now show the exchanged
amount, and the converted value card follows show_exchanged_amounts.
2026-11-11 10:39:06 -03:00
eitchtee 7aed2e8574 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-11 13:27:09 +00:00
Herculino Trotta 9d36af78c4 Merge pull request #664 from officialasishkumar/feat/optional-exchanged-amounts
feat(currencies): make displaying exchanged amounts optional
2026-11-11 10:26:39 -03:00
Herculino Trotta 00d37d8c81 refactor(currencies): keep the exchanged amounts display rule in one place
Account.displayed_exchange_currency holds the account/currency precedence for transactions, and shown_exchange_currency() expresses the same rule as a query expression for the insights and account totals, replacing the per-module checks.
2026-11-11 10:22:50 -03:00
Asish Kumar d3f29f5ad1 feat(currencies): make displaying exchanged amounts optional
Currencies and accounts get a "Show exchanged amounts" switch, on by
default. Turning it off hides the amounts converted to the exchange
currency without removing the exchange currency, so consolidated totals
on the Net Worth page keep working.

The switch belongs to whichever one provides the exchange currency:

- Transactions (including both legs of combined transfers) use the
  account's switch when the account has its own exchange currency, and
  the currency's switch otherwise, matching how the exchanged amount is
  picked.
- Account cards and Net Worth account rows follow the account.
- Currency cards, the monthly summary and daily allowance, Net Worth
  currency rows and the month-by-month and year-by-year insights follow
  the currency.

Currency totals still convert hidden currencies, because the
consolidated totals are built from those values; the setting only
leaves them out of the displayed data. The API keeps returning
exchanged_amount for transactions, and the account serializer exposes
the new field (currencies already serialize all fields).

Closes #486
2026-11-11 15:26:04 +05:30
eitchtee 60a0365b23 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-11 01:05:02 +00:00
Herculino Trotta edd045607f Merge pull request #663 from eitchtee/feat/dca-improvements
feat(dca): optional amounts, currency-checked links and entities
2026-11-10 22:04:34 -03:00
Herculino Trotta 3468b10e94 feat(dca): limit create-transaction accounts to the strategy currencies 2026-11-10 21:57:39 -03:00
Herculino Trotta 750b86394e feat(dca): optional amounts, currency-checked links and entities on entries
- Amounts default to the linked transaction's amount when left empty
- Linked transactions must be in the strategy's payment/target currency; pickers only search those
- Allow setting entities on transactions created from an entry
- Fix crash when only the expense transaction was linked
2026-11-10 21:55:29 -03:00
Herculino Trotta 706f8fea2b feat(transactions): allow filtering the transaction picker search
TransactionSelect takes a filters dict sent as query params; the search endpoint applies allowlisted ones (currency, account).
2026-11-10 21:55:29 -03:00
Herculino Trotta eafaf0027c Merge pull request #662 from eitchtee/fix/investments-short-period-return
fix(investments): solve short-period return over the holding period
2026-11-10 20:38:42 -03:00
Herculino Trotta 0093cabfc9 fix(investments): solve short-period return over the holding period
Holdings under a year annualized their rate before turning it back into
the period return, so a few days with a modest gain (+1.3% in one day is
~10,600% a year) fell outside xirr's search range and showed no percentage.
Solve the rate over the period held instead.
2026-11-10 20:35:03 -03:00
eitchtee 37ecc7da1b chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-10 13:59:54 +00:00
Herculino Trotta 5d5a423db5 Merge pull request #661 from eitchtee/weblate
Translations update from Weblate
2026-11-10 10:59:29 -03:00
Weblate b6ac69716c Merge remote-tracking branch 'origin/main' 2026-11-10 13:55:36 +00:00
eitchtee c256671acc chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-10 13:55:32 +00:00
Weblate 0e62594133 Merge remote-tracking branch 'origin/main' 2026-11-10 13:55:06 +00:00
Herculino Trotta 07933ac5c1 Merge pull request #660 from jayhemnani9910/fix/recurring-month-end-keeps-day
fix(transactions): keep a recurrence on its day after a short month
2026-11-10 10:55:03 -03:00
masttera 3c30116072 locale(Russian): update translation
Currently translated at 56.6% (543 of 959 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/ru/
2026-11-10 07:58:57 +00:00
eitchtee 7ebcccdeda chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-10 02:41:08 +00:00
Herculino Trotta 674870641c Merge pull request #659 from eitchtee/fix/linked-transfer-exchanged-values
feat(transactions): redesign combined transfer items + show exchanged amounts for both sides
2026-11-09 23:40:42 -03:00
Herculino Trotta 0854805630 feat(transactions): show combined transfers as two legs on a timeline
- Shared header (date, description, badges); each side gets its own row:
  account with its category, tags and entities, amount + exchanged amount
- Timeline rail from the transfer icon branching into the out/in icons
- Amounts drop below on small screens and sit bottom-right on lg, like
  regular items; spacing matches regular item metadata rows
- Notes move below the legs on transfers so they don't sit in the rail
2026-11-09 23:35:56 -03:00
Herculino Trotta 4826c4932a fix(transactions): show exchanged amount for both sides of combined transfers 2026-11-09 23:16:47 -03:00
Jay Hemnani 6a289327b6 fix(transactions): keep a recurrence on its day after a short month
A monthly recurrence on the 31st clamped to Feb 28 and stayed on the
28th for every later month.
2026-11-10 03:51:15 +05:30
eitchtee bdc0603327 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-09 02:35:42 +00:00
Herculino Trotta a7ae1c7ec4 Merge pull request #657 from eitchtee/feat/distribution-totals-bracket
feat(distribution): show combined projected + current percentage
2026-11-08 23:34:56 -03:00
Herculino Trotta 34ba0c6e6a Merge pull request #658 from eitchtee/feat/investments-redesign
feat(investments): calmer list and detail pages
2026-11-08 23:34:49 -03:00
Herculino Trotta d0b6be14e7 feat(investments): calmer list and detail pages, group holdings by asset class
- One hero number with a single return line; secondary totals behind a Details toggle
- Holdings in one list card with quiet group subheaders, value and %/yr per row
- Group holdings by account group or asset class, remembered in the session
- Detail page: value and chart up top, Your position and home-currency sidebar
- Replace tooltips with visible text; keep amounts from wrapping on phones
2026-11-08 21:48:40 -03:00
Herculino Trotta 55f064ee7c feat(distribution): bracket projected + current segments with their sum
Remove the unused exchanged branch from calculate_percentage_distribution; nothing read it and it mixed up income_current with expense_projected.
2026-11-08 20:16:13 -03:00
eitchtee 10cb4465d8 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-08 22:24:02 +00:00
Herculino Trotta 93c7de2888 Merge pull request #656 from eitchtee/fix/investment-returns
fix(investments): correct returns on unit-priced and value-tracked accounts
0.26.1
2026-11-08 19:23:37 -03:00
Herculino Trotta fda4bade62 fix(investments): count income categories on unit-priced accounts and transfers at their own amount
- Unit-priced accounts now honour their income categories, tags and entities:
  a matching transaction is a gain or loss, and any other unlinked one is money
  in or out at that day's market price. Before, every unlinked outflow was a
  loss and yields were booked as new money in.
- A transfer out of an account tracked by value counts its own amount. It used
  the other side converted at the day's rate, so a coin bought from a savings
  account moved the coin's price change onto the savings account.
2026-11-08 18:05:17 -03:00
Herculino Trotta 448e9c8f5c fix(api): save income categories, tags and entities on account create and update
AccountSerializer assigned the many-to-many fields with setattr, which Django rejects, so any write that included them returned a 500. The default ModelSerializer create/update already handles them.
2026-11-08 17:57:56 -03:00
eitchtee e7665103c0 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
0.26.0
2026-11-08 20:20:28 +00:00
Herculino Trotta bdbcf3ea70 Merge pull request #655 from eitchtee/feat/demo-investments
feat(demo): add investment examples to the demo data
2026-11-08 17:20:04 -03:00
Herculino Trotta b6cb1e8b52 Merge pull request #654 from eitchtee/fix/transfer-account-name-width
fix(transactions): let transfer account names use the free row space
2026-11-08 17:19:55 -03:00
Herculino Trotta d9c296c26b Merge pull request #653 from eitchtee/fix/transfer-form-fields
fix(transfers): entities, paid state and inactive items in the transfer form
2026-11-08 17:19:41 -03:00
Herculino Trotta 78cb61b0b6 feat(demo): add investment examples to the demo data
Investments landed without demo data. The ETF, Bitcoin and savings accounts become investments, and new accounts cover the rest of the tracker: Apple shares (dividends paid into checking, a partial sale, gifted shares with an estimated cost), a retirement fund tracked by value (quarterly gains and a loss, a yearly fee) and gold. Asset classes have targets that add up to 100%, plus one without a target to show how rebalancing leaves it out.

The investment examples use their own random seed, so the rest of the demo is unchanged. The demo test now renders the investment pages and checks each kind of holding has figures.
2026-11-08 17:17:16 -03:00
Herculino Trotta 52eae5180f fix(transactions): let transfer account names use the free row space
Account names on a combined transfer were cut at a fixed 14rem even when the row had room. On large screens the row now stays on one line and the account side can grow up to half of it, so names only truncate past that.
2026-11-08 17:17:05 -03:00