335 lines
10 KiB
Markdown
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 |