Modul broadcast mengirim pesan WhatsApp massal ke kontak berdasarkan tag, segment, atau daftar eksplisit. Dua mode: manual (langsung) dan scheduler (terjadwal).
Pengiriman tidak di Laravel Laravel hanya buat record BroadcastSceduler + BroadcastLog. Eksekusi pengiriman diserahkan ke worker/cron/engine WA eksternal. last_execute_date & onprogress di-update oleh service lain. Jangan berasumsi broadcast rusak di Laravel — cek worker dulu.
File kunci
File Baris Peran app/Http/Controllers/BroadcastscedularController.php1.450 Scheduler CRUD, filter recipient, statistik app/Http/Controllers/BroadcastchatController.php929 Message CRUD (pesan + media), overview app/Models/BroadcastSceduler.php74 Model scheduler app/Models/BroadcastMessage.php37 Model pesan app/Models/BroadcastLog.php48 Model log pengiriman
Model
BroadcastMessage
Field: title, message (array {type:'text'|'images'|'video'|'file', message, original_name, stored_name, size}), media_type, team_id, store_id.
BroadcastSceduler
Field: device, message_id, mode (BroadcastTarget enum), type (SchedulerTypeCast), status (bool), broadcast_type ('langsung'|'jadwal'), start_date, end_date, time, contact_list[], product_list[], status_list[], tag_list[], segment_list[], onprogress (bool), last_execute_date, last_manualrun_date.
Auto-disable di retrieved Setiap kali scheduler dimuat, jika data_device.sender atau message.id kosong, status dipaksa false + save. Efek: list scheduler selalu query write, lambat, dan bisa conflict dengan edit concurrent.
BroadcastLog
Field: status (bool — sukses/gagal), broadcast_id, customer_id, batch_id, store_id.
Scheduler vs Manual
Manual (broadcast_type='langsung') : kirim langsung, update last_manualrun_date. Frontend trigger
Scheduler (broadcast_type='jadwal') : punya start_date/end_date/time/type (once/once-range/everidate/every-range). Worker eksternal update last_execute_date
Recipient selection
Filter Cara mode='tag_customer'Filter by tag_list + criteria mode='segment_customer'Filter by segment_list (hanya index [0] ) contact_listDaftar eksplisit product_listFilter customer yang beli produk tertentu status_listFilter by status order customer
Criteria tag
Criteria Query MongoDB andelemMatch $eq per tag (semua tag harus ada)orwhereIn (salah satu tag)exclude!= (tidak ada tag)
segment_list hanya pakai index [0] countRecipients hanya ambil $segmentList[0]['id']. Pilih multiple segment sebenarnya tidak ter-support. Frontend mungkin tampilkan multi-select tapi backend hanya ambil satu.
Route
Web (routes/web.php:435)
Method Path Fungsi GET /broadcast/messageIndex pesan GET /broadcast/createForm buat pesan POST /broadcast/storeSimpan pesan GET /broadcast/sceduler/createForm buat scheduler POST /broadcast/sceduler/storeSimpan scheduler
API (routes/api.php:627)
Prefix /broadcast:
Method Path Fungsi GET /broadcast/listList pesan POST /broadcast/duplicate/{id}Duplikasi PUT /broadcast/update/{id}Update pesan DELETE /broadcast/destroy/{id}Hapus GET /broadcast/scedulerList scheduler POST /broadcast/sceduler/saveSimpan scheduler PATCH /broadcast/sceduler/change-status/{id}Toggle status POST /broadcast/sceduler/count-recipientsHitung penerima
Integrasi
Service Endpoint Untuk Engine WA (url_engine) GET /api/device-infoCek status device via DeviceService AWS S3 upload/delete Upload media pesan
Temuan
updatestatus duplikat changeStatus — tanpa return response & tanpa permission check. Salah satu harus dihapus
Index2.vue mungkin orphan — pola duplikat seperti Pages/Biolink copy/
Typo persisten Sceduler — sudah merasuk ke nama file, controller, model, route, frontend. Jangan perbaiki tanpa koordinasi lintas repo
Tidak ada retry/throttle di Laravel — tidak ditemukan mekanisme retry. Throttle hanya di middleware API umum