diff --git a/app/Http/Controllers/Api/AmiEventController.php b/app/Http/Controllers/Api/AmiEventController.php index 69da686..e002d36 100644 --- a/app/Http/Controllers/Api/AmiEventController.php +++ b/app/Http/Controllers/Api/AmiEventController.php @@ -138,13 +138,19 @@ private function updateMetric($queue, $field, $value) private function saveQueues($queue, $tenant) { - $existingQueues = Queue::where('source_id', $queue)->exists(); + $existingQueue = Queue::where('tenant_id', $tenant->id) + ->where('source_id', $queue) + ->exists(); - if (!$existingQueues) { - Queue::create(['tenant_id' => $tenant->id, 'type' => 'voice', 'source_id' => $queue]); - exit; + if (!$existingQueue) { + Queue::create([ + 'tenant_id' => $tenant->id, + 'type' => 'voice', + 'source_id' => $queue, + 'name' => "Fila $queue", // Nome padrão provisório + 'sector' => null // Começa sem setor + ]); } - } private function broadcastUpdate($queue) { diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 557e174..f1cbef2 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -3,37 +3,34 @@ namespace App\Http\Controllers; use Inertia\Inertia; +use App\Models\User; use App\Models\Queue; +use Illuminate\Support\Facades\Auth; use Carbon\Carbon; class DashboardController extends Controller { public function index() { - /** - * Graças à Trait 'BelongsToTenant' no Model Queue, - * o Laravel aplica automaticamente: WHERE tenant_id = ID_DO_USUARIO_LOGADO - */ + $user = Auth::user(); - $queues = Queue::with([ - // 1. Relacionamento com Métricas Diárias - 'dailyMetrics' => function ($query) { - // Filtra para pegar apenas os dados de HOJE - $query->whereDate('date', Carbon::today()); - }, + // 1. Começa a query base (apenas filas do Tenant do usuário) + $query = Queue::where('tenant_id', $user->tenant_id) + ->with(['dailyMetrics', 'waitingList']); // Carrega relacionamentos - // 2. Relacionamento com Lista de Espera (Ao Vivo) - 'waitingList' => function ($query) { - // Ordena: Quem chegou primeiro aparece no topo da lista interna (se formos exibir detalhes) - $query->orderBy('entered_at', 'asc'); - } - ]) - // Ordena as filas por nome para ficarem sempre na mesma posição no Dashboard - ->orderBy('name', 'asc') - ->get(); + // 2. APLICAR O FILTRO DE SETOR + // Se o usuário tiver algo escrito em 'allowed_sector', filtramos. + // Se for null, ele pula esse if e traz tudo. + if (!empty($user->allowed_sector)) { + $query->where('sector', $user->allowed_sector); + } + // 3. Executa a query + $queues = $query->get(); + + // 4. Entrega para o Vue return Inertia::render('Dashboard', [ - 'queues' => $queues, + 'queues' => $queues ]); } } diff --git a/app/Http/Controllers/QueueController.php b/app/Http/Controllers/QueueController.php index 10327bd..36e0b76 100644 --- a/app/Http/Controllers/QueueController.php +++ b/app/Http/Controllers/QueueController.php @@ -27,4 +27,26 @@ public function setQueueName(Request $request) return back()->with('message', 'Nome da fila atualizado com sucesso!'); } + + public function updateSectors(Request $request) + { + $data = $request->validate([ + 'queues' => 'required|array', + 'queues.*.id' => 'required|exists:queues,id', // Garante que a fila existe + 'queues.*.sector' => 'nullable|string|max:50', // Valida o nome do setor + ]); + + foreach ($data['queues'] as $item) { + // Encontra a fila pelo ID e atualiza apenas a coluna 'sector' + // Sugestão: Se usar multi-tenancy, adicione ->where('tenant_id', ...) aqui + $queue = Queue::find($item['id']); + + if ($queue) { + $queue->sector = $item['sector']; + $queue->save(); + } + } + + return back()->with('message', 'Setores organizados com sucesso!'); + } } diff --git a/app/Models/Queue.php b/app/Models/Queue.php index 6413546..8318438 100644 --- a/app/Models/Queue.php +++ b/app/Models/Queue.php @@ -10,7 +10,7 @@ class Queue extends Model { use HasFactory, BelongsToTenant; - protected $fillable = ['tenant_id', 'name', 'type', 'source_id', 'sla_threshold']; + protected $fillable = ['tenant_id', 'name', 'type', 'source_id', 'sla_threshold', 'sector']; public function tenant() { diff --git a/database/migrations/2025_12_19_132630_add_sector_to_queues_table.php b/database/migrations/2025_12_19_132630_add_sector_to_queues_table.php new file mode 100644 index 0000000..b75c4dc --- /dev/null +++ b/database/migrations/2025_12_19_132630_add_sector_to_queues_table.php @@ -0,0 +1,28 @@ +string('sector')->nullable()->after('name'); // Campo Setor + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('queues', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2025_12_19_133511_add_allowed_sector_to_users_table.php b/database/migrations/2025_12_19_133511_add_allowed_sector_to_users_table.php new file mode 100644 index 0000000..5f6d60e --- /dev/null +++ b/database/migrations/2025_12_19_133511_add_allowed_sector_to_users_table.php @@ -0,0 +1,26 @@ +string('allowed_sector')->nullable()->after('email'); + }); + } + + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('allowed_sector'); + }); + } +}; diff --git a/resources/js/Components/SetQueueSectorForm.vue b/resources/js/Components/SetQueueSectorForm.vue new file mode 100644 index 0000000..c8ab86c --- /dev/null +++ b/resources/js/Components/SetQueueSectorForm.vue @@ -0,0 +1,105 @@ + + + \ No newline at end of file diff --git a/resources/js/Layouts/AuthenticatedLayout.vue b/resources/js/Layouts/AuthenticatedLayout.vue index 57bdb42..fcdefc0 100644 --- a/resources/js/Layouts/AuthenticatedLayout.vue +++ b/resources/js/Layouts/AuthenticatedLayout.vue @@ -5,6 +5,7 @@ import Dropdown from '@/Components/Dropdown.vue'; import DropdownLink from '@/Components/DropdownLink.vue'; import { Link } from '@inertiajs/vue3'; import SetQueueNameForm from '@/Components/SetQueueNameForm.vue'; +import SetQueueSectorForm from '@/Components/SetQueueSectorForm.vue'; const showingSidebar = ref(false); @@ -112,9 +113,13 @@ const menuItems = [ diff --git a/resources/js/Pages/Dashboard.vue b/resources/js/Pages/Dashboard.vue index c6d32b8..08290bd 100644 --- a/resources/js/Pages/Dashboard.vue +++ b/resources/js/Pages/Dashboard.vue @@ -1,15 +1,102 @@