# Auto Approval Flow Guide

## 🚀 **Overview**

Sistem auto approval flow memungkinkan artikel untuk otomatis masuk ke workflow approval yang sesuai dengan user level submitter saat artikel dibuat, tanpa perlu manual submit approval.

## 🔄 **How It Works**

### **1. Artikel Creation Process**

Ketika user membuat artikel baru:

```bash
curl -X POST "http://localhost:8080/api/articles" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer USER_TOKEN" \
  -d '{
    "title": "Sample Article",
    "content": "Article content here",
    "categoryId": 1,
    "isDraft": false
  }'
```

**Sistem akan otomatis:**

1. ✅ **Detect User Level** - Mengambil user level dari JWT token
2. ✅ **Check Approval Requirement** - Cek apakah user level memerlukan approval
3. ✅ **Get Default Workflow** - Mengambil workflow default untuk client
4. ✅ **Create Approval Flow** - Membuat `ArticleApprovalFlows` record
5. ✅ **Initialize Multi-Branch** - Menentukan branch dan step pertama yang sesuai
6. ✅ **Set Article Status** - Set artikel ke status "Pending Approval"

### **2. Multi-Branch Logic**

Sistem akan otomatis menentukan branch yang sesuai berdasarkan:

- **User Level Submitter** - Level user yang membuat artikel
- **Workflow Conditions** - Kondisi yang dikonfigurasi di workflow steps
- **Branch Rules** - Aturan branching yang sudah disetup

**Contoh Flow:**

```
User Level 5 membuat artikel
    ↓
Sistem cek workflow conditions
    ↓
Masuk ke "Branch_A" (Level 2 A Branch)
    ↓
Menunggu approval dari User Level 3
    ↓
Setelah approved → masuk ke "Final_Approval"
    ↓
Menunggu approval dari User Level 2
    ↓
Artikel published
```

## 📋 **Implementation Details**

### **Database Changes**

Sistem menggunakan field baru di `ArticleApprovalFlows`:

```sql
-- Multi-branch support fields
current_branch     VARCHAR(100)  -- Current active branch
branch_path        TEXT          -- JSON array tracking path
is_parallel_flow   BOOLEAN       -- Whether parallel flow
parent_flow_id     INT4          -- For parallel flows
```

### **Service Integration**

```go
// Articles Service - Auto approval flow creation
func (s *articlesService) Save(authToken string, req request.ArticlesCreateRequest) {
    // ... create article ...
    
    // Auto-create approval flow with multi-branch support
    if createdBy.UserLevel.IsApprovalActive {
        approvalFlow := &entity.ArticleApprovalFlows{
            ArticleId:     article.ID,
            WorkflowId:    defaultWorkflow.ID,
            CurrentStep:   1,
            StatusId:      1, // In Progress
            SubmittedById: user.ID,
            SubmittedAt:   time.Now(),
            // Multi-branch fields
            CurrentBranch:  nil, // Will be determined
            BranchPath:     nil, // Will be populated
            IsParallelFlow: false,
        }
        
        // Initialize multi-branch flow
        s.initializeMultiBranchFlow(authToken, flowId, userLevelId)
    }
}
```

## 🎯 **User Experience**

### **Before (Manual Submit)**
```
1. User creates article
2. User manually submits for approval
3. System creates approval flow
4. Approval process begins
```

### **After (Auto Submit)**
```
1. User creates article
2. System automatically:
   - Creates approval flow
   - Determines correct branch
   - Sets first applicable step
   - Notifies approvers
3. Approval process begins immediately
```

## 🔧 **Configuration**

### **Workflow Setup**

Pastikan workflow sudah dikonfigurasi dengan benar:

```json
{
  "name": "Multi-Branch Article Approval",
  "isActive": true,
  "isDefault": true,
  "steps": [
    {
      "stepOrder": 1,
      "stepName": "Level 2 A Branch",
      "requiredUserLevelId": 3,
      "conditionType": "user_level_hierarchy",
      "conditionValue": "{\"applies_to_levels\": [5]}",
      "branchName": "Branch_A"
    },
    {
      "stepOrder": 1,
      "stepName": "Level 2 B Branch", 
      "requiredUserLevelId": 4,
      "conditionType": "user_level_hierarchy",
      "conditionValue": "{\"applies_to_levels\": [6]}",
      "branchName": "Branch_B"
    },
    {
      "stepOrder": 2,
      "stepName": "Level 1 Final Approval",
      "requiredUserLevelId": 2,
      "conditionType": "always",
      "branchName": "Final_Approval"
    }
  ]
}
```

