Complaint Action Workflow Documentation

Konsep Dasar

1. Complaint (Laporan)

Laporan yang dibuat oleh warga dengan berbagai status:

  • pending - Menunggu ditindaklanjuti
  • in_discussion - Sedang dibahas
  • postponed - Ditunda
  • resolved - Selesai
  • closed - Ditutup
  • rejected - 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
  • Sumber 2: Hasil Rapat

    • Complaint dibahas di rapat dengan decision = resolved
    • Sistem otomatis set needs_action = true
    • Artinya: "Sudah dibahas, perlu tindakan nyata"

3. Status vs Prioritas di Complaint Actions

A. Status Complaint (Kolom status di tabel complaints)

Status laporan secara umum:

  • pending - Belum ada pembahasan
  • in_discussion - Sedang dibahas (di rapat atau sedang dikerjakan)
  • postponed - Ditunda untuk pembahasan berikutnya
  • resolved - Sudah selesai dikerjakan
  • closed - 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 penugasan
  • assigned - Sudah ditugaskan (ada task)
  • in_progress - Sedang dikerjakan
  • completed - Tindakan selesai
  • cancelled - 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:

  1. Checkbox - Untuk bulk action
  2. # - Nomor urut
  3. Tiket - Nomor tiket complaint
  4. Judul - Judul complaint
  5. Kategori - Kategori complaint
  6. Pelapor - Nama pelapor
  7. Blok/Rumah - Lokasi pelapor
  8. Prioritas - action_priority (🟢 Mudah, 🟡 Sedang, 🔴 Sulit)
  9. Status - [PERLU DIUBAH] Bukan status complaint, tapi action_status
  10. Dibuat - Tanggal complaint dibuat
  11. Info - Tombol untuk lihat riwayat rapat
  12. 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:

  1. needs_action = true
  2. Tidak memiliki task yang aktif (status: pending, in_progress, completed)
  3. 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:

  1. Laporan mana yang butuh tindakan
  2. Tindakan mana yang sudah ditugaskan
  3. Tindakan mana yang sedang dikerjakan
  4. Tindakan mana yang sudah selesai
© 2026 Wargaku System. Membantu komunitas tumbuh bersama.