D
Modul

Pengaturan (Team)

Role/permission system, user management per store, team chat internal, CS rotasi. UserStore sebagai pivot multi-tenant.

Modul team mengelola anggota tim per store: role (Owner/Admin/CS/Gudang), permission, team chat internal, dan rotasi CS.

File kunci

FileBarisPeran
app/Http/Controllers/TeamController.php830CRUD team member, role hierarchy, redistribusi rotator
app/Http/Controllers/TeamchatController.php418Internal team chat (DM antar member)
app/Models/UserStore.php46Pivot user↔store
app/Models/TeamchatInbox.php30Pesan internal team
app/Models/HandleGudang.php24Antrian handle gudang
app/Models/VendorUser.php35User koneksi covendor (Sanctum)

Role hierarchy

RoleAkses
OwnerFull access, tidak bisa dihapus
AdminManage CS di bawahnya, tidak bisa hapus Admin paralel
Customer ServiceChat handling, assign ke Admin
GudangHandle gudang untuk chat

UserStore field: store_id, user_id, is_owner (bool), role, admin_id (referensi CS→Admin), permission (array), default_device, status_feature (enabled/disabled).

Controller method utama

TeamController

MethodFungsi
storeCreate User + UserStore. Bila role=Gudang: tambahkan ke ChatList.id_gudang & HandleGudang.gudang_id
updateEdit user + role. Bila CS → set admin_id
destroyBulk delete + validasi hierarchy + redistribusi rotator + re-enable/disable per kuota paket
getAdminOptionListList admin untuk dropdown
teamFeatureAccessHitung kuota member dari findAccessFeature(features, 'team_member')

TeamchatController

MethodFungsi
listList member store (kecuali diri) + TeamchatInbox terakhir per pair
getUnreadsCount pesan belum dibaca
addSimpan pesan + POST ke {url_engine}/update-teamchat
listInboxLoad pesan per pair + mark read
indexRender Teamchat/Index
storeCreate akun chat eksternal via http://localhost/chat/api_request

Route

Web (routes/web.php:239)

Prefix /team:

MethodPathFungsi
GET/teamIndex
GET/team/createForm create
POST/team/storeCreate
GET/team/edit/{id}Edit
POST/team/update/{id}Update
POST/team/destroyDelete

Prefix /teamchat:

MethodPathFungsi
GET/teamchatIndex

API (routes/api.php:333)

MethodPathFungsi
POST/team/listList member
GET/team/list_paginatePaginate
GET/teamchat/listList chat
POST/teamchat/addKirim pesan
GET/teamchat/list-inboxInbox per pair
POST/teamchat/mark_readMark read

Integrasi

ServiceEndpointUntuk
Engine WA (url_engine)POST /update-teamchatPush event realtime chat ke socket WA
External chat servicehttp://localhost/chat/api_requestCreate akun chat eksternal (key 21aOfjTBLDhFx6AoMqH hardcoded)
Cron DowngradehandleDowngradeTeamMemberDisable team member berlebih saat paket turun

Temuan

  • destroy bug (:508) — Store::where('user_id', $user->id) hanya jalan untuk Owner. Bisa return null untuk Admin/CS → fatal
  • destroy set email null via raw DB::table('users') (:671-673) — bypass model, bisa bentrok dengan soft delete
  • store assign permission tanpa validasi struktur (:319) — bisa inject permission tanpa batas
  • TeamchatController::store kredensial hardcoded (:18-19) — password time(), username time(). Lemah
  • mark_read route duplikat (api.php:663-664) — POST /mark_read terdaftar 2x
  • UserRole & UserAspire MySQL kosong — warisan, tidak terpakai
  • HandleGudang tanpa SoftDeletes — beda dengan model sejenis