# Updated Approval Flow Logic

## 🎯 **Overview**

Flow approval telah diubah sesuai permintaan untuk memberikan pengalaman yang lebih baik dalam proses revisi dan penolakan artikel.

## 🔄 **Flow Behavior Changes**

### **1. Approve Action**
- ✅ **Behavior**: Tetap sama seperti sebelumnya
- ✅ **Result**: Naik ke step berikutnya atau selesai jika sudah step terakhir
- ✅ **Status**: Workflow berlanjut normal

### **2. Revision Action (Baru)**
- ✅ **Behavior**: Mundur ke step awal (step 1) dengan status pending
- ✅ **Result**: Flow approval direset seperti belum berjalan
- ✅ **Status**: `StatusId = 1` (pending)
- ✅ **Article Status**: `StatusId = 1` (draft), `IsDraft = true`
- ✅ **Restart**: Ketika user melakukan update artikel, approval akan berjalan kembali dari step 1

### **3. Reject Action (Baru)**
- ✅ **Behavior**: Mundur ke step awal (step 1) dengan status pending
- ✅ **Result**: Flow approval direset seperti belum berjalan
- ✅ **Status**: `StatusId = 1` (pending)
- ✅ **Article Status**: `StatusId = 1` (draft), `IsDraft = true`
- ✅ **Restart**: Ketika user melakukan update artikel, approval akan berjalan kembali dari step 1

## 📊 **Database Changes**

### **Article Approval Flows Table:**
```sql
-- Untuk Revision Action
UPDATE article_approval_flows 
SET current_step = 1,
    status_id = 1,  -- pending
    revision_requested = true,
    revision_message = 'message',
    completed_at = NULL  -- Reset completed_at
WHERE id = flow_id;

-- Untuk Reject Action  
UPDATE article_approval_flows 
SET current_step = 1,
    status_id = 1,  -- pending
    revision_message = 'message',
    completed_at = NULL  -- Reset completed_at
WHERE id = flow_id;
```

### **Articles Table:**
```sql
-- Untuk Revision & Reject Action
UPDATE articles 
SET status_id = 1,  -- draft
    is_draft = true,
    workflow_id = workflow_id,  -- Keep workflow ID
    current_approval_step = 1   -- Reset to step 1
WHERE id = article_id;
```

## 🎯 **Action Types & Behavior Summary**

| Action | Flow Behavior | Article Status | Restart Behavior |
|--------|---------------|----------------|------------------|
| **`approve`** | Naik ke step berikutnya | Tetap dalam approval | Workflow berlanjut |
| **`revision`** | Reset ke step 1, status pending | Draft | Restart dari step 1 saat update |
| **`reject`** | Reset ke step 1, status pending | Draft | Restart dari step 1 saat update |

## 🚀 **API Usage Examples**

### **Revision Request:**
```bash
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "action": "revision",
    "message": "Please fix grammar and improve conclusion"
  }'
```

**Response:**
```json
{
  "success": true,
  "messages": ["Article successfully revision through active approval flow"],
  "data": {
    "article_id": 123,
    "flow_id": 456,
    "action": "revision",
    "current_step": 1,
    "current_branch": "Branch_A",
    "workflow_id": 1
  }
}
```

### **Reject Request:**
```bash
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "action": "reject",
    "message": "Content does not meet quality standards"
  }'
```

**Response:**
```json
{
  "success": true,
  "messages": ["Article successfully reject through active approval flow"],
  "data": {
    "article_id": 123,
    "flow_id": 456,
    "action": "reject",
    "current_step": 1,
    "current_branch": "Branch_A",
    "workflow_id": 1
  }
}
```

## 🔄 **Restart Flow Logic**

### **Ketika User Update Artikel:**

1. **System Check**: Apakah artikel memiliki `workflow_id` dan `current_approval_step = 1`?
2. **Auto Restart**: Jika ya, approval flow akan berjalan kembali dari step 1
3. **Status Update**: Artikel status berubah dari draft ke pending approval
4. **Flow Continuation**: Approval flow berlanjut dengan step yang sudah direset

### **Implementation dalam Articles Service:**
```go
// Ketika artikel diupdate, check apakah perlu restart approval
if article.WorkflowId != nil && article.CurrentApprovalStep != nil && *article.CurrentApprovalStep == 1 {
    // Restart approval flow
    err := articleApprovalFlowsService.RestartApprovalFlow(article.ID)
    if err != nil {
        return err
    }
}
```

## 📈 **Benefits**

### **1. Better User Experience**
- ✅ User bisa melakukan revisi tanpa kehilangan progress workflow
- ✅ Reject tidak menghapus workflow, hanya reset
- ✅ Mudah untuk restart approval setelah update

### **2. Workflow Continuity**
- ✅ Workflow ID tetap tersimpan untuk restart
- ✅ Tidak perlu membuat workflow baru
- ✅ History approval tetap tersimpan

### **3. Flexible Process**
- ✅ User bisa update artikel dan approval otomatis restart
- ✅ Tidak ada duplikasi workflow
- ✅ Konsisten dengan business logic

## 🎯 **Use Cases**

### **Scenario 1: Revision Process**
1. Editor review artikel di step 2
2. Editor request revision → Flow reset ke step 1, artikel jadi draft
3. Author update artikel
4. Approval flow restart otomatis dari step 1
5. Editor review lagi dari awal

### **Scenario 2: Rejection Process**
1. Editor review artikel di step 2
2. Editor reject artikel → Flow reset ke step 1, artikel jadi draft
3. Author update artikel
4. Approval flow restart otomatis dari step 1
5. Editor review lagi dari awal

### **Scenario 3: Multiple Revisions**
1. Editor request revision → Reset ke step 1
2. Author update → Restart approval
3. Editor request revision lagi → Reset ke step 1 lagi
4. Author update lagi → Restart approval lagi
5. Proses bisa berulang sampai approved

## 🎉 **Summary**

Perubahan flow ini memberikan:

1. **✅ Flexibility**: User bisa melakukan revisi/reject tanpa kehilangan workflow
2. **✅ Continuity**: Workflow tidak terputus, hanya direset
3. **✅ Auto Restart**: Approval otomatis restart saat artikel diupdate
4. **✅ Better UX**: Proses yang lebih intuitif dan user-friendly
5. **✅ Data Integrity**: Workflow ID dan history tetap tersimpan

Sekarang sistem approval memberikan pengalaman yang lebih baik dengan flow yang lebih fleksibel! 🚀
