Complaint Action Workflow Documentation
Konsep Dasar
1. Complaint (Laporan)
Laporan yang dibuat oleh warga dengan berbagai status:
pending- Menunggu ditindaklanjutiin_discussion- Sedang dibahaspostponed- Ditundaresolved- Selesaiclosed- Ditutuprejected- Ditolak
2. Complaint Actions (Keluhan Butuh Tindakan)
Daftar complaint yang memerlukan tindakan lanjut. Complaint masuk ke list ini jika:
-
Sumber 1: Langsung dari Laporan
- Complaint dibuat dengan flag
needs_action = true(butuh tindakan langsung) - Contoh: Kerusakan infrastruktur yang urgent
- Complaint dibuat dengan flag
-
Sumber 2: Hasil Rapat
- Complaint dibahas di rapat dengan decision =
resolved - Sistem otomatis set
needs_action = true - Artinya: "Sudah dibahas, perlu tindakan nyata"
- Complaint dibahas di rapat dengan decision =
3. Status vs Prioritas di Complaint Actions
A. Status Complaint (Kolom status di tabel complaints)
Status laporan secara umum:
pending- Belum ada pembahasanin_discussion- Sedang dibahas (di rapat atau sedang dikerjakan)postponed- Ditunda untuk pembahasan berikutnyaresolved- Sudah selesai dikerjakanclosed- Ditutup (tidak perlu tindakan)rejected- Ditolak
B. Status Action (Kolom baru yang perlu dibuat)
Status pengerjaan tindakan untuk complaint yang needs_action = true:
not_assigned- Belum ada penugasanassigned- Sudah ditugaskan (ada task)in_progress- Sedang dikerjakancompleted- Tindakan selesaicancelled- Dibatalkan
C. Prioritas Action (Kolom action_priority di tabel complaints)
Tingkat prioritas pengerjaan:
easy🟢 - Mudah (perbaikan sederhana)medium🟡 - Sedang (kompleksitas menengah)hard🔴 - Sulit (kompleks, butuh usaha lebih)
Alur Kerja
Scenario 1: Complaint Langsung Butuh Tindakan
1. Warga buat laporan → status: pending, needs_action: true
2. Muncul di "Complaint Actions" → action_status: not_assigned
3. Admin set prioritas → action_priority: medium
4. Admin buat task → action_status: assigned
5. Petugas kerjakan → action_status: in_progress
6. Selesai → action_status: completed, status: resolved, needs_action: false
Scenario 2: Complaint dari Hasil Rapat
1. Warga buat laporan → status: pending, needs_action: false
2. Masuk agenda rapat
3. Dibahas di rapat → pivot.decision: resolved
4. Meeting selesai → status: in_discussion, needs_action: true
5. Muncul di "Complaint Actions" → action_status: not_assigned
6. Admin set prioritas → action_priority: high
7. Admin buat task → action_status: assigned
8. Petugas kerjakan → action_status: in_progress
9. Selesai → action_status: completed, status: resolved, needs_action: false
Scenario 3: Complaint Ditunda di Rapat
1. Warga buat laporan → status: pending
2. Masuk agenda rapat
3. Dibahas di rapat → pivot.decision: postponed
4. Meeting selesai → status: postponed, needs_action: false
5. TIDAK muncul di "Complaint Actions"
6. Bisa masuk rapat berikutnya
Kolom Database
Tabel complaints
status- Status laporan umum (pending, in_discussion, resolved, dll)needs_action- Boolean, apakah butuh tindakan (true/false)action_priority- Prioritas tindakan (easy, medium, hard, NULL)action_status- [PERLU DITAMBAHKAN] Status pengerjaan tindakan
Tabel meeting_complaints (pivot)
decision- Keputusan rapat (resolved, postponed, needs_info, dll)is_discussed- Apakah sudah dibahas (true/false)discussion_notes- Catatan pembahasan
Tabel complaint_tasks
status- Status task (pending, in_progress, completed, cancelled)priority- Prioritas task (easy, medium, hard)
Tampilan di Complaint Actions
Kolom yang Ditampilkan:
- Checkbox - Untuk bulk action
- # - Nomor urut
- Tiket - Nomor tiket complaint
- Judul - Judul complaint
- Kategori - Kategori complaint
- Pelapor - Nama pelapor
- Blok/Rumah - Lokasi pelapor
- Prioritas - action_priority (🟢 Mudah, 🟡 Sedang, 🔴 Sulit)
- Status - [PERLU DIUBAH] Bukan status complaint, tapi action_status
- Dibuat - Tanggal complaint dibuat
- Info - Tombol untuk lihat riwayat rapat
- Aksi - Tombol untuk buat task
Status Action yang Ditampilkan:
not_assigned→ Badge Abu-abu: "Belum Ditugaskan"assigned→ Badge Biru: "Sudah Ditugaskan"in_progress→ Badge Kuning: "Sedang Dikerjakan"completed→ Badge Hijau: "Selesai"cancelled→ Badge Merah: "Dibatalkan"
Perubahan yang Diperlukan
1. Database Migration
Schema::table('complaints', function (Blueprint $table) {
$table->enum('action_status', [
'not_assigned',
'assigned',
'in_progress',
'completed',
'cancelled'
])->nullable()->after('action_priority');
});
2. Update Logic di MeetingController::finish()
Saat meeting selesai dengan decision = 'resolved':
if ($decision === 'resolved') {
$complaint->needs_action = true;
$complaint->action_status = 'not_assigned'; // Belum ada penugasan
$complaint->status = 'in_discussion'; // Masih dalam proses
$complaint->save();
}
3. Update Logic di ComplaintActionController::createTask()
Saat task dibuat:
// Update complaint action_status
foreach ($complaints as $complaint) {
$complaint->action_status = 'assigned';
$complaint->save();
}
4. Update Logic saat Task Status Berubah
Di TaskController (perlu dibuat):
// Saat task status berubah
if ($task->status === 'in_progress') {
foreach ($task->complaints as $complaint) {
$complaint->action_status = 'in_progress';
$complaint->save();
}
}
if ($task->status === 'completed') {
foreach ($task->complaints as $complaint) {
$complaint->action_status = 'completed';
$complaint->status = 'resolved';
$complaint->needs_action = false;
$complaint->save();
}
}
5. Update DataTable di ComplaintActionController
Ganti kolom status dari status menjadi action_status:
{
data: 'action_status',
render: function(data) {
const badges = {
'not_assigned': '<span class="badge bg-secondary">Belum Ditugaskan</span>',
'assigned': '<span class="badge bg-info">Sudah Ditugaskan</span>',
'in_progress': '<span class="badge bg-warning">Sedang Dikerjakan</span>',
'completed': '<span class="badge bg-success">Selesai</span>',
'cancelled': '<span class="badge bg-danger">Dibatalkan</span>'
};
return badges[data] || '<span class="badge bg-secondary">Belum Ditugaskan</span>';
}
}
Filter di Complaint Actions
Complaint muncul di list jika:
needs_action = true- Tidak memiliki task yang aktif (status: pending, in_progress, completed)
- Sudah dibahas di rapat ATAU belum pernah masuk rapat
Query:
Complaint::where('needs_action', true)
->whereDoesntHave('tasks', function($q) {
$q->whereIn('status', ['pending', 'in_progress', 'completed']);
})
->where(function($q) {
$q->whereHas('meetings', function($mq) {
$mq->where('meeting_complaints.is_discussed', true);
})
->orWhereDoesntHave('meetings');
});
Kesimpulan
Status Complaint ≠Status Action
- Status Complaint: Kondisi laporan secara keseluruhan
- Status Action: Kondisi pengerjaan tindakan untuk laporan yang butuh tindakan
- Prioritas Action: Tingkat urgensi pengerjaan
Dengan pemisahan ini, kita bisa tracking dengan jelas:
- Laporan mana yang butuh tindakan
- Tindakan mana yang sudah ditugaskan
- Tindakan mana yang sedang dikerjakan
- Tindakan mana yang sudah selesai