From 58898e8fbe99ca9471d7c63df5086e0060caeebd Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Fri, 22 May 2026 12:07:01 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20Domain:=20Plan=20B=20Chunk=20A1=20?= =?UTF-8?q?=E2=80=94=20Contract=20+2=20fields=20V2=20(ApprovalWorkflowId?= =?UTF-8?q?=20+=20CurrentApprovalLevelOrder)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirror PE Mig 22-24 pattern. V1+V2 coexist (7 V1 contract giữ WorkflowDefinitionId, V2 mới pin ApprovalWorkflowId). Fields added: - ApprovalWorkflowId Guid? — pin schema mới ApprovalWorkflowsV2 - CurrentApprovalLevelOrder int? — Cấp đang chờ duyệt (1/2/3) trong Step Service ApproveV2Async branch (Chunk B) sẽ dispatch: - if (contract.ApprovalWorkflowId is Guid awId) ApproveV2Async - else ApproveV1Legacy (giữ behavior 7 V1 contract) Verify: - dotnet build SolutionErp.slnx PASS 0 err, 2 pre-existing DocxRenderer warn - No migration (Chunk A2 sẽ scaffold Mig 32) Plan B chain (6 chunks): - A1 (this) Entity +2 fields (em main) - A2 Mig 32 schema (Implementer Case 2 cookie-cutter) - B Service ApproveV2Async branch (em main critical ~200 LOC) - C Mig 33 ContractLevelOpinions (Implementer) - D FE Workspace V2 (Implementer) - E FE Section 5 LevelOpinionsV2 (Implementer) Co-Authored-By: Claude Opus 4.7 (1M context) --- src/Backend/SolutionErp.Domain/Contracts/Contract.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Backend/SolutionErp.Domain/Contracts/Contract.cs b/src/Backend/SolutionErp.Domain/Contracts/Contract.cs index b9bcfa8..78ad736 100644 --- a/src/Backend/SolutionErp.Domain/Contracts/Contract.cs +++ b/src/Backend/SolutionErp.Domain/Contracts/Contract.cs @@ -20,6 +20,7 @@ public class Contract : AuditableEntity public string? NoiDung { get; set; } public bool BypassProcurementAndCCM { get; set; } // HĐ Chủ đầu tư → skip CCM public Guid? WorkflowDefinitionId { get; set; } // Pinned at creation — HĐ cũ chạy version cũ ngay cả khi admin active version mới + public Guid? ApprovalWorkflowId { get; set; } // [Plan B S29 2026-05-22 Mig 32] Pin schema mới ApprovalWorkflowsV2 — mirror PE Mig 23. V1+V2 coexist: 7 V1 contract giữ WorkflowDefinitionId; V2 mới pin ApprovalWorkflowId. Service ApproveV2Async branch theo field này. public DateTime? SlaDeadline { get; set; } // Hết hạn phase hiện tại public string? DraftData { get; set; } // JSON field values (render template) public bool SlaWarningSent { get; set; } // Flag để không gửi warning 2 lần @@ -39,6 +40,11 @@ public class Contract : AuditableEntity public int? CurrentWorkflowStepIndex { get; set; } public int? RejectedAtStepIndex { get; set; } + // [Plan B S29 2026-05-22 Mig 32] V2 workflow tracking — mirror PE Mig 24. + // CurrentApprovalLevelOrder: Cấp đang chờ duyệt (1/2/3) trong Step hiện tại + // khi pin ApprovalWorkflowId. Null khi V1 legacy hoặc V2 terminal (DaPhatHanh). + public int? CurrentApprovalLevelOrder { get; set; } + public List Approvals { get; set; } = new(); public List Comments { get; set; } = new(); public List Attachments { get; set; } = new();