qudoco-be/plan/dynamic-article-approval-sy...

335 lines
10 KiB
Markdown

# Plan Implementasi Sistem Approval Artikel Dinamis
## 1. Analisis Sistem Saat Ini
### Struktur Database yang Sudah Ada:
- **Articles**: Memiliki field `NeedApprovalFrom`, `HasApprovedBy`, `StatusId` untuk tracking approval
- **ArticleApprovals**: Menyimpan history approval dengan `ApprovalAtLevel`
- **Users**: Terhubung dengan `UserLevels` dan `UserRoles`
- **UserLevels**: Memiliki `LevelNumber`, `ParentLevelId`, `IsApprovalActive`
- **UserRoles**: Terhubung dengan `UserLevels` melalui `UserRoleLevelDetails`
- **UserRoleAccesses**: Memiliki `IsApprovalEnabled` untuk kontrol akses approval
- **MasterApprovalStatuses**: Status approval (pending, approved, rejected)
### Logika Approval Saat Ini:
- Hard-coded untuk 3 level (level 1, 2, 3)
- Approval naik ke parent level jika disetujui
- Kembali ke contributor jika ditolak
- Status: 1=Pending, 2=Approved, 3=Rejected
## 2. Kebutuhan Sistem Baru
### Functional Requirements:
1. **Dynamic Approval Levels**: Sistem harus mendukung 1-N level approval
2. **Flexible Workflow**: Approval flow bisa diubah sewaktu-waktu
3. **Role-based Access**: Approver dan Contributor dengan hak akses berbeda
4. **Revision Handling**: Artikel kembali ke contributor saat revisi diminta
5. **Audit Trail**: Tracking lengkap history approval
### User Stories:
- Sebagai **Contributor**: Saya bisa membuat artikel dan submit untuk approval
- Sebagai **Approver Level N**: Saya bisa approve/reject/request revision artikel
- Sebagai **Admin**: Saya bisa mengatur approval workflow secara dinamis
## 3. Desain Database Baru
### 3.1 Tabel Baru yang Diperlukan:
#### `approval_workflows`
```sql
CREATE TABLE approval_workflows (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
is_active BOOLEAN DEFAULT true,
client_id UUID,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
#### `approval_workflow_steps`
```sql
CREATE TABLE approval_workflow_steps (
id SERIAL PRIMARY KEY,
workflow_id INT REFERENCES approval_workflows(id),
step_order INT NOT NULL,
user_level_id INT REFERENCES user_levels(id),
is_required BOOLEAN DEFAULT true,
can_skip BOOLEAN DEFAULT false,
client_id UUID,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
#### `article_approval_flows`
```sql
CREATE TABLE article_approval_flows (
id SERIAL PRIMARY KEY,
article_id INT REFERENCES articles(id),
workflow_id INT REFERENCES approval_workflows(id),
current_step INT DEFAULT 1,
status_id INT DEFAULT 1, -- 1=In Progress, 2=Completed, 3=Rejected
client_id UUID,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
#### `article_approval_step_logs`
```sql
CREATE TABLE article_approval_step_logs (
id SERIAL PRIMARY KEY,
article_flow_id INT REFERENCES article_approval_flows(id),
step_order INT NOT NULL,
user_level_id INT REFERENCES user_levels(id),
approved_by INT REFERENCES users(id),
action VARCHAR(50) NOT NULL, -- 'approved', 'rejected', 'revision_requested'
message TEXT,
approved_at TIMESTAMP,
client_id UUID,
created_at TIMESTAMP DEFAULT NOW()
);
```
### 3.2 Modifikasi Tabel Existing:
#### `articles` - Tambah field:
```sql
ALTER TABLE articles ADD COLUMN workflow_id INT REFERENCES approval_workflows(id);
ALTER TABLE articles ADD COLUMN current_approval_step INT DEFAULT 0;
-- Keep existing fields: need_approval_from, has_approved_by, status_id untuk backward compatibility
```
#### `user_roles` - Tambah field:
```sql
ALTER TABLE user_roles ADD COLUMN role_type VARCHAR(50) DEFAULT 'contributor'; -- 'contributor', 'approver', 'admin'
```
## 4. Implementasi Backend
### 4.1 Entities Baru:
- `ApprovalWorkflows`
- `ApprovalWorkflowSteps`
- `ArticleApprovalFlows`
- `ArticleApprovalStepLogs`
### 4.2 Modules Baru:
#### `approval_workflows`
- **Repository**: CRUD operations untuk workflow management
- **Service**: Business logic untuk workflow creation/modification
- **Controller**: API endpoints untuk workflow management
- **Request/Response**: DTOs untuk workflow operations
#### `article_approval_flows`
- **Repository**: Tracking approval progress per artikel
- **Service**: Core approval logic, step progression
- **Controller**: API untuk approval actions
- **Request/Response**: DTOs untuk approval operations
### 4.3 Modifikasi Modules Existing:
#### `articles/service`
- Refactor `UpdateApproval()` method untuk menggunakan dynamic workflow
- Tambah method `InitiateApprovalFlow()` untuk memulai approval process
- Tambah method `ProcessApprovalStep()` untuk handle approval actions
#### `article_approvals`
- Extend untuk support dynamic workflow
- Integrate dengan `ArticleApprovalStepLogs`
## 5. API Design
### 5.1 Workflow Management APIs:
```
GET /api/approval-workflows # List all workflows
POST /api/approval-workflows # Create new workflow
GET /api/approval-workflows/{id} # Get workflow details
PUT /api/approval-workflows/{id} # Update workflow
DELETE /api/approval-workflows/{id} # Delete workflow
GET /api/approval-workflows/{id}/steps # Get workflow steps
POST /api/approval-workflows/{id}/steps # Add workflow step
PUT /api/approval-workflow-steps/{id} # Update workflow step
DELETE /api/approval-workflow-steps/{id} # Delete workflow step
```
### 5.2 Article Approval APIs:
```
POST /api/articles/{id}/submit-approval # Submit article for approval
POST /api/articles/{id}/approve # Approve current step
POST /api/articles/{id}/reject # Reject article
POST /api/articles/{id}/request-revision # Request revision
GET /api/articles/{id}/approval-history # Get approval history
GET /api/articles/pending-approval # Get articles pending approval for current user
```
### 5.3 Request/Response Models:
#### Workflow Creation:
```json
{
"name": "Standard Article Approval",
"description": "3-level approval process",
"steps": [
{
"stepOrder": 1,
"userLevelId": 3,
"isRequired": true,
"canSkip": false
},
{
"stepOrder": 2,
"userLevelId": 2,
"isRequired": true,
"canSkip": false
},
{
"stepOrder": 3,
"userLevelId": 1,
"isRequired": true,
"canSkip": false
}
]
}
```
#### Approval Action:
```json
{
"action": "approved", // "approved", "rejected", "revision_requested"
"message": "Article looks good, approved for next level"
}
```
## 6. Business Logic Flow
### 6.1 Article Submission Flow:
1. Contributor creates article (status: draft)
2. Contributor submits for approval
3. System creates `ArticleApprovalFlow` record
4. System sets article status to "pending approval"
5. System notifies first level approver
### 6.2 Approval Process Flow:
1. Approver receives notification
2. Approver reviews article
3. Approver takes action:
- **Approve**: Move to next step or publish if final step
- **Reject**: Set article status to rejected, end flow
- **Request Revision**: Send back to contributor
### 6.3 Revision Flow:
1. Article returns to contributor
2. Contributor makes revisions
3. Contributor resubmits
4. Approval flow restarts from step 1
## 7. Implementation Phases
### Phase 1: Database & Core Entities
- [ ] Create new database tables
- [ ] Implement new entities
- [ ] Create migration scripts
- [ ] Update existing entities
### Phase 2: Workflow Management
- [ ] Implement `approval_workflows` module
- [ ] Create workflow CRUD operations
- [ ] Implement workflow step management
- [ ] Create admin interface for workflow setup
### Phase 3: Dynamic Approval Engine
- [ ] Implement `article_approval_flows` module
- [ ] Refactor articles service for dynamic approval
- [ ] Create approval processing logic
- [ ] Implement notification system
### Phase 4: API & Integration
- [ ] Create approval APIs
- [ ] Update existing article APIs
- [ ] Implement role-based access control
- [ ] Create approval dashboard
### Phase 5: Testing & Migration
- [ ] Unit tests for all new modules
- [ ] Integration tests for approval flows
- [ ] Data migration from old system
- [ ] Performance testing
## 8. Backward Compatibility
### Migration Strategy:
1. **Dual System**: Run old and new system parallel
2. **Default Workflow**: Create default workflow matching current 3-level system
3. **Gradual Migration**: Migrate existing articles to new system
4. **Fallback**: Keep old approval logic as fallback
### Data Migration:
```sql
-- Create default workflow
INSERT INTO approval_workflows (name, description)
VALUES ('Legacy 3-Level Approval', 'Default 3-level approval system');
-- Create workflow steps
INSERT INTO approval_workflow_steps (workflow_id, step_order, user_level_id)
VALUES
(1, 1, 3), -- Level 3 approver
(1, 2, 2), -- Level 2 approver
(1, 3, 1); -- Level 1 approver
-- Update existing articles
UPDATE articles SET workflow_id = 1 WHERE workflow_id IS NULL;
```
## 9. Security Considerations
### Access Control:
- **Contributor**: Can only create and edit own articles
- **Approver**: Can only approve articles at their assigned level
- **Admin**: Can manage workflows and override approvals
### Validation:
- Validate user has permission for approval level
- Prevent approval of own articles
- Validate workflow step sequence
- Audit all approval actions
## 10. Performance Considerations
### Optimization:
- Index on `article_approval_flows.article_id`
- Index on `article_approval_flows.workflow_id`
- Index on `article_approval_step_logs.article_flow_id`
- Cache active workflows
- Batch notification processing
### Monitoring:
- Track approval processing time
- Monitor workflow bottlenecks
- Alert on stuck approvals
- Dashboard for approval metrics
## 11. Future Enhancements
### Possible Extensions:
1. **Conditional Workflows**: Different workflows based on article type/category
2. **Parallel Approvals**: Multiple approvers at same level
3. **Time-based Escalation**: Auto-escalate if approval takes too long
4. **External Integrations**: Email/Slack notifications
5. **Approval Templates**: Pre-defined approval messages
6. **Bulk Approvals**: Approve multiple articles at once
---
**Estimasi Waktu Implementasi**: 4-6 minggu
**Kompleksitas**: Medium-High
**Risk Level**: Medium (karena perubahan core business logic)
**Next Steps**:
1. Review dan approval plan ini
2. Setup development environment
3. Mulai implementasi Phase 1
4. Regular progress review setiap minggu