@extends('layouts.app-layout') @section('title', 'Panel de Funcionario - ' . config('app.name')) @section('content') @php use App\Enums\FuncionarioRolEnum; $user = auth()->user(); $funcionario = $user->funcionario; $acciones = $acciones ?? collect(); $totalAcciones = $totalAcciones ?? $acciones->count(); $margenDiasAccionesProximas = $margenDiasAccionesProximas ?? 7; $limiteAccionesDashboard = $limiteAccionesDashboard ?? 4; $usandoFallbackAccionesProximas = $usandoFallbackAccionesProximas ?? false; $unidadesRecientes = $unidadesRecientes ?? collect(); $reuniones = $reuniones ?? collect(); $totalReuniones = $totalReuniones ?? $reuniones->count(); $limiteReunionesDashboard = $limiteReunionesDashboard ?? 4; $esAsesorExterno = ($funcionario?->rol?->value ?? $funcionario?->rol) === FuncionarioRolEnum::ASESOR_EXTERNO->value; @endphp

Panel de Funcionario

Hola, {{ $user->nombre }} {{ $user->apellido }}

{{ $esAsesorExterno ? 'Gestiona reuniones y tareas asignadas de forma rápida.' : 'Gestiona reuniones, contactos y tareas internas de forma rápida.' }}

@if($funcionario?->rol) {{ $funcionario->rol->label() }} @endif
@php $cards = [ [ 'section' => 'Base', 'title' => 'Unidades de atención', 'desc' => $esAsesorExterno ? 'Accede a las unidades vinculadas a tus acciones activas.' : 'Accede al listado completo de unidades registradas.', 'icon' => 'bi-buildings', 'tone' => ['tone_class' => 'tone-blue'], 'actions' => $esAsesorExterno ? [ ['label' => 'Ver unidades', 'url' => route('unidades-atencion.index'), 'solid' => true], ] : [ ['label' => 'Ver unidades', 'url' => route('unidades-atencion.index'), 'solid' => true], ['label' => 'Crear', 'url' => route('registro.contacto.iniciar'), 'solid' => false], ], ], ]; if (!$esAsesorExterno) { $cards[] = [ 'section' => 'Seguimiento', 'title' => 'Evaluaciones', 'desc' => 'Revisa evaluaciones y preguntas clave.', 'icon' => 'bi-bar-chart', 'tone' => ['tone_class' => 'tone-contact-rose'], 'actions' => [ ['label' => 'Evaluaciones', 'url' => route('funcionario.evaluaciones.index'), 'solid' => true], ['label' => 'Resultados', 'url' => route('funcionario.resultados.index'), 'solid' => false], ], ]; } $cards[] = $esAsesorExterno ? [ 'section' => 'Seguimiento', 'title' => 'Acciones', 'desc' => 'Revisa las acciones donde sos responsable.', 'icon' => 'bi-list-check', 'tone' => ['tone_class' => 'tone-contact-peach'], 'actions' => [ ['label' => 'Ver acciones', 'url' => route('acciones.index'), 'solid' => true], ], ] : [ 'section' => 'Seguimiento', 'title' => 'Planes de acción', 'desc' => 'Gestiona planes, acciones y responsables asignados.', 'icon' => 'bi-list-check', 'tone' => ['tone_class' => 'tone-contact-peach'], 'actions' => [ ['label' => 'Planes', 'url' => route('planes.index'), 'solid' => true], ['label' => 'Acciones', 'url' => route('acciones.index'), 'solid' => false], ], ]; $cards[] = [ 'section' => 'Agenda', 'title' => 'Reuniones', 'desc' => 'Coordina reuniones y asigna responsables.', 'icon' => 'bi-clipboard2-check', 'tone' => ['tone_class' => 'tone-contact-coral'], 'actions' => [ ['label' => 'Ver reuniones', 'url' => route('reuniones.index'), 'solid' => true], ['label' => 'Crear', 'url' => route('reuniones.create'), 'solid' => false], ], ]; if (!$esAsesorExterno) { $cards[] = [ 'section' => 'Gestión', 'title' => 'Postulaciones', 'desc' => 'Administra y revisa postulaciones a programas.', 'icon' => 'bi-file-earmark-text', 'tone' => ['tone_class' => 'tone-contact-teal'], 'actions' => [ ['label' => 'Ver postulaciones', 'url' => route('postulaciones.index'), 'solid' => true], ['label' => 'Administrar', 'url' => route('programas.index'), 'solid' => false], ], ]; $cards[] = [ 'section' => 'Catálogo', 'title' => 'Programas', 'desc' => 'Gestiona los programas disponibles y su información.', 'icon' => 'bi-journal-text', 'tone' => ['tone_class' => 'tone-contact-sky'], 'actions' => [ ['label' => 'Ver programas', 'url' => route('programas.index'), 'solid' => true], ['label' => 'Crear', 'url' => route('programas.create'), 'solid' => false], ], ]; $cards[] = [ 'section' => 'Gestión', 'title' => 'Contactos', 'desc' => 'Administra los contactos y sus datos clave.', 'icon' => 'bi-people', 'tone' => ['tone_class' => 'tone-contact-indigo'], 'actions' => [ ['label' => 'Ver contactos', 'url' => route('contactos.index'), 'solid' => true], ], ]; } if ($funcionario?->rol === FuncionarioRolEnum::ADMIN) { $cards[] = [ 'section' => 'Administración', 'title' => 'Funcionarios', 'desc' => 'Administra funcionarios, roles y estados de acceso.', 'icon' => 'bi-gear', 'tone' => ['tone_class' => 'tone-slate-dark'], 'actions' => [ ['label' => 'Ver funcionarios', 'url' => route('funcionarios.index'), 'solid' => true], ['label' => 'Crear', 'url' => route('funcionarios.create'), 'solid' => false], ], ]; } @endphp
@foreach($cards as $card) @php $tone = $card['tone']; $toneClass = $tone['tone_class'] ?? 'tone-blue'; @endphp

