@extends('layouts.app') @section('contenido') @php $faseCalculo = [ 'grupos' => 'grupos', 'dieciseisavos' => 'dieciseisavos', 'octavos' => 'octavos', 'cuartos' => 'cuartos', 'semifinales' => 'semifinales', ]; $textoBotonCalculo = [ 'grupos' => 'Calcular dieciseisavos', 'dieciseisavos' => 'Calcular octavos', 'octavos' => 'Calcular cuartos', 'cuartos' => 'Calcular semifinales', 'semifinales' => 'Calcular final y tercer puesto', ]; /* |-------------------------------------------------------------------------- | Mapa de códigos FIFA / abreviaturas a código de bandera ISO |-------------------------------------------------------------------------- | Si tienes imágenes locales, guárdalas en public/img/flags/ | Ejemplo: | public/img/flags/mex.png | public/img/flags/arg.png | public/img/flags/bra.png */ $codigoIsoBandera = [ 'MEX' => 'mx', 'RSA' => 'za', 'KOR' => 'kr', 'CZE' => 'cz', 'USA' => 'us', 'PAR' => 'py', 'CAN' => 'ca', 'BIH' => 'ba', 'POR' => 'pt', 'SUI' => 'ch', 'ECU' => 'ec', 'GER' => 'de', 'CIV' => 'ci', 'NED' => 'nl', 'BRA' => 'br', 'MAR' => 'ma', 'FRA' => 'fr', 'ARG' => 'ar', 'CRO' => 'hr', 'ENG' => 'gb-eng', 'ESP' => 'es', 'ITA' => 'it', 'BEL' => 'be', 'URU' => 'uy', 'COL' => 'co', 'JPN' => 'jp', 'GHA' => 'gh', 'ALG' => 'dz', 'DZ' => 'dz', 'AUS' => 'au', 'AUT' => 'at', 'DEN' => 'dk', 'NOR' => 'no', 'SWE' => 'se', 'POL' => 'pl', 'SEN' => 'sn', 'EGY' => 'eg', 'TUN' => 'tn', 'IRN' => 'ir', 'IRQ' => 'iq', 'KSA' => 'sa', 'SAU' => 'sa', 'JOR' => 'jo', 'UZB' => 'uz', 'NZL' => 'nz', 'PAN' => 'pa', 'CRC' => 'cr', 'CUR' => 'cw', 'CUW' => 'cw', 'CPV' => 'cv', 'COD' => 'cd', 'DRC' => 'cd', 'QAT' => 'qa', 'UAE' => 'ae', 'CHI' => 'cl', 'CHL' => 'cl', 'PER' => 'pe', 'BOL' => 'bo', 'VEN' => 've', 'UKR' => 'ua', 'TUR' => 'tr', 'GRE' => 'gr', 'ROU' => 'ro', 'SRB' => 'rs', 'CYP' => 'cy', 'HAI' => 'ht', 'JAM' => 'jm', ]; $isoPorNombre = [ 'méxico' => 'mx', 'mexico' => 'mx', 'sudáfrica' => 'za', 'sudafrica' => 'za', 'corea del sur' => 'kr', 'república checa' => 'cz', 'republica checa' => 'cz', 'estados unidos' => 'us', 'paraguay' => 'py', 'canadá' => 'ca', 'canada' => 'ca', 'bosnia y herzegovina' => 'ba', 'portugal' => 'pt', 'suiza' => 'ch', 'ecuador' => 'ec', 'alemania' => 'de', 'costa de marfil' => 'ci', 'países bajos' => 'nl', 'paises bajos' => 'nl', 'brasil' => 'br', 'marruecos' => 'ma', 'francia' => 'fr', 'argentina' => 'ar', 'croacia' => 'hr', 'inglaterra' => 'gb-eng', 'españa' => 'es', 'espana' => 'es', 'italia' => 'it', 'bélgica' => 'be', 'belgica' => 'be', 'uruguay' => 'uy', 'colombia' => 'co', 'japón' => 'jp', 'japon' => 'jp', 'ghana' => 'gh', 'argelia' => 'dz', 'australia' => 'au', 'austria' => 'at', 'dinamarca' => 'dk', 'noruega' => 'no', 'suecia' => 'se', 'polonia' => 'pl', 'senegal' => 'sn', 'egipto' => 'eg', 'túnez' => 'tn', 'tunez' => 'tn', 'irán' => 'ir', 'iran' => 'ir', 'irak' => 'iq', 'arabia saudita' => 'sa', 'jordania' => 'jo', 'uzbekistán' => 'uz', 'uzbekistan' => 'uz', 'nueva zelanda' => 'nz', 'panamá' => 'pa', 'panama' => 'pa', 'costa rica' => 'cr', 'curazao' => 'cw', 'cabo verde' => 'cv', 'rd congo' => 'cd', 'república democrática del congo' => 'cd', 'republica democratica del congo' => 'cd', ]; $normalizarTexto = function ($texto) { $texto = mb_strtolower(trim((string) $texto), 'UTF-8'); $buscar = ['á','é','í','ó','ú','ñ','ü']; $reemplazar = ['a','e','i','o','u','n','u']; return str_replace($buscar, $reemplazar, $texto); }; $codigoEquipo = function ($equipo, $origen = null) { if ($equipo) { return strtoupper($equipo->codigo ?? mb_substr($equipo->nombre ?? 'EQ', 0, 3)); } return strtoupper($origen ?: 'PEND'); }; $nombreEquipo = function ($equipo, $origen = null) { if ($equipo) { return $equipo->nombre ?? $equipo->codigo ?? 'Equipo'; } return $origen ?: 'Pendiente'; }; $banderaEquipo = function ($equipo) use ($codigoIsoBandera, $isoPorNombre, $normalizarTexto) { if (!$equipo) { return null; } $bandera = $equipo->bandera ?? null; $codigo = strtoupper(trim((string) ($equipo->codigo ?? ''))); $nombre = trim((string) ($equipo->nombre ?? '')); /* |-------------------------------------------------------------------------- | 1. Si el modelo ya trae URL o ruta en bandera |-------------------------------------------------------------------------- */ if ($bandera) { if (str_starts_with($bandera, 'http')) { return $bandera; } $posiblesRutas = [ $bandera, 'storage/' . $bandera, 'img/flags/' . $bandera, 'img/banderas/' . $bandera, ]; foreach ($posiblesRutas as $ruta) { if (file_exists(public_path($ruta))) { return asset($ruta); } } } /* |-------------------------------------------------------------------------- | 2. Buscar bandera local por código FIFA |-------------------------------------------------------------------------- */ $candidatos = []; if ($codigo) { $candidatos[] = strtolower($codigo); $candidatos[] = strtoupper($codigo); if (isset($codigoIsoBandera[$codigo])) { $candidatos[] = $codigoIsoBandera[$codigo]; } } /* |-------------------------------------------------------------------------- | 3. Buscar bandera local por nombre normalizado |-------------------------------------------------------------------------- */ if ($nombre) { $nombreNormalizado = $normalizarTexto($nombre); if (isset($isoPorNombre[$nombreNormalizado])) { $candidatos[] = $isoPorNombre[$nombreNormalizado]; } } $extensiones = ['png', 'jpg', 'jpeg', 'webp', 'svg']; foreach (array_unique($candidatos) as $base) { foreach ($extensiones as $ext) { $rutas = [ "img/flags/{$base}.{$ext}", "img/banderas/{$base}.{$ext}", "flags/{$base}.{$ext}", "banderas/{$base}.{$ext}", ]; foreach ($rutas as $ruta) { if (file_exists(public_path($ruta))) { return asset($ruta); } } } } /* |-------------------------------------------------------------------------- | 4. Si no hay imagen local, usar bandera online |-------------------------------------------------------------------------- */ $iso = null; if ($codigo && isset($codigoIsoBandera[$codigo])) { $iso = $codigoIsoBandera[$codigo]; } if (!$iso && $nombre) { $nombreNormalizado = $normalizarTexto($nombre); $iso = $isoPorNombre[$nombreNormalizado] ?? null; } if ($iso) { return "https://flagcdn.com/w80/{$iso}.png"; } return null; }; $renderBandera = function ($equipo, $origen = null) use ($banderaEquipo, $codigoEquipo) { $src = $banderaEquipo($equipo); $codigo = $codigoEquipo($equipo, $origen); if ($src) { return ' ' . e($codigo) . ' ' . e($codigo) . ' '; } return '' . e($codigo) . ''; }; @endphp

