diff --git a/Data/AppDbContext.cs b/Data/AppDbContext.cs index 0ad1294..2324112 100644 --- a/Data/AppDbContext.cs +++ b/Data/AppDbContext.cs @@ -262,6 +262,20 @@ public class AppDbContext : DbContext cmd.ExecuteNonQuery(); } + if (columns.Count > 0 && !columns.Contains("grade_type", StringComparer.OrdinalIgnoreCase)) + { + using var cmd = conn.CreateCommand(); + cmd.CommandText = "ALTER TABLE lunch_order_transactions ADD COLUMN grade_type TEXT DEFAULT ''"; + cmd.ExecuteNonQuery(); + } + + if (columns.Count > 0 && !columns.Contains("Designation", StringComparer.OrdinalIgnoreCase)) + { + using var cmd = conn.CreateCommand(); + cmd.CommandText = "ALTER TABLE lunch_order_transactions ADD COLUMN Designation TEXT DEFAULT ''"; + cmd.ExecuteNonQuery(); + } + // Remove deprecated column if it exists (older installs). RemoveEmployeeDbIdColumnIfPresent(conn, columns); } diff --git a/Models/HrmsEmployeeInfo.cs b/Models/HrmsEmployeeInfo.cs index 519f8bf..2ffed8e 100644 --- a/Models/HrmsEmployeeInfo.cs +++ b/Models/HrmsEmployeeInfo.cs @@ -26,4 +26,6 @@ public class HrmsEmployeeInfo /// Site from employee_rfid_tag.location_site_id; used for menu lookup (lunch_menu_week). public string LocationSiteId { get; set; } = string.Empty; public string GradeType { get; set; } = string.Empty; + /// employee.position_title (job title / designation). + public string PositionTitle { get; set; } = string.Empty; } diff --git a/Models/ScanRecord.cs b/Models/ScanRecord.cs index 636ec68..dd17daa 100644 --- a/Models/ScanRecord.cs +++ b/Models/ScanRecord.cs @@ -47,4 +47,6 @@ public class ScanRecord /// Total price for this scan's meal menu. public double TotalPrice { get; set; } public string grade_type { get; set; } = string.Empty; + /// employee.position_title at scan time (designation). + public string Designation { get; set; } = string.Empty; } diff --git a/Services/EmployeeLookupService.cs b/Services/EmployeeLookupService.cs index 9dc914f..82489b8 100644 --- a/Services/EmployeeLookupService.cs +++ b/Services/EmployeeLookupService.cs @@ -38,7 +38,8 @@ public class EmployeeLookupService : IEmployeeLookupService d.title AS department_title, d.department_type, r.location_site_id AS location_site_id, - r.grade_type AS grade_type + r.grade_type AS grade_type, + e.position_title AS position_title FROM employee_rfid_tag r JOIN employee e ON e.id = r.parent_document_id LEFT JOIN department d ON d.id = e.department_id @@ -70,7 +71,8 @@ public class EmployeeLookupService : IEmployeeLookupService DepartmentTitle = GetString(reader, 9), DepartmentType = GetString(reader, 10), LocationSiteId = GetString(reader, 11), - GradeType = GetString(reader, 12) + GradeType = GetString(reader, 12), + PositionTitle = GetString(reader, 13) }; } diff --git a/Services/HrmsMenuItemForMapping.cs b/Services/HrmsMenuItemForMapping.cs index 29d66e0..f007e44 100644 --- a/Services/HrmsMenuItemForMapping.cs +++ b/Services/HrmsMenuItemForMapping.cs @@ -35,6 +35,12 @@ public static class HrmsMenuItemForMapping return "NON_MANAGEMENT"; } + /// Human-readable grade label for Excel export (Management / Non Management). + public static string ToExportGradeLabel(string? gradeType) + { + return FromGradeType(gradeType) == "MANAGEMENT" ? "Management" : "Non Management"; + } + private static string ToCompactAlphaNum(string? s) { if (string.IsNullOrWhiteSpace(s)) diff --git a/Services/RfidService.cs b/Services/RfidService.cs index e0e21a7..9b958b9 100644 --- a/Services/RfidService.cs +++ b/Services/RfidService.cs @@ -418,7 +418,8 @@ public class RfidService : IRfidService MealLabel = mealLabel, MealItems = mealItemsDisplay, TotalPrice = totalPrice, - grade_type = employee.GradeType ?? string.Empty + grade_type = employee.GradeType ?? string.Empty, + Designation = employee.PositionTitle ?? string.Empty }; db.LunchOrderTransactions.Add(record); db.SaveChanges(); diff --git a/ViewModels/ScannerDashboardViewModel.cs b/ViewModels/ScannerDashboardViewModel.cs index fbf4442..8ad0dca 100644 --- a/ViewModels/ScannerDashboardViewModel.cs +++ b/ViewModels/ScannerDashboardViewModel.cs @@ -933,11 +933,12 @@ public partial class ScannerDashboardViewModel : ObservableObject private static string BuildCsvFromScanRecords(IReadOnlyList records) { var sb = new StringBuilder(); - sb.AppendLine("Id,CardId,ScanTime,IsSynced,SiteId,DeviceId,IpAddress,EmployeeId,EmployeeName,Department,Meal,Price"); + sb.AppendLine("Id,CardId,ScanTime,IsSynced,SiteId,DeviceId,IpAddress,EmployeeId,EmployeeName,Department,GradeType,Designation,Meal,Price"); foreach (var r in records) { - - var localScanTime = r.ScanTime.ToLocalTime(); sb.Append(r.Id); + var localScanTime = r.ScanTime.ToLocalTime(); + var gradeLabel = HrmsMenuItemForMapping.ToExportGradeLabel(r.grade_type); + sb.Append(r.Id); sb.Append(','); sb.Append(ToExcelText(r.CardId)); sb.Append(','); @@ -957,6 +958,10 @@ public partial class ScannerDashboardViewModel : ObservableObject sb.Append(','); sb.Append(EscapeCsv(r.Department ?? string.Empty)); sb.Append(','); + sb.Append(EscapeCsv(gradeLabel)); + sb.Append(','); + sb.Append(EscapeCsv(r.Designation ?? string.Empty)); + sb.Append(','); sb.Append(EscapeCsv(r.MealItems ?? string.Empty)); sb.Append(','); sb.Append(r.TotalPrice.ToString("0.##", CultureInfo.InvariantCulture));