D
Modul

Perangkat

Modul WhatsApp automation — device pairing, live chat, AI agent, broadcast. Bergantung pada 3 service eksternal.

Modul WhatsApp & Device mencakup pairing device, live chat, AI agent, broadcast, dan integrasi ke engine WhatsApp (Node.js) + engine bot (Node.js) + backend Go.

File kunci

FileBarisPeran
app/Http/Controllers/DeviceController.php923Device lifecycle: pairing, status, logout
app/Http/Controllers/LiveChatController.php1.213Live chat, agent assignment, CS rotasi
app/Http/Controllers/AgentAiController.php1.477AI agent CRUD, prompt, QnA, follow-up
app/Http/Controllers/BroadcastscedularController.php1.265Scheduled broadcast
app/Http/Controllers/BroadcastchatController.php768Manual broadcast
app/Services/DeviceService.php37Helper device info (hampir tidak dipakai)
resources/js/Pages/LiveChat/Index.vue5.681UI live chat (god component)

Device vs Agent — perbedaan

DeviceAgent
Modelapp/Models/Device.phpapp/Models/Agent.php
PeranSesi WhatsApp (instance di engine WA)Konfigurasi AI agent
Field utamano_wa, port, token, is_connected, agent_idprompt, qna_conditional, followup, welcome_messages
RelasibelongsTo(Agent) via agent_idhasMany(Device)
Dibuat saatPairing QR di engine WAAdmin konfigurasi AI di UI

Satu agent bisa dipetakan ke banyak device. Device tanpa agent_id = pesan masuk tidak diproses AI.

DeviceController — method utama

MethodFungsi
index()Halaman Device/Index — list device + agent + kuota
getQr()Pairing QR — GET url_engine . 'api/qrcode?instance='
store()Buat device baru — generate port, token, panggil engine api/new
list()List paginate, tiap row cek status realtime via deviceInfo()
deviceInfo($id)Cek status — GET url_engine . 'api/device-info?instance='
restartSession()Restart sesi — POST url_engine . 'api/new'
reload($id)Reload — GET url_engine . 'reload'
logout($id)Logout device — GET url_engine . 'api/logout?instance='
destroy($id)Hapus device + panggil engine logout + soft-delete
update()Update agent_id + sync handle_by_bot di ChatList
generatePortDevice()Alokasi port 3-digit acak (100–999)

LiveChatController

Chat models — perbedaan

ModelPeran
ChatListDaftar percakapan aktif (inbox view)
ChatHistoryRiwayat pesan per percakapan
ChatOrderOrder yang dibuat dari percakapan
ChatCheckoutCheckout yang dibuat dari percakapan

Real-time

Socket.IO (composables/useSocket.js) — connect di app.js setup() ke url_engine. Frontend mendengar event socket untuk update chat list real-time.

AI Agent

AgentAiController mengelola konfigurasi AI agent:

AspekField di model Agent
Promptprompt (default dari config('default_data.prompt'))
QnAqna_conditional — array {question, answer}
Follow-upfollowup — map keyed by type → {is_generate_ai, message, sending_time, image}
Welcome messagewelcome_messages — array {type, message, fileName?}
Limithistory_limit (default 10), message_limit (default 1000), message_await (default 15)

Testing inbox

AgentTestingInboxController — UI untuk test AI agent dengan input bebas. Dipanggil via url_ai_agent (Engine Bot).

Engine WhatsApp integration

MethodEndpointFungsi
getQr()GET api/qrcode?instance=Ambil QR untuk pairing
store()POST api/newBuat instance baru
deviceInfo()GET api/device-info?instance=Cek status koneksi
logout()GET api/logout?instance=Logout device
restartSession()POST api/newRestart sesi
reload()GET reloadReload sesi
createNotif()POST push-notifPush notif ke device
updateDataSource()POST update-chatlistSync chat list

Host produksi tidak konsisten

plaintext
engine.dazo.id        — di OrderController, Downgrade, SubscriptionNotif
engine-wa.dazo.id     — di AgentAiController, DeviceService

Konfirmasi mana yang benar sebelum menulis URL baru.

Engine Bot (AI) integration

MethodEndpointFungsi
AgentTestingInboxControllerurl_ai_agentTest AI agent
DokuCheckoutController::notifyEngineBot(){engine_bot_url}/api/webhook/payment-notificationNotify pembayaran ke Engine Bot

Token: config('services.engine_bot.token') (ENGINE_BOT_TOKEN di .env).

Backend Go integration

MethodEndpointFungsi
OrderController::createOrderPOST {url_api}send_messageKirim pesan WA ke pembeli
OrderController::createOrderPOST {url_api}send_imageKirim gambar
DigitalProductService::sendMessagePOST {url_api}send_messageKirim link produk digital
LiveChatController (via url_api)Escalate chat

Broadcast

ControllerPeran
BroadcastscedularControllerBroadcast terjadwal (scheduler)
BroadcastchatControllerBroadcast manual

DeviceService di-inject di BroadcastscedularController untuk cek status device sebelum kirim.

Template & Response

ModelPeran
TemplateMessageTemplate pesan WhatsApp (approved Meta)
ResponseTemplateQuick reply untuk CS
ChatbotKonfigurasi chatbot rule-based
FlowAlur percakapan (conversation flow)
WellcomeMessagePesan welcome otomatis

Socket.IO

composables/useSocket.js (46 baris):

js
const socket = io(global.url_engine || 'http://localhost:5002', {
    transports: ['websocket'],
    autoConnect: true
});

initSocket() dipanggil di app.js setup() — connect di setiap page load. Dipakai di 11 file.

Langkah berikutnya