Mis pronósticos Mundial 2026

Importante: cada fase se guarda de forma independiente. Primero guarda los marcadores, luego calcula la siguiente fase. En semifinales, los ganadores pasan a la final y los perdedores al tercer puesto.
@if(session('success'))
{{ session('success') }}
@endif @if($errors->any())
{{ $errors->first() }}
@endif @if($estado->pronostico_final_enviado)
Tu pronóstico final ya fue enviado. No puedes modificarlo.
@endif
Imprimir
@csrf
Ver ranking
@foreach($fases as $index => $fase) @endforeach
@foreach($fases as $index => $fase)

{{ $fase->nombre }}

@if($fase->pronostico_abierto) Fase abierta @else Fase cerrada @endif @if($fase->codigo !== 'grupos') Equipos calculados por usuario @endif
@csrf
@foreach($fase->partidos as $partido) @php $pronostico = $pronosticos[$partido->id] ?? null; $local = $partido->numero <= 72 ? $partido->local : $pronostico?->local; $visitante = $partido->numero <= 72 ? $partido->visitante : $pronostico?->visitante; $tieneEquipos = $local && $visitante; $bloqueado = !$fase->pronostico_abierto || !$partido->pronostico_abierto || ($pronostico?->bloqueado ?? false) || $estado->pronostico_final_enviado || !$tieneEquipos; $esLlave = $partido->numero >= 73; @endphp
M{{ $partido->numero }} {{ $pronostico?->puntaje_obtenido ?? 0 }} pts
{!! $renderBandera($local, $partido->origen_local) !!} {{ $nombreEquipo($local, $partido->origen_local) }}
{!! $renderBandera($visitante, $partido->origen_visitante) !!} {{ $nombreEquipo($visitante, $partido->origen_visitante) }}
@if($fase->codigo === 'grupos') @else Si colocas empate, selecciona quién pasa. @endif @if(!$tieneEquipos && $partido->numero >= 73)
Primero calcula la fase anterior para cargar estos equipos.
@endif
@endforeach
@if(isset($faseCalculo[$fase->codigo])) @endif
@endforeach

Tablas generadas con tus marcadores

@foreach($tabla as $grupo => $filas)
Grupo {{ $grupo }}
@foreach($filas as $f) @php $eq = $f['equipo'] ?? null; @endphp @endforeach
Pos. Equipo PTS DG GF
{{ $f['posicion'] ?? '-' }}
{!! $renderBandera($eq) !!} {{ $eq->nombre ?? 'Pendiente' }}
{{ $f['pts'] ?? 0 }} {{ $f['dg'] ?? 0 }} {{ $f['gf'] ?? 0 }}
@endforeach
@if(count($mejoresTerceros))

Mejores terceros

@foreach($mejoresTerceros as $grupo => $fila) @php $eq = $fila['equipo'] ?? null; @endphp @endforeach
Orden Grupo Equipo PTS DG GF Estado
{{ $loop->iteration }} {{ $fila['grupo'] ?? $grupo }}
{!! $renderBandera($eq) !!} {{ $eq->nombre ?? 'Pendiente' }}
{{ $fila['pts'] ?? 0 }} {{ $fila['dg'] ?? 0 }} {{ $fila['gf'] ?? 0 }} @if($loop->iteration <= 8) Clasifica @else No clasifica @endif
@endif
@endsection