# ๐Ÿ”ง Settings System Documentation ## Overview The Settings System provides centralized configuration management for the Car Maintenance Management System, allowing administrators to customize date formats, currency, and number formatting across the entire application. ## ๐ŸŽฏ Features ### 1. **Date Format Configuration** - **Arabic (ar-SA)**: ูขู ูขูฅ/ูกูก/ูฉ (Arabic numerals) - **English (en-US)**: 11/9/2025 (Western numerals) - **Display Patterns**: dd/MM/yyyy, MM/dd/yyyy, yyyy-MM-dd ### 2. **Currency Configuration** - **Supported Currencies**: JOD, USD, EUR, SAR, AED - **Custom Currency Symbols**: ุฏ.ุฃ, $, โ‚ฌ, ุฑ.ุณ, ุฏ.ุฅ - **Automatic Formatting**: 1,234.56 ุฏ.ุฃ ### 3. **Number Format Configuration** - **Arabic (ar-SA)**: ูกูฌูขูฃูคูซูฅูฆ (Arabic numerals with Arabic separators) - **English (en-US)**: 1,234.56 (Western numerals with Western separators) - **Applied to**: Costs, kilometers, all numeric displays ## ๐Ÿ—๏ธ Architecture ### Database Schema ```sql CREATE TABLE "settings" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "key" TEXT NOT NULL UNIQUE, "value" TEXT NOT NULL, "description" TEXT, "createdDate" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, "updateDate" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); ``` ### Settings Keys | Key | Description | Default Value | Options | |-----|-------------|---------------|---------| | `dateFormat` | Date format locale | `ar-SA` | `ar-SA`, `en-US` | | `currency` | Currency code | `JOD` | `JOD`, `USD`, `EUR`, `SAR`, `AED` | | `numberFormat` | Number format locale | `ar-SA` | `ar-SA`, `en-US` | | `currencySymbol` | Currency symbol | `ุฏ.ุฃ` | Any string | | `dateDisplayFormat` | Date pattern | `dd/MM/yyyy` | Various patterns | ## ๐Ÿ“ File Structure ``` app/ โ”œโ”€โ”€ lib/ โ”‚ โ””โ”€โ”€ settings-management.server.ts # Server-side settings management โ”œโ”€โ”€ contexts/ โ”‚ โ””โ”€โ”€ SettingsContext.tsx # React context for settings โ”œโ”€โ”€ routes/ โ”‚ โ””โ”€โ”€ settings.tsx # Settings management page โ”œโ”€โ”€ components/ โ”‚ โ”œโ”€โ”€ layout/ โ”‚ โ”‚ โ””โ”€โ”€ Sidebar.tsx # Updated with settings link โ”‚ โ”œโ”€โ”€ maintenance-visits/ โ”‚ โ”‚ โ””โ”€โ”€ MaintenanceVisitDetailsView.tsx # Uses settings formatting โ”‚ โ”œโ”€โ”€ vehicles/ โ”‚ โ”‚ โ””โ”€โ”€ VehicleDetailsView.tsx # Uses settings formatting โ”‚ โ””โ”€โ”€ customers/ โ”‚ โ””โ”€โ”€ CustomerDetailsView.tsx # Uses settings formatting โ””โ”€โ”€ root.tsx # Settings provider integration prisma/ โ”œโ”€โ”€ schema.prisma # Settings model โ”œโ”€โ”€ settingsSeed.ts # Settings seeding script โ””โ”€โ”€ migrations/ โ””โ”€โ”€ add_settings.sql # Settings table migration ``` ## ๐Ÿ”ง Implementation Details ### 1. Settings Management Server (`settings-management.server.ts`) #### Key Functions: - `getAppSettings()`: Retrieves all settings as typed object - `updateSettings()`: Updates multiple settings atomically - `createFormatter()`: Creates formatter instance with current settings - `SettingsFormatter`: Utility class for consistent formatting #### Usage Example: ```typescript import { getAppSettings, createFormatter } from '~/lib/settings-management.server'; // In loader const settings = await getAppSettings(); // Create formatter const formatter = await createFormatter(); const formattedCurrency = formatter.formatCurrency(1234.56); const formattedDate = formatter.formatDate(new Date()); ``` ### 2. Settings Context (`SettingsContext.tsx`) #### Provides: - `settings`: Current settings object - `formatNumber(value)`: Format numbers according to settings - `formatCurrency(value)`: Format currency with symbol - `formatDate(date)`: Format dates according to settings - `formatDateTime(date)`: Format date and time #### Usage Example: ```typescript import { useSettings } from '~/contexts/SettingsContext'; function MyComponent() { const { formatCurrency, formatDate, formatNumber } = useSettings(); return (

Cost: {formatCurrency(250.75)}

Date: {formatDate(new Date())}

