D
Modul

Rotator Agen

Konfigurasi distribusi CS saat chat masuk. Mode percentage atau same (rata). Disimpan di Setting.globalAssignation.

Modul Rotator Agen mengonfigurasi bagaimana chat masuk didistribusikan ke CS. Disimpan di Setting.globalAssignation dan dipakai oleh LiveChatController::getRotator().

File kunci

FileBarisPeran
app/Http/Controllers/SettingController.php:1766-1818Render & update rotator
app/Http/Controllers/LiveChatController.php:1076-1145getRotator() — logic distribusi saat chat masuk

Model

Setting.globalAssignation (embed document):

json
{
  "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

MethodFungsi
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

MethodPathFungsi
GET/setting/cs-rotatorHalaman rotator
POST/setting/update-rotatorUpdate
POST/api/livechat/get-rotatorDipanggil engine WA saat chat masuk

Frontend

FileBaris
Setting/CsRotator.vue268

Temuan

  • getRotator():1079 query tanpa scope store_idSetting::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