Pemantauan & Troubleshooting
Pohon diagnosis cepat
1. Pesan masuk tidak dibalas AI
Perintah:
docker logs --tail 100 crm_queue
docker exec crm_php php artisan queue:failed
docker exec crm_php tail -100 storage/logs/laravel.log
2. Chat Rooms kosong / gagal kirim
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| Daftar percakapan kosong | Tidak ada akun is_active dengan gateway_provider = jasnita | Aktifkan akun di menu WhatsApp Business |
Log ChatPanel conversations gagal | API Jasnita menolak / berubah | Cek kredensial OAuth; endpoint chatpanel/* tidak terdokumentasi publik dan bisa berubah |
Toschat menolak kredensial (HTTP 401) | client_id/secret/username/password salah | Perbarui kredensial akun |
| "Pesan gagal terkirim" | Jendela 24 jam lewat | Pakai Compose Message dengan template |
| "Tidak ada akun WhatsApp Jasnita aktif" | Akun nonaktif atau bukan jasnita | Aktifkan / perbaiki gateway_provider |
| Media tidak tampil | Proksi menolak (izin) atau path kosong | Cek izin halaman Chat Rooms user tersebut |
| Mode testing: pasien tidak menerima apa pun | Disengaja | Setel WHATSAPP_TEST_MODE=false |
3. Pembayaran & booking ⚠️ prioritas tertinggi
Cari draft yang bermasalah
Buka menu Booking Requests (/admin/booking-requests) dan saring:
| Status | Artinya | Tindakan |
|---|---|---|
Failed | 💰 Uang masuk, janji temu GAGAL dibuat | Buat janji temu manual, hubungi pasien |
Pending melewati expires_at | Sapuan belum berjalan | Cek scheduler hidup |
Paid tanpa appointment_id | Anomali | Periksa log |
Pesan log penting
| Pesan log | Tingkat | Artinya |
|---|---|---|
Gagal membuat Appointment dari booking berbayar | error | 💰 Uang masuk, janji temu gagal. Draft → Failed |
Booking diselamatkan sapuan tapi notifikasinya gagal | error | 💰 Pasien punya jadwal tanpa tahu apa pun. Kirim pesan manual — sapuan tidak akan menengoknya lagi |
Booking sudah terkonfirmasi tapi notifikasinya gagal | error | Sama seperti di atas, dari jalur listener |
Pembayaran lunas gagal jadi janji temu dan drafnya tak terbaca | error | 💰 Pasien tidak bisa dihubungi sama sekali |
Gagal mengonfirmasi booking dari pembayaran lunas | error | Listener melempar; sapuan 5 menit akan memungutnya |
Callback Duitku dilewati: Payment tidak ditemukan | warning | Baris Payment sudah terhapus (mis. pasien dihapus). Satu-satunya jejaknya |
Callback Duitku dilewati: merchantOrderId tidak berbentuk RESV-{id} | warning | Order integrasi lain, atau format Duitku berubah → pembayaran berhenti dibukukan |
Callback lunas mendahului status lokal; Payment dibuka kembali jadi Success | warning | Normal — sapuan sempat menandai Expired/Failed duluan |
Callback lunas dilewati: Payment sudah Refunded | warning | Pembukuan Duitku dan kami tidak sepakat — urusan manusia |
Callback lunas diulang untuk Payment yang sudah Success | info | Retry Duitku biasa |
Pembayaran lunas tanpa draft booking | warning | Reservasi manual (wajar) atau insert draft gagal (tidak wajar) |
Duitku callback: invalid signature | warning | Signature salah — cek DUITKU_API_KEY |
Tool AI di luar allowlist ditolak sebelum dieksekusi | warning | Model mengarang nama tool, atau ada yang mencoba menyetirnya |
Perintah pencarian log
docker exec crm_php grep -E "booking|Duitku|Payment" storage/logs/laravel.log | tail -50
docker exec crm_php php artisan bookings:reconcile # jalankan sapuan manual
Alur penyelamatan otomatis
4. Data SIMRS tidak diperbarui
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| Baris SIMRS ada tapi tidak masuk CRM | Relasi (pasien/dokter/poli) belum ada → baris dilewati | Jalankan entitas prasyarat dulu, sesuai urutan FK-safe |
| Error tanggal PostgreSQL | Zero-date MySQL | Sudah ditangani cleanDate() — kalau muncul lagi, laporkan |
Error CHECK constraint gender | Nilai sex di luar L/P | Sudah dipetakan; nilai lain jadi null |
| Tombol Sync tidak melakukan apa-apa | Queue worker mati | docker restart crm_queue |
| Koneksi SIMRS gagal | Terowongan mati | Cek kontainer crm_simrs_tunnel |
| Data salah masuk | — | Rollback batch tersebut dari UI |
docker exec crm_php php artisan simrs:sync patient
docker ps --format "{{.Names}}\t{{.Status}}" | grep simrs
5. Daftar kontak basi
Halaman Kontak menampilkan waktu sinkron terakhir di subheading. Merah = lintasan terakhir gagal.
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| Tidak ada info "sinkron terakhir" | Belum pernah sinkron | Tekan tombol manual |
| Info merah | Lintasan gagal | Baca pesan error di contact_sync_runs |
| Waktu tidak pernah maju | WHATSAPP_CONTACT_SYNC_ENABLED=false atau scheduler mati | Cek env + scheduler |
| Nomor baru tidak muncul seketika | Job webhook gagal mencatat kontak | Cari log Gagal mencatat kontak dari pesan masuk |
| Nama kontak tidak ikut diperbarui | Disengaja — nama editan petugas tidak ditimpa | Bukan bug |
docker exec crm_php php artisan contacts:sync
6. Menu tidak muncul / akses ditolak
shouldRegisterNavigation() memanggil canAccess() — jadi menu yang hilang selalu berarti izinnya belum diberikan.
7. Antrian bermasalah
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| "Selesaikan antrian aktif di loket ini dulu" | Loket masih memegang nomor | Klik Selesai dulu |
| "Tidak ada antrian menunggu" | Tidak ada nomor Waiting pada tanggal terpilih | Normal |
| Papan tayang kosong | Tidak ada loket aktif yang memegang antrian | Panggil satu nomor |
| Video YouTube tidak muncul | URL tidak dikenali | Pakai youtu.be/XXX atau youtube.com/watch?v=XXX |
| Nomor lompat / berulang | — | Penomoran per poli per hari; periksa queue_date dan poly_id |
| Loket memanggil nomor poli lain | Perilaku sistem: callNext() tidak menyaring poli | Atur pembagian loket secara prosedural |
Pemantauan rutin
Perintah pemeriksaan cepat
# Kesehatan kontainer
docker ps --format "{{.Names}}\t{{.Status}}" | grep crm_
# Worker & scheduler
docker logs --tail 30 crm_queue
docker logs --tail 30 crm_scheduler
docker exec crm_php php artisan schedule:list
# Job gagal
docker exec crm_php php artisan queue:failed
# Kesalahan terbaru
docker exec crm_php grep -i "ERROR" storage/logs/laravel.log | tail -30
# Ketersediaan aplikasi
curl -s -o /dev/null -w "%{http_code}\n" https://crmrsi.balascepat.com/admin/login
Kapan harus eskalasi
Eskalasi segera kalau menemukan
- Draft berstatus
Failed— uang masuk tanpa jadwal - Log
Callback Duitku dilewati: merchantOrderId tidak berbentuk RESV-{id}yang berulang — kemungkinan format Duitku berubah dan semua pembayaran berhenti dibukukan - Log
Booking diselamatkan sapuan tapi notifikasinya gagal— pasien punya jadwal tanpa tahu apa pun, dan tidak ada sapuan berikutnya yang akan menengoknya crm_queuemati lebih dari beberapa menit — pesan masuk menumpuk tanpa dibalas
Perhatikan tapi tidak mendesak
Callback lunas mendahului status lokalsesekali — normalPembayaran lunas tanpa draft booking— wajar untuk reservasi manual dari Chat Rooms- Lintasan
contacts:syncgagal sesekali — sapuan berikutnya 10 menit lagi - Batch SIMRS
failed— akan dilanjutkan dari cursor