diff --git a/fe-admin/src/types/purchaseEvaluation.ts b/fe-admin/src/types/purchaseEvaluation.ts index bc63cb7..9bfa481 100644 --- a/fe-admin/src/types/purchaseEvaluation.ts +++ b/fe-admin/src/types/purchaseEvaluation.ts @@ -8,7 +8,7 @@ export type PurchaseEvaluationType = typeof PurchaseEvaluationType[keyof typeof export const PurchaseEvaluationTypeLabel: Record = { 1: 'Duyệt NCC', - 2: 'Duyệt NCC - Phương án', + 2: 'Duyệt NCC và Giải pháp', } export const PurchaseEvaluationTypeCode: Record = { diff --git a/fe-user/src/types/purchaseEvaluation.ts b/fe-user/src/types/purchaseEvaluation.ts index bc63cb7..9bfa481 100644 --- a/fe-user/src/types/purchaseEvaluation.ts +++ b/fe-user/src/types/purchaseEvaluation.ts @@ -8,7 +8,7 @@ export type PurchaseEvaluationType = typeof PurchaseEvaluationType[keyof typeof export const PurchaseEvaluationTypeLabel: Record = { 1: 'Duyệt NCC', - 2: 'Duyệt NCC - Phương án', + 2: 'Duyệt NCC và Giải pháp', } export const PurchaseEvaluationTypeCode: Record = { diff --git a/src/Backend/SolutionErp.Domain/PurchaseEvaluations/PurchaseEvaluationPolicy.cs b/src/Backend/SolutionErp.Domain/PurchaseEvaluations/PurchaseEvaluationPolicy.cs index 5d4b2a0..b6faed8 100644 --- a/src/Backend/SolutionErp.Domain/PurchaseEvaluations/PurchaseEvaluationPolicy.cs +++ b/src/Backend/SolutionErp.Domain/PurchaseEvaluations/PurchaseEvaluationPolicy.cs @@ -79,7 +79,7 @@ public static class PurchaseEvaluationPolicies // B — DuyetNccPhuongAn (5 step thực + Drafter): Drafter → Purchasing → Dự án → CCM → CEO(PA) → CEO(NCC) public static readonly PurchaseEvaluationPolicy NccWithPlan = new( Name: "NccWithPlan", - Description: "Duyệt NCC + Phương án — 5 step (Purchasing → Dự án → CCM → CEO duyệt PA → CEO duyệt NCC).", + Description: "Duyệt NCC và Giải pháp — 5 step (Purchasing → Dự án → CCM → CEO duyệt Giải pháp → CEO duyệt NCC).", Transitions: new Dictionary<(PurchaseEvaluationPhase, PurchaseEvaluationPhase), string[]> { [(PurchaseEvaluationPhase.DangSoanThao, PurchaseEvaluationPhase.ChoPurchasing)] = [AppRoles.Drafter, AppRoles.DeptManager], diff --git a/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs b/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs index d418368..0195a42 100644 --- a/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs +++ b/src/Backend/SolutionErp.Infrastructure/Persistence/DbInitializer.cs @@ -328,7 +328,7 @@ public static class DbInitializer var typeLabels = new Dictionary { [PurchaseEvaluationType.DuyetNcc] = ("QT-DN-A", "Quy trình Duyệt NCC"), - [PurchaseEvaluationType.DuyetNccPhuongAn] = ("QT-DN-B", "Quy trình Duyệt NCC - Phương Án"), + [PurchaseEvaluationType.DuyetNccPhuongAn] = ("QT-DN-B", "Quy trình Duyệt NCC và Giải pháp"), }; var phaseNames = new Dictionary @@ -1278,8 +1278,8 @@ public static class DbInitializer // Pe_* group per PurchaseEvaluationType + 3 action leaves each var peTypeLabels = new Dictionary { - ["DuyetNcc"] = "Quy trình Duyệt NCC", - ["DuyetNccPhuongAn"] = "Quy trình Duyệt NCC - Phương Án", + ["DuyetNcc"] = "Duyệt NCC", + ["DuyetNccPhuongAn"] = "Duyệt NCC và Giải pháp", }; var peOrder = 1; foreach (var code in MenuKeys.PurchaseEvaluationTypeCodes) @@ -1312,6 +1312,41 @@ public static class DbInitializer await db.SaveChangesAsync(); logger.LogInformation("Seeded {Count} menu items", added); } + + // Backfill label updates for menu items renamed via business changes. + // Add new entries here khi có rename — key → expected label. Idempotent. + var labelBackfill = new Dictionary + { + [MenuKeys.PurchaseEvaluationGroup("DuyetNcc")] = "Duyệt NCC", + [MenuKeys.PurchaseEvaluationGroup("DuyetNccPhuongAn")] = "Duyệt NCC và Giải pháp", + [MenuKeys.PeWorkflowTypeLeaf("DuyetNcc")] = "Duyệt NCC", + [MenuKeys.PeWorkflowTypeLeaf("DuyetNccPhuongAn")] = "Duyệt NCC và Giải pháp", + }; + var updatedLabels = 0; + foreach (var (key, expectedLabel) in labelBackfill) + { + var item = await db.MenuItems.FirstOrDefaultAsync(m => m.Key == key); + if (item != null && item.Label != expectedLabel) + { + item.Label = expectedLabel; + updatedLabels++; + } + } + if (updatedLabels > 0) + { + await db.SaveChangesAsync(); + logger.LogInformation("Backfilled {Count} menu labels", updatedLabels); + } + + // Backfill WorkflowDefinition name cho B (Phương Án → Giải pháp rename). + var wfB = await db.PurchaseEvaluationWorkflowDefinitions + .FirstOrDefaultAsync(w => w.Code == "QT-DN-B" && w.Version == 1); + if (wfB != null && wfB.Name.Contains("Phương Án")) + { + wfB.Name = wfB.Name.Replace("Quy trình Duyệt NCC - Phương Án", "Quy trình Duyệt NCC và Giải pháp"); + await db.SaveChangesAsync(); + logger.LogInformation("Backfilled WorkflowDefinition QT-DN-B name"); + } } private static async Task SeedAdminPermissionsAsync(ApplicationDbContext db, RoleManager roleManager, ILogger logger)