Files
sure/config/locales/views/settings/en.yml
MkDev11 68efe71cdb feat: Customizable Budget Month Start Day (#810)
* Add customizable budget month start day (#253)

Allow users to set a custom month-to-date start date (1st-28th) for
budgeting and MTD calculations. Useful for users who want budget
periods aligned with their pay schedule (e.g., 25th to 24th).

Changes:
- Add month_start_day column to families table (default: 1)
- Add database check constraint for valid range (1-28)
- Add Family#uses_custom_month_start?, custom_month_start_for,
  custom_month_end_for, current_custom_month_period helper methods
- Add Period.current_month_for(family), last_month_for(family) methods
- Update Budget model for custom month boundaries in find_or_bootstrap,
  param_to_date, budget_date_valid?, current?, and name methods
- Add month_start_day setting to Settings > Preferences UI
- Add warning message when custom month start day is configured
- Add comprehensive tests with travel_to for date robustness

Fixes #253

* Add /api/v1/user endpoint for Flutter mobile app and PWA

Expose user preferences including month_start_day via API endpoint
following existing pattern for default_period. This allows Flutter
mobile app and PWA to read/update user preferences through a
consistent API contract.

Endpoints:
- GET /api/v1/user - Read user preferences including family settings
- PATCH /api/v1/user - Update user preferences

Response includes: id, email, first_name, last_name, default_period,
locale, and family settings (currency, timezone, date_format, country,
month_start_day).

* Update Periodable to use family-aware MTD periods

When users select 'current_month' or 'last_month' period filters on
dashboard/reports, now respects the family's custom month_start_day
setting instead of using static calendar month boundaries.

This ensures MTD filter on dashboard is consistent with how budgets
calculate their periods when custom month start day is configured.

* Fix param_to_date to correctly map budget params to custom periods

When a family uses a custom start day, the previous implementation
called custom_month_start_for on the 1st of the month, which incorrectly
shifted dates before the start day to the previous month.

Now we directly construct the date using family.month_start_day, so
'jan-2026' with month_start_day=25 correctly returns Jan 25, 2026
instead of Dec 25, 2025.

* Fix param_to_date and use Current pattern in API controller

- Fix param_to_date to directly construct date with family.month_start_day
  instead of using custom_month_start_for which incorrectly shifted dates
- Replace current_user with Current.user/Current.family in API controller
  to follow project convention used in other API v1 controllers

* Add i18n for budget name method

Use I18n.t for localizable budget period names to follow
project conventions for user-facing strings.

* Remove unused budget_end variable in budget_date_valid?

* Use Date.current for timezone consistency in Budget#current?

* Address PR review feedback

- Remove API users endpoint (mobile won't use yet)
- Remove user route from config/routes.rb
- Remove ai_summary/document_type schema bleed from pdf-import-ai branch

* Pass family to param_to_date for custom month logic

* Run migration to add month_start_day column to schema

* Schema regressions

---------

Co-authored-by: mkdev11 <jaysmth689+github@users.noreply.github.com>
Co-authored-by: Juan José Mata <juanjo.mata@gmail.com>
2026-02-04 23:58:09 +01:00

173 lines
8.0 KiB
YAML

---
en:
views:
settings:
payments:
renewal: "Your contribution continues on %{date}."
cancellation: "Your contribution ends on %{date}."
settings:
ai_prompts:
show:
page_title: AI Prompts
openai_label: OpenAI
disable_ai: Disable AI Assistant
prompt_instructions: Prompt Instructions
main_system_prompt:
title: Main System Prompt
subtitle: Core instructions that define how the AI assistant behaves in all chat conversations
transaction_categorizer:
title: Transaction Categorizer
subtitle: AI automatically categorizes your transactions based on your defined categories
merchant_detector:
title: Merchant Detector
subtitle: AI identifies and enriches transaction data with merchant information
payments:
show:
page_title: Payments
subscription_subtitle: Update your credit card details
subscription_title: Manage contributions
preferences:
show:
country: Country
currency: Currency
date_format: Date format
general_subtitle: Configure your preferences
general_title: General
default_period: Default Period
default_account_order: Default Account Order
language: Language
language_auto: Browser language
page_title: Preferences
theme_dark: Dark
theme_light: Light
theme_subtitle: Choose a preferred theme for the app
theme_system: System
theme_title: Theme
timezone: Timezone
month_start_day: Budget month starts on
month_start_day_hint: Set when your budget month starts (e.g., payday)
month_start_day_warning: Your budgets and MTD calculations will use this custom start day instead of the 1st of each month.
profiles:
destroy:
cannot_remove_self: You cannot remove yourself from the account.
member_removal_failed: There was a problem removing the member.
member_removed: Member was successfully removed.
not_authorized: You are not authorized to remove members.
show:
confirm_delete:
body: Are you sure you want to permanently delete your account? This action
is irreversible.
title: Delete account?
confirm_reset:
body: Are you sure you want to reset your account? This will delete all your accounts, categories, merchants, tags, and other data. This action cannot be undone.
title: Reset account?
confirm_reset_with_sample_data:
body: Are you sure you want to reset your account and load sample data? This will delete your existing data and replace it with demo data so you can explore Sure safely.
title: Reset account and load sample data?
confirm_remove_invitation:
body: Are you sure you want to remove the invitation for %{email}?
title: Remove Invitation
confirm_remove_member:
body: Are you sure you want to remove %{name} from your account?
title: Remove Member
danger_zone_title: Danger Zone
delete_account: Delete account
delete_account_warning: Deleting your account will permanently remove all
your data and cannot be undone.
reset_account: Reset account
reset_account_warning: Resetting your account will delete all your accounts, categories, merchants, tags, and other data, but keep your user account intact.
reset_account_with_sample_data: Reset and preload
reset_account_with_sample_data_warning: Delete all your existing data and then load fresh sample data so you can explore with a pre-filled environment.
email: Email
first_name: First Name
household_form_input_placeholder: Enter household name
household_form_label: Household name
household_subtitle: Invite family members, partners and other inviduals. Invitees
can login to your household and access your shared accounts.
household_title: Household
invitation_link: Invitation link
invite_member: Add member
last_name: Last Name
page_title: Profile Info
pending: Pending
profile_subtitle: Customize how you appear on %{product_name}
profile_title: Personal
remove_invitation: Remove Invitation
remove_member: Remove Member
save: Save
securities:
show:
page_title: Security
mfa_title: Two-Factor Authentication
mfa_description: Add an extra layer of security to your account by requiring a code from your authenticator app when signing in
enable_mfa: Enable 2FA
disable_mfa: Disable 2FA
disable_mfa_confirm: Are you sure you want to disable two-factor authentication?
sso_title: Connected Accounts
sso_subtitle: Manage your single sign-on account connections
sso_disconnect: Disconnect
sso_last_used: Last used
sso_never: Never
sso_no_email: No email
sso_no_identities: No SSO accounts connected
sso_connect_hint: Log out and sign in with an SSO provider to connect an account.
sso_confirm_title: Disconnect Account?
sso_confirm_body: Are you sure you want to disconnect your %{provider} account? You can reconnect it later by signing in with that provider again.
sso_confirm_button: Disconnect
sso_warning_message: This is your only login method. You should set a password in your security settings before disconnecting, otherwise you may be locked out of your account.
settings_nav:
accounts_label: Accounts
advanced_section_title: Advanced
ai_prompts_label: AI Prompts
api_key_label: API Key
payment_label: Payment
categories_label: Categories
feedback_label: Feedback
general_section_title: General
imports_label: Imports
exports_label: Exports
logout: Logout
merchants_label: Merchants
guides_label: Guides
other_section_title: More
preferences_label: Preferences
profile_label: Profile Info
recurring_transactions_label: Recurring
rules_label: Rules
security_label: Security
self_hosting_label: Self-Hosting
tags_label: Tags
transactions_section_title: Transactions
whats_new_label: What's new
api_keys_label: API Key
bank_sync_label: Bank Sync
settings_nav_link_large:
next: Next
previous: Back
user_avatar_field:
accepted_formats: JPG or PNG. 5MB max.
choose: Upload photo
choose_label: (optional)
change: Change photo
providers:
show:
coinbase_title: Coinbase
encryption_error:
title: Encryption Configuration Required
message: Active Record encryption keys are not configured. Please ensure the encryption credentials (active_record_encryption.primary_key, active_record_encryption.deterministic_key, and active_record_encryption.key_derivation_salt) are properly set up in your Rails credentials or environment variables before using sync providers.
coinbase_panel:
setup_instructions: "To connect Coinbase:"
step1_html: Go to <a href="https://portal.cdp.coinbase.com/projects/api-keys" target="_blank" class="text-primary underline">Coinbase API Settings</a>
step2: Create a new API key with read-only permissions (view accounts, view transactions)
step3: Copy your API key and API secret and paste them below
api_key_label: API Key
api_key_placeholder: Enter your Coinbase API key
api_secret_label: API Secret
api_secret_placeholder: Enter your Coinbase API secret
connect_button: Connect Coinbase
syncing: Syncing...
sync: Sync
disconnect_confirm: Are you sure you want to disconnect this Coinbase connection? Your synced accounts will become manual accounts.
status_connected: Coinbase is connected and syncing your crypto holdings.
status_not_connected: Not connected. Enter your API credentials above to get started.