5.7 KiB
5.7 KiB
TASK-BE-017: Document Numbering Backend Refactor
status: TODO priority: HIGH estimated_effort: 3-5 days dependencies:
- specs/01-requirements/03.11-document-numbering.md (v1.6.2)
- specs/03-implementation/document-numbering.md (v1.6.2) related_task: TASK-FE-017-document-numbering-refactor.md
Objective
Refactor Document Numbering module ตาม specification v1.6.2 โดยเน้น:
- Number State Machine (RESERVED → CONFIRMED → VOID → CANCELLED)
- Idempotency-Key support
- Counter Key alignment ตาม requirements
Implementation Checklist
1. Entity Updates
1.1 DocumentNumberCounter Entity
- Rename
current_year→ ใช้reset_scopepattern (YEAR_2025, NONE) - Ensure FK columns match:
correspondence_type_id,originator_organization_id,recipient_organization_id - Add
rfa_type_id,sub_type_id,discipline_idcolumns if missing - Update Primary Key ให้ตรงกับ requirements spec
// Expected Counter Key structure
interface CounterKey {
projectId: number;
originatorOrganizationId: number;
recipientOrganizationId: number; // 0 for RFA
correspondenceTypeId: number;
subTypeId: number; // 0 if not applicable
rfaTypeId: number; // 0 if not applicable
disciplineId: number; // 0 if not applicable
resetScope: string; // 'YEAR_2025', 'NONE'
}
1.2 DocumentNumberAudit Entity
- Add
operationenum:RESERVE,CONFIRM,CANCEL,MANUAL_OVERRIDE,VOID,GENERATE - Ensure
counter_keyis stored as JSON - Add
idempotency_keycolumn
1.3 DocumentNumberReservation Entity (NEW if not exists)
- Create entity for Two-Phase Commit reservations
- Fields:
token,document_number,status,expires_at,metadata
2. Service Updates
2.1 DocumentNumberingService
- Implement
reserveNumber()- Phase 1 of Two-Phase Commit - Implement
confirmNumber()- Phase 2 of Two-Phase Commit - Implement
cancelNumber()- Explicit cancel reservation - Add Idempotency-Key checking logic
- Update
generateNextNumber()to use new CounterKey structure
2.2 Counter Key Builder
- Create helper to build counter key based on document type:
- Global (LETTER, MEMO, RFI):
(project, orig, recip, type, 0, 0, 0, YEAR_XXXX) - TRANSMITTAL:
(project, orig, recip, type, subType, 0, 0, YEAR_XXXX) - RFA:
(project, orig, 0, type, 0, rfaType, discipline, NONE)
- Global (LETTER, MEMO, RFI):
2.3 ManualOverrideService
- Implement
manualOverride()with validation - Auto-update counter if manual number > current
2.4 VoidReplaceService
- Implement
voidAndReplace()workflow - Link new document to voided document
3. Controller Updates
3.1 DocumentNumberingController
- Add
POST /reserveendpoint - Add
POST /confirmendpoint - Add
POST /cancelendpoint - Add
Idempotency-Keyheader validation middleware
3.2 DocumentNumberingAdminController
- Add
POST /manual-overrideendpoint - Add
POST /void-and-replaceendpoint - Add
POST /bulk-importendpoint - Add
GET /metricsendpoint for monitoring dashboard
4. Number State Machine
stateDiagram-v2
[*] --> RESERVED: reserve()
RESERVED --> CONFIRMED: confirm()
RESERVED --> CANCELLED: cancel() or TTL expired
CONFIRMED --> VOID: void()
CANCELLED --> [*]
VOID --> [*]
4.1 State Transitions
- Implement state validation before transitions
- Log all transitions to audit table
- TTL 5 minutes for RESERVED state
5. Testing
5.1 Unit Tests
- CounterService.incrementCounter()
- ReservationService.reserve/confirm/cancel()
- TemplateValidator.validate()
- CounterKeyBuilder
5.2 Integration Tests
- Two-Phase Commit flow
- Idempotency-Key duplicate prevention
- Redis lock + DB optimistic lock
5.3 Load Tests
- Concurrent number generation (1000 req/s)
- Zero duplicates verification
Files to Create/Modify
| Action | Path |
|---|---|
| MODIFY | backend/src/modules/document-numbering/entities/document-number-counter.entity.ts |
| MODIFY | backend/src/modules/document-numbering/entities/document-number-audit.entity.ts |
| CREATE | backend/src/modules/document-numbering/entities/document-number-reservation.entity.ts |
| MODIFY | backend/src/modules/document-numbering/services/document-numbering.service.ts |
| CREATE | backend/src/modules/document-numbering/services/reservation.service.ts |
| CREATE | backend/src/modules/document-numbering/services/manual-override.service.ts |
| MODIFY | backend/src/modules/document-numbering/controllers/document-numbering.controller.ts |
| MODIFY | backend/src/modules/document-numbering/controllers/document-numbering-admin.controller.ts |
| CREATE | backend/src/modules/document-numbering/guards/idempotency.guard.ts |
Acceptance Criteria
- All Counter Key ตรงกับ requirements v1.6.2
- Number State Machine ทำงานถูกต้อง
- Idempotency-Key ป้องกัน duplicate requests
- Zero duplicate numbers ใน concurrent load test
- Audit logs บันทึกทุก operation