### **User Level Configuration**

Pastikan user levels sudah dikonfigurasi dengan benar:

```sql
-- Check user levels
SELECT id, level_name, level_number, is_approval_active 
FROM user_levels 
WHERE client_id = 'your-client-id'
ORDER BY level_number;
```

## 📊 **Monitoring & Debugging**

### **Check Auto-Created Flows**

```sql
-- Check approval flows created automatically
SELECT 
    aaf.id,
    aaf.article_id,
    aaf.current_step,
    aaf.current_branch,
    aaf.status_id,
    aaf.submitted_at,
    a.title,
    u.name as submitter_name,
    ul.level_name as submitter_level
FROM article_approval_flows aaf
JOIN articles a ON aaf.article_id = a.id
JOIN users u ON aaf.submitted_by_id = u.id
JOIN user_levels ul ON u.user_level_id = ul.id
WHERE aaf.created_at >= NOW() - INTERVAL '1 day'
ORDER BY aaf.created_at DESC;
```

### **Check Branch Path**

```sql
-- Check branch path taken
SELECT 
    id,
    article_id,
    current_branch,
    branch_path,
    current_step
FROM article_approval_flows
WHERE branch_path IS NOT NULL
ORDER BY created_at DESC;
```

### **API Endpoints for Monitoring**

```bash
# Check approval status
curl -X GET "http://localhost:8080/api/articles/{article_id}/approval-status" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Check next steps preview
curl -X GET "http://localhost:8080/api/article-approval-flows/{flow_id}/next-steps-preview" \
  -H "Authorization: Bearer YOUR_TOKEN"

# Check my approval queue
curl -X GET "http://localhost:8080/api/article-approval-flows/my-queue" \
  -H "Authorization: Bearer APPROVER_TOKEN"
```

## 🚨 **Troubleshooting**

### **Common Issues**

1. **No Approval Flow Created**
   - Check if user level has `is_approval_active = true`
   - Check if default workflow exists
   - Check logs for errors

2. **Wrong Branch Selected**
   - Check workflow conditions
   - Check user level hierarchy
   - Check condition value JSON format

3. **Flow Not Initialized**
   - Check `initializeMultiBranchFlow` method
   - Check `FindNextStepsForBranch` method
   - Check database constraints

### **Debug Commands**

```bash
# Check user level
curl -X GET "http://localhost:8080/api/users/{user_id}" \
  -H "Authorization: Bearer YOUR_TOKEN" | jq '.data.user_levels'

# Check default workflow
curl -X GET "http://localhost:8080/api/approval-workflows/default" \
  -H "Authorization: Bearer YOUR_TOKEN"

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

## 🎉 **Benefits**

1. **Better UX** - User tidak perlu manual submit approval
2. **Automatic Routing** - Sistem otomatis menentukan branch yang sesuai
3. **Immediate Processing** - Approval flow dimulai langsung setelah artikel dibuat
4. **Consistent Behavior** - Semua artikel mengikuti aturan yang sama
5. **Reduced Errors** - Mengurangi kemungkinan user lupa submit approval

## 🔄 **Migration from Manual Submit**

Jika sebelumnya menggunakan manual submit, sistem akan tetap backward compatible:

- Artikel lama tetap bisa menggunakan manual submit
- Artikel baru akan otomatis menggunakan auto-approval flow
- Kedua sistem bisa berjalan bersamaan

## 📝 **Next Steps**

Setelah implementasi auto-approval flow:

1. ✅ Test dengan berbagai user levels
2. ✅ Monitor approval flow creation
3. ✅ Verify branch routing logic
4. ✅ Check notification system
5. ✅ Update user documentation
6. ✅ Train users on new workflow

---

**Sistem auto approval flow memberikan pengalaman yang lebih seamless dan otomatis untuk proses approval artikel!** 🚀
