@page "/financial"

Financial Management

Bill-back consolidation, lodge card reconciliation, virtual credit cards

Outstanding Invoices
R @OutstandingInvoices.ToString("N0")
14 invoices · ageing 0-30 days
Lodge Card Balance
R @LodgeCardBalance.ToString("N0")
Reconciled to 24 May
YTD Savings
@YtdSavingsText
▲ 18.2% vs. baseline
No-Show Fees
R @NoShowFees.ToString("N0")
▼ R 2,300 vs. last month

Spend vs. Savings

Cost containment performance

On track
R2.5M R2.0M R1.5M R1.0M R500k Dec Jan Feb Mar Apr May
Total Spend
Savings Realised

Savings Breakdown

How May savings of R 412,580 were realised

+R 412k
@foreach (var item in SavingsData) { }
Category Open Rate Negotiated Saved %
@item.Category R @item.OpenRate.ToString("N0") R @item.NegotiatedRate.ToString("N0") R @item.Saved.ToString("N0") @item.Percentage.ToString("F1")%
Total saved this month R @TotalSavedThisMonth.ToString("N0") 16.8%

Virtual Credit Card

Single-use, per-transaction

SAQA · Single-use VCC
4716 •••• •••• 8842
Cardholder SAQA Travel Desk
Limit R 3,500.00
Expires 02/06/26

Spend by Cost Centre

Where the May spend went

@foreach (var cc in CostCentreData) {
@cc.Name
@cc.Travellers travellers
R @cc.Spend.ToString("N0")
}

Consolidated Invoices

Bill-back from suppliers · linked to PO & Travel Authorisation

May 2026
@foreach (var invoice in InvoicesData) { }
Invoice # Supplier Linked PO Items Total Status
@invoice.InvoiceNum @invoice.Supplier @invoice.LinkedPo @invoice.Items R @invoice.Total.ToString("N0") @invoice.Status
@code { // KPI Data Properties private double OutstandingInvoices { get; set; } = 184920; private double LodgeCardBalance { get; set; } = 312440; private string YtdSavingsText { get; set; } = "R 1.94M"; private double NoShowFees { get; set; } = 8140; private double TotalSavedThisMonth { get; set; } = 412580; // Savings Breakdown Data Structure private List SavingsData { get; set; } = new() { new SavingsItem("Air, domestic", 980400, 832340, 148060, 15.1, "bg-[#e2eefb] text-[#0066b3]"), new SavingsItem("Air, international", 320200, 260920, 59280, 18.5, "bg-[#e2eefb] text-[#0066b3]"), new SavingsItem("Accommodation", 845600, 722420, 123180, 14.6, "bg-[#f4f7fb] text-[#1f2a3a] border border-[#e4eaf2]"), new SavingsItem("Car rental", 215800, 168180, 47620, 22.1, "bg-[#fff4dd] text-[#b06b00]"), new SavingsItem("Shuttle and transfers", 92800, 75400, 17400, 18.8, "bg-[#f4f7fb] text-[#1f2a3a] border border-[#e4eaf2]"), new SavingsItem("Service fees waived", 17040, 0, 17040, 100.0, "bg-[#e3f6ed] text-[#22a06b]") }; // Cost Centre Data Structure private List CostCentreData { get; set; } = new() { new CostCentreItem("Office of the CEO", 12, 684200), new CostCentreItem("Qualifications and Standards", 38, 542400), new CostCentreItem("Verifications", 26, 418950), new CostCentreItem("Research and Stats", 18, 312800), new CostCentreItem("Corporate Services", 14, 248400), new CostCentreItem("International Liaison", 6, 640560) }; // Consolidated Invoices Data Structure private List InvoicesData { get; set; } = new() { new InvoiceItem("INV-2026-0541", "SAA", "PO-44219", "3 tickets", 12420, "Paid", "bg-[#e3f6ed] text-[#22a06b]"), new InvoiceItem("INV-2026-0542", "Premier Hotels", "PO-44230", "5 nights", 9475, "Pending", "bg-[#fff4dd] text-[#b06b00]"), new InvoiceItem("INV-2026-0543", "Avis", "PO-44245", "1 rental · 3 days", 1420, "Reconciled", "bg-[#e2eefb] text-[#0066b3]"), new InvoiceItem("INV-2026-0544", "FlySafair", "PO-44250", "2 tickets", 3970, "Paid", "bg-[#e3f6ed] text-[#22a06b]"), new InvoiceItem("INV-2026-0545", "British Airways", "PO-44261", "1 ticket (LHR)", 18940, "Disputed", "bg-[#fde5e8] text-[#dc2626]") }; // Sub-classes for models public class SavingsItem { public string Category { get; set; } public double OpenRate { get; set; } public double NegotiatedRate { get; set; } public double Saved { get; set; } public double Percentage { get; set; } public string BadgeClass { get; set; } public SavingsItem(string category, double openRate, double negotiatedRate, double saved, double percentage, string badgeClass) { Category = category; OpenRate = openRate; NegotiatedRate = negotiatedRate; Saved = saved; Percentage = percentage; BadgeClass = badgeClass; } } public class CostCentreItem { public string Name { get; set; } public int Travellers { get; set; } public double Spend { get; set; } public CostCentreItem(string name, int travellers, double spend) { Name = name; Travellers = travellers; Spend = spend; } } public class InvoiceItem { public string InvoiceNum { get; set; } public string Supplier { get; set; } public string LinkedPo { get; set; } public string Items { get; set; } public double Total { get; set; } public string Status { get; set; } public string StatusBadgeClass { get; set; } public InvoiceItem(string invoiceNum, string supplier, string linkedPo, string items, double total, string status, string statusBadgeClass) { InvoiceNum = invoiceNum; Supplier = supplier; LinkedPo = linkedPo; Items = items; Total = total; Status = status; StatusBadgeClass = statusBadgeClass; } } }