Commit Graph
1417 Commits
Author SHA1 Message Date
eitchtee ec9efccdf2 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-11-02 04:18:58 +00:00
Herculino Trotta 3716b9b0e3 feat(transactions): link transfer sides and show them as a single item
Transfers are still two transactions, now linked to each other:
- shown as one item in lists, with each side's amount, account,
  category and tags ("Combine transfers" user setting, on by default)
- date, reference date, paid and mute stay in sync between sides
- edit opens the transfer form; delete, restore, duplicate and bulk
  actions act on both sides
- transfers made by the transfer form now trigger rules for each side

Recurring and quick transactions gain a Transfer type, with a "To
account" and optional "To amount", generating linked transfers. A
transfer can be converted into either.

Existing transfers are left as they are, since there is no reliable
way to pair them.
2026-11-02 01:14:46 -03:00
Herculino Trotta 1d22c9ff66 feat(demo): generate demo data relative to today
Replace the hard-dated demo fixture with a load_demo_data command that
builds the dataset around the current date, so the demo always has data
in the current month. It also covers more features: multi-currency
accounts with exchange rate history, an ETF and Bitcoin tracked with DCA
strategies, transfers, a credit card using reference dates, installment
plans, recurring transactions, quick transactions, rules and filter
presets.
2026-11-01 00:13:01 -03:00
Herculino Trotta 556542ac9e docs(readme): refresh screenshots 2026-11-01 00:12:33 -03:00
eitchtee 83da4226d9 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-31 21:00:46 +00:00
Herculino Trotta 809564a1d3 Merge pull request #634 from eitchtee/feat/reconciliation-cutoff
feat(accounts): reconcile balances against a date or reference month cutoff
2026-10-31 18:00:23 -03:00
Herculino Trotta fcd666946f feat(accounts): reconcile balances against a date or reference month cutoff
Credit cards often have paid transactions dated after the invoice being
closed, which made reconciliation against all paid transactions wrong.

