From ef2330871d7b7884ada6853c48b946e42cf6c852 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Fri, 22 May 2026 12:30:06 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20App:=20Plan=20B=20Chunk=20E1=20?= =?UTF-8?q?=E2=80=94=20CreateContractCommand=20+ApprovalWorkflowId=20V2=20?= =?UTF-8?q?pin=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirror PE CreatePurchaseEvaluationCommand pattern. Drafter pick V2 workflow qua Workspace Select dropdown (Chunk D FE Implementer running parallel) → ApprovalWorkflowId pin lúc create. Fallback V1 auto activeWfId nếu null (7 prod contract giữ behavior). Changes: - CreateContractCommand record +Guid? ApprovalWorkflowId = null (optional) - Handler line 96 wire entity.ApprovalWorkflowId = request.ApprovalWorkflowId - Both V1 + V2 fields persist (Service ApproveV2Async branch dispatch theo V2 first) Verify: - dotnet build PASS 0 err - Backward compat: existing caller (KHÔNG pass ApprovalWorkflowId) → fallback null - V1 contract path UNCHANGED Plan B chain status: - A1 58898e8 ✅ Entity - A2 a85e437 ✅ Mig 32 + Seed - B 138469d ✅ Service ApproveV2 branch - C 26c98d3 ✅ Mig 33 LevelOpinions - B2 1f199b0 ✅ UPSERT block - E1 (this) ✅ CreateContractCommand +ApprovalWorkflowId - D FE Workspace V2 (Implementer running parallel) - E2 ContractDetailDto + GetContractByIdQuery extend (em main pending) - E3 FE Section 5 LevelOpinionsV2 (Implementer pending sau E2) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Contracts/ContractFeatures.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Backend/SolutionErp.Application/Contracts/ContractFeatures.cs b/src/Backend/SolutionErp.Application/Contracts/ContractFeatures.cs index 714d2ce..4088ac7 100644 --- a/src/Backend/SolutionErp.Application/Contracts/ContractFeatures.cs +++ b/src/Backend/SolutionErp.Application/Contracts/ContractFeatures.cs @@ -27,7 +27,13 @@ public record CreateContractCommand( string? DraftData, Guid? BudgetId, string? BudgetManualName, - decimal? BudgetManualAmount) : IRequest; + decimal? BudgetManualAmount, + // [Plan B S29 2026-05-22 Chunk E1] Drafter pick V2 workflow lúc create — + // mirror PE pattern Workspace Select dropdown. Nếu null → fallback V1 auto + // pick activeWfId (7 prod contract giữ behavior). Mutually exclusive với + // V1: pin V2 + V1 cùng lúc OK schema (cả 2 nullable) — Service ApproveV2Async + // branch ưu tiên V2 nếu cả 2 set. + Guid? ApprovalWorkflowId = null) : IRequest; public class CreateContractCommandValidator : AbstractValidator { @@ -94,6 +100,10 @@ public class CreateContractCommandHandler( BudgetManualName = request.BudgetManualName, BudgetManualAmount = request.BudgetManualAmount, WorkflowDefinitionId = activeWfId, + // [Plan B S29 2026-05-22 Chunk E1] Pin V2 workflow nếu Drafter pick + // qua Workspace Select dropdown (Chunk D FE). Cả 2 set ok — Service + // ApproveV2Async branch dispatch theo ApprovalWorkflowId trước. + ApprovalWorkflowId = request.ApprovalWorkflowId, SlaDeadline = DateTime.UtcNow.Add(workflow.GetPhaseSla(ContractPhase.DangSoanThao) ?? TimeSpan.FromDays(7)), };