Skip to content

v3.3.0 — Internationalization & Multi-Tax

Choose a tag to compare

@Blb3D Blb3D released this 01 Mar 04:01

Highlights

Your ERP, your currency — FilaOps now supports 21 currencies and 20 locales out of the box. Set your company's currency and locale in Admin Settings, and every number, price, and PDF in the system renders accordingly. No more hardcoded dollar signs.

Multi-tax rates — Create named tax rates (GST 10%, VAT 20%, State Sales Tax 6.25%) and assign them to quotes and orders. The system supports a default rate, per-quote overrides, and graceful fallback to legacy settings. The frontend adapts automatically: checkbox for single-rate setups, dropdown selector when you have multiple rates.

PRO-ready architecture — Core now exposes a clean plugin registration system. PRO modules can inject routes, declare features, and set tier information without modifying any Core code. The frontend discovers available features at startup via /system/info.

What's New

Internationalization (i18n)

  • LocaleContext provider with useFormatCurrency() and useFormatNumber() hooks
  • 21 ISO 4217 currencies (USD, EUR, GBP, CAD, AUD, JPY, CNY, INR, and more)
  • 20 BCP-47 locales with human-readable labels and live preview
  • Regional Settings UI in Admin Settings — currency and locale dropdowns
  • Currency-aware PDF generation with proper symbol mapping
  • 48 hardcoded $ signs replaced across 10 components
  • 13 duplicate formatCurrency definitions consolidated into centralized hooks

Multi-Tax Rate System

  • New tax_rates table with full CRUD API (/api/v1/tax-rates)
  • Named rates with percentage, default flag, and soft-delete
  • Tax resolution: specific rate > default rate > legacy fallback
  • QuoteFormModal adapts: checkbox (0–1 rates) or dropdown (2+ rates)
  • Admin Settings tax rate management with inline add/remove

PRO Extension Points

  • plugin_registry.py — runtime tier and feature registration
  • /api/v1/system/info — frontend discovers available features
  • load_plugin() — environment-variable-driven plugin loading
  • useApp() hook — frontend tier/feature awareness

Testing

  • 98 new frontend unit tests (i18n hooks, locale context, currency/number formatting)
  • Component-level currency integration tests for all currency-bearing components
  • Frontend unit tests now run in CI via dedicated vitest.unit.config.js

Bug Fixes

  • Upload directory resolution: Path(__file__) instead of hardcoded /app/ paths — fixes CI and fresh VM installs (#365)
  • FileStorageService startup hardened: mkdir wrapped in try/except
  • Module-level locale defaults synced for non-hook code (PDFs, modals)
  • SQLAlchemy .is_(True) for ruff E712 compliance
  • Migration 058 seed INSERT explicit for PostgreSQL compatibility

Full Changelog: v3.2.0...v3.3.0

94 files changed | +2,776 | -253