kontenhumas-be/docs/UPDATED_APPROVAL_FLOW_LOGIC.md

197 lines
6.1 KiB
Markdown
Raw Permalink Normal View History

2025-10-01 21:17:11 +00:00
# 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! 🚀