Files
solution-erp/docs/changelog/sessions/2026-05-15-s23-turn8-plan-r-cleanup-prod-test-data.md
pqhuy1987 5cbf516a78
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 3m27s
[CLAUDE] Scripts Docs: Chunk R — Cleanup destructive prod database (52 rows + ~600 cascade child)
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>
2026-05-15 14:11:56 +07:00

168 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Session 23 turn 8 — 2026-05-15 — Plan R Cleanup destructive prod database
**Dev:** Claude Opus 4.7 1M (em main solo execute, 1 Investigator pre-flight spawn)
**Duration:** ~30 phút
**Base commit:** `108268a` (Plan Q FE banner fix)
**Final HEAD:** `<pending>` (Plan R scripts + docs)
## 🎯 Trigger session
Bro UAT confirm Plan P+Q deploy wire OK (Run #203+#204 PASS) + chỉ thị cleanup:
> "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."
→ 2 cleanup destructive trên prod database SolutionErp:
- **Scope A:** Phiếu test cũ (PurchaseEvaluation rows tất cả)
- **Scope B:** Quy trình cũ không ghim (ApprovalWorkflowsV2 với IsUserSelectable=false + PurchaseEvaluationWorkflowDefinitions V1 với IsActive=false)
## 🔍 Investigator pre-flight audit (~64K spawn)
🟦 Investigator sqlcmd prod audit confirm scope cụ thể:
**Scope A — 35 PE rows total:**
- 28 active (Phase 3:1 / Phase 6:1 / Phase 7:4 / Phase 10 DaDuyet:20 / Phase 98 TraLai:1 / Phase 99 TuChoi:1)
- 7 soft-deleted (IsDeleted=1 carry from prior sessions)
- Pin scheme: 25 BOTH V1+V2 / 3 V1-only / 0 None
- Cascade khi DELETE PE: 42 Details + 49 Suppliers + 64 Approvals + 238 Changelogs + 10 Attachments + 43 LevelOpinions = **446 child rows**
**Scope B — 17 V2 + 4 V1 workflows:**
| Type | Total | Keep | Delete |
|---|---|---|---|
| ApprovalWorkflowsV2 | 17 | 2 (`QT-DN-V2-001 v16` + `QT-DN-PA-V2-001 v2` ghim+active) | 15 (IsUserSelectable=false v2..v15 + PA v1) |
| PurchaseEvaluationWorkflowDefinitions (V1) | 4 | 2 (`QT-DN-A v3` + `QT-DN-B v1` active + PE pinned) | 2 (`QT-DN-A v1` + `v2` inactive) |
**Critical gotcha findings:**
- PE.ApprovalWorkflowId FK **Restrict** ([PurchaseEvaluationConfiguration.cs:40](src/Backend/SolutionErp.Infrastructure/Persistence/Configurations/PurchaseEvaluationConfiguration.cs:40)) → soft-delete PE KHÔNG release FK → phải HARD DELETE
- ApprovalWorkflow extend `BaseEntity` (KHÔNG `AuditableEntity`) → hard DELETE only, no IsDeleted flag
- Filtered indexes (Mig 29+) require `SET QUOTED_IDENTIFIER ON` cho DELETE statement
- LevelOpinion FK Restrict to ApprovalWorkflowLevel → KHÔNG cascade khi DELETE workflow → phải DELETE PE first
**Backup constraint discoveries:**
- SQL Express KHÔNG support `BACKUP DATABASE WITH COMPRESSION`
- `RESTORE VERIFYONLY` require sysadmin permission (vrapp KHÔNG có) → verify qua file size + Get-Item
## 🌳 Plan R 7-step execution
### Step 1+2 — BACKUP DATABASE + verify file existence
File: `scripts/plan-r-backup.sql` upload qua scp → sqlcmd -i
```sql
BACKUP DATABASE SolutionErp
TO DISK = 'C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak'
WITH INIT, STATS = 20,
NAME = 'SolutionErp Plan R pre-cleanup 2026-05-15',
DESCRIPTION = 'Backup before destructive cleanup: 28 PE + 15 V2 unghim + 2 V1 inactive workflows';
```
Output: `Processed 2249 pages in 0.099 seconds (177.413 MB/sec)`. File size: **18,506,240 bytes (~18.5MB)** verified via `Get-Item`.
### Step 3-5 — DELETE 3 transaction commits
File: `scripts/plan-r-cleanup.sql` 3 separate BEGIN/COMMIT TRANSACTION blocks + TRY/CATCH rollback per step.
```sql
SET QUOTED_IDENTIFIER ON; -- filtered indexes require
SET ANSI_NULLS ON;
-- Step 3: DELETE 28 active + 7 soft-deleted PE (cascade 446 child rows)
DELETE FROM PurchaseEvaluations WHERE IsDeleted = 0; -- 28 rows
DELETE FROM PurchaseEvaluations WHERE IsDeleted = 1; -- 7 rows
-- Step 4: DELETE 15 V2 workflows unghim (cascade ~140 Steps+Levels)
DELETE FROM ApprovalWorkflows WHERE IsUserSelectable = 0;
-- Step 5: DELETE 2 V1 workflows inactive (cascade ~37 Steps+Approvers)
DELETE FROM PurchaseEvaluationWorkflowDefinitions WHERE IsActive = 0;
```
Execute output:
```
PE active rows deleted: 28
PE soft-deleted rows deleted: 7
V2 workflows deleted: 15
V1 workflows deleted: 2
```
**Total: 52 rows direct + ~600 cascade child = ~650+ rows wiped clean.**
### Step 6 — Post-cleanup verify
```
PE total (expect 0) 0 ✅
V2 workflow total (expect 2 ghim) 2 ✅
V2 ghim remaining 2 ✅
V1 workflow total (expect 2 active) 2 ✅
V1 active remaining 2 ✅
```
Remaining V2 workflows:
- `QT-DN-PA-V2-001 v2` (ApplicableType=2) — ghim + active
- `QT-DN-V2-001 v16` (ApplicableType=1) — ghim + active
Remaining V1 workflows:
- `QT-DN-A v3` (EvaluationType=1) — active
- `QT-DN-B v1` (EvaluationType=2) — active
### Step 7 — BE smoke verify alive post-cleanup
Plan F precedent (S22): drop V1 workflow → BE crash startup vì PE pin V1 không có V2 fallback. Plan R KHÔNG đụng V1 active (`QT-DN-A v3` + `QT-DN-B v1`) → BE expect healthy.
```bash
curl -X POST /api/auth/login → HTTP 200 (admin token len 468)
curl /api/purchase-evaluations → HTTP 200
curl /api/approval-workflows-v2?applicableType=1 → HTTP 200
curl /api/pe-workflows → HTTP 200
```
→ 3/3 endpoints 200, BE healthy post-cleanup. KHÔNG crash.
## 📊 Stats Plan R chốt
| Metric | Trước (S23 t7) | Sau (S23 t8) | Δ |
|---|---|---|---|
| **PE rows** | 35 (28 active + 7 soft) | **0** | -35 |
| **ApprovalWorkflows V2** | 17 | **2** | -15 |
| **PE Workflow Definitions V1** | 4 | **2** | -2 |
| **Total entity rows deleted** | — | **52 + ~600 cascade** | -650+ |
| Migrations | 31 | 31 | 0 |
| Endpoints | ~145 | ~145 | 0 |
| FE pages | 34 | 34 | 0 |
| Unit tests | 111 | 111 | 0 |
| Backup file | — | `SolutionErp_pre_cleanup_2026-05-15.bak` 18.5MB | rollback ready |
## 🎯 Multi-agent ROI evidence Plan R
| Spawn | Agent | Cost | Output | Catch |
|---|---|---|---|---|
| Pre-flight audit | 🟦 Investigator | ~64K | 4 SQL queries enum 35 PE + 17 V2 + 4 V1 + FK Restrict gotcha + soft-delete vs hard-delete decision tree + 3 Option compare | **Saved em main hard-delete without backup risk** + catch SQL Express constraint (no COMPRESSION) + catch QUOTED_IDENTIFIER filter index requirement |
| Execute | 👤 Chủ trì | ~self | 2 SQL script files upload qua scp + sqlcmd -i + post-cleanup smoke verify | Iterated 2× SQL constraint fix (COMPRESSION + QUOTED_IDENTIFIER) |
**Total Plan R cost:** ~64K Investigator + em main solo execute. Multi-agent value: avoid em main hard-delete blind without backup → bro production data loss risk.
## 📋 Pattern reinforced cross-project
1. **Destructive operation prod BẮT BUỘC pre-flight audit + backup mandatory** — KHÔNG em main solo blind execute. Investigator catch SQL constraint + FK gotcha + Option compare.
2. **SQL Express limitations** — KHÔNG support BACKUP COMPRESSION + RESTORE VERIFYONLY require sysadmin. Workaround: verify backup file size via Get-Item.
3. **SET QUOTED_IDENTIFIER ON + ANSI_NULLS ON** required cho DELETE statement nếu schema có filtered indexes (Mig 29+).
4. **FK Restrict gotcha** — soft-delete KHÔNG release FK reference. Hard DELETE only nếu cần unblock cascade.
5. **Plan F precedent learn** — KHÔNG drop V1 active workflow (PE pin → BE crash). Plan R giữ V1 active `QT-DN-A v3` + `QT-DN-B v1` → BE healthy.
6. **scp + sqlcmd -i workflow** cho complex SQL trên prod — clean local file upload + execute remote, avoid shell escaping hell qua SSH PowerShell.
## ⏭ Pending S23 t9+
- 🟢 **Bro UAT test workflow mới fresh** — admin Designer tạo workflow mới (nếu cần) + Drafter NV Test tạo phiếu mới test cumulative Plan K → P + Q fix
- 🟡 **Plan B Contract V2 wire (Mig 32+33)** — HIGH priority next, PE V2 pattern proven 4 plan
- 🔍 Discovery #4 ASP.NET enum body deserialization — LOW priority polish (register JsonStringEnumConverter)
- 🔍 Discovery #3 anomaly CI trigger docs-only — 3× reinforced, recommend Investigator follow-up
- 🔧 Gotcha #47 paths-ignore agent-memory — pending
## References
- Scripts:
- [scripts/plan-r-backup.sql](scripts/plan-r-backup.sql) — BACKUP DATABASE
- [scripts/plan-r-cleanup.sql](scripts/plan-r-cleanup.sql) — DELETE 3 transactions
- Backup file: `vietreport-vps:C:\Backup\SolutionErp_pre_cleanup_2026-05-15.bak` (18.5MB)
- Rules: §destructive operation discipline (pre-flight + backup + verify), `feedback_drastic_refactor_scope`