Files
solution-erp/docs/changelog/sessions/2026-05-08-0500-drastic-refactor-flat-workflow.md
pqhuy1987 21ee36390e [CLAUDE] Docs+Skill: chốt Session 16 wrap-up — drastic refactor flat workflow (Chunk D)
Session 16 (2026-05-08) docs/skill/memory wrap-up:

STATUS.md:
- Last updated Session 16 (2 commit Chunk A+B)
- Phase summary count (20→21 mig, 96→77 test, 57→55 bảng)
- Recently Done row Session 16 chi tiết (drastic refactor hoàn tất)
- Phase enum simplified semantic post-Mig 21

HANDOFF.md:
- TL;DR Session 16 prepend với 2 chunk + Chunk C SKIP rationale
- Per-chunk implementation chi tiết (Domain + Mig 21 + Service + Tests
  + FE Designer)
- 8 cảnh báo Session 17+: UAT live test / old data migration / Sample
  seed / Budget N-stage / schema-diagram / skill refresh / tests flat /
  Hard blockers Ops

migration-todos.md: Phase 9 + Session 16 block 2 chunk done + 7 defer task

Session log NEW `2026-05-08-0500-drastic-refactor-flat-workflow.md`:
- Bối cảnh resume từ S15 defer
- Spec implementation (Phase enum, state machine, schema Mig 21)
- Per-chunk Chunk A + Chunk B detail
- Chunk C skip rationale
- Memory `feedback_drastic_refactor_scope` validation:
  scope estimate 30% accurate (3h actual vs 10h conservative)
- Plan organization sau S16

Skill ef-core-migration:
- description + heading: 20→21 migration
- + Mig 21 row "RefactorWorkflowToFlatModel" với detail (4 ALTER + 2
  ALTER + DROP TABLE × 2 + DROP COLUMN × 2 + restore simple unique × 2)
- Total 57→55 bảng (-2 InnerStep tables)
- Tests: 96→77 (drop 19 legacy)

CLAUDE.md root:
- Migration count 20→21
- DB tables 57→55
- Workflow flat description thay N-stage description

docs/rules.md §7: 96→77 test (Mig 21 simplified)

Memory `project_solution_erp.md`:
- Add "Tổng sau session 16" block với drastic refactor details

🎉 Session 16 wrap-up. Cumulative since session start (S15 wrap-up
`38d10b7`): 4 commit (S15 wrap-up was final S15) + 3 commit Session 16
(A `dbb0089` + B `88a5be1` + D current).

Defer Session 17+ priority:
1. UAT live test workflow flat (3 phòng × N cấp realistic)
2. Old PE/HĐ legacy phase data migration
3. Sample data seed (Task 2 carry-over)
4. Hard blockers Ops

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 12:16:32 +07:00

