mirror of https://github.com/Lukibeg/OmniBoard.git
Compare commits
No commits in common. "fbac60b9f3095a792851e927d6e974ec7b1640ff" and "523f5080d3d8034ba4502f0af1ff917dc6224368" have entirely different histories.
fbac60b9f3
...
523f5080d3
|
|
@ -44,8 +44,8 @@ public function handle(Request $request)
|
||||||
|
|
||||||
// Recupera Fila
|
// Recupera Fila
|
||||||
$queue = Queue::where('tenant_id', $tenant->id)
|
$queue = Queue::where('tenant_id', $tenant->id)
|
||||||
->where('source_id', $queueNumber)
|
->where('source_id', $queueNumber)
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
if (!$queue) {
|
if (!$queue) {
|
||||||
return response()->json(['error' => 'Fila não encontrada'], 404);
|
return response()->json(['error' => 'Fila não encontrada'], 404);
|
||||||
|
|
@ -98,42 +98,49 @@ public function handle(Request $request)
|
||||||
|
|
||||||
private function handleMemberStatus($agent, $data, $tenantId)
|
private function handleMemberStatus($agent, $data, $tenantId)
|
||||||
{
|
{
|
||||||
$isPaused = ($data['Paused'] ?? '0') == '1';
|
// 1. A PAUSA TEM PRIORIDADE ABSOLUTA
|
||||||
$asteriskStatus = $data['Status'] ?? null;
|
// Se o Asterisk diz que Paused é '1', o agente está pausado,
|
||||||
|
// não importa se o telefone está no gancho ou fora do gancho.
|
||||||
|
if (($data['Paused'] ?? '0') == '1') {
|
||||||
|
$agent->status = 'paused';
|
||||||
|
|
||||||
$targetStatus = 'offline';
|
// Só atualizamos o motivo se o evento trouxer um motivo novo.
|
||||||
$targetReason = null;
|
// O QueueMemberStatus as vezes não traz o motivo, então evitamos apagar o existente.
|
||||||
|
if (!empty($data['PausedReason'])) {
|
||||||
|
$agent->pause_reason = $data['PausedReason'];
|
||||||
|
} elseif (!$agent->pause_reason) {
|
||||||
|
$agent->pause_reason = 'Pausa'; // Fallback se estiver nulo
|
||||||
|
}
|
||||||
|
|
||||||
if ($isPaused) {
|
|
||||||
$targetStatus = 'paused';
|
|
||||||
$targetReason = !empty($data['PausedReason']) ? $data['PausedReason'] : ($agent->pause_reason ?? 'Pausa');
|
|
||||||
} else {
|
} else {
|
||||||
$targetReason = null;
|
// 2. SE NÃO ESTÁ PAUSADO, OLHAMOS O STATUS DO DISPOSITIVO
|
||||||
|
$agent->pause_reason = null;
|
||||||
|
|
||||||
|
$asteriskStatus = $data['Status'] ?? null;
|
||||||
|
|
||||||
switch ($asteriskStatus) {
|
switch ($asteriskStatus) {
|
||||||
case '1':
|
case '1': // AST_DEVICE_NOT_INUSE (Livre)
|
||||||
$targetStatus = 'available';
|
$agent->status = 'available';
|
||||||
break;
|
break;
|
||||||
case '2':
|
|
||||||
case '3':
|
case '2': // AST_DEVICE_INUSE (Em uso / Falando)
|
||||||
case '6':
|
case '3': // AST_DEVICE_BUSY (Ocupado)
|
||||||
$targetStatus = 'talking';
|
case '6': // AST_DEVICE_RINGING (Tocando)
|
||||||
|
// Aqui mantemos 'talking' para ficar azul no dashboard
|
||||||
|
$agent->status = 'talking';
|
||||||
break;
|
break;
|
||||||
case '5':
|
|
||||||
$targetStatus = 'offline';
|
case '5': // AST_DEVICE_UNAVAILABLE (Offline / Cabo desconectado / Softphone fechado)
|
||||||
|
$agent->status = 'offline';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
$targetStatus = 'offline';
|
// Se vier status desconhecido (4, 0, etc), mantemos o atual ou definimos offline
|
||||||
|
// $agent->status = 'offline';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TRAVA DE IDEMPOTÊNCIA (Igual ao handlePause)
|
|
||||||
if ($agent->status === $targetStatus && $agent->pause_reason === $targetReason) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$agent->status = $targetStatus;
|
|
||||||
$agent->pause_reason = $targetReason;
|
|
||||||
$agent->last_status_change = now();
|
$agent->last_status_change = now();
|
||||||
$agent->save();
|
$agent->save();
|
||||||
|
|
||||||
|
|
@ -189,25 +196,13 @@ private function handleComplete($queue, $data)
|
||||||
|
|
||||||
private function handlePause($agent, $data, $tenantId)
|
private function handlePause($agent, $data, $tenantId)
|
||||||
{
|
{
|
||||||
|
// Esse evento ocorre quando a ação de pausa é disparada
|
||||||
$isPaused = isset($data['Paused']) && $data['Paused'] == '1';
|
$isPaused = isset($data['Paused']) && $data['Paused'] == '1';
|
||||||
$targetStatus = $isPaused ? 'paused' : 'available'; // Se despausar, assume livre
|
|
||||||
|
|
||||||
$targetReason = null;
|
$agent->status = $isPaused ? 'paused' : 'available';
|
||||||
if ($isPaused) {
|
$agent->pause_reason = $isPaused ? ($data['Reason'] ?? 'Pausa') : null;
|
||||||
$targetReason = $data['Reason'] ?? $data['PausedReason'] ?? 'Pausa';
|
|
||||||
if (trim($targetReason) === '') $targetReason = 'Pausa';
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- TRAVA DE IDEMPOTÊNCIA ---
|
|
||||||
// Se o agente está em 10 filas, esse evento dispara 10 vezes.
|
|
||||||
// Se o status já for igual, IGNORA para não spamar o WebSocket.
|
|
||||||
if ($agent->status === $targetStatus && $agent->pause_reason === $targetReason) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$agent->status = $targetStatus;
|
|
||||||
$agent->pause_reason = $targetReason;
|
|
||||||
$agent->last_status_change = now();
|
$agent->last_status_change = now();
|
||||||
|
|
||||||
$agent->save();
|
$agent->save();
|
||||||
|
|
||||||
broadcast(new DashboardUpdate($tenantId));
|
broadcast(new DashboardUpdate($tenantId));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue