Modul Rotator Agen mengonfigurasi bagaimana chat masuk didistribusikan ke CS. Disimpan di Setting.globalAssignation dan dipakai oleh LiveChatController::getRotator().
File kunci
File Baris Peran app/Http/Controllers/SettingController.php:1766-1818— Render & update rotator app/Http/Controllers/LiveChatController.php:1076-1145— getRotator() — logic distribusi saat chat masuk
Model
Setting.globalAssignation (embed document):
json Copy {
" role " : " Customer Service " ,
" team " : [ " <user_store_id> " , ... ],
" distribution " : [{ " name " : " ... " , " id " : " <user_store_id> " , " total " : <persen_target> }],
" type_distribution " : " same " | " percentage "
}
Juga ditulis ke Product.rotatorData & Product.global_cs_rotator_status saat update_rotator.
Controller method utama
Method Fungsi cs_rotator()Render Setting/CsRotator update_rotator()Update Setting.globalAssignation + sync ke semua produk LiveChatController::getRotator()Logic distribusi saat chat masuk
Logic getRotator
percentage mode : hitung countTeamOrder / countAllOrder * 100 per CS, pilih yang <= targetPercentage dan terendah
same mode : rulePercentage = 100 / count(team), pilih yang <= rulePercentage
Fallback : bila tidak ada yang memenuhi, pilih random
Route
Method Path Fungsi GET /setting/cs-rotatorHalaman rotator POST /setting/update-rotatorUpdate POST /api/livechat/get-rotatorDipanggil engine WA saat chat masuk
Frontend
File Baris Setting/CsRotator.vue268
Temuan
getRotator():1079 query tanpa scope store_id — Setting::get()->first() ambil setting toko mana pun. Bug serius — kebocoran config rotator antar merchant
same mode bug — loop tanpa break, selalu ambil team terakhir yang qualified
percentage mode salah bandingkan satuan — bandingkan totalPercentage (float) dengan countTeamOrder (integer count)
update_rotator() mass-assign tanpa validasi + sync heavy write ke semua produk