From cc0e642c435e51987efb586b178722fd086b3c8e Mon Sep 17 00:00:00 2001 From: Ho Ngoc Hai Date: Sun, 1 Mar 2026 05:22:32 +0700 Subject: [PATCH] =?UTF-8?q?feat(admin):=20P6=20=E2=80=94=20Zones,=20Combo?= =?UTF-8?q?=20services,=20Shift=20management?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - R4: Zone management (Restaurant) — 4 zones with table counts, status, actions - S6: Combo services (Spa) — 3 combo cards with pricing, duration, sold count - C5: Shift management (Café) — weekly shift grid (S/C/—) with legend + stats --- .../Pages/Admin/Shop/ShopPage.razor | 130 ++++++++++++++++++ .../Services/ShopSidebarConfig.cs | 3 + 2 files changed, 133 insertions(+) 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 ddbb8b2f..c9f3c6be 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 @@ -1338,6 +1338,133 @@ break; + // ═══ R4: ZONES / KHU VỰC (Nhà hàng) ═══ + case "zones": +
+
+

📍 Quản lý khu vực

+ +
+
+
+ @foreach (var (name, tables, desc, color, icon) in new[] { + ("Tầng 1 — Sảnh chính", 12, "Khu vực chính tiếp khách, gần quầy bar", "#3B82F6", "building"), + ("Tầng 2 — VIP", 6, "Phòng VIP riêng tư, cách âm tốt", "#A855F7", "crown"), + ("Sân vườn", 8, "Khu vực ngoài trời, view đẹp", "#22C55E", "trees"), + ("Bar & Lounge", 4, "Khu vực bar, phục vụ đồ uống", "#F59E0B", "wine") }) + { +
+
+
+ +
+
+
@name
+
@tables bàn
+
+
+

@desc

+
+ Đang hoạt động +
+
+ + +
+
+ } +
+
+
+ break; + + // ═══ S6: COMBO DỊCH VỤ (Spa) ═══ + case "combos": +
+
+

🎁 Combo dịch vụ

+ +
+
+
+ @foreach (var (name, services, duration, price, orig, sold, color) in new[] { + ("Combo Thư Giãn Toàn Thân", "Massage body 60' + Xông hơi 30' + Đắp mặt nạ 20'", "110 phút", "800,000₫", "1,050,000₫", 45, "#3B82F6"), + ("Combo Detox & Làm Đẹp", "Tẩy tế bào chết + Massage mặt + Chăm sóc da 5 bước", "90 phút", "650,000₫", "850,000₫", 32, "#A855F7"), + ("Combo Cặp Đôi Premium", "2 Massage body 90' + 2 Xông hơi + Trà thảo mộc", "120 phút", "1,500,000₫", "2,100,000₫", 18, "#EC4899") }) + { +
+
+

@name

+ Đang bán +
+

@services

+
+ + @duration +
+
+
+ @price + @orig +
+ Đã bán: @sold +
+
+ } +
+
+
+ break; + + // ═══ C5: CA LÀM VIỆC / SHIFTS (Café) ═══ + case "shifts": +
+
3Ca hôm nay
+
5Đang làm việc
+
1Vắng mặt
+
+
+
+

📋 Lịch ca — Tuần này

+ +
+
+ + + @foreach (var d in new[] { "T2", "T3", "T4", "T5", "T6", "T7", "CN" }) + { + + } + + @foreach (var (name, shifts) in new[] { + ("Nguyễn A", new[] { "S", "S", "C", "C", "—", "S", "—" }), + ("Trần B", new[] { "C", "C", "S", "S", "C", "—", "—" }), + ("Lê C", new[] { "S", "—", "S", "C", "S", "C", "S" }), + ("Phạm D", new[] { "—", "S", "C", "—", "C", "S", "C" }), + ("Hoàng E", new[] { "C", "C", "—", "S", "S", "—", "S" }) }) + { + + + @foreach (var s in shifts) + { + var bg = s == "S" ? "rgba(59,130,246,0.12)" : s == "C" ? "rgba(168,85,247,0.12)" : "transparent"; + var fg = s == "S" ? "#3B82F6" : s == "C" ? "#A855F7" : "var(--admin-text-tertiary)"; + + } + + } +
Nhân viên@d
@name + @s +
+
+
+
+
S = Sáng (7:00-14:00)
+
C = Chiều (14:00-22:00)
+
— = Nghỉ
+
+ break; + // ═══ UNKNOWN SECTIONS ═══ default:
@@ -1554,6 +1681,9 @@ case "consent": _sectionTitle = "Cam kết KH"; _sectionIcon = "file-check"; _sectionDescription = "Biểu mẫu đồng ý khách hàng."; break; case "doctors": _sectionTitle = "Bác sĩ / CK"; _sectionIcon = "stethoscope"; _sectionDescription = "Quản lý bác sĩ và chuyên gia."; break; case "followup": _sectionTitle = "Tái khám"; _sectionIcon = "calendar-heart"; _sectionDescription = "Lịch tái khám sau điều trị."; break; + case "zones": _sectionTitle = "Khu vực"; _sectionIcon = "map-pin"; _sectionDescription = "Quản lý khu vực phục vụ."; break; + case "combos": _sectionTitle = "Combo dịch vụ"; _sectionIcon = "layers"; _sectionDescription = "Quản lý combo dịch vụ."; break; + case "shifts": _sectionTitle = "Ca làm việc"; _sectionIcon = "clock-4"; _sectionDescription = "Lịch ca làm, phân ca."; break; default: _sectionTitle = Section ?? "Trang"; _sectionIcon = "layout-dashboard"; _sectionDescription = "Trang đang phát triển."; break; } } diff --git a/apps/web-client-tpos-net/src/WebClientTpos.Client/Services/ShopSidebarConfig.cs b/apps/web-client-tpos-net/src/WebClientTpos.Client/Services/ShopSidebarConfig.cs index 7be4bc82..e7c4c932 100644 --- a/apps/web-client-tpos-net/src/WebClientTpos.Client/Services/ShopSidebarConfig.cs +++ b/apps/web-client-tpos-net/src/WebClientTpos.Client/Services/ShopSidebarConfig.cs @@ -34,6 +34,7 @@ public static class ShopSidebarConfig new("POS Bán hàng", "monitor", "pos"), new("Menu & Đồ uống", "coffee", "menu"), new("Nguyên liệu", "flask-conical", "recipes"), + new("Ca làm việc", "clock-4", "shifts"), new("Tồn kho", "warehouse", "inventory"), new("Tài chính", "trending-up", "finance"), new("Nhân sự", "users", "staff"), @@ -49,6 +50,7 @@ public static class ShopSidebarConfig new("Menu & Món ăn", "utensils", "menu"), new("Bàn / Table", "grid-3x3", "tables"), new("Đặt bàn", "calendar-check", "reservations"), + new("Khu vực", "map-pin", "zones"), new("Bếp (Kitchen)", "flame", "kitchen"), new("Tồn kho", "warehouse", "inventory"), new("Tài chính", "trending-up", "finance"), @@ -80,6 +82,7 @@ public static class ShopSidebarConfig new("Lịch hẹn", "calendar", "appointments"), new("Dịch vụ", "sparkles", "services"), new("Gói dịch vụ", "gift", "packages"), + new("Combo dịch vụ", "layers", "combos"), new("Tài nguyên", "door-open", "resources"), new("Sản phẩm", "package", "products"), new("Tài chính", "trending-up", "finance"),