@page "/sla-reports" @using System.Collections.Generic @using System.Linq @using System.Threading.Tasks @rendermode InteractiveServer
@* Page Header Area *@

SLA & Monthly Reports Dashboard

Enterprise service level compliance, National Treasury rate-cap checking, and monthly operational reports ledger prepared for SAQA bid submission by TMT Projects

@* Filters & Controls *@
Period:
Cost Centre:
@* Alert / Action Feedback Banner *@ @if (!string.IsNullOrEmpty(AlertFeedback)) {
@AlertFeedback
} @* SLA Scorecard Cards - Quick telemetry indicators *@
@foreach (var metric in CoreSlaMetrics) {
@metric.Name
@metric.Actual @metric.Unit
Target: @metric.Target @metric.StatusLabel
}
@* Navigation Tabs Bar *@
@* ===================== TAB 1: SCORECARD DETAILS ===================== *@ @if (ActiveTab == "scorecard") {
@* Left block: Target meters list (lg:col-span-8) *@

SAQA Dedicated SLA Telemetry Matrix

May 2026 contractual performance indexes, target deviations, and billing benchmarks

97.8% SLA Aggregated Compliance
@* Metric row 1 *@
Booking Response turn-around (Domestic) Measure of time elapsed from travel authorization submission to first quote iteration
44 minutes Target: < 60 mins (98.4% met)
@* Metric row 2 *@
Emergency After-Hours response speed Emergency helpline consultant response and ticket remediation threshold
9 minutes Target: < 15 mins (100% met)
@* Metric row 3 *@
National Treasury Price Caps Adherence Rate Adherence to Treasury instructions on flight quotas, hotel matrices and shuttle spending caps
94.1% compliance Target: 100% (7 authorized deviations)
@* Metric row 4 *@
Billing Reconciliation & Lodge Matching Automated lodge card clearing speed and invoice linkages matching PO guidelines
28 hours Target: < 48 hours (99.1% met)
@* Metric row 5 *@
Ticketing Accuracy / Zero Voucher Error Rate Zero ticketing rejects or hotel vouchers invalid on check-in
99.96% accuracy Target: > 99.90% (0 errors)
@* Consolidated SLA Quality Box *@
SLA Target Met Rating TMT Projects dedicated operations are strictly aligned with ASATA standards, assuring SAQA of seamless continuity.
97.8% Achieved
@* Right block: Live SLA alerts & warnings desk (lg:col-span-4) *@

Live SLA Alert Desk

Real-time GDS operational alerts matching May SLAs

Hotel Cap Deviation Pending Review

Cape Town peak-booking R 2,400/night has passed 24h limit without CFO override. Ticket pending hold.

SLA limit: 4h response standard
After-Hours Call log triggered

London flight delay rerouting handled for Dr. Sithole. Resolution verified in 12 mins.

Target met (9m actual)
Lodge Reconciliation auto-cleared

142 May flight billing matched automatically with zero manual discrepancies logged.

Reconciled standard: 100%
Real-time monitoring nodes are automatically backed by failover pathways. Performance thresholds audited independently.
} @* ===================== TAB 2: REPORTS LIBRARY ===================== *@ @if (ActiveTab == "library") {
@* Reports Listing column (lg:col-span-4) *@

Standard Monthly Logs

Select a ledger below to view the interactive live telemetry data

@foreach (var report in MonthlyReportTemplates) { }
National Treasury compliant formats

All ledgers export smoothly to National Treasury standard spreadsheets with pre-populated cost centers.

@* Report Interactive Preview Table (lg:col-span-8) *@
@* Table Header Area *@

@ActiveReportMetadata.Emoji @ActiveReportMetadata.Name

Active data preview for @SelectedPeriod period

@* Search Filter *@
Search:
@* Table Renderings based on chosen reports *@
@if (SelectedReportKey == "deviations") { @foreach (var row in FilteredDeviations) { } @if (!FilteredDeviations.Any()) { }
Traveller Route Paid Justification / Reason Approver Status
@row.Traveller
@row.CostCentre
@row.Route (@row.Supplier)
@row.Date
R @row.PaidPrice.ToString("N0")
Saved: R @row.Saving.ToString("N0")
@row.Justification
Code: @row.ReasonCode
@row.ApprovedBy @row.Status
No matching records found.
} else if (SelectedReportKey == "afterhours") { @foreach (var row in FilteredAfterHours) { } @if (!FilteredAfterHours.Any()) { }
Timestamp Traveller Category / Reason Resolution Process SLA Speed Status
@row.Date
@row.Time
@row.Traveller
@row.Category
@row.Reason
@row.Resolution @row.ResponseTimeMinutes mins Target: <15m @row.Status
No matching records found.
} else if (SelectedReportKey == "refunds") { @foreach (var row in FilteredRefunds) { } @if (!FilteredRefunds.Any()) { }
Traveller / Ticket # Airline & Route Face Value Issue / Expiry Date Claim Status Action Required
@row.Traveller
Ticket: @row.TicketNumber
@row.Airline
@row.Route
R @row.FaceValue.ToString("N0")
Issued: @row.IssueDate
Expires: @row.ExpiryDate
@row.RefundStatus
No matching records found.
} else if (SelectedReportKey == "carbon") {
@{ decimal totalCarbon = FilteredCarbon.Sum(c => c.CarbonFootprint); decimal greenAccommodationRatio = FilteredCarbon.Any(c => c.Category == "Lodging" && c.EcoPerformanceTag.Contains("Eco")) ? 42.8M : 0M; int treesOffset = (int)(totalCarbon * 41.5M); }
Total Carbon Emitted @totalCarbon.ToString("F1") Tons CO₂ @((totalCarbon * -0.24M).ToString("F1"))% vs baseline
Green Accommodation Ratio @(greenAccommodationRatio > 0 ? "42.8%" : "0.0%") Bookings Target: 30.0% standard
Tree-Offset Equivalent @treesOffset.ToString("N0") Trees/Year SLA Sustainability Match
@foreach (var row in FilteredCarbon) { } @if (!FilteredCarbon.Any()) { }
Category Activity Metric Carbon Footprint Eco Performance Tag Green Recommendations
@row.Category @row.ActivityMetric = 5M ? "text-[#0066b3]" : "text-[#22a06b]")"> @row.CarbonFootprint.ToString("F1") Tons CO₂ @row.EcoPerformanceTag @row.GreenRecommendation
No matching records found.
}
* Showing live data queried directly from ASATA-linked accounts. Securely verified by POPIA guidelines.
} @* ===================== TAB 3: CONSULTANTS PERFORMANCE ===================== *@ @if (ActiveTab == "consultants") {

SAQA Dedicated Travel Consultants Performance

SLA productivity tracker for TMT Projects specialists permanently assigned to South African Qualifications Authority

100% Availability Verified
@foreach (var consultant in ConsultantPerformances) {
@string.Concat(consultant.Name.Split(' ').Select(n => n[0]))

@consultant.Name

@consultant.Role
Specialty Focus: @consultant.Specialty
Bookings Handled: @consultant.BookingsHandled
Avg Response Speed: @consultant.ResponseTimeMinutes mins
Error Ticket Volume: @consultant.ErrorsCount
@* Performance bar *@
SLA Success Score: @(consultant.ErrorsCount == 0 ? "100%" : "99.8%")
@* CSAT Score rating representation *@
CSAT Rating:
★ @consultant.CsatScore.ToString("F2") / 5.0
}

Dedicated SLA Service Protocols

TMT Projects provides a dedicated 24/7 corporate desk. For executive and VIP bookings, Thabo Khumalo is assigned as the primary liaison officer. Escalated service matters and disputes bypass the standard queue and route instantly to Lerato Nkosi for immediate SLA verification and reconciliation logs.

} @* ===================== TAB 4: DISPUTE & SERVICE LOGS ===================== *@ @if (ActiveTab == "disputes") {
@* Service dispute logging form (lg:col-span-5) *@

Log SLA Query or Service Violation

Submit service delays or rate cap disputes for priority TMT investigation

@* Active disputes / Queries tracking ledger (lg:col-span-7) *@

SAQA Active Service Quality Log

Live status tracker of submitted queries in May 2026

@ServiceQueries.Count(q => q.Status != "Resolved") Active Disputes
@foreach (var query in ServiceQueries) {
@if (query.Urgency == "High") { } else { }

@query.Category

@query.Date

@query.Description

Traveller Reference: @query.TravellerName
@query.Status @if (query.Status != "Resolved") { }
}
Disputes logged are actioned by Lerato Nkosi within 4 hours. Escalations are automatically flagged in daily reports.
}
@code { // Reporting parameters private string SelectedPeriod { get; set; } = "May 2026"; private string SelectedCostCentre { get; set; } = "All"; // SLA state feedback messages private string AlertFeedback { get; set; } = string.Empty; // Primary Tab Selection private string ActiveTab { get; set; } = "scorecard"; // Reports Library state private string SelectedReportKey { get; set; } = "deviations"; private string ReportSearchQuery { get; set; } = string.Empty; // SLA Query / Dispute form bind states private string NewQueryCategory { get; set; } = "Booking Response Delay"; private string NewQueryTraveller { get; set; } = string.Empty; private string NewQueryUrgency { get; set; } = "Medium"; private string NewQueryDescription { get; set; } = string.Empty; // Data Structures & Models public class SlaMetric { public string Name { get; set; } = string.Empty; public string Target { get; set; } = string.Empty; public string Actual { get; set; } = string.Empty; public string Unit { get; set; } = string.Empty; public string StatusLabel { get; set; } = string.Empty; public string StatusClass { get; set; } = string.Empty; public string BarColorClass { get; set; } = string.Empty; } public class MonthlyReportMetadata { public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public string Emoji { get; set; } = string.Empty; public int RecordCount { get; set; } } public class DeviationReportRow { public string Traveller { get; set; } = string.Empty; public string CostCentre { get; set; } = string.Empty; public string Route { get; set; } = string.Empty; public string Date { get; set; } = string.Empty; public string Supplier { get; set; } = string.Empty; public decimal OpenPrice { get; set; } public decimal PaidPrice { get; set; } public decimal Saving => OpenPrice - PaidPrice; public string ReasonCode { get; set; } = string.Empty; public string Justification { get; set; } = string.Empty; public string ApprovedBy { get; set; } = string.Empty; public string Status { get; set; } = "Approved"; } public class AfterHoursLogRow { public string Date { get; set; } = string.Empty; public string Time { get; set; } = string.Empty; public string Traveller { get; set; } = string.Empty; public string Category { get; set; } = string.Empty; public string Reason { get; set; } = string.Empty; public string Resolution { get; set; } = string.Empty; public int ResponseTimeMinutes { get; set; } public string Status { get; set; } = "Resolved"; public string CostCentre { get; set; } = string.Empty; } public class UnusedTicketRow { public string Traveller { get; set; } = string.Empty; public string TicketNumber { get; set; } = string.Empty; public string Airline { get; set; } = string.Empty; public string Route { get; set; } = string.Empty; public decimal FaceValue { get; set; } public string IssueDate { get; set; } = string.Empty; public string ExpiryDate { get; set; } = string.Empty; public string RefundStatus { get; set; } = "Pending"; public string ActionPending { get; set; } = "Process Refund"; public string CostCentre { get; set; } = string.Empty; } public class CarbonReportRow { public string Category { get; set; } = string.Empty; public string ActivityMetric { get; set; } = string.Empty; public decimal CarbonFootprint { get; set; } public string EcoPerformanceTag { get; set; } = string.Empty; public string GreenRecommendation { get; set; } = string.Empty; public string CostCentre { get; set; } = string.Empty; public string Date { get; set; } = string.Empty; } public class ConsultantPerformance { public string Name { get; set; } = string.Empty; public string Role { get; set; } = string.Empty; public string Specialty { get; set; } = string.Empty; public int BookingsHandled { get; set; } public int ErrorsCount { get; set; } public int ResponseTimeMinutes { get; set; } public double CsatScore { get; set; } } public class SlaQueryDispute { public int Id { get; set; } public string Date { get; set; } = string.Empty; public string Category { get; set; } = string.Empty; public string TravellerName { get; set; } = string.Empty; public string Urgency { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public string Status { get; set; } = "In Review"; } // Databases private List CoreSlaMetrics { get; set; } = new(); private Dictionary MonthlyReportTemplates { get; set; } = new(); private List DeviationRows { get; set; } = new(); private List AfterHoursRows { get; set; } = new(); private List UnusedTicketRows { get; set; } = new(); private List CarbonRows { get; set; } = new(); private List ConsultantPerformances { get; set; } = new(); private List ServiceQueries { get; set; } = new(); // Active Metadata calculated helper property private MonthlyReportMetadata ActiveReportMetadata => MonthlyReportTemplates.ContainsKey(SelectedReportKey) ? MonthlyReportTemplates[SelectedReportKey] : new MonthlyReportMetadata { Name = "Report Log", Emoji = "📁" }; // Dynamic Record Counter private int GetReportCount(string key) { return key switch { "deviations" => FilteredDeviations.Count(), "afterhours" => FilteredAfterHours.Count(), "refunds" => FilteredRefunds.Count(), "carbon" => FilteredCarbon.Count(), _ => 0 }; } // Cost Centre normalizer private bool IsCostCentreMatch(string itemCc, string selectedCc) { if (selectedCc == "All") return true; string normalizedItem = itemCc.Replace("&", "and").Replace(" ", "").ToLower(); string normalizedSelected = selectedCc.Replace("&", "and").Replace(" ", "").ToLower(); return normalizedItem == normalizedSelected; } // Date Period helper private bool IsDateInPeriod(string itemDate, string selectedPeriod) { if (string.IsNullOrEmpty(selectedPeriod) || selectedPeriod == "All") return true; if (selectedPeriod == "May 2026") { return itemDate.Contains("May", System.StringComparison.OrdinalIgnoreCase); } else if (selectedPeriod == "April 2026") { return itemDate.Contains("Apr", System.StringComparison.OrdinalIgnoreCase); } else if (selectedPeriod == "Q1 2026") { return itemDate.Contains("Jan", System.StringComparison.OrdinalIgnoreCase) || itemDate.Contains("Feb", System.StringComparison.OrdinalIgnoreCase) || itemDate.Contains("Mar", System.StringComparison.OrdinalIgnoreCase); } return true; } // Filtered Preview Data Lists private IEnumerable FilteredDeviations => DeviationRows .Where(d => IsCostCentreMatch(d.CostCentre, SelectedCostCentre) && IsDateInPeriod(d.Date, SelectedPeriod) && (string.IsNullOrEmpty(ReportSearchQuery) || d.Traveller.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || d.CostCentre.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || d.Supplier.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || d.Justification.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase))); private IEnumerable FilteredAfterHours => AfterHoursRows .Where(a => IsCostCentreMatch(a.CostCentre, SelectedCostCentre) && IsDateInPeriod(a.Date, SelectedPeriod) && (string.IsNullOrEmpty(ReportSearchQuery) || a.Traveller.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || a.Category.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || a.Reason.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || a.Resolution.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase))); private IEnumerable FilteredRefunds => UnusedTicketRows .Where(r => IsCostCentreMatch(r.CostCentre, SelectedCostCentre) && IsDateInPeriod(r.IssueDate, SelectedPeriod) && (string.IsNullOrEmpty(ReportSearchQuery) || r.Traveller.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || r.Airline.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || r.Route.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase))); private IEnumerable FilteredCarbon => CarbonRows .Where(c => IsCostCentreMatch(c.CostCentre, SelectedCostCentre) && IsDateInPeriod(c.Date, SelectedPeriod) && (string.IsNullOrEmpty(ReportSearchQuery) || c.Category.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || c.ActivityMetric.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase) || c.GreenRecommendation.Contains(ReportSearchQuery, System.StringComparison.OrdinalIgnoreCase))); protected override void OnInitialized() { LoadScorecardData(); LoadMonthlyReportsMeta(); LoadDeviationReport(); LoadAfterHoursReport(); LoadUnusedTicketsReport(); LoadCarbonReport(); LoadConsultantPerformances(); LoadServiceDisputes(); } private void SetActiveTab(string tab) { ActiveTab = tab; ReportSearchQuery = string.Empty; } private void SelectReport(string reportKey) { SelectedReportKey = reportKey; ReportSearchQuery = string.Empty; } private void OnFilterChanged() { TriggerFeedback($"Loaded SLA and operations data for period '{SelectedPeriod}' under Cost Centre '{SelectedCostCentre}' Filter."); } // PDF and Excel download simulation triggers private void TriggerPdfDownload() { TriggerFeedback($"Generating Monthly SLA Compliance Pack for period {SelectedPeriod}. Downloader thread initialized..."); } private void TriggerExcelDownload() { TriggerFeedback($"Exporting Full Operational Ledgers ({ActiveReportMetadata.Name}) as spreadsheet output for National Treasury submission."); } private void TriggerFeedback(string msg) { AlertFeedback = msg; _ = DismissAlertDelay(); } private async Task DismissAlertDelay() { await Task.Delay(4000); AlertFeedback = string.Empty; StateHasChanged(); } // Submit user SLA Issue query private void SubmitSlaQuery() { if (string.IsNullOrEmpty(NewQueryTraveller) || string.IsNullOrEmpty(NewQueryDescription)) { TriggerFeedback("ERROR: Please fill in all fields (Traveller Name & Problem description) before logging a query."); return; } var newQuery = new SlaQueryDispute { Id = ServiceQueries.Count + 1, Date = "Just Now", Category = NewQueryCategory, TravellerName = NewQueryTraveller, Urgency = NewQueryUrgency, Description = NewQueryDescription, Status = "Awaiting Desk Action" }; ServiceQueries.Insert(0, newQuery); NewQueryTraveller = string.Empty; NewQueryDescription = string.Empty; TriggerFeedback($"SUCCESS: SLA Service Query registered successfully as Issue ID #2026-QS0{newQuery.Id}. Dispatched to Lerato Nkosi."); } // Complete dispute action simulating resolution private void ResolveSlaQuerySim(int id) { var found = ServiceQueries.FirstOrDefault(q => q.Id == id); if (found != null) { found.Status = "Resolved"; TriggerFeedback($"SLA Service Issue #{id} marked as RESOLVED. Audit trace logged."); } } // Process voucher simulation inside registry private void TriggerVoucherAction(UnusedTicketRow row) { if (row.RefundStatus == "Pending") { row.RefundStatus = "Refunded"; row.ActionPending = "Audit Logged"; TriggerFeedback($"Refund of R {row.FaceValue:N0} successfully processed to SAQA Lodge Card for traveller '{row.Traveller}'."); } else if (row.RefundStatus == "Credit Logged") { row.RefundStatus = "Applied to Flight"; row.ActionPending = "Synced to GDS"; TriggerFeedback($"Credit note R {row.FaceValue:N0} reallocated dynamically to upcoming domestic route."); } } // Contact Consultant sim private void StartConsultantChatSim(string name) { TriggerFeedback($"Escalated priority channel connected directly with {name}. Chat initialized securely via TLS."); } // Core Data Loaders private void LoadScorecardData() { CoreSlaMetrics = new List { new SlaMetric { Name = "Response Time", Target = "< 60m", Actual = "44", Unit = "Mins Avg", StatusLabel = "Target Met", StatusClass = "bg-[#e3f6ed] text-[#22a06b]", BarColorClass = "before:bg-[#22a06b]" }, new SlaMetric { Name = "After Hours SLA", Target = "< 15m", Actual = "9", Unit = "Mins Avg", StatusLabel = "Target Met", StatusClass = "bg-[#e3f6ed] text-[#22a06b]", BarColorClass = "before:bg-[#00a3a1]" }, new SlaMetric { Name = "Rate Cap Adherence", Target = "100%", Actual = "94.1", Unit = "% Booked", StatusLabel = "Warning", StatusClass = "bg-[#fff4dd] text-[#b06b00]", BarColorClass = "before:bg-[#f4a300]" }, new SlaMetric { Name = "Lodge Matching Speed", Target = "< 48h", Actual = "28", Unit = "Hours Avg", StatusLabel = "Target Met", StatusClass = "bg-[#e3f6ed] text-[#22a06b]", BarColorClass = "before:bg-[#22a06b]" }, new SlaMetric { Name = "Ticketing Quality", Target = "> 99.9%", Actual = "99.96", Unit = "% Perfect", StatusLabel = "Target Met", StatusClass = "bg-[#e3f6ed] text-[#22a06b]", BarColorClass = "before:bg-[#22a06b]" }, new SlaMetric { Name = "Adoption (Mobile Portal)", Target = "> 75%", Actual = "78.1", Unit = "% Active", StatusLabel = "Target Met", StatusClass = "bg-[#e2eefb] text-[#0066b3]", BarColorClass = "before:bg-[#0066b3]" } }; } private void LoadMonthlyReportsMeta() { MonthlyReportTemplates = new Dictionary { { "deviations", new MonthlyReportMetadata { Name = "NT Cost Containment Deviation Ledger", Description = "Out-of-policy bookings requiring CFO exception logs and approvals", Emoji = "⚖️", RecordCount = 7 } }, { "afterhours", new MonthlyReportMetadata { Name = "After-Hours Support Events Log", Description = "Late night crisis calls, flight delays and urgent re-routing records", Emoji = "🌙", RecordCount = 4 } }, { "refunds", new MonthlyReportMetadata { Name = "Unused Ticket & Open Refund Registry", Description = "Credits notes tracked securely to prevent voucher value expiry", Emoji = "🎟️", RecordCount = 5 } }, { "carbon", new MonthlyReportMetadata { Name = "CO2 Sustainability Footprint Report", Description = "Carbon offsets, bed-night emissions, and eco accommodation trends", Emoji = "🍃", RecordCount = 3 } } }; } private void LoadDeviationReport() { DeviationRows = new List { new DeviationReportRow { Traveller = "T. Maluleke", CostCentre = "Office of the CEO", Route = "JNB → LHR", Date = "14 May 2026", Supplier = "British Airways", OpenPrice = 21440M, PaidPrice = 18940M, ReasonCode = "DEV-CAB-01", Justification = "Premium Economy class upgrade justified by medical clearance certification", ApprovedBy = "CFO (Approved)", Status = "Authorized" }, new DeviationReportRow { Traveller = "J. Mokoena", CostCentre = "Office of the CEO", Route = "JNB → CPT", Date = "02 May 2026", Supplier = "SAA", OpenPrice = 3290M, PaidPrice = 2890M, ReasonCode = "CAP-AIR-01", Justification = "Late schedule confirmation due to urgent CEO board meetings; exceeded treasury R2,500 flight cap.", ApprovedBy = "CFO Office", Status = "Authorized" }, new DeviationReportRow { Traveller = "N. Ndlovu", CostCentre = "Qualifications & Standards", Route = "Cape Town stay", Date = "22 May 2026", Supplier = "Premier Hotels", OpenPrice = 2400M, PaidPrice = 1895M, ReasonCode = "CAP-HOT-02", Justification = "Cape Town peak-season rates exceed R 1,900/night limit. Bypassed with CFO support.", ApprovedBy = "CFO (Line Manager)", Status = "Authorized" }, new DeviationReportRow { Traveller = "S. Pillay", CostCentre = "Verifications", Route = "Durban engagement", Date = "14 May 2026", Supplier = "Avis Car", OpenPrice = 520M, PaidPrice = 420M, ReasonCode = "CAP-CAR-01", Justification = "Personal leisure extension added. Differential costs calculated and billed to personal card.", ApprovedBy = "Corporate Services", Status = "Authorized" } }; } private void LoadAfterHoursReport() { AfterHoursRows = new List { new AfterHoursLogRow { Date = "22 May 2026", Time = "11:14 PM", Traveller = "Dr. P. Sithole", Category = "Flight Delay Rerouting", Reason = "BA JNB-LHR delayed by 4 hours, missing connecting transit node", Resolution = "Rerouted to early morning shuttle flight. Lounge voucher auto-issued.", ResponseTimeMinutes = 9, Status = "Resolved", CostCentre = "Office of the CEO" }, new AfterHoursLogRow { Date = "18 May 2026", Time = "01:05 AM", Traveller = "T. Maluleke", Category = "Hotel Check-In Dispute", Reason = "Premier Hotel desk logged zero confirmation for booking #HT7811", Resolution = "Contacted hotel night supervisor, synced Sabre API voucher, check-in cleared.", ResponseTimeMinutes = 11, Status = "Resolved", CostCentre = "Office of the CEO" }, new AfterHoursLogRow { Date = "10 May 2026", Time = "05:45 AM", Traveller = "A. Dlamini", Category = "Urgent eVisa Query", Reason = "eVisa barcode rejected on Nairobi check-in transit node", Resolution = "Repulled VFS Global Kenyan eVisa PDF. SMS copy sent to boarding agent.", ResponseTimeMinutes = 6, Status = "Resolved", CostCentre = "Qualifications & Standards" } }; } private void LoadUnusedTicketsReport() { UnusedTicketRows = new List { new UnusedTicketRow { Traveller = "J. Mokoena", TicketNumber = "083-4412092", Airline = "SAA", Route = "JNB → CPT", FaceValue = 2890M, IssueDate = "21 May 2026", ExpiryDate = "21 Jul 2026", RefundStatus = "Pending", ActionPending = "Process Refund", CostCentre = "Office of the CEO" }, new UnusedTicketRow { Traveller = "T. Maluleke", TicketNumber = "125-9921443", Airline = "British Airways", Route = "JNB → LHR", FaceValue = 18940M, IssueDate = "05 Jan 2026", ExpiryDate = "05 Sep 2026", RefundStatus = "Credit Logged", ActionPending = "Apply Note", CostCentre = "Office of the CEO" }, new UnusedTicketRow { Traveller = "N. Ndlovu", TicketNumber = "083-1144021", Airline = "FlySafair", Route = "JNB → DUR", FaceValue = 1985M, IssueDate = "18 Apr 2026", ExpiryDate = "18 Aug 2026", RefundStatus = "Pending", ActionPending = "Process Refund", CostCentre = "Qualifications & Standards" } }; } private void LoadCarbonReport() { CarbonRows = new List { new CarbonReportRow { Category = "Air Travel", ActivityMetric = "142 Flights logged", CarbonFootprint = 21.4M, EcoPerformanceTag = "Heavy Footprint", GreenRecommendation = "Consolidate multiple JNB-CPT site trips", CostCentre = "Office of the CEO", Date = "14 May 2026" }, new CarbonReportRow { Category = "Lodging", ActivityMetric = "128 Bed nights", CarbonFootprint = 9.8M, EcoPerformanceTag = "Eco Certified (42%)", GreenRecommendation = "Select Green-flag Premier Hotels", CostCentre = "Qualifications & Standards", Date = "22 May 2026" }, new CarbonReportRow { Category = "Ground & Transit", ActivityMetric = "32 Car rental cycles", CarbonFootprint = 3.0M, EcoPerformanceTag = "Optimal", GreenRecommendation = "Utilize Gautrain connections regularly", CostCentre = "Verifications", Date = "14 May 2026" }, new CarbonReportRow { Category = "Air Travel", ActivityMetric = "28 Flights logged", CarbonFootprint = 4.2M, EcoPerformanceTag = "Moderate", GreenRecommendation = "Use Microsoft Teams for routine alignments", CostCentre = "Qualifications & Standards", Date = "18 Apr 2026" }, new CarbonReportRow { Category = "Lodging", ActivityMetric = "15 Bed nights", CarbonFootprint = 1.1M, EcoPerformanceTag = "Eco Certified (100%)", GreenRecommendation = "Green accommodation target met", CostCentre = "Office of the CEO", Date = "10 Jan 2026" } }; } private void LoadConsultantPerformances() { ConsultantPerformances = new List { new ConsultantPerformance { Name = "Thabo Khumalo", Role = "Senior Travel Lead", Specialty = "VIP & Executive Bookings", BookingsHandled = 412, ErrorsCount = 0, ResponseTimeMinutes = 44, CsatScore = 4.92 }, new ConsultantPerformance { Name = "Lerato Nkosi", Role = "Reconciliation Expert", Specialty = "SLA Compliance & Disputes", BookingsHandled = 310, ErrorsCount = 1, ResponseTimeMinutes = 22, CsatScore = 4.88 }, new ConsultantPerformance { Name = "Zama Ndlovu", Role = "Helpline Coordinator", Specialty = "After-Hours Emergency Support", BookingsHandled = 142, ErrorsCount = 0, ResponseTimeMinutes = 9, CsatScore = 4.96 } }; } private void LoadServiceDisputes() { ServiceQueries = new List { new SlaQueryDispute { Id = 1, Date = "24 May 2026", Category = "Booking Response Delay", TravellerName = "A. Dlamini", Urgency = "High", Description = "Flight request from Durban took 74 mins to receive first quote validation. SLA limit is 60 mins.", Status = "In Review" }, new SlaQueryDispute { Id = 2, Date = "19 May 2026", Category = "Billing / Invoice Dispute", TravellerName = "N. Ndlovu", Urgency = "Medium", Description = "Double billing check-in on Durban Airport transfer invoice. Outstanding audit matched in ledger.", Status = "Resolved" } }; } }