@extends('layouts.app') @section('content')

Barra institucional

@if($institutionLocked)
Configuración institucional bloqueada. Una vez inicia el proceso electoral (primer voto) o se configura por primera vez, no se puede modificar.
@else
@csrf
Preview logo
@endif

Administración Electoral

Configura elección, carga candidatos y gestiona el cierre oficial.

@if(session('status'))
{{ session('status') }}
@endif @if($errors->has('general'))
{{ $errors->first('general') }}
@endif @if($errors->any() && !$errors->has('general'))
{{ $errors->first() }}
@endif

Crear nueva elección

Solo disponible cuando no exista una elección activa. El historial se conserva automáticamente.

@csrf

Historial de elecciones

@forelse($electionsHistory as $historyElection) @empty @endforelse
ID Nombre Estado Inicio Fin
{{ $historyElection->id }} {{ $historyElection->name }} {{ $historyElection->is_active ? 'Activa' : 'Cerrada' }} {{ $historyElection->voting_started_at ?? 'No iniciada' }} {{ $historyElection->ends_at }}
No hay elecciones registradas.

Crear jurados

El administrador crea las cuentas de jurado para acceso al panel de seguimiento.

@csrf

Jurados registrados

    @forelse($juries as $jury)
  • {{ $jury->name }} ({{ $jury->email }})
  • @empty
  • No hay jurados creados.
  • @endforelse

Importar estudiantes por CSV

Carga masiva de estudiantes habilitados para votar.

@csrf
Descargar plantilla CSV

Estructura obligatoria del CSV (encabezados exactos):

  • full_name: nombre completo del estudiante (texto).
  • grade_level: grado numérico entre 1 y 11.
  • login_code: código único de acceso del estudiante (sin repetir).
  • pin: clave de votación del estudiante en texto (el sistema la cifra).
  • login_pin_hash: hash ya calculado del PIN (bcrypt/argon). Puedes usar esta columna en lugar de pin.

Columna opcional:

  • document_number: documento/identificación (opcional).

Ejemplo de CSV:

full_name,grade_level,login_code,pin,login_pin_hash,document_number
Sofia Diaz,5,STU5001,1234,,10203040
Mateo Perez,11,STU1102,,$2y$10$hashEjemploYaCalculado...,99887766

Notas:

  • Guardar el archivo en formato CSV UTF-8.
  • Si un login_code ya existe, el estudiante se actualiza.
  • En cada fila debes enviar pin o login_pin_hash.
  • La importación reinicia estado de voto del estudiante importado (has_voted = false).
@if(!$election)
No hay elección configurada.
@else

Elección: {{ $election->name }}

Estado: {{ $election->is_active ? ($election->voting_started_at ? 'Votación en curso' : 'Preparada (sin iniciar)') : 'Cerrada' }}

Ventana registro candidatos: {{ $election->candidate_upload_starts_at }} a {{ $election->candidate_upload_ends_at }}

Inicio real votación: {{ $election->voting_started_at ?? 'Pendiente (presiona Iniciar votación)' }}

@if($election->is_active)

Registrar candidato

Disponible en el rango de fechas permitido.

@csrf
@endif
Descargar acta PDF @if($election->is_active && !$election->voting_started_at)
@csrf
@endif @if($election->is_active)
@csrf
@endif

Total tarjetones

{{ $totalBallots }}

Habilitados para votar

{{ $eligibleVoters }}

Participación

{{ $turnoutPercent }}%

Certificados emitidos

{{ $receiptsCount }}

@if($revealWinners)
Ganador Personero: {{ $personeroWinner?->full_name ?? 'N/A' }} | Ganador Contralor: {{ $contralorWinner?->full_name ?? 'N/A' }}
@else
El ganador solo se declara cuando la elección esté cerrada oficialmente.
@endif

Resultados Personero

@foreach($personeroResults as $row) @endforeach
CandidatoVotos% sobre tarjetones
#{{ $row->display_number }} - {{ $row->full_name }}{{ $row->votes_count }}{{ $row->percent }}%
Voto en blanco{{ $personeroBlank }}

Resultados Contralor

@foreach($contralorResults as $row) @endforeach
CandidatoVotos% sobre tarjetones
#{{ $row->display_number }} - {{ $row->full_name }}{{ $row->votes_count }}{{ $row->percent }}%
Voto en blanco{{ $contralorBlank }}

Últimos certificados emitidos

@foreach($recentReceipts as $receipt) @endforeach
CódigoHoraValidación
{{ $receipt->receipt_code }} {{ $receipt->voted_at }} Verificar
@endif
@csrf
@endsection