From 0e171af1fa6c97fbeffc1934ccd78d17a5256e82 Mon Sep 17 00:00:00 2001 From: "mustafa.ahmed" Date: Thu, 2 Apr 2026 10:34:52 +0500 Subject: [PATCH] Updated the grade mapping logic in HrmsMenuItemForMapping.cs to map Contractual and MTO/TE/Intern to MANAGEMENT and Unassigned (and empty values) to NON_MANAGEMENT. The FromGradeType method in HrmsMenuItemForMapping was modified to handle the new mapping rules, ensuring that menu items and lunch order items align with the updated grade-to-menu mapping: Contractual and MTO/TE/Intern are now mapped to MANAGEMENT menu. Unassigned and empty values are mapped to NON_MANAGEMENT. --- Services/HrmsMenuItemForMapping.cs | 45 ++++++++++++++++++++++++++++++ Services/MenuLookupService.cs | 15 +--------- Services/SyncService.cs | 14 +--------- 3 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 Services/HrmsMenuItemForMapping.cs diff --git a/Services/HrmsMenuItemForMapping.cs b/Services/HrmsMenuItemForMapping.cs new file mode 100644 index 0000000..29d66e0 --- /dev/null +++ b/Services/HrmsMenuItemForMapping.cs @@ -0,0 +1,45 @@ +namespace UtopiaCanteenSystem.Services; + +/// +/// Maps HRMS employee_rfid_tag.grade_type to menu_item.item_for. +/// Menu rows only use MANAGEMENT / NON_MANAGEMENT; other grades must map to one of those. +/// Contractual and MTO/TE/Intern use the management menu; Unassigned uses non-management. +/// +public static class HrmsMenuItemForMapping +{ + /// + /// Returns MANAGEMENT or NON_MANAGEMENT for menu queries. Never returns empty. + /// + public static string FromGradeType(string? gradeType) + { + var compact = ToCompactAlphaNum(gradeType); + if (string.IsNullOrEmpty(compact)) + return "NON_MANAGEMENT"; + + if (compact == "management") + return "MANAGEMENT"; + + if (compact == "nonmanagement") + return "NON_MANAGEMENT"; + + if (compact == "contractual" || compact == "mtoteintern") + return "MANAGEMENT"; + + if (compact == "unassigned") + return "NON_MANAGEMENT"; + + if (compact.StartsWith("non", StringComparison.Ordinal) && compact.Contains("management", StringComparison.Ordinal)) + return "NON_MANAGEMENT"; + + // Any other label (e.g. future grade codes) — use non-management menu so items still resolve. + return "NON_MANAGEMENT"; + } + + private static string ToCompactAlphaNum(string? s) + { + if (string.IsNullOrWhiteSpace(s)) + return string.Empty; + var chars = s.Trim().ToLowerInvariant().Where(char.IsLetterOrDigit).ToArray(); + return new string(chars); + } +} diff --git a/Services/MenuLookupService.cs b/Services/MenuLookupService.cs index 18e7a24..3b10075 100644 --- a/Services/MenuLookupService.cs +++ b/Services/MenuLookupService.cs @@ -237,7 +237,7 @@ public class MenuLookupService : IMenuLookupService AND mi.item_for = @itemFor ORDER BY mi.item_name;"; - var itemFor = GetItemForFromGradeType(gradeType); + var itemFor = HrmsMenuItemForMapping.FromGradeType(gradeType); await using var conn = new MySqlConnection(connectionString); await conn.OpenAsync(cancellationToken).ConfigureAwait(false); @@ -265,19 +265,6 @@ public class MenuLookupService : IMenuLookupService return list; } - private static string GetItemForFromGradeType(string? gradeType) - { - var value = (gradeType ?? string.Empty).Trim().ToLowerInvariant(); - - return value switch - { - "management" => "MANAGEMENT", - "nonmanagement" => "NON_MANAGEMENT", - "non_management" => "NON_MANAGEMENT", - _ => string.Empty - }; - } - private static string GetString(MySqlDataReader reader, int ordinal) { if (reader.IsDBNull(ordinal)) return string.Empty; diff --git a/Services/SyncService.cs b/Services/SyncService.cs index e415305..9cbbdf0 100644 --- a/Services/SyncService.cs +++ b/Services/SyncService.cs @@ -212,7 +212,7 @@ public class SyncService : ISyncService if (lunchOrderId > 0) { var mealItems = SplitMealItems(record.MealItems); - var itemFor = GradeTypeToItemFor(record.grade_type); + var itemFor = HrmsMenuItemForMapping.FromGradeType(record.grade_type); foreach (var itemName in mealItems) { @@ -335,18 +335,6 @@ public class SyncService : ISyncService } } - private static string GradeTypeToItemFor(string? gradeType) - { - var value = (gradeType ?? string.Empty).Trim().ToLowerInvariant(); - return value switch - { - "management" => "MANAGEMENT", - "nonmanagement" => "NON_MANAGEMENT", - "non_management" => "NON_MANAGEMENT", - _ => string.Empty - }; - } - private static IReadOnlyList SplitMealItems(string? mealItems) { if (string.IsNullOrWhiteSpace(mealItems))