@page "/mobile"
@using System.Collections.Generic
@using System.Linq
@using System.Threading.Tasks
@* Page Header Area *@
SAQA Mobile Companion
Empowering travellers with real-time itinerary updates, offline OCR expense capturing, and instant consultant chat
@* Alert / Feedback Notification Banner *@
@if (!string.IsNullOrEmpty(AlertFeedback))
{
}
@* Adoption & Capture Progress Cards *@
Active Mobile Users
@ActiveInstalls / 238
78% adoption across SAQA
Receipts Scanned (OCR)
@ReceiptsScannedCount
R @TotalValueScanned.ToString("N0") auto-reconciled
Mobile Bookings Share
34%
May 2026 reporting period
Avg Approval Turnaround
1h 12m
92% faster than email workflows
@* Core interactive layout split *@
@* Interactive Phone Bezel Simulator - Left Column (lg:col-span-5) *@
@* Front Camera Notch *@
@* Phone Inner Screen Canvas *@
@* Phone Status Bar *@
@* Simulated Active Mobile Screen View *@
@* Screen Header *@
@ActiveTravellerInitials
@ActiveTraveller
SAQA corporate account
Online
@* Live View Contents based on Active Phone tab *@
@if (ActivePhoneTab == "profile")
{
SAA Voyager Program
@LoyaltyMiles.ToString("N0") Miles
Gold status
Marriott Bonvoy Partner ID Linked
Verified Documents
ZA Passport
Valid Oct 2029
United Kingdom Visa
Valid Dec 2027
Schengen short-stay
Awaiting renewal
Travel Preferences
Aisle Seat preferred
Halal Meal
Non-Smoking Floor
Avis automatic group B
}
else if (ActivePhoneTab == "expenses")
{
Captured Overseas Receipts
OCR Sync active
@foreach (var exp in MockExpenses)
{
@exp.Merchant
@exp.Category · @exp.Date
R @exp.ZarAmount.ToString("N2")
@exp.ForeignAmount
Reconciled
}
@if (IsScanning)
{
Simulating Live Receipt Photo OCR Scan...
Auto-converting exchange rates to ZAR settlement metrics
}
}
else if (ActivePhoneTab == "itinerary")
{
Active Business Itinerary
Cape Town Engagement
Gate Open
Flight (Outbound)
SAA flight SA 311
Johannesburg (JNB) to Cape Town (CPT)
Boarding
05:30 AM
Seat Assigned
14C (Aisle)
Gate
A12 (Terminal B)
Accommodation Check-In
Premier Hotel Waterfront
2 Nights confirmed lodging · PO linked
Voucher reference: HT7811 · Billed to SAQA Lodge Card
}
else if (ActivePhoneTab == "chat")
{
@foreach (var msg in ChatMessages)
{
@msg.Sender · @msg.Timestamp
@msg.Text
}
@if (IsTyping)
{
●
●
●
Consultant typing...
}
}
@* Phone Bottom Navigation Bar *@
@* Traveller Profile Selector (Updates the phone UI dynamically) *@
Swapping the active traveller updates the profile sync settings and loyalties on the phone bezel above.
@* Mobile Capabilities Grid and Adopt Cards - Right Column (lg:col-span-7) *@
Dynamic Mobile Capabilities
Purpose-built workflows configured for SAQA corporate compliance
Always Syncing
@* Cap 1 *@
Profile & Doc Synchronization
Automatic sync of passport expiries, visas, and airline reward levels before tickets are processed.
@* Cap 2 *@
Receipt OCR Engine (Offline Ready)
Translates international receipts into ZAR using historical exchange conversion tables. Works in airplanes without Wi-Fi.
@* Cap 3 *@
Push Notification Alerts
Real-time alerts for gate changes, boarding statuses, flight delays, or global travel risk notifications.
@* Tile 4 *@
Approve On-the-Go
SAQA executives can approve pre-travel authorizations instantly inside the app.
Adoption and Usage Analysis
Continuous telemetry tracking of mobile app engagements
Active Installations
Across all corporate profiles
@ActiveInstalls of 238
May Receipts Scanned
Submissions cleared via OCR
@ReceiptsScannedCount
Mobile Self-Bookings
Executed via corporate tool
34% of all trips
Biometric POPIA Security compliance
Companion logs zero database footprints locally on device storage caches. All connection frames are sealed with AES-256 state channels.
@code {
// Model Definitions
public class MockExpense
{
public string Date { get; set; } = string.Empty;
public string Merchant { get; set; } = string.Empty;
public string Category { get; set; } = string.Empty;
public string ForeignAmount { get; set; } = string.Empty;
public decimal ZarAmount { get; set; }
}
public class ChatBubble
{
public string Sender { get; set; } = string.Empty;
public string Timestamp { get; set; } = string.Empty;
public string Text { get; set; } = string.Empty;
public bool IsTraveller { get; set; }
}
// Core states
private string ActivePhoneTab { get; set; } = "profile";
private int ActiveInstalls { get; set; } = 186;
private int ReceiptsScannedCount { get; set; } = 412;
private decimal TotalValueScanned { get; set; } = 184200M;
private string AlertFeedback { get; set; } = string.Empty;
// Active Traveller Details (Synchronized across UI metrics)
private string ActiveTraveller { get; set; } = "J. Mokoena";
private string ActiveTravellerInitials { get; set; } = "JM";
private int LoyaltyMiles { get; set; } = 84210;
// Live OCR Scanning State simulation
private bool IsScanning { get; set; } = false;
// Chat Interface Simulator states
private string NewChatMessage { get; set; } = string.Empty;
private bool IsTyping { get; set; } = false;
private int UnreadChatCount { get; set; } = 1;
// Mock Database Arrays
private List