# Multi-Branch Approval System Implementation

## 🎯 Overview

Sistem Multi-Branch Approval telah berhasil diimplementasikan untuk mendukung workflow approval yang dapat bercabang berdasarkan User Level dari submitter artikel. Implementasi ini memungkinkan:

- **Conditional Routing**: Approval flow mengikuti jalur berbeda berdasarkan level user yang submit artikel
- **Hierarchical Branching**: Support untuk struktur cabang yang kompleks dengan multiple level
- **Dynamic Configuration**: Workflow dapat dikonfigurasi secara dinamis tanpa mengubah kode
- **Backward Compatibility**: Sistem lama tetap berfungsi tanpa perubahan

## 🚀 Quick Start

### 1. Database Migration

Jalankan script migration untuk menambahkan support multi-branch:

```bash
# Jalankan migration script
psql -d your_database -f docs/migrations/add_multi_branch_support.sql
```

### 2. Create Multi-Branch Workflow

```bash
curl -X POST "http://localhost:8080/api/approval-workflows/with-steps" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "name": "Multi-Branch Article Approval",
    "description": "Workflow dengan cabang berdasarkan user level",
    "isActive": true,
    "steps": [
      {
        "stepOrder": 1,
        "stepName": "Level 2 Branch",
        "requiredUserLevelId": 2,
        "conditionType": "user_level_hierarchy",
        "conditionValue": "{\"applies_to_levels\": [4,5,6,7,8,9]}",
        "branchName": "Branch_A"
      },
      {
        "stepOrder": 1,
        "stepName": "Level 3 Branch",
        "requiredUserLevelId": 3,
        "conditionType": "user_level_hierarchy",
        "conditionValue": "{\"applies_to_levels\": [10,11,12,13,14,15]}",
        "branchName": "Branch_B"
      },
      {
        "stepOrder": 2,
        "stepName": "Level 1 Final Approval",
        "requiredUserLevelId": 1,
        "conditionType": "always",
        "branchName": "Final_Approval"
      }
    ]
  }'
```

### 3. Submit Article untuk Approval

```bash
curl -X POST "http://localhost:8080/api/articles/123/submit-approval" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "workflowId": 1
  }'
```

### 4. Process Multi-Branch Approval

```bash
curl -X POST "http://localhost:8080/api/article-approval-flows/456/multi-branch-approve" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "message": "Article looks good, approved for next level"
  }'
```

## 📁 File Changes

### Database Entities

1. **`app/database/entity/approval_workflow_steps.entity.go`**
   - Added multi-branch support fields
   - Added parent-child relationships
   - Added condition types and values

2. **`app/database/entity/article_approval_flows.entity.go`**
   - Added branch tracking fields
   - Added parallel flow support
   - Added parent-child flow relationships

### Service Layer

3. **`app/module/approval_workflow_steps/repository/approval_workflow_steps.repository.go`**
   - Added multi-branch query methods
   - Added condition-based filtering
   - Added branch-specific queries

4. **`app/module/article_approval_flows/service/article_approval_flows.service.go`**
   - Added multi-branch approval processing
   - Added condition evaluation logic
   - Added branch determination methods

### API Layer

5. **`app/module/approval_workflows/request/approval_workflows.request.go`**
   - Added multi-branch fields to request structures
   - Updated entity conversion methods

6. **`app/module/article_approval_flows/controller/article_approval_flows.controller.go`**
   - Added multi-branch approval endpoints
   - Added next steps preview endpoint

## 🔧 Configuration

### Condition Types

1. **`user_level`**: Steps berlaku untuk user level tertentu
   ```json
   "conditionValue": "[4, 5, 6]"
   ```

2. **`user_level_hierarchy`**: Steps berlaku berdasarkan hierarki
   ```json
   "conditionValue": "{\"applies_to_levels\": [4,5,6], \"min_level\": 4, \"max_level\": 9}"
   ```

3. **`always`**: Steps selalu berlaku
   ```json
   "conditionValue": "{}"
   ```

4. **`custom`**: Steps dengan kondisi custom (untuk ekstensi masa depan)

### Branch Configuration

- **`branchName`**: Nama cabang untuk identifikasi
- **`branchOrder`**: Urutan dalam cabang yang sama
- **`parentStepId`**: ID step parent untuk hierarchical branching
- **`isParallel`**: Apakah step ini berjalan parallel

## 📊 Flow Examples

### Example 1: User Level 5 Submit Article

```
User Level 5 → Branch A (Level 2) → Final Approval (Level 1)
```

### Example 2: User Level 8 Submit Article

```
User Level 8 → Branch A (Level 2) → Final Approval (Level 1)
```

### Example 3: User Level 12 Submit Article

```
User Level 12 → Branch B (Level 3) → Final Approval (Level 1)
```

## 🧪 Testing

### Test Scenarios

1. **Basic Branching Test**:
   ```bash
   # Submit dari user level 5
   curl -X POST "http://localhost:8080/api/articles/123/submit-approval" \
     -H "Authorization: Bearer USER_LEVEL_5_TOKEN" \
     -d '{"workflowId": 1}'
   
   # Check next steps
   curl -X GET "http://localhost:8080/api/article-approval-flows/456/next-steps-preview" \
     -H "Authorization: Bearer USER_LEVEL_5_TOKEN"
   ```

