diff --git a/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs b/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs index 808d176..8be29e2 100644 --- a/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs +++ b/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs @@ -1538,27 +1538,50 @@ public static class DbInitializer // - Nếu user đã có → verify dept + position + roles, fix nếu drift // - Try-catch per-user → 1 fail không abort 12 còn lại // - Log chi tiết success/fixed/created/failed counts - // Default password: User@123456 (warn log để rotate prod). - private const string DemoUserPassword = "User@123456"; + // Default password: User@1234567 (warn log để rotate prod). + // [S58 2026-06-11] 11→12 ký tự: prod set Identity:Password:RequiredLength=12 + // (appsettings.Production.json) → CreateAsync silent-fail MỌI user dùng const này + // trên prod từ trước tới giờ (named-person sample + nv.cao/nv.truong IT pool + + // 5 real staff — root cause "helpdesk inert" S56). User Dev cũ giữ pass cũ + // (const chỉ áp dụng lúc CREATE user mới, không đổi pass existing). + private const string DemoUserPassword = "User@1234567"; - // [S57bis 2026-06-11] Khóa 14/16 demo sample user — sếp yêu cầu "clear dữ liệu cũ", + // [S57bis 2026-06-11] Khóa demo sample user — sếp yêu cầu "clear dữ liệu cũ", // anh chốt scope: CHỈ khóa user demo (GIỮ phiếu/HĐ/NCC/dự án demo). Ungated idempotent // (mirror SeedRealMasterDataAsync philosophy): chạy mọi startup → khóa BỀN kể cả ai - // re-activate nhầm. GIỮ ACTIVE có chủ đích: + // re-activate nhầm. Email không tồn tại trong DB → skip vô hại. + // [S58 2026-06-11] +20 email UAT-matrix `{dept}.{nv|pp|tp}@` + `bod.{1,2}@` = population + // prod THẬT (tạo TAY qua admin UI 2026-05-13 — chưa từng nằm trong seed). 14 email + // named-person = population Dev (prod không có — DemoUserPassword cũ 11 ký tự fail + // RequiredLength=12, đã fix). KHÔNG khóa theo pattern/regex: binh.le@/binh.lethanh@ + // là người thật nằm sát scheme demo — CHỈ exact-email list. + // GIỮ ACTIVE có chủ đích (KHÔNG đưa vào list): // - nv.cao + nv.truong : IT helpdesk round-robin pool (S52 P11-D) — khóa nốt SAU KHI // anh gán ≥1 user thật vào Phòng CNTT (ops-pending S56), tránh helpdesk chết hẳn. // - catalog.manager : account chức năng quản danh mục dùng chung (Plan CA S29). + // - nv.test : creds cicd-monitor smoke-verify prod sau deploy (anh chốt S58). + // - chuong.phan@solution.com.vn (domain thiếu 's', không trong seed): typo-dup của bản + // @solutions nhưng có thể là login thật anh Chương đang dùng — giữ, xác nhận rồi dọn sau. // Muốn mở lại 1 user có chủ đích → gỡ email khỏi list này + admin re-activate. private static async Task LockDemoSampleUsersAsync( UserManager userManager, ILogger logger) { string[] emails = [ + // Population Dev — named-person sample seed (16 trừ nv.cao/nv.truong) "bod.huynh@solutions.com.vn", "bod.le@solutions.com.vn", "bod.tran@solutions.com.vn", "pm.nguyen@solutions.com.vn", "pm.le@solutions.com.vn", "ccm.tran@solutions.com.vn", "pro.pham@solutions.com.vn", "fin.do@solutions.com.vn", "act.vu@solutions.com.vn", "equ.bui@solutions.com.vn", "hra.dang@solutions.com.vn", "qs.hoang@solutions.com.vn", "qs.ngo@solutions.com.vn", "nv.dinh@solutions.com.vn", + // Population prod — UAT-matrix tạo tay 2026-05-13 (S58) + "act.nv@solutions.com.vn", "act.pp@solutions.com.vn", "act.tp@solutions.com.vn", + "bod.1@solutions.com.vn", "bod.2@solutions.com.vn", + "equ.nv@solutions.com.vn", "equ.pp@solutions.com.vn", "equ.tp@solutions.com.vn", + "fin.nv@solutions.com.vn", "fin.pp@solutions.com.vn", "fin.tp@solutions.com.vn", + "hra.nv@solutions.com.vn", "hra.pp@solutions.com.vn", "hra.tp@solutions.com.vn", + "pm.nv@solutions.com.vn", "pm.pp@solutions.com.vn", "pm.tp@solutions.com.vn", + "qs.nv@solutions.com.vn", "qs.pp@solutions.com.vn", "qs.tp@solutions.com.vn", ]; var locked = 0;