[CLAUDE] FE-User: tab strip 4 giai doan tren phieu PE + menu 4-GD + danh so 01-07 nhom HD (UAT anh Kiet)
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m44s

- PePipelineStrip moi (mirror x2 app md5-identical): Duyet NCC | Ke hoach ky ket HD | Duyet hop dong | Hop dong cung — chen dau PeDetailTabs (GD1 active)
- Menu 4-GD: rename 2 root (PurchaseEvaluations->Duyet NCC, Contracts->Duyet hop dong) + 2 root placeholder KeHoachKyKet/HopDongCung (ngoai MenuKeys.All, staticMap -> /dashboard) — prod da SQL truc tiep cung ngay, seeder+labelBackfill giu hoi tu (gotcha #11)
- Danh so 01.-07. nhom HD: prod prepend-only 0-VN-over-wire (renamed=7), seeder typeLabels + labelBackfill 7 entry
- Dong bo nhan 4-GD tren dashboard (3 title + 3 group aria)
- reviewKeys += 2 placeholder CanRead-only; test 562 PASS; build fe x2 PASS

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-29 12:06:19 +07:00
parent b2a86feab6
commit 1a47a61c21
8 changed files with 190 additions and 18 deletions

View File

@ -1736,15 +1736,19 @@ public static class DbInitializer
private static async Task SeedMenuTreeAsync(ApplicationDbContext db, ILogger logger)
{
// [S159 2026-07-29] UAT anh Kiệt: "cho đánh số thứ tự phía trước giúp anh — 01. HĐ thầu phụ"
// ⇒ prefix 01.-07. theo THỨ TỰ hiển thị (= thứ tự ContractTypeCodes). Prod đã UPDATE
// trực tiếp cùng ngày (prepend-only, 0 ký tự VN qua wire); labelBackfill dưới giữ
// các env khác hội tụ (gotcha #11 — sửa tree.Add một mình là vô tác dụng trên DB đang chạy).
var typeLabels = new Dictionary<string, string>
{
["ThauPhu"] = "HĐ Thầu phụ",
["GiaoKhoan"] = "HĐ Giao khoán",
["NhaCungCap"] = "HĐ Nhà cung cấp",
["DichVu"] = "HĐ Dịch vụ",
["MuaBan"] = "HĐ Mua bán",
["NguyenTacNcc"] = "HĐ Nguyên tắc NCC",
["NguyenTacDv"] = "HĐ Nguyên tắc Dịch vụ",
["ThauPhu"] = "01. HĐ Thầu phụ",
["GiaoKhoan"] = "02. HĐ Giao khoán",
["NhaCungCap"] = "03. HĐ Nhà cung cấp",
["DichVu"] = "04. HĐ Dịch vụ",
["MuaBan"] = "05. HĐ Mua bán",
["NguyenTacNcc"] = "06. HĐ Nguyên tắc NCC",
["NguyenTacDv"] = "07. HĐ Nguyên tắc Dịch vụ",
};
var tree = new List<(string Key, string Label, string? Parent, int Order, string Icon)>
@ -1764,7 +1768,11 @@ public static class DbInitializer
(MenuKeys.CatalogServices, "Dịch vụ", MenuKeys.Catalogs, 3, "Wrench"),
(MenuKeys.CatalogWorkItems,"Hạng mục công việc", MenuKeys.Catalogs, 4, "ListChecks"),
// [S57] Order 30→31: nhường slot 30 cho nhóm "Cá nhân" (đứng ngay sau Văn phòng số = 29, mirror Puro).
(MenuKeys.Contracts, "Hợp đồng", null, 31, "FileText"),
(MenuKeys.Contracts, "Duyệt hợp đồng", null, 31, "FileText"), // [S159] rename theo 4-GĐ (owner tab strip)
// [S159] 2 root PLACEHOLDER GĐ2/GĐ4 — menu = 4 giai đoạn (owner). Ngoài MenuKeys.All,
// FE staticMap trỏ /dashboard. Prod đã INSERT trực tiếp cùng ngày (idempotent ở đây).
(MenuKeys.KeHoachKyKet, "Kế hoạch ký kết HĐ", null, 26, "FileSignature"),
(MenuKeys.HopDongCung, "Hợp đồng cứng", null, 32, "Stamp"),
(MenuKeys.Forms, "Biểu mẫu", null, 40, "FileSpreadsheet"),
(MenuKeys.Reports, "Báo cáo", null, 50, "BarChart3"),
(MenuKeys.System, "Hệ thống", null, 90, "Settings"),
@ -1774,7 +1782,7 @@ public static class DbInitializer
(MenuKeys.MenuVisibility, "Menu eOffice", MenuKeys.System, 94, "Eye"),
(MenuKeys.Workflows, "Quy trình HĐ", MenuKeys.System, 95, "GitBranch"),
// Module Duyệt NCC (tiền-HĐ)
(MenuKeys.PurchaseEvaluations, "Quy trình chọn Thầu phụ - NCC", null, 25, "ClipboardCheck"),
(MenuKeys.PurchaseEvaluations, "Duyệt NCC", null, 25, "ClipboardCheck"), // [S159] rename theo 4-GĐ
(MenuKeys.PeWorkflows, "Quy trình Duyệt NCC", MenuKeys.System, 95, "GitCompareArrows"),
// Quy trình duyệt MỚI (Mig 22 — Session 17, 2026-05-08): schema riêng
// UAT trước khi migrate hoàn toàn. Cấu trúc: Quy trình > Bước (Phòng) > Cấp (NV cụ thể).
@ -1932,6 +1940,19 @@ public static class DbInitializer
// chạy vì upsert `:1893-1905` chỉ update `Order` cho key đã tồn tại.
[MenuKeys.PurchaseEvaluationPending("DuyetNcc")] = "Đang duyệt",
[MenuKeys.PurchaseEvaluationPending("DuyetNccPhuongAn")] = "Đang duyệt",
// [S159] 🔴 UAT anh Kiệt: đánh số 01.-07. nhóm HĐ (verbatim "01 . HĐ thầu phụ").
// Prod đã prepend trực tiếp cùng ngày ⇒ trên prod các entry này NO-OP (equal);
// dev/fresh-DB hội tụ qua đây. Nguồn số = thứ tự ContractTypeCodes (= [Order]).
// [S159] 2 root rename theo 4-GĐ (prod đã SQL cùng ngày ⇒ NO-OP trên prod).
[MenuKeys.PurchaseEvaluations] = "Duyệt NCC",
[MenuKeys.Contracts] = "Duyệt hợp đồng",
[MenuKeys.ContractTypeGroup("ThauPhu")] = "01. HĐ Thầu phụ",
[MenuKeys.ContractTypeGroup("GiaoKhoan")] = "02. HĐ Giao khoán",
[MenuKeys.ContractTypeGroup("NhaCungCap")] = "03. HĐ Nhà cung cấp",
[MenuKeys.ContractTypeGroup("DichVu")] = "04. HĐ Dịch vụ",
[MenuKeys.ContractTypeGroup("MuaBan")] = "05. HĐ Mua bán",
[MenuKeys.ContractTypeGroup("NguyenTacNcc")] = "06. HĐ Nguyên tắc NCC",
[MenuKeys.ContractTypeGroup("NguyenTacDv")] = "07. HĐ Nguyên tắc Dịch vụ",
};
var updatedLabels = 0;
foreach (var (key, expectedLabel) in labelBackfill)
@ -2113,6 +2134,9 @@ public static class DbInitializer
var reviewKeys = MenuKeys.All.Where(InReviewScope)
.Concat(peKeys)
// [S159] 2 root placeholder GĐ2/GĐ4 — CanRead-only mọi role (IsPeKey=false
// ⇒ nhánh read-only). Prod đã INSERT trực tiếp; đây giữ fresh-DB hội tụ.
.Concat(new[] { MenuKeys.KeHoachKyKet, MenuKeys.HopDongCung })
.Distinct()
.ToArray();
var roles = await roleManager.Roles.ToListAsync();