{{ $card['section'] }}

{{ $card['title'] }}

{{ $card['desc'] }}

@foreach($card['actions'] as $action) @if($action['solid']) {{ $action['label'] }} @else {{ $action['label'] }} @endif @endforeach
@endforeach

Próximas acciones

Mostramos pendientes y en proceso que vencen en los próximos {{ $margenDiasAccionesProximas }} días; si no hay, verás las más próximas.

Reuniones asignadas @if(Route::has('reuniones.index')) (VER TODAS) @endif

{{ $totalReuniones }} próximas @if($totalReuniones > $reuniones->count()) • mostrando {{ $reuniones->count() }} @endif

@if($reuniones->isEmpty())
No tienes reuniones próximas asignadas.
@else
@foreach($reuniones as $reunion) @php $contacto = $reunion->contacto; $fechaReunion = \Carbon\Carbon::parse($reunion->fecha_reunion); $horaInicio = \Carbon\Carbon::parse($reunion->hora_inicio); $fechaFormato = $fechaReunion->format('d/m'); $horaFormato = $horaInicio->format('H:i'); $estadoClass = match($reunion->estado) { 'Agendada' => 'bg-info-subtle text-info-emphasis', 'Reprogramada' => 'bg-warning-subtle text-warning-emphasis', default => 'bg-light text-dark border' }; @endphp
@if(Route::has('reuniones.show')) @endif
{{ $contacto->user->nombre }} {{ $contacto->user->apellido }} {{ $reunion->estado }} {{ $fechaFormato }} • {{ $horaFormato }}
{{ $reunion->tipo_reunion }} • {{ $reunion->modalidad }}
@endforeach
@endif

Tareas @if(Route::has('acciones.index')) (ACCIONES) @else (ACCIONES) @endif

{{ $totalAcciones }} por vencer @if($totalAcciones > $acciones->count()) • mostrando {{ $acciones->count() }} @endif

@if($acciones->isEmpty())
No tienes acciones por vencer próximamente asignadas.
@else
@foreach($acciones as $accion) @php $plan = $accion->planes->first(); $unidad = $plan?->unidadAtencion; $fecha = $accion->fecha_vencimiento?->format('d/m'); $estadoLabel = $accion->estado->label() ?? ucfirst($accion->estado); $estadoClass = 'bg-light text-dark border'; @endphp
@if(Route::has('acciones.show')) @endif
{{ $accion->detalle_accion }} {{ $estadoLabel }} @if($fecha) {{ $fecha }} @endif
@if($plan) {{ $plan->titulo }} @endif @if($unidad)
{{ $unidad->nombre_comercial }} @endif
@endforeach
@endif
@endsection