mirror of https://github.com/Lukibeg/OmniBoard.git
141 lines
4.1 KiB
PHP
141 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Tenant;
|
|
use App\Models\Queue;
|
|
use App\Models\WaitingList;
|
|
use App\Models\DailyMetric;
|
|
use Carbon\Carbon;
|
|
use App\Events\DashboardUpdate;
|
|
|
|
class AmiEventController extends Controller
|
|
{
|
|
public function handle(Request $request)
|
|
{
|
|
$token = $request->header('X-Tenant-Token');
|
|
$tenant = Tenant::where('api_key', $token)->first();
|
|
|
|
if (!$tenant) {
|
|
return response()->json(['error' => 'Unauthorized'], 401);
|
|
}
|
|
|
|
$data = $request->all();
|
|
$eventName = $data['Event'] ?? null;
|
|
$queueName = $data['Queue'] ?? null;
|
|
|
|
if (!$eventName || !$queueName) {
|
|
return response()->json(['status' => 'ignored']);
|
|
}
|
|
|
|
$queue = Queue::where('tenant_id', $tenant->id)
|
|
->where('source_id', $queueName) // Procura "08000" na coluna source_id
|
|
->first();;
|
|
|
|
if (!$queue) {
|
|
return response()->json(['error' => 'Fila não encontrada'], 404);
|
|
}
|
|
|
|
switch ($eventName) {
|
|
case 'QueueCallerJoin':
|
|
$this->handleJoin($queue, $data);
|
|
break;
|
|
case 'AgentConnect':
|
|
$this->handleConnect($queue, $data);
|
|
break;
|
|
case 'AgentComplete': // Ou QueueCallerLeave com TalkTime
|
|
$this->handleComplete($queue, $data);
|
|
break;
|
|
case 'QueueCallerAbandon':
|
|
$this->handleAbandon($queue, $data);
|
|
break;
|
|
}
|
|
|
|
return response()->json(['status' => 'success']);
|
|
}
|
|
|
|
|
|
private function handleJoin($queue, $data)
|
|
{
|
|
WaitingList::create([
|
|
'tenant_id' => $queue->tenant_id, // <--- ADICIONE ESTA LINHA
|
|
'queue_id' => $queue->id,
|
|
'caller_number' => $data['CallerIDNum'],
|
|
'caller_name' => $data['CallerIDName'] ?? 'Desconhecido',
|
|
'entered_at' => now(),
|
|
]);
|
|
|
|
$this->updateMetric($queue, 'received_count', 1);
|
|
$this->broadcastUpdate($queue);
|
|
}
|
|
|
|
private function handleConnect($queue, $data)
|
|
{
|
|
WaitingList::where('queue_id', $queue->id)
|
|
->where('caller_number', $data['CallerIDNum'])
|
|
->delete();
|
|
|
|
$metric = $this->getTodayMetric($queue);
|
|
$holdTime = intval($data['HoldTime'] ?? 0);
|
|
|
|
$newAvg = (($metric->avg_wait_time * $metric->answered_count) + $holdTime) / ($metric->answered_count + 1);
|
|
|
|
$metric->avg_wait_time = $newAvg;
|
|
$metric->answered_count += 1;
|
|
$metric->save();
|
|
$this->broadcastUpdate($queue);
|
|
}
|
|
|
|
private function handleComplete($queue, $data)
|
|
{
|
|
$talkTime = intval($data['TalkTime'] ?? 0);
|
|
$metric = $this->getTodayMetric($queue);
|
|
|
|
if ($metric->answered_count > 0) {
|
|
$newAvg = (($metric->avg_talk_time * ($metric->answered_count - 1)) + $talkTime) / $metric->answered_count;
|
|
$metric->avg_talk_time = $newAvg;
|
|
$metric->save();
|
|
}
|
|
$this->broadcastUpdate($queue);
|
|
}
|
|
|
|
private function handleAbandon($queue, $data)
|
|
{
|
|
WaitingList::where('queue_id', $queue->id)
|
|
->where('caller_number', $data['CallerIDNum'])
|
|
->delete();
|
|
|
|
$this->updateMetric($queue, 'abandoned_count', 1);
|
|
$this->broadcastUpdate($queue);
|
|
}
|
|
|
|
private function getTodayMetric($queue)
|
|
{
|
|
return DailyMetric::firstOrCreate(
|
|
[
|
|
'queue_id' => $queue->id,
|
|
'date' => Carbon::today()
|
|
],
|
|
[
|
|
'tenant_id' => $queue->tenant_id,
|
|
'received_count' => 0,
|
|
'answered_count' => 0,
|
|
'abandoned_count' => 0
|
|
]
|
|
);
|
|
}
|
|
|
|
private function updateMetric($queue, $field, $value)
|
|
{
|
|
$metric = $this->getTodayMetric($queue);
|
|
$metric->increment($field, $value);
|
|
}
|
|
private function broadcastUpdate($queue)
|
|
{
|
|
// Dispara o evento apenas para o Tenant dono da fila
|
|
broadcast(new DashboardUpdate($queue->tenant_id));
|
|
}
|
|
}
|