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 c351679f..8e7c2875 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
@@ -164,13 +164,25 @@
@foreach (var p in _products)
{
+ var typeColor = (p.Type ?? "") switch { "Service" => "#EC4899", "Physical" => "#3B82F6", _ => "#F59E0B" };
+ var typeLabel = (p.Type ?? "") switch { "Service" => "Dịch vụ", "Physical" => "Vật lý", _ => "Đồ uống" };
@p.Name
-
@(p.CategoryName ?? "—")
+
@(p.CategoryName ?? "—")
+
@typeLabel
@p.Price.ToString("N0")₫
+ @if (p.Description?.Contains("variant:") == true || p.Description?.Contains("topping:") == true)
+ {
+
+ @foreach (var tag in (p.Description ?? "").Split(',').Where(t => t.Trim().StartsWith("variant:") || t.Trim().StartsWith("topping:")).Take(3))
+ {
+ @tag.Trim()
+ }
+
+ }
}
@@ -499,7 +511,7 @@
var borderColor = room.Status switch { "available" => "rgba(139,92,246,0.3)", "occupied" => "rgba(239,68,68,0.3)", "reserved" => "rgba(245,158,11,0.3)", _ => "rgba(107,107,111,0.3)" };
var statusColor = room.Status switch { "available" => "#8B5CF6", "occupied" => "#EF4444", "reserved" => "#F59E0B", _ => "#6B6B6F" };
var statusText = room.Status switch { "available" => "Trống", "occupied" => "Đang hát", "reserved" => "Đã đặt", "cleaning" => "Dọn dẹp", _ => room.Status };
- var roomType = (room.Zone ?? "").ToLower() switch { var z when z.Contains("vip") => ("VIP", "#F59E0B"), var z when z.Contains("party") => ("Party", "#EC4899"), _ => ("Standard", "#8B5CF6") };
+ var roomType = (room.Zone ?? "").ToLower() switch { var z when z.Contains("vip") => ("VIP", "#F59E0B", 200000m), var z when z.Contains("party") => ("Party", "#EC4899", 350000m), _ => ("Standard", "#8B5CF6", 120000m) };
@@ -508,15 +520,23 @@
@roomType.Item1
-
@(room.Zone ?? "Chung") • @room.Capacity chỗ
+
@(room.Zone ?? "Chung") • @room.Capacity chỗ
+
@FormatVND(roomType.Item3)/giờ
@statusText
@if (room.SessionId.HasValue)
{
-
- @room.GuestCount khách • Bắt đầu @(room.StartedAt?.ToString("HH:mm") ?? "—")
+ var elapsed = DateTime.UtcNow - (room.StartedAt ?? DateTime.UtcNow);
+ var hours = Math.Max(1, (int)Math.Ceiling(elapsed.TotalHours));
+ var bill = hours * roomType.Item3;
+
+
@room.GuestCount khách • Bắt đầu @(room.StartedAt?.ToString("HH:mm") ?? "—")
+
+ @hours giờ
+ @FormatVND(bill)
+
}