Commit Graph
2076 Commits
Author SHA1 Message Date
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
Herculino Trotta 122f0b7a28 fix(transfers): entities, paid state and inactive items in the transfer form
The transfer form had no entities field and always created paid transfers. Each side now has its own entities, shown as from -> to in the list like category and tags, and a Projected/Paid toggle applies to both sides.

Editing a transfer also offered only active categories, tags and entities and non-archived accounts, so saving silently dropped a deactivated tag or failed on an archived account. The transfer's own items stay selectable, as in the transaction form.
2026-11-08 17:16:49 -03:00
Herculino Trotta b561ec7d77 Merge pull request #652 from eitchtee/weblate
Translations update from Weblate
2026-11-08 16:44:06 -03:00
Herculino Trotta cdc112fa00 locale(Portuguese (Brazil)): update translation
Currently translated at 100.0% (958 of 958 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pt_BR/
2026-11-08 19:40:42 +00:00
eitchtee 90df6227cb chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-08 19:20:48 +00:00
Herculino Trotta 1c7be36ebb Merge pull request #650 from eitchtee/feat/bank-sync-2
feat: bank sync with external providers (Lunch Flow, SimpleFIN, Pluggy)
2026-11-08 16:20:11 -03:00
Herculino Trotta 1369c3edbf Merge remote-tracking branch 'origin/main' into feat/bank-sync-2
# Conflicts:
#	app/apps/export_app/views.py
#	app/templates/includes/sidebar.html
2026-11-08 16:17:06 -03:00
Herculino Trotta cc4c58b676 feat(bank-sync): add Pluggy provider
Brazilian banks through Open Finance. Users give their Pluggy client
credentials and the ids of their connections (items), from Meu Pluggy.

- Uses the cursor-paginated /v2/transactions; /transactions is removed
  after 2026-12-31. Our own filters are sent again with each cursor.
- The direction comes from `type`, not the amount's sign: credit cards
  keep the card's sign, purchases are positive. Checked against a real
  Meu Pluggy card and checking account; the sandbox data doesn't match
  production here.
- Pending transactions keep their id once they post (a card's open bill
  stays pending until it closes), so they're imported unpaid and settled
  later. Future-dated ones (installments, scheduled payments) wait for
  their date. Installments already come dated in their own month.
- Foreign purchases use the account's amount, with the original amount
  in the notes.
- Connections that need the user to log in again show as an error.
2026-11-08 16:10:38 -03:00
Herculino Trotta 2a4202118b feat(bank-sync): import pending transactions and settle them when they post
Providers can now return pending transactions, flagged as such, when
their ids survive posting. They're imported unpaid right away and, once
the bank posts them, marked paid with their final amount and date.

- Settling happens once, so later edits stick, and one marked paid by
  hand is left alone. It goes through save() so a transfer's other side
  follows; no rules run again. reference_date moves only if it still
  followed the date.
- Each sync looks back to the oldest unpaid synced transaction, since a
  card purchase can post weeks later when the bill closes. Pending ones
  older than 60 days are taken as cancelled and no longer followed.
2026-11-08 16:09:23 -03:00
Herculino Trotta 9238c48bb5 feat(bank-sync): add SimpleFIN provider
Users paste a one-time setup token. On save it's claimed and the access
URL it returns is stored; credentials go in a header, never the URL, so
errors don't leak them.

- Providers can validate or transform their settings (clean_settings),
  run by the service form once every other field is valid, so a token
  isn't spent on a form that fails anyway.
- Providers can declare a minimum sync interval. SimpleFIN Bridge
  disables tokens that go much past ~24 requests a day, so it's 6 hours.
- Tokens and access URLs are user input pointing the server at a host:
  only SimpleFIN Bridge is allowed unless SIMPLEFIN_ALLOWED_HOSTS says
  otherwise. Checked again on every request, for restored settings.
- Transactions are fetched per account in 90-day windows, Bridge's
  limit per request. Pending ones are skipped.
2026-11-08 16:08:37 -03:00