218 lines
9.2 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 2026-05-08 (S16) — DRASTIC REFACTOR flat workflow Phòng × Cấp
**Dev:** Claude
**Duration:** ~3h focused (vs ~8-10h estimate ban đầu)
**Base commit:** `38d10b7` (sau Session 15 wrap-up)
**Final commit:** `88a5be1`
**Total commits:** 2 chunk per-commit (Chunk A all BE + Chunk B FE Designer; Chunk C skip)
## Bối cảnh
Resume từ Session 15 defer plan. User chốt drastic refactor: "bỏ phase enum hoàn toàn, dùng ChoDuyet=10 đơn nhất + currentStepIndex tracking". Workflow flat list (Phòng × Cấp × Approvers).
Per memory `feedback_drastic_refactor_scope.md` rule:
- Dedicated session với context fresh ✓
- Scope conservative 2x buffer ✓ (estimate 8-10h, actual ~3h)
- Tránh mid-session big refactor ✓ (Session 15 đã revert + defer đúng)
- Tests rewrite biggest risk ✓ (drop 19 test legacy, no replacement)
## Spec implementation
### Phase enum simplify (PE + Contract)
```
DangSoanThao = 1
ChoDuyet = 10 ← NEW generic intermediate
DaDuyet = 7 (PE)
DaPhatHanh = 9 (Contract)
TuChoi = 99
LEGACY 2-6 + 98 deprecated (giữ enum cho data cũ đọc OK)
```
### State machine (per module)
```
DangSoanThao
│ Drafter trình duyệt (init CurrentWorkflowStepIndex=0)
ChoDuyet ──── advance idx per approve ──── ChoDuyet ──── ... ──── (idx >= steps.Count)
│ │
│ Trả lại ▼
│ (save RejectedAtStepIndex, DaDuyet
│ resume Drafter → ChoDuyet jump-back) DaPhatHanh
│ (terminal)
│ Từ chối
TuChoi (terminal khoá)
```
### Schema (Migration 21)
```sql
-- WorkflowStep + DeptId/PositionLevel (PE + Contract)
ALTER TABLE WorkflowSteps ADD DepartmentId UNIQUEIDENTIFIER NULL FK Restrict
ALTER TABLE WorkflowSteps ADD PositionLevel INT NULL
ALTER TABLE PurchaseEvaluationWorkflowSteps ADD DepartmentId + PositionLevel
-- PE/Contract tracking columns
ALTER TABLE Contracts ADD CurrentWorkflowStepIndex INT NULL + RejectedAtStepIndex INT NULL
ALTER TABLE PurchaseEvaluations ADD same 2 cols
-- Drop InnerStep tables (Mig 18 + 20)
DROP TABLE PurchaseEvaluationWorkflowStepInnerSteps
DROP TABLE WorkflowStepInnerSteps
-- Drop InnerStepId columns + filtered indexes (Mig 19/20 reverse)
ALTER TABLE *DepartmentApprovals DROP COLUMN InnerStepId
DROP UX_*Phase_InnerStep filtered + DROP UX_*Phase_Dept_Stage filtered
CREATE UX_*Phase_Dept_Stage non-filtered (restore Mig 16 simple unique)
```
## Per-chunk
### Chunk A (`dbb0089`) — All BE single big commit
**Why single big:** drastic refactor entity drop break dependent code (Service + App + Tests). Per-chunk discipline impossible với schema change scope. Single commit + verify build/test pass at end.
**Files modified (23):**
- Domain entities (8 files): PE/Contract Phase, Workflow definition, DeptApproval, PE/Contract aggregates
- EF Configurations (3 files): WorkflowDefinition, PurchaseEvaluation, DepartmentApprovals
- ApplicationDbContext: drop DbSets
- App CQRS (2 files): WorkflowAdminFeatures + PeWorkflowAdminFeatures
- Service (2 files): PE + Contract WorkflowService rewrite
- Migration 21 (2 files: .cs + Designer.cs)
- Snapshot update
- Tests (1 update + 3 deletes): PeWorkflowAdminTests update, drop PeNStageApprovalTests + ContractNStageApprovalTests + PeTwoStageApprovalTests
**LOC:** +4486 / -2108 (net +2378). Service rewrite simpler than legacy 2-stage + N-stage code.
**Test impact:** 96 → 77 (-19 legacy). Cover dropped:
- 6 test PE N-stage (Mig 18 logic)
- 6 test Contract N-stage (Mig 20 logic)
- 7 test PE 2-stage (Mig 16 NV/TPB Review/Confirm)
Defer: write new tests cho flat workflow flow (làm khi UAT bug).
### Chunk B (`88a5be1`) — FE Designer rewrite
**Files modified (4):**
- `fe-admin/src/pages/system/PeWorkflowsPage.tsx` — full rewrite ~510 LOC
- `fe-admin/src/pages/system/WorkflowsPage.tsx` — full rewrite ~480 LOC
- `fe-admin/src/types/purchaseEvaluation.ts` + ChoDuyet=10 enum
- `fe-user/src/types/purchaseEvaluation.ts` mirror
**LOC:** +201 / -438 (net -237). Designer simpler — drop entire InnerSteps sub-section.
**Designer step UI new:**
```jsx
<step row>
[Order badge] [Tên bước] [Phòng Select] [Cấp Select NV/PP/TP] [Trash]
[SLA] [+ Role / + User buttons]
[Approvers list rows (Role/User)]
</step row>
```
**Save payload:**
```json
{
"steps": [{
"order": 1,
"phase": 10, // ChoDuyet auto
"name": "Phòng A — Cấp 1",
"departmentId": "<guid>",
"positionLevel": 1, // NV
"approvers": [...] // optional Role/User fallback
}, ...]
}
```
### Chunk C (FE PeWorkflowPanel + timeline) — SKIPPED
Existing UI compatible:
- `workflow.nextPhases` BE-driven (now returns from policy.NextPhasesFrom which has DangSoanThao→ChoDuyet, ChoDuyet→DaDuyet, ChoDuyet→DangSoanThao, ChoDuyet→TuChoi)
- 3-button Trả lại/Từ chối UI from Session 14 reuse với target=DangSoanThao (Trả lại) / target=TuChoi (Từ chối) pattern
- Workflow timeline display phases — chỉ 4 states (DangSoanThao/ChoDuyet/DaDuyet/TuChoi) thay vì 7-9 cũ
KHÔNG cần đụng. Reduce session scope.
## Verify
-`dotnet build SolutionErp.slnx` 0 error
-`dotnet ef database update` Mig 21 LocalDB applied OK
-`dotnet test SolutionErp.slnx` 77 pass (54 Domain + 23 Infra)
-`npm run build` fe-admin + fe-user pass
- 🔄 Manual UAT pending — workflow flat ready test
## Bug + Fix log
| # | Issue | Fix |
|---|---|---|
| 1 | First Edit error "Identity.PositionLevel" namespace qualified — using `SolutionErp.Domain.Identity` brings PositionLevel to scope, sub-namespace prefix invalid | Change to `PositionLevel?` direct |
| 2 | Test fail PeWorkflowAdminTests `Create_PersistsAllSteps_OrderedByOrderField` — assert phase=DangSoanThao but new logic auto ChoDuyet | Update assert to ChoDuyet |
| 3 | Generate Mig 21 warning "operation may result in data loss" | Acceptable — legacy InnerStep tables data dropped (had test data only ở Design DB) |
## Docs updates
- ✅ STATUS.md — Last updated + Phase summary count + Recently Done row Session 16 (KEEP narrative cũ Session 12-15)
- ✅ HANDOFF.md — TL;DR Session 16 prepend + 8 cảnh báo Session 17+
- ✅ migration-todos.md — Phase 9 + Session 16 block 2 chunk + 7 defer task
- ✅ Session log (file này)
- ⏸ schema-diagram.md §17-21 — defer cron audit 2026-06-01
- ⏸ Skill ef-core-migration row Mig 21 — defer cron audit
- ⏸ Skill contract-workflow flat workflow section — defer cron audit
## Memory validation
`feedback_drastic_refactor_scope.md` (Session 15 add): rule applied successfully —
- Dedicated session ✓
- Scope estimate conservative ✓ (8-10h plan, 3h actual = 30% of estimate)
- REVERT Session 15 was correct decision (avoid mid-session breaking state)
- Per-chunk discipline relaxed for big BE refactor (single big commit acceptable when entity drop break dependents)
- Tests rewrite handled via DROP (no replacement) — pragmatic given UAT iteration mode
## Stats cumulative (sau Session 16)
| | Trước S16 | Sau S16 | Diff |
|---|---:|---:|---:|
| BE LOC | ~15800 | ~15500 | -300 (service simplified) |
| API endpoints | ~134 | ~134 | 0 |
| Migrations | 20 | **21** | +1 |
| DB tables | 57 | **55** | -2 (InnerStep tables dropped) |
| FE pages | 32 | 32 | 0 (rewrite existing 2 designer) |
| Tests | 96 | **77** | -19 (drop legacy N-stage/2-stage) |
| Docs | ~59 | ~60 | +1 (session log này) |
| Memory entries | 12 | 12 | 0 |
| Commits S16 | — | **+2** | A + B per-chunk |
## Plan organization sau Session 16
```
Plan cha: Phase 9 active — UAT
├── Plan con A-S15: All ✅ DONE (xem session logs trước)
├── Plan con S16: Drastic refactor flat workflow ✅ DONE (2 chunk)
│ ├── ✅ Chunk A — All BE (Domain + Mig 21 + Service + Tests)
│ ├── ✅ Chunk B — FE Designer rewrite
│ └── ⊘ Chunk C — FE PeWorkflowPanel SKIP (compat existing)
└── Plan con Defer S17+:
├── 🔥 UAT live test workflow flat (3 phòng × N cấp realistic setup)
├── Old PE/HĐ data migration legacy workflow stuck phase
├── Sample data seed N-stage (block DesignTime vs Runtime DB)
├── Budget N-stage (cần versioned WF migration trước)
├── schema-diagram §17-21 cron audit 2026-06-01
├── Skill ef-core-migration / contract-workflow refresh cron audit
├── Tests flat workflow flow (làm khi UAT bug)
└── Hard blockers Ops (UAT, SMTP, Rotate creds, SQL backup, Remove huypham.vn, win-acme)
```
## Handoff
UAT iteration mode active. Workflow flat ready. User UAT live:
1. Tạo workflow definition mới qua `/system/pe-workflows/DuyetNcc` với 3 phòng × N cấp
2. Tạo phiếu PE → trình duyệt → User cùng Phòng+Cấp duyệt qua từng step
3. Test 3-button Trả lại/Từ chối hoạt động đúng
**Cron audit kế:** 2026-06-01 (~24 ngày).
Drastic refactor success — scope estimate accuracy: 30% (3h actual vs 10h conservative). Over-estimated risk thanks to per-chunk discipline + memory rule guidance.