[CLAUDE] Docs+Skill: chốt Session 14 wrap-up — PE 3-button workflow + Task 2 defer
Session 14 (2026-05-07) docs/skill update:
STATUS.md:
- Last updated + Phase summary count (95→96 test, 20 mig, 57 bảng, 41 gotcha)
- Recently Done row Session 14 chi tiết (3-button + Task 2 in-progress + DesignTime/Runtime DB gotcha)
HANDOFF.md:
- TL;DR Session 14 prepend với 1 commit + Task 2 defer
- 5 cảnh báo Session 15+: TraLai phase orphan / Task 2 sample seed / DesignTime
vs Runtime DB / Budget N-stage defer / schema-diagram §17-19 defer
migration-todos.md: Phase 9 + Session 14 block 4 sub-task done + 2 defer task
Session log NEW `2026-05-07-2500-3-button-workflow.md`:
- Bối cảnh + spec 3-button (Duyệt/Trả lại/Từ chối) + implementation chi tiết
(Domain policy expand + Service tách reject + FE button + dialog warning)
- Tests update (95→96 với +1 NEW Reject_To_TuChoi_Locks_Permanently)
- Task 2 in-progress: DesignTime vs Runtime DB gotcha + API exit 255 sớm
- Plan organization sau S14
Skill ef-core-migration:
- description + heading: 17→20 migration
- Bảng migration history thêm Mig 18-19 (PE) + Mig 20 (Contract)
- Section MỚI "N-stage workflow pattern (Mig 18-20)" — architecture decision
với filtered unique trick + per-module migration packaging guideline
- Phase 8 update: 83→96 test breakdown
Skill contract-workflow:
- Section MỚI "Phase 9+ done (Mig 18-20 — Session 12/13/14)":
* N-stage workflow PE + Contract (entity + filtered unique split + service
refactor + tests + FE Designer + UsersPage cấp + API)
* PE 3-button approval (Duyệt/Trả lại/Từ chối) Session 14
* Defer: Budget N-stage / Phase TraLai=98 orphan
CLAUDE.md root: 16→20 migration + 55→57 bảng + 83→96 test
docs/rules.md §7: Phase 9 active 83→96 test
Verify: dotnet test 96 pass + npm build (skip — pure docs/skill update).
🎉 Session 14 wrap-up complete. Pushed 1 task (3-button) + Task 2 defer.
Cumulative since session start (13h17): 13 commit (1 button removal +
6 PE N-stage Chunk A-F + 5 Contract N-stage Chunk A,B,C,D,F + 1 3-button).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@ -314,6 +314,54 @@ POST /api/contracts/{id}/transitions { targetPhase: 3, decision: 1, comment: "..
|
||||
- [x] **Lock edit guards** 17 handler khi Phase != DangSoanThao
|
||||
- [x] **CanBypassReview toggle** per User — admin UI + audit IsBypassed=true
|
||||
|
||||
## Phase 9+ done (Mig 18-20 — Session 12/13/14)
|
||||
|
||||
### N-stage workflow (PE Mig 18-19 + Contract Mig 20)
|
||||
|
||||
- [x] **N-stage approval** Phòng × PositionLevel (NV/PP/TP) cấu hình động per
|
||||
WorkflowStep cha. Mỗi inner step = 1 cấp duyệt (Order asc, sequential).
|
||||
- [x] **PositionLevel enum** Domain/Identity (NV=1, PP=2, TP=3) + `User.PositionLevel int?`
|
||||
- [x] **InnerStep entity** + ALTER `*DepartmentApproval.InnerStepId Guid?` per module
|
||||
- [x] **Filtered unique split** (Mig 19 cho PE / gộp Mig 20 cho Contract):
|
||||
legacy `WHERE InnerStepId IS NULL` (Stage Review/Confirm) + N-stage
|
||||
`WHERE InnerStepId IS NOT NULL` (per inner step)
|
||||
- [x] **Service refactor** TransitionAsync — load InnerSteps eager + reject
|
||||
branch clear N-stage rows + dept approval block split: hasInnerSteps→N-stage
|
||||
logic / else→legacy 2-stage. Match firstPending Order asc + (exact level
|
||||
OR canBypass + level≥). Bypass batch upsert NV+PP+TP cùng dept ≤ actor.
|
||||
- [x] **6 test PE N-stage** + **6 test Contract N-stage** (`PeNStageApprovalTests`,
|
||||
`ContractNStageApprovalTests`). Pattern reusable.
|
||||
- [x] **FE Designer** (PeWorkflowsPage + WorkflowsPage) sub-section "Cấp duyệt nhỏ
|
||||
trong phòng" drag-list { Phòng × Cấp + required }
|
||||
- [x] **UsersPage cột Cấp** + cycle button null→1→2→3→null
|
||||
- [x] **API** `PATCH /users/{id}/position-level`
|
||||
|
||||
**Backward compat 100%:** workflow no InnerSteps → service fallback legacy 2-stage
|
||||
Mig 16. Data legacy InnerStepId=null vẫn enforce unique cũ qua filtered index.
|
||||
|
||||
### PE 3-button approval (Session 14 — `0d77698`)
|
||||
|
||||
UI distinguishment 3 hành động cho approver:
|
||||
- **Duyệt** = forward (decision=Approve)
|
||||
- **Trả lại** = về DangSoanThao + Drafter sửa (decision=Reject + target=DangSoanThao
|
||||
→ smart reject pattern Mig 16 + clear N-stage rows + jump-back)
|
||||
- **Từ chối** = Phase=TuChoi (decision=Reject + target=TuChoi → phiếu khoá
|
||||
vĩnh viễn 17 handler Mig 16 lock edit, Drafter phải tạo phiếu mới)
|
||||
|
||||
**Domain policy expand:** NccOnly + NccWithPlan + FromDefinition thêm `(X → TuChoi)`
|
||||
transition cho mọi phase trung gian (trước chỉ DangSoanThao→TuChoi).
|
||||
|
||||
**Service Reject branch tách 2 case:**
|
||||
- target=TuChoi → giữ nguyên (KHÔNG override + KHÔNG set RejectedFromPhase + KHÔNG clear N-stage)
|
||||
- target khác (DangSoanThao) → smart reject (force DangSoanThao + RejectedFromPhase + clear N-stage)
|
||||
|
||||
### Defer
|
||||
|
||||
- Budget N-stage — cần migration `AddBudgetVersionedWorkflow` trước (Budget
|
||||
hardcoded `BudgetPolicy.Default`, chưa có versioned WorkflowDefinition).
|
||||
- Phase TraLai = 98 (Domain enum từ S11+++++++) — orphan, KHÔNG wire (user
|
||||
Session 14 chốt không cần phase trung gian).
|
||||
|
||||
## Tier 4+ (còn thiếu / future)
|
||||
|
||||
- [ ] Warning notification 20% SLA (`SlaWarningSent` flag đã có)
|
||||
|
||||
Reference in New Issue
Block a user