2. **Multiple Branch Test**:
   ```bash
   # Test dengan user level berbeda
   curl -X POST "http://localhost:8080/api/articles/124/submit-approval" \
     -H "Authorization: Bearer USER_LEVEL_12_TOKEN" \
     -d '{"workflowId": 1}'
   ```

### Performance Testing

```bash
# Load testing dengan multiple submissions
for i in {1..100}; do
  curl -X POST "http://localhost:8080/api/articles/$i/submit-approval" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -d '{"workflowId": 1}' &
done
wait
```

## 🔍 Monitoring

### Check Workflow Status

```bash
# Get workflow dengan steps
curl -X GET "http://localhost:8080/api/approval-workflows/1/with-steps" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Get next steps preview
curl -X GET "http://localhost:8080/api/article-approval-flows/456/next-steps-preview" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

### Dashboard Statistics

```bash
# Get approval statistics
curl -X GET "http://localhost:8080/api/article-approval-flows/dashboard-stats" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

## 🚨 Error Handling

### Common Errors

1. **No Applicable Steps**:
   ```json
   {
     "success": false,
     "messages": ["No applicable next steps found for this user level"],
     "error": "NO_APPLICABLE_STEPS"
   }
   ```

2. **Invalid Condition Value**:
   ```json
   {
     "success": false,
     "messages": ["Invalid condition value format"],
     "error": "CONDITION_VALUE_INVALID"
   }
   ```

3. **Workflow Not Found**:
   ```json
   {
     "success": false,
     "messages": ["Workflow not found"],
     "error": "WORKFLOW_NOT_FOUND"
   }
   ```

## 🔄 Migration Guide

### From Linear to Multi-Branch

1. **Backup existing data**:
   ```sql
   CREATE TABLE approval_workflow_steps_backup AS SELECT * FROM approval_workflow_steps;
   CREATE TABLE article_approval_flows_backup AS SELECT * FROM article_approval_flows;
   ```

2. **Run migration script**:
   ```bash
   psql -d your_database -f docs/migrations/add_multi_branch_support.sql
   ```

3. **Test migration**:
   - Verify existing workflows still work
   - Test new multi-branch functionality
   - Rollback if issues found

### Rollback (if needed)

```sql
-- Uncomment rollback section in migration script
-- Run rollback commands to revert changes
```

## 📈 Performance Considerations

### Database Indexes

```sql
-- Indexes untuk performance
CREATE INDEX idx_approval_workflow_steps_condition ON approval_workflow_steps(condition_type, branch_name);
CREATE INDEX idx_article_approval_flows_branch ON article_approval_flows(current_branch);
```

### Caching Strategy

- Cache workflow steps by condition type
- Cache user level mappings
- Cache branch determination results

## 🔒 Security

### Access Control

- Validate user permissions for each approval step
- Ensure users can only approve steps they're authorized for
- Log all approval actions for audit

### Data Validation

- Validate condition values before processing
- Sanitize JSON input in condition_value
- Check for SQL injection in dynamic queries

## 🐛 Troubleshooting

### Common Issues

1. **Steps Not Found**:
   - Check condition_type and condition_value
   - Verify user level mapping
   - Check workflow activation status

2. **Infinite Loops**:
   - Validate step dependencies
   - Check for circular references in parent_step_id
   - Ensure proper step ordering

3. **Performance Issues**:
   - Check database indexes
   - Optimize condition evaluation queries
   - Consider caching strategies

### Debug Commands

```bash
# Check workflow steps
curl -X GET "http://localhost:8080/api/approval-workflows/1/with-steps" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Check user level
curl -X GET "http://localhost:8080/api/users/456" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Check approval flow status
curl -X GET "http://localhost:8080/api/article-approval-flows/123" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

## 🚀 Future Enhancements

1. **Visual Workflow Designer**: UI untuk membuat workflow secara visual
2. **Condition Builder**: UI untuk membuat kondisi tanpa JSON manual
3. **Workflow Templates**: Template workflow untuk berbagai use case
4. **Advanced Branching**: Support untuk conditional branching yang lebih kompleks
5. **Parallel Processing**: True parallel approval processing
6. **Workflow Analytics**: Analytics untuk workflow performance dan bottlenecks

## 📚 Documentation

- [Multi-Branch Approval Guide](docs/MULTI_BRANCH_APPROVAL_GUIDE.md)
- [Curl Examples](docs/MULTI_BRANCH_CURL_EXAMPLES.md)
- [Database Migration](docs/migrations/add_multi_branch_support.sql)

## 🤝 Support

Untuk pertanyaan atau masalah dengan implementasi multi-branch approval system, silakan:

1. Check dokumentasi lengkap di `docs/` folder
2. Review curl examples untuk testing
3. Check troubleshooting section
4. Contact development team untuk support lebih lanjut

---

**Status**: ✅ Implementasi selesai dan siap untuk production
**Version**: 1.0.0
**Last Updated**: $(date)
