# 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! 🚀