The reconciliation panel now lets you balance against all paid
transactions (previous behavior), paid transactions up to a date, or
paid transactions up to a reference month. The adjustment transaction is
dated at the cutoff so later reconciliations with the same or a later
cutoff include it. An invalid cutoff blocks the reconciliation instead
of silently falling back.
2026-10-31 17:56:36 -03:00
sorcierwax edd87327d0 locale(French): update translation
Currently translated at 100.0% (817 of 817 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/fr/
2026-10-25 12:58:57 +00:00
Herculino Trotta aa92aa1926 Merge pull request #630 from eitchtee/ci/test-runner
ci: run Django test suite on pull requests
2026-10-24 14:05:45 -03:00
Herculino Trotta 5468d17e20 ci: provide container paths and a clean TMPDIR for tests
test(transactions): enable soft delete explicitly in the hard-delete attachment test
2026-10-24 14:01:47 -03:00
eitchtee 2558d601dd chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-24 16:57:23 +00:00
Herculino Trotta d7537b54ad Merge pull request #629 from eitchtee/fix/import-object-authorization
fix(import): enforce object-level authorization on import profiles and runs
2026-10-24 13:56:53 -03:00
Herculino Trotta 4446db3249 test(users): stop using SocialLogin.state_from_request removed in allauth 65.20
django-allauth 65.20 removed SocialLogin.state_from_request, breaking the
OIDC email auto-connect tests after the bump in #627.
2026-10-24 13:27:10 -03:00
Herculino Trotta 1e486a608e fix(import): enforce object-level authorization on import profiles and runs
ImportProfile and ImportRun had no owner, and neither the web views nor the
REST viewsets filtered by the requesting user, so any authenticated user could
read, edit and delete every other user's import profiles and runs
(GHSA-q668-h56g-mfp4).

- ImportProfile is now a SharedObject, with share and take-ownership views
  like transaction rules; the global unique constraint on name is dropped.
- ImportRun is now an OwnedObject owned by the uploader, so runs made with a
  shared profile stay private to whoever ran them.
- Existing runs are backfilled with the owner of their imported
  transactions; existing profiles stay unowned and usable by everyone.
2026-10-24 13:26:37 -03:00
Herculino Trotta 1b4a2eb3d1 Merge pull request #625 from obervinov/fix/rules-set-mute-writes-to-mute
fix(rules): write set_mute action to mute instead of is_paid
2026-10-24 12:00:30 -03:00
eitchtee a6f56c4989 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-24 14:59:16 +00:00
obervinov aa95ade7ce fix(rules): write set_mute action to mute instead of is_paid 2026-10-21 21:51:22 +04:00
Dimitri Decrock 565a770130 locale(Dutch): update translation
Currently translated at 100.0% (817 of 817 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/nl/
2026-10-14 04:57:23 +00:00
Dimitri Decrock a3d75de836 locale(Dutch): update translation
Currently translated at 97.3% (795 of 817 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/nl/
2026-10-14 03:57:23 +00:00
eitchtee 8794aba1c5 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-12 05:47:31 +00:00
Herculino Trotta 3261e5f266 fix(transactions): apply the form amount to a paid transaction converted into an installment plan 2026-10-12 02:41:14 -03:00
Herculino Trotta 35ef1dd716 fix(transactions): apply the form amount to a paid transaction converted into a recurring transaction 2026-10-12 02:41:14 -03:00
Herculino Trotta f52a0f8cd5 locale(Portuguese (Brazil)): update translation
Currently translated at 98.0% (801 of 817 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pt_BR/
2026-10-10 21:57:23 +00:00
eitchtee ac16359ff4 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-10 21:20:53 +00:00
Herculino Trotta 174d2eb340 fix(simulator): use money mask on amount field
Match the other amount fields by using the Alpine money mask, and parse the masked value with the user's separators.
2026-10-10 18:19:07 -03:00
Herculino Trotta 5f71288e44 Merge pull request #612 from fxmacrodata/fxmacrodata-hardening
fix(automatic-exchange-rates): don't follow redirects or log the key in the FXMacroData provider
2026-10-10 17:52:17 -03:00
eitchtee ca267fedef chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-10 20:52:09 +00:00
Herculino Trotta 92c33a9fcc Merge pull request #615 from eitchtee/fix/oidc-unverified-email-autoconnect
feat(auth): make OIDC email trust configurable
2026-10-10 17:51:37 -03:00
Herculino Trotta d1bb9698a0 Merge pull request #614 from eitchtee/feat/simulation-tool
feat: add Simulator tool
2026-10-10 17:51:24 -03:00
Herculino Trotta c274e92f86 Merge pull request #613 from eitchtee/feat/transaction-convert-menu
feat(transactions): convert a transaction into a quick transaction, recurring transaction or installment plan
2026-10-10 17:51:13 -03:00
Herculino Trotta 2544820e1a Merge pull request #569 from eitchtee/copilot/fix-code-scanning-alerts
Stop exposing exception text in OAuth dynamic client registration errors
2026-10-10 17:50:53 -03:00
Herculino Trotta e925822574 fix(oauth): keep specific DCR errors without exposing exception text
Parsing helpers now return (value, error) instead of raising, so no
exception object flows into the response while clients keep the
precise messages they had before.

full_clean() failures map to fixed per-field messages; redirect URI
errors surface as NON_FIELD_ERRORS from Application.clean().

Also reject non-string token_endpoint_auth_method with a 400 instead
of crashing with a TypeError.
2026-10-10 17:48:14 -03:00
Herculino Trotta 59de9f2443 feat(auth): configure OIDC email trust
Allow verified-only linking with OIDC_TRUST_EMAIL=false while retaining case-insensitive matching. Keep unconditional trust enabled by default for compatibility with #518; that mode retains the documented takeover risk.
2026-10-10 17:01:52 -03:00
Herculino Trotta 6e72594ec7 test(simulator): cover baseline calculation and page 2026-10-10 15:26:59 -03:00
Herculino Trotta 916c401ce3 feat(sidebar): add simulator to tools menu 2026-10-10 15:26:59 -03:00
Herculino Trotta bdf0cf8d4c feat(simulator): add simulator tool page
Hyperscript-driven page to simulate one-time, recurring and installment expenses or incomes over the projected balance.
2026-10-10 15:26:59 -03:00
Herculino Trotta 81e572c8ab feat(simulator): add projected baseline calculation
Per-currency monthly net changes from active, tracked accounts, plus the exchange rate for currencies with an exchange currency.
2026-10-10 15:26:59 -03:00
Herculino Trotta 195da63998 feat(transactions): add Convert submenu to the transaction actions menu
Replaces the "Add as quick transaction" action.
2026-10-09 23:25:20 -03:00
Herculino Trotta 8c5c299312 feat(transactions): add views to convert a transaction into a quick transaction, recurring transaction or installment plan 2026-10-09 23:25:19 -03:00
Herculino Trotta cd6069f857 feat(transactions): let new recurring transactions and installment plans adopt an existing transaction 2026-10-09 23:25:19 -03:00
Robert Tidball 237f8efc6c fix(automatic-exchange-rates): don't follow redirects or log the key in the FXMacroData provider 2026-10-05 21:45:20 +11:00
eitchtee 8c631d2893 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-10-03 17:07:08 +00:00
Robert Tidball 1c3c29d366 feat(automatic-exchange-rates): add FXMacroData as a provider 2026-10-01 15:33:26 +10:00
Herculino Trotta 17673681ea locale(Portuguese (Brazil)): update translation
Currently translated at 99.8% (787 of 788 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/pt_BR/
2026-09-13 14:34:33 +00:00
Dimitri Decrock 138fb07ae7 locale(Dutch): update translation
Currently translated at 100.0% (788 of 788 strings)

Translation: WYGIWYH/App
Translate-URL: https://translations.herculino.com/projects/wygiwyh/app/nl/
2026-09-13 11:48:49 +00:00
eitchtee 0de1914ed9 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-09-13 05:22:24 +00:00
Herculino Trotta 28e05d3c95 Merge pull request #603
feat(transactions): update cuelume; bring back improved volume user setting
2026-09-13 02:21:56 -03:00
Herculino Trotta a2ee0b4ae6 feat(transactions): update cuelume; bring back improved volume user setting 2026-09-13 01:24:37 -03:00
eitchtee 5a1c0ab818 chore(locale): update translation files
[skip ci] Automatically generated by Django makemessages workflow
2026-09-12 21:03:37 +00:00
Herculino Trotta f32805ba02 Merge pull request #602
feat(insights): replace fixed overviews with a single arrangeable overview
2026-09-12 18:03:14 -03:00