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 155195e..8ad0dca 100644
--- a/ViewModels/ScannerDashboardViewModel.cs
+++ b/ViewModels/ScannerDashboardViewModel.cs
@@ -933,10 +933,11 @@ 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();
+ var gradeLabel = HrmsMenuItemForMapping.ToExportGradeLabel(r.grade_type);
sb.Append(r.Id);
sb.Append(',');
sb.Append(ToExcelText(r.CardId));
@@ -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));