# Approval Workflow Flow Diagram ## πŸ”„ **Complete Approval Process Flow** ### **1. System Setup Phase** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CLIENT │───▢│ APPROVAL_WORKFLOWS │───▢│ APPROVAL_WORKFLOW β”‚ β”‚ CREATION β”‚ β”‚ (Master Template) β”‚ β”‚ STEPS β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CLIENT_APPROVAL_ β”‚ β”‚ SETTINGS β”‚ β”‚ (Configuration) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### **2. Article Submission Phase** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ USER LEVEL 3 │───▢│ CREATE ARTICLE │───▢│ CHECK USER LEVEL β”‚ β”‚ (POLRES) β”‚ β”‚ β”‚ β”‚ REQUIRES APPROVAL? β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ YES - CREATE β”‚ β”‚ APPROVAL FLOW β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ARTICLE_APPROVAL_ β”‚ β”‚ FLOWS β”‚ β”‚ (current_step: 1) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### **3. Step-by-Step Approval Process** ``` STEP 1: Level 2 Approval β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ USER LEVEL 2 │───▢│ REVIEW ARTICLE │───▢│ APPROVE/REJECT β”‚ β”‚ (POLDAS) β”‚ β”‚ (Step 1) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CREATE STEP LOG β”‚ β”‚ (ARTICLE_APPROVAL_ β”‚ β”‚ STEP_LOGS) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MOVE TO STEP 2 β”‚ β”‚ (current_step: 2) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ STEP 2: Level 1 Approval β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ USER LEVEL 1 │───▢│ REVIEW ARTICLE │───▢│ APPROVE/REJECT β”‚ β”‚ (POLDAS) β”‚ β”‚ (Step 2) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ CREATE STEP LOG β”‚ β”‚ (ARTICLE_APPROVAL_ β”‚ β”‚ STEP_LOGS) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ COMPLETE APPROVAL β”‚ β”‚ (status: approved) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ“Š **Database State Changes** ### **Initial State (Article Created)** ``` ARTICLES: β”œβ”€β”€ id: 101 β”œβ”€β”€ title: "Sample Article" β”œβ”€β”€ workflow_id: 1 β”œβ”€β”€ current_approval_step: 1 β”œβ”€β”€ status_id: 1 (pending) └── created_by_id: 3 ARTICLE_APPROVAL_FLOWS: β”œβ”€β”€ id: 1 β”œβ”€β”€ article_id: 101 β”œβ”€β”€ workflow_id: 1 β”œβ”€β”€ current_step: 1 β”œβ”€β”€ status_id: 1 (pending) β”œβ”€β”€ submitted_by_id: 3 └── submitted_at: 2025-01-15 10:00:00 ARTICLE_APPROVALS (Legacy): β”œβ”€β”€ id: 1 β”œβ”€β”€ article_id: 101 β”œβ”€β”€ approval_at_level: 2 β”œβ”€β”€ status_id: 1 (pending) └── message: "Need Approval" ``` ### **After Step 1 Approval (Level 2)** ``` ARTICLES: β”œβ”€β”€ current_approval_step: 2 ← UPDATED └── status_id: 1 (pending) ARTICLE_APPROVAL_FLOWS: β”œβ”€β”€ current_step: 2 ← UPDATED └── status_id: 1 (pending) ARTICLE_APPROVAL_STEP_LOGS: ← NEW RECORD β”œβ”€β”€ id: 1 β”œβ”€β”€ approval_flow_id: 1 β”œβ”€β”€ step_order: 1 β”œβ”€β”€ step_name: "Level 2 Review" β”œβ”€β”€ approved_by_id: 2 β”œβ”€β”€ action: "approve" β”œβ”€β”€ message: "Approved by Level 2" └── processed_at: 2025-01-15 11:00:00 ``` ### **After Step 2 Approval (Level 1) - Final** ``` ARTICLES: β”œβ”€β”€ current_approval_step: null ← UPDATED β”œβ”€β”€ status_id: 2 (approved) ← UPDATED β”œβ”€β”€ is_publish: true ← UPDATED └── published_at: 2025-01-15 12:00:00 ← UPDATED ARTICLE_APPROVAL_FLOWS: β”œβ”€β”€ current_step: 2 β”œβ”€β”€ status_id: 2 (approved) ← UPDATED └── completed_at: 2025-01-15 12:00:00 ← UPDATED ARTICLE_APPROVAL_STEP_LOGS: ← NEW RECORD β”œβ”€β”€ id: 2 β”œβ”€β”€ approval_flow_id: 1 β”œβ”€β”€ step_order: 2 β”œβ”€β”€ step_name: "Level 1 Final Approval" β”œβ”€β”€ approved_by_id: 1 β”œβ”€β”€ action: "approve" β”œβ”€β”€ message: "Final approval by Level 1" └── processed_at: 2025-01-15 12:00:00 ``` ## πŸ”§ **Module Interaction Matrix** | Module | Purpose | Reads From | Writes To | Triggers | |--------|---------|------------|-----------|----------| | `articles` | Article Management | - | `articles` | Creates approval flow | | `approval_workflows` | Workflow Templates | `approval_workflows` | - | Defines steps | | `approval_workflow_steps` | Step Definitions | `approval_workflow_steps` | - | Defines requirements | | `article_approval_flows` | Active Instances | `approval_workflows` | `article_approval_flows` | Manages progression | | `article_approval_step_logs` | Audit Trail | `article_approval_flows` | `article_approval_step_logs` | Logs actions | | `article_approvals` | Legacy Support | - | `article_approvals` | Backward compatibility | | `client_approval_settings` | Configuration | `clients` | `client_approval_settings` | Sets defaults | ## 🚨 **Error Handling Flow** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ERROR │───▢│ LOG ERROR │───▢│ ROLLBACK β”‚ β”‚ OCCURS β”‚ β”‚ (Zerolog) β”‚ β”‚ TRANSACTION β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ NOTIFY USER β”‚ β”‚ (Error Response) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ”„ **Auto-Skip Logic Flow** ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ USER LEVEL 1 │───▢│ CHECK CAN SKIP │───▢│ SKIP ALL STEPS β”‚ β”‚ (HIGHEST) β”‚ β”‚ ALL STEPS? β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ AUTO APPROVE β”‚ β”‚ (status: approved) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ“ˆ **Performance Considerations** ### **Database Indexes Needed** ```sql -- For fast approval flow lookups CREATE INDEX idx_article_approval_flows_status ON article_approval_flows(status_id); CREATE INDEX idx_article_approval_flows_current_step ON article_approval_flows(current_step); -- For step log queries CREATE INDEX idx_article_approval_step_logs_flow_id ON article_approval_step_logs(approval_flow_id); CREATE INDEX idx_article_approval_step_logs_processed_at ON article_approval_step_logs(processed_at); -- For user level queries CREATE INDEX idx_users_user_level_id ON users(user_level_id); CREATE INDEX idx_user_levels_level_number ON user_levels(level_number); ``` ### **Caching Strategy** ``` 1. Workflow Templates β†’ Cache in Redis 2. User Level Mappings β†’ Cache in Memory 3. Active Approval Flows β†’ Cache with TTL 4. Step Requirements β†’ Cache per Workflow ``` ## 🎯 **Key Success Metrics** 1. **Approval Time**: Average time from submission to approval 2. **Step Completion Rate**: Percentage of steps completed successfully 3. **Error Rate**: Percentage of failed approval processes 4. **User Satisfaction**: Feedback on approval process 5. **System Performance**: Response times for approval actions ## πŸ” **Debugging Checklist** - [ ] Check if workflow exists and is active - [ ] Verify user level permissions - [ ] Confirm step order is correct - [ ] Validate foreign key relationships - [ ] Check transaction rollback scenarios - [ ] Monitor step log creation - [ ] Verify notification delivery - [ ] Test edge cases (auto-skip, rejection, etc.) ## πŸ“ **Summary** Sistem approval workflow MEDOLS menggunakan pendekatan modular yang memungkinkan: 1. **Fleksibilitas**: Workflow dapat dikonfigurasi per client 2. **Auditability**: Setiap action dicatat dalam step logs 3. **Scalability**: Dapat menangani multiple workflow types 4. **Backward Compatibility**: Legacy system tetap berfungsi 5. **User Experience**: Auto-skip untuk user level tinggi Dengan arsitektur ini, sistem dapat menangani berbagai skenario approval dengan efisien dan dapat diandalkan.