diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor index 06afae51..db121a02 100644 --- a/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor +++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Pages/Admin/Shop/ShopPage.razor @@ -214,10 +214,28 @@ // ═══ FINANCE ═══ case "finance": + var finOrders = _financePeriod switch { + "7d" => _orders.Where(o => o.CreatedAt >= DateTime.UtcNow.AddDays(-7)).ToList(), + "30d" => _orders.Where(o => o.CreatedAt >= DateTime.UtcNow.AddDays(-30)).ToList(), + _ => _orders }; +
+

Tài chính

+
+ @foreach (var (label, val) in new[] { ("7 ngày", "7d"), ("30 ngày", "30d"), ("Tất cả", "all") }) + { + + } +
+
-
@FormatVND(_orders.Sum(o => o.TotalAmount))Tổng doanh thu
-
@_orders.CountĐơn hàng
-
@FormatVND(_orders.Any() ? _orders.Average(o => o.TotalAmount) : 0)TB/đơn
+
@FormatVND(finOrders.Sum(o => o.TotalAmount))Tổng doanh thu
+
@finOrders.CountĐơn hàng
+
@FormatVND(finOrders.Any() ? finOrders.Average(o => o.TotalAmount) : 0)TB/đơn
@FormatVND(_wallets.Sum(w => w.Balance))Số dư ví
@if (_walletTxns.Any()) @@ -346,16 +364,28 @@ // ═══ CUSTOMERS + MEMBERSHIP LEVELS ═══ case "customers": - @if (!_members.Any()) +
+

@_members.Count khách hàng

+
+ + +
+
+ var filteredMembers = string.IsNullOrWhiteSpace(_customerSearch) + ? _members + : _members.Where(m => m.Id.ToString().Contains(_customerSearch, StringComparison.OrdinalIgnoreCase) + || (m.LevelName ?? "").Contains(_customerSearch, StringComparison.OrdinalIgnoreCase)).ToList(); + @if (!filteredMembers.Any()) { @RenderEmpty("heart", "#EF4444", "Chưa có khách hàng", "Khách hàng sẽ hiển thị khi có giao dịch", "monitor", "Mở POS bán hàng", $"/pos/{ShopId}/{_posVertical}") } else {
-
@_members.CountTổng khách hàng
+
@filteredMembers.CountTổng khách hàng
@_memberLevels.CountCấp bậc
-
@(_members.Any() ? _members.Max(m => m.TotalExpEarned).ToString("N0") : "0")EXP cao nhất
+
@(filteredMembers.Any() ? filteredMembers.Max(m => m.TotalExpEarned).ToString("N0") : "0")EXP cao nhất
@if (_memberLevels.Any()) { @@ -390,11 +420,11 @@ EXP Ngày tham gia - @foreach (var m in _members) + @foreach (var m in filteredMembers) { @m.Id.ToString()[..8] - @(m.LevelName ?? "—") + @(m.LevelName ?? "—") @m.TotalExpEarned.ToString("N0") @m.CreatedAt.ToString("dd/MM/yyyy") @@ -889,6 +919,10 @@ private List _staffSchedules = new(); private List _invTxns = new(); private List _resources = new(); + // Customer filter state + private string _customerSearch = ""; + // Finance date range filter state + private string _financePeriod = "all"; // 7d, 30d, all protected override async Task OnInitializedAsync() => await LoadData();