All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m27s
Bro UAT confirm Plan P+Q wire OK + chỉ thị cleanup test data: > "OK Tao thấy tạm ổn rồi đấy, mày xóa hết các phiếu test cũ đi nhé, > các quy trình cũ ko ghim cũng xóa hết đi. Cho gọn đẹp." Investigator pre-flight audit prod DB ~64K spawn confirm scope: - 35 PE rows total (28 active + 7 soft-deleted) - 17 ApprovalWorkflowsV2 (15 IsUserSelectable=false + 2 ghim+active) - 4 PurchaseEvaluationWorkflowDefinitions V1 (2 IsActive=false + 2 active) Critical gotchas: 1. PE.ApprovalWorkflowId FK Restrict → soft-delete KHÔNG release FK, hard-DELETE PE first 2. ApprovalWorkflow extend BaseEntity (NO soft-delete) → hard DELETE only 3. Filtered indexes Mig 29+ require SET QUOTED_IDENTIFIER ON 4. SQL Express constraints: NO BACKUP COMPRESSION + RESTORE VERIFYONLY require sysadmin (vrapp KHÔNG có) Execute via scripts/plan-r-*.sql upload scp + sqlcmd -i workflow: Step 1+2 — BACKUP DATABASE: - C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak (18.5MB, 2249 pages) - Verified via Get-Item file size Step 3-5 — 3 separate transactions DELETE: - 28 PE active + 7 soft-deleted → cascade 446 child rows (42 Details + 49 Suppliers + 64 Approvals + 238 Changelogs + 10 Attachments + 43 LevelOpinions) - 15 V2 workflows unghim → cascade ~140 Steps+Levels - 2 V1 workflows inactive → cascade ~37 Steps+Approvers Total: 52 rows direct + ~600 cascade child = ~650+ rows wiped. Step 6 — Verify post-cleanup state: - PE total: 35 → 0 ✓ - V2 workflows: 17 → 2 (QT-DN-V2-001 v16 + QT-DN-PA-V2-001 v2 ghim+active) - V1 workflows: 4 → 2 (QT-DN-A v3 + QT-DN-B v1 active, PE pin protected) Step 7 — BE smoke verify alive post-cleanup: - /api/auth/login → 200 - /api/purchase-evaluations → 200 - /api/approval-workflows-v2 → 200 - /api/pe-workflows → 200 → KHÔNG crash startup (Plan F precedent avoid được) Multi-agent ROI: Investigator save em main hard-delete blind without backup + catch SQL Express constraint + catch FK Restrict gotcha. Pattern reinforced: - Destructive operation prod BẮT BUỘC pre-flight audit + backup + verify - scp + sqlcmd -i workflow cho complex SQL trên prod (avoid shell escape hell qua SSH PowerShell) - Plan F precedent: KHÔNG drop active workflow (PE pin → BE crash) Stats final S23 t8: - 31 mig · 59 tables · ~145 endpoints · 34 FE pages · 111 test unchanged - 47 gotcha · 20 memory · 6 skills · 4 sub-agents - **0 PE phiếu test + 4 workflow ghim/active** — UAT clean slate - Backup rollback ready: vietreport-vps:C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
99 lines
4.0 KiB
Transact-SQL
99 lines
4.0 KiB
Transact-SQL
-- Plan R S23 t8 (2026-05-15) — Destructive cleanup prod
|
|
-- Bro request 2026-05-15: "xóa hết các phiếu test cũ + quy trình cũ ko ghim cũng xóa hết"
|
|
-- Pre-flight Investigator audit: 28 PE active + 15 V2 unghim + 2 V1 inactive workflows
|
|
-- Backup: C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak (18.5MB verified)
|
|
|
|
USE SolutionErp;
|
|
GO
|
|
|
|
-- Filtered indexes require QUOTED_IDENTIFIER ON + ANSI_NULLS ON (Mig 29+ FilteredIndex)
|
|
SET QUOTED_IDENTIFIER ON;
|
|
SET ANSI_NULLS ON;
|
|
GO
|
|
|
|
PRINT '=== Plan R cleanup execute START ===';
|
|
PRINT 'Pre-cleanup state:';
|
|
|
|
SELECT 'PE active' AS Entity, COUNT(*) AS Cnt FROM PurchaseEvaluations WHERE IsDeleted = 0
|
|
UNION ALL SELECT 'PE soft-deleted', COUNT(*) FROM PurchaseEvaluations WHERE IsDeleted = 1
|
|
UNION ALL SELECT 'V2 workflow total', COUNT(*) FROM ApprovalWorkflows
|
|
UNION ALL SELECT 'V2 unghim (target)', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 0
|
|
UNION ALL SELECT 'V2 ghim (KEEP)', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 1
|
|
UNION ALL SELECT 'V1 workflow total', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions
|
|
UNION ALL SELECT 'V1 inactive (target)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0
|
|
UNION ALL SELECT 'V1 active (KEEP)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 1;
|
|
|
|
PRINT '';
|
|
PRINT '=== Step 3: DELETE 28 PE active (cascade 446 child rows) ===';
|
|
BEGIN TRY
|
|
BEGIN TRANSACTION DeletePE;
|
|
DELETE FROM PurchaseEvaluations WHERE IsDeleted = 0;
|
|
DECLARE @PEDeleted INT = @@ROWCOUNT;
|
|
PRINT 'PE active rows deleted: ' + CAST(@PEDeleted AS NVARCHAR(10));
|
|
|
|
-- Also clear soft-deleted ones for clean slate
|
|
DELETE FROM PurchaseEvaluations WHERE IsDeleted = 1;
|
|
DECLARE @PESoftDeleted INT = @@ROWCOUNT;
|
|
PRINT 'PE soft-deleted rows deleted: ' + CAST(@PESoftDeleted AS NVARCHAR(10));
|
|
|
|
COMMIT TRANSACTION DeletePE;
|
|
PRINT 'Step 3 COMMIT OK';
|
|
END TRY
|
|
BEGIN CATCH
|
|
ROLLBACK TRANSACTION DeletePE;
|
|
PRINT 'Step 3 FAILED — rollback. Error: ' + ERROR_MESSAGE();
|
|
THROW;
|
|
END CATCH;
|
|
|
|
PRINT '';
|
|
PRINT '=== Step 4: DELETE 15 V2 workflows unghim (cascade Steps + Levels) ===';
|
|
BEGIN TRY
|
|
BEGIN TRANSACTION DeleteV2;
|
|
DELETE FROM ApprovalWorkflows WHERE IsUserSelectable = 0;
|
|
DECLARE @V2Deleted INT = @@ROWCOUNT;
|
|
PRINT 'V2 workflows deleted: ' + CAST(@V2Deleted AS NVARCHAR(10));
|
|
COMMIT TRANSACTION DeleteV2;
|
|
PRINT 'Step 4 COMMIT OK';
|
|
END TRY
|
|
BEGIN CATCH
|
|
ROLLBACK TRANSACTION DeleteV2;
|
|
PRINT 'Step 4 FAILED — rollback. Error: ' + ERROR_MESSAGE();
|
|
THROW;
|
|
END CATCH;
|
|
|
|
PRINT '';
|
|
PRINT '=== Step 5: DELETE 2 V1 workflows inactive (cascade Steps + Approvers) ===';
|
|
BEGIN TRY
|
|
BEGIN TRANSACTION DeleteV1;
|
|
DELETE FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0;
|
|
DECLARE @V1Deleted INT = @@ROWCOUNT;
|
|
PRINT 'V1 workflows deleted: ' + CAST(@V1Deleted AS NVARCHAR(10));
|
|
COMMIT TRANSACTION DeleteV1;
|
|
PRINT 'Step 5 COMMIT OK';
|
|
END TRY
|
|
BEGIN CATCH
|
|
ROLLBACK TRANSACTION DeleteV1;
|
|
PRINT 'Step 5 FAILED — rollback. Error: ' + ERROR_MESSAGE();
|
|
THROW;
|
|
END CATCH;
|
|
|
|
PRINT '';
|
|
PRINT '=== Post-cleanup verify ===';
|
|
|
|
SELECT 'PE total (expect 0)' AS Entity, COUNT(*) AS Cnt FROM PurchaseEvaluations
|
|
UNION ALL SELECT 'V2 workflow total (expect 2 ghim)', COUNT(*) FROM ApprovalWorkflows
|
|
UNION ALL SELECT 'V2 ghim remaining', COUNT(*) FROM ApprovalWorkflows WHERE IsUserSelectable = 1 AND IsActive = 1
|
|
UNION ALL SELECT 'V1 workflow total (expect 2 active)', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions
|
|
UNION ALL SELECT 'V1 active remaining', COUNT(*) FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 1;
|
|
|
|
PRINT '';
|
|
PRINT 'Remaining V2 workflows (ghim+active):';
|
|
SELECT Code, Version, ApplicableType, IsActive, IsUserSelectable, Name FROM ApprovalWorkflows ORDER BY Code, Version DESC;
|
|
|
|
PRINT '';
|
|
PRINT 'Remaining V1 workflows:';
|
|
SELECT Code, Version, EvaluationType, IsActive, Name FROM PurchaseEvaluationWorkflowDefinitions ORDER BY Code, Version DESC;
|
|
|
|
PRINT '';
|
|
PRINT '=== Plan R cleanup execute END ===';
|