Add Region settings tab, remove country-specific defaults - #422
Merged
Conversation
Rename the "Local" settings tab to "Region" and move the operating country selector there alongside currency settings. Remove all hardcoded "Germany" defaults from the frontend forms, backend model, intent fallbacks, and KPI function parameters — the onboarding wizard collects the operating country explicitly. Also neutralize German-specific UI text: remove "Soli" from tax labels, drop § 16 Abs. 6 UStG from the currency description, and replace USt-IdNr / Steuernummer references with generic terms. Co-authored-by: Cursor <cursoragent@cursor.com>
Tax identifiers belong with the tax jurisdiction, not personal identity. Co-authored-by: Cursor <cursoragent@cursor.com>
Merge the separate jurisdiction and currency save buttons into one "Save Region Settings" that saves both in parallel. Co-authored-by: Cursor <cursoragent@cursor.com>
Split the "Business" wizard step into "Profile" (identity, address, bank account) and "Region" (operating country, tax identifiers), matching the settings tab structure. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep each onboarding step focused: Profile has name/email/phone, Address has street address and bank account. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
- Add 59 major countries to operating-country dropdown (previously limited to ~7 with tax models) - Add has_tax_model() check and all_operating_countries() RPC - Show info banner when selected country lacks a tax model, with link to request it on GitHub - Gray out tax-dependent UI (income tax waterfall bars, tax estimates, spendable income KPI) when country is unsupported - Add country_supported flag to salary and KPI responses - Fix remaining Germany default in salary intent Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
|
Will review today |
aaronspring
approved these changes
Jul 21, 2026
aaronspring
left a comment
Contributor
There was a problem hiding this comment.
I like the attempt removing the Germany default.
Regarding Settings: Invoicing now contains "Saved Invoice Notes" and Region could also hold invoice notes. I think your choice of keeping invoice notes under Invoicing is good judgement.
Regarding onboarding:
- Region: current default is Argentina by ordering. Possible to have no default?
LGTM
aaronspring
pushed a commit
that referenced
this pull request
Jul 24, 2026
* feat: add Region settings tab, remove country-specific defaults Rename the "Local" settings tab to "Region" and move the operating country selector there alongside currency settings. Remove all hardcoded "Germany" defaults from the frontend forms, backend model, intent fallbacks, and KPI function parameters — the onboarding wizard collects the operating country explicitly. Also neutralize German-specific UI text: remove "Soli" from tax labels, drop § 16 Abs. 6 UStG from the currency description, and replace USt-IdNr / Steuernummer references with generic terms. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: move VAT and tax number from Profile to Region tab Tax identifiers belong with the tax jurisdiction, not personal identity. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: single save button for Region tab Merge the separate jurisdiction and currency save buttons into one "Save Region Settings" that saves both in parallel. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: onboarding wizard mirrors settings tabs (Profile, Region) Split the "Business" wizard step into "Profile" (identity, address, bank account) and "Region" (operating country, tax identifiers), matching the settings tab structure. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: split Profile wizard step into Profile + Address Keep each onboarding step focused: Profile has name/email/phone, Address has street address and bank account. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: remove German-specific placeholder text from all form fields Co-authored-by: Cursor <cursoragent@cursor.com> * feat: expand country list and graceful tax model degradation - Add 59 major countries to operating-country dropdown (previously limited to ~7 with tax models) - Add has_tax_model() check and all_operating_countries() RPC - Show info banner when selected country lacks a tax model, with link to request it on GitHub - Gray out tax-dependent UI (income tax waterfall bars, tax estimates, spendable income KPI) when country is unsupported - Add country_supported flag to salary and KPI responses - Fix remaining Germany default in salary intent Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
aaronspring
added a commit
that referenced
this pull request
Jul 24, 2026
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
sreedevi-i
pushed a commit
to sreedevi-i/tuttle
that referenced
this pull request
Jul 28, 2026
…dev#427) * refactor: replace black, flake8, isort, pydocstyle with ruff Consolidate four Python linting/formatting tools into ruff: - pyproject.toml: swap black/isort/pydocstyle dev deps for ruff, replace [tool.flake8] + [tool.isort] with [tool.ruff] config - .pre-commit-config.yaml: replace psf/black hook with astral-sh/ruff-pre-commit (ruff check --fix + ruff format) - CI: replace flake8 lint step with ruff check + ruff format --check - Apply ruff format and ruff check --fix across the codebase Supersedes tuttle-dev#420 — the Python 3.14 event-loop crash in black is no longer relevant since ruff is written in Rust. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: make the append-only migration guard formatting-immune (tuttle-dev#428) Ruff reformatted committed revisions in tuttle/migrations/versions, joining multi-line op.execute(...) calls onto one line. The formatting is fine and stays; the guard was the problem — it compared raw diff text, so a cosmetic reflow read as an edit to a shipped schema delta and test_versions_are_append_only_in_git failed on this branch locally. Compare the parsed op.* calls in upgrade() instead. Reflows and import sorting become invisible; a change to what a call actually does still fails. Scoped to upgrade() because that is the code already-migrated databases executed, and because downgrade() bodies were legitimately replaced with `raise NotImplementedError` after the fact. CI never caught any of this: actions/checkout defaults to fetch-depth: 1, and the guard skips files whose per-file git log has one commit — under a shallow clone that is every file, so the assert always passed vacuously. With full history it also surfaces a real pre-existing violation on main (c3d70beffa72, backfill changed from "" to "Unknown" in 9cec3e0), which is grandfathered here with a comment and tracked in tuttle-dev#429. Verified: ruff check clean, ruff format --check clean, 504 passed / 1 skipped, and the guard still fails on a planted table rename. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * Add Region settings tab, remove country-specific defaults (tuttle-dev#422) * feat: add Region settings tab, remove country-specific defaults Rename the "Local" settings tab to "Region" and move the operating country selector there alongside currency settings. Remove all hardcoded "Germany" defaults from the frontend forms, backend model, intent fallbacks, and KPI function parameters — the onboarding wizard collects the operating country explicitly. Also neutralize German-specific UI text: remove "Soli" from tax labels, drop § 16 Abs. 6 UStG from the currency description, and replace USt-IdNr / Steuernummer references with generic terms. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: move VAT and tax number from Profile to Region tab Tax identifiers belong with the tax jurisdiction, not personal identity. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: single save button for Region tab Merge the separate jurisdiction and currency save buttons into one "Save Region Settings" that saves both in parallel. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: onboarding wizard mirrors settings tabs (Profile, Region) Split the "Business" wizard step into "Profile" (identity, address, bank account) and "Region" (operating country, tax identifiers), matching the settings tab structure. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: split Profile wizard step into Profile + Address Keep each onboarding step focused: Profile has name/email/phone, Address has street address and bank account. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: remove German-specific placeholder text from all form fields Co-authored-by: Cursor <cursoragent@cursor.com> * feat: expand country list and graceful tax model degradation - Add 59 major countries to operating-country dropdown (previously limited to ~7 with tax models) - Add has_tax_model() check and all_operating_countries() RPC - Show info banner when selected country lacks a tax model, with link to request it on GitHub - Gray out tax-dependent UI (income tax waterfall bars, tax estimates, spendable income KPI) when country is unsupported - Add country_supported flag to salary and KPI responses - Fix remaining Germany default in salary intent Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> * style: ruff format intent.py after merging main Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * style: ruff format intent.py after merging main (tuttle-dev#422) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Aaron Spring <12237157+aaronspring@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Aaron Spring <draaronspring@proton.me>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
"Germany"defaults — frontend forms, backend model field, intent fallbacks, and KPI function parameters all default to empty string§ 16 Abs. 6 UStGcitation, replaceUSt-IdNr/Steuernummerwith generic labelsTest plan
operating_country = "Germany"still work normally