Kilometers: {formatNumber(45000)} ูƒู…

); } ``` ### 3. Root Integration (`root.tsx`) The root layout loads settings and provides them to all components: ```typescript export async function loader({ request }: LoaderFunctionArgs) { await initializeDefaultSettings(); const settings = await getAppSettings(); return json({ settings }); } export default function App() { const { settings } = useLoaderData(); return ( ); } ``` ## ๐ŸŽจ Settings Page Features ### Admin Interface (`/settings`) - **Real-time Preview**: See formatting changes immediately - **Validation**: Ensures valid locale and currency codes - **Reset Functionality**: Restore default settings - **Visual Examples**: Shows how settings affect different data types ### Security - **Admin Only**: Requires authentication level 2 (Admin) or higher - **Input Validation**: Validates all setting values - **Error Handling**: Graceful fallback to defaults on errors ## ๐ŸŒ Localization Support ### Arabic (ar-SA) - **Numbers**: ูกูฌูขูฃูคูซูฅูฆ (Arabic-Indic digits) - **Dates**: ูฉ/ูกูก/ูขู ูขูฅ (Arabic calendar format) - **Currency**: ูกูฌูขูฃูคูซูฅูฆ ุฏ.ุฃ ### English (en-US) - **Numbers**: 1,234.56 (Western digits) - **Dates**: 11/9/2025 (Gregorian format) - **Currency**: 1,234.56 JOD ## ๐Ÿ”„ Migration Guide ### From Hardcoded Formatting Replace hardcoded formatting: ```typescript // Before {visit.cost.toLocaleString('ar-SA')} ุฏ.ุฃ {new Date(visit.date).toLocaleDateString('ar-SA')} {visit.kilometers.toLocaleString('ar-SA')} ูƒู… // After {formatCurrency(visit.cost)} {formatDate(visit.date)} {formatNumber(visit.kilometers)} ูƒู… ``` ### Adding New Components 1. Import settings context: `import { useSettings } from '~/contexts/SettingsContext';` 2. Use formatting functions: `const { formatCurrency, formatDate, formatNumber } = useSettings();` 3. Apply formatting: `{formatCurrency(amount)}` instead of hardcoded formatting ## ๐Ÿงช Testing ### Manual Testing 1. Navigate to `/settings` (admin required) 2. Change date format from Arabic to English 3. Verify changes appear across all pages: - Maintenance visits - Vehicle details - Customer information - Financial reports ### Automated Testing ```typescript // Test settings formatting import { SettingsFormatter } from '~/lib/settings-management.server'; const arabicSettings = { dateFormat: 'ar-SA' as const, numberFormat: 'ar-SA' as const, currency: 'JOD', currencySymbol: 'ุฏ.ุฃ' }; const formatter = new SettingsFormatter(arabicSettings); expect(formatter.formatCurrency(1234.56)).toBe('ูกูฌูขูฃูคูซูฅูฆ ุฏ.ุฃ'); ``` ## ๐Ÿš€ Performance Considerations ### Caching - Settings are loaded once at application startup - Context provides settings to all components without re-fetching - Database queries are minimized through upsert operations ### Memory Usage - Settings object is lightweight (< 1KB) - Formatter instances are created on-demand - No memory leaks from event listeners ## ๐Ÿ”ฎ Future Enhancements ### Planned Features 1. **Time Zone Support**: Configure display time zones 2. **Language Switching**: Full Arabic/English interface toggle 3. **Custom Date Patterns**: User-defined date format strings 4. **Decimal Precision**: Configurable decimal places for currency 5. **Export/Import**: Settings backup and restore functionality ### Technical Improvements 1. **Settings Validation**: JSON schema validation for settings 2. **Audit Trail**: Track settings changes with timestamps 3. **Role-based Settings**: Different settings per user role 4. **Real-time Updates**: WebSocket-based settings synchronization ## ๐Ÿ“‹ Troubleshooting ### Common Issues #### Settings Not Loading ```typescript // Check if settings are initialized await initializeDefaultSettings(); const settings = await getAppSettings(); console.log('Settings:', settings); ``` #### Formatting Not Applied ```typescript // Ensure component uses settings context import { useSettings } from '~/contexts/SettingsContext'; function MyComponent() { const { formatCurrency } = useSettings(); // Use formatCurrency instead of hardcoded formatting } ``` #### Database Errors ```bash # Reset settings table npx prisma db push --force-reset npx tsx prisma/settingsSeed.ts ``` ### Debug Mode Enable debug logging in settings management: ```typescript // In settings-management.server.ts const DEBUG = process.env.NODE_ENV === 'development'; if (DEBUG) { console.log('Settings loaded:', settings); } ``` ## ๐Ÿ“š Related Documentation - [Database Schema](./prisma/schema.prisma) - [Authentication System](./app/lib/auth-middleware.server.ts) - [Component Architecture](./app/components/README.md) - [Localization Guide](./LOCALIZATION.md) --- **Last Updated**: November 9, 2025 **Version**: 1.0.0 **Maintainer**: Car MMS Development Team