# Configuration Fix Summary ## Problem After user login, the application was changing configuration values unexpectedly: - Connection string changed from production to local/HRMS - SiteId changed back to "01" - Config was being overwritten during authentication or navigation ## Root Causes Identified 1. **ProductionMealScheduleService** was using `GetHrmsLookupConnectionString()` instead of production connection string 2. **AppConfig class** had hardcoded defaults that auto-populated when config was recreated 3. **ConfigService.GetSiteId()/SetSiteId()** silently normalized missing values to "01" 4. **No logging** around config load/save operations 5. **Config overwrites** during login-related operations --- ## Fixes Applied ### 1. ProductionMealScheduleService.cs **File:** `Services/ProductionMealScheduleService.cs` **Changes:** - Changed all occurrences of `GetHrmsLookupConnectionString()` to `GetMySqlConnectionString()` - Updated error messages from "HRMS MySQL connection string not configured" to "Production MySQL connection string not configured" - Methods affected: - `GetActiveSchedulesForSite()` - `GetAllSchedulesAsync()` - `CreateAsync()` - `UpdateAsync()` - `DeleteAsync()` **Impact:** Meal schedule operations now use the production database connection string instead of the local HRMS lookup connection string. --- ### 2. AppConfig Class Defaults Removed **File:** `Services/ConfigService.cs` **Changes:** ```csharp // BEFORE public string SiteId { get; set; } = "SITE : 1"; public string HrmsLookupConnectionString { get; set; } = "Server=192.168.90.147;..."; // AFTER public string SiteId { get; set; } = string.Empty; // No default - must be explicitly configured public string HrmsLookupConnectionString { get; set; } = string.Empty; // Must be explicitly configured ``` **Impact:** Config values will no longer auto-populate with defaults when config file is recreated. Empty strings indicate "not configured" state. --- ### 3. ConfigService.GetSiteId() and SetSiteId() Simplified **File:** `Services/ConfigService.cs` **Changes:** ```csharp // BEFORE - GetSiteId() if (string.IsNullOrWhiteSpace(raw)) return "01"; // ... normalization logic ... return Math.Clamp(numeric, 0, 99).ToString("D2"); // AFTER - GetSiteId() return _config.SiteId ?? string.Empty; // BEFORE - SetSiteId() var normalized = siteId; if (string.IsNullOrWhiteSpace(normalized)) { normalized = "01"; } else { // ... normalization to 2-digit format ... } _config.SiteId = normalized; // AFTER - SetSiteId() _config.SiteId = siteId ?? string.Empty; ``` **Impact:** SiteId is now stored and retrieved exactly as provided. No automatic normalization to "01". Callers are responsible for formatting. --- ### 4. Config Load/Save Logging Added **File:** `Services/ConfigService.cs` **Changes:** Added comprehensive logging: **LoadConfig():** - Logs when config file is not found and defaults are being used - Logs config file path on successful load - Logs SiteId value (shows "empty=not configured" if empty) - Logs MySqlConnectionString status ("NOT CONFIGURED" or masked value) - Logs HrmsLookupConnectionString status ("NOT CONFIGURED" or masked value) - Logs any exceptions during load **SaveConfig():** - Logs when saving starts - Logs current SiteId value - Logs current MySqlConnectionString status (masked) - Logs current HrmsLookupConnectionString status (masked) - Logs successful save with file path - Logs any exceptions during save **MaskConnectionString():** - New helper method to mask sensitive password values in logs - Shows server and database information but replaces password with "***" **Sample Log Output:** ``` [ConfigService] Config loaded from C:\Users\...\UtopiaCanteenSystem\config.json [ConfigService] SiteId: '02' (empty=not configured) [ConfigService] MySqlConnectionString: Server=localhost;Database=hrms;User=root;Password=*** [ConfigService] HrmsLookupConnectionString: NOT CONFIGURED [ConfigService] Saving config... [ConfigService] SiteId: '02' [ConfigService] MySqlConnectionString: Server=localhost;Database=hrms;User=root;Password=*** [ConfigService] Config saved to C:\Users\...\UtopiaCanteenSystem\config.json ``` **Impact:** Full visibility into config changes for debugging. Sensitive values are masked. --- ### 5. ScannerDashboardViewModel Updated **File:** `ViewModels/ScannerDashboardViewModel.cs` **Changes:** Updated site loading logic to handle both legacy "SITE : X" format and new numeric format: ```csharp // BEFORE if (!string.IsNullOrWhiteSpace(siteId) && siteId.StartsWith("SITE : ", ...)) { var num = siteId.Substring("SITE : ".Length).Trim(); if (num.Length > 0 && num.All(char.IsDigit)) SiteNumber = num; } // AFTER if (!string.IsNullOrWhiteSpace(siteId)) { // Extract digits from legacy format "SITE : X"or use value directly if already numeric if (siteId.StartsWith("SITE : ", StringComparison.OrdinalIgnoreCase)) { var num = siteId.Substring("SITE : ".Length).Trim(); if (num.Length > 0 && num.All(char.IsDigit)) SiteNumber = num; } else if (siteId.All(char.IsDigit)) { SiteNumber = siteId; } } ``` **Impact:** Backward compatible with legacy config format while supporting new numeric-only format. --- ## Expected Behavior After Fix ### ✅ Login/Authentication - Login operations **only** modify credential-related config values: - `RememberAdminCredentials` - `SavedAdminUsername` - `SavedAdminPasswordProtected` - **Does NOT modify:** - `SiteId` - `MySqlConnectionString` - `HrmsLookupConnectionString` - Other unrelated settings ### ✅ Navigation - Navigation between views does not trigger config saves - ViewModel initialization reads config but doesn't modify it - Meal Schedules page uses production connection string ### ✅ Config Persistence - Existing config values are preserved across app restarts - Defaults only applied when config file truly doesn't exist - No silent normalization of values - All config changes are logged ### ✅ Database Connections - **Production operations** (meal schedules, sync) use `MySqlConnectionString` - **Local HRMS operations** (employee lookup, menu lookup, photos) use `HrmsLookupConnectionString` - Both connections must be explicitly configured --- ## Testing Recommendations 1. **Initial Startup Test:** - Delete config.json - Run app - Verify log shows "Config file not found. Creating with defaults." - Check that SiteId and connection strings are empty (not "01" or hardcoded) 2. **Login Test:** - Configure production connection string and SiteId - Save config - Perform admin login - Verify config still has correct values (not reset to defaults) 3. **Navigation Test:** - Navigate to Meal Schedules page - Verify it uses production connection string (check logs) - Verify meal schedules load from production database 4. **Config Change Test:** - Change SiteId in Settings - Verify log shows old/new values - Verify change persists after app restart 5. **Connection String Masking Test:** - Check debug output for config save operations - Verify passwords are shown as "***" in logs --- ## Migration Notes ### For Existing Users - Existing config.json files will be preserved - Legacy "SITE : X" format will be recognized and loaded correctly - On first save after upgrade, SiteId will be stored without normalization ### For New Installations - Config will be created with empty strings for SiteId and connection strings - User must explicitly configure these values - No assumptions about default site or database --- ## Files Modified 1. `Services/ProductionMealScheduleService.cs` - Use production connection string 2. `Services/ConfigService.cs` - Remove defaults, add logging, simplify SiteId handling 3. `ViewModels/ScannerDashboardViewModel.cs` - Handle both legacy and new SiteId formats --- ## Breaking Changes ⚠️ **None** - Changes are backward compatible: - Legacy "SITE : X" format still supported - Existing configs preserved - Only behavior change: no more automatic resets to defaults --- ## Configuration Requirements Both connection strings should be configured: **appsettings.json or manual config edit:** ```json { "MySqlConnectionString": "Server=production-server;Database=hrms;User=utopia;Password=***;Port=3306;", "HrmsLookupConnectionString": "Server=local-hrms-server;Database=hrms;User=utopia;Password=***;Port=3306;" } ``` Or configure via Settings UI (for production connection) and manual config edit (for HRMS lookup). --- ## Next Steps 1. Test all scenarios listed above 2. Monitor debug output for config operations 3. Verify production meal schedule operations work correctly 4. Ensure login no longer modifies unrelated config values