@php $data = is_string($taxes_subdomain->data) ? json_decode($taxes_subdomain->data) : $taxes_subdomain->data; $logo = $data->logo ?? null; $nombre = $taxes_subdomain->nombre_fantasia ?: $taxes_subdomain->subdomain; $labelFase = function ($f) { return [ 'round_robin' => 'Round robin', '32avos' => '32avos', '16avos' => '16avos', 'octavos' => 'Octavos', 'cuartos' => 'Cuartos', 'semifinal' => 'Semifinal', 'final' => 'Final', 'tercer_puesto' => '3er puesto', 'grupos' => 'Grupos', ][$f] ?? $f; }; $labelEstado = function ($e) { return [ 'pendiente_disponibilidad' => 'Pendiente', 'sin_match' => 'Sin match', 'confirmado' => 'Confirmado', 'jugado' => 'Jugado', 'walkover' => 'Walkover', 'suspendido' => 'Suspendido', 'cancelado' => 'Cancelado', ][$e] ?? $e; }; // Iniciales de un nombre para fallback de avatar $iniciales = function ($name) { $t = trim($name ?? ''); if (!$t) return '?'; $parts = preg_split('/\s+/', $t); return strtoupper(mb_substr($parts[0] ?? '', 0, 1) . mb_substr($parts[count($parts)-1] ?? '', 0, 1)); }; // Render del avatar de un participante (single = 1, pareja = 2 overlap) $avatar = function ($part) use ($iniciales) { if (!$part) return ''; $cell = function ($url, $name) use ($iniciales) { if ($url) { return ''.e($name ?? '').''; } return ''.e($iniciales($name)).''; }; if (($part['tipo'] ?? null) === 'pareja') { $urls = $part['foto_urls'] ?? [null, null]; $names = array_map('trim', explode('/', $part['nombre'] ?? '')); return ''.$cell($urls[0] ?? null, $names[0] ?? '').$cell($urls[1] ?? null, $names[1] ?? '').''; } return $cell($part['foto_url'] ?? null, $part['nombre'] ?? ''); }; // Badge W.O.: el lado que no ganó lo lleva oculto (visibility:hidden) pero // ocupando el mismo lugar; si no, esa fila queda más angosta y los // casilleros de games dejan de alinearse con los de la otra fila. // Mismo criterio que el bracket del admin (TenisPartidosController). $badgeWo = function ($p, $lado) { $oculto = $p->ganador_lado !== $lado ? ' wo-badge-ghost' : ''; return ' W.O.'; }; // Sets de un lado en celdas de ancho fijo (misma columna en fila A y B) + // tie-break en superíndice + negrita por set ganado. $setsLado = function ($p, $lado, $sep = ' | ') use ($badgeWo) { $sets = $p->sets ?? collect(); $esWo = $p->estado === 'walkover'; if (count($sets) === 0) { return $esWo ? $badgeWo($p, $lado) : ''; } if ($esWo) { $score = collect($sets)->map(function ($s) use ($lado) { $g = $lado === 'a' ? $s->games_a : $s->games_b; return ''.($g === null ? '' : (int) $g).''; })->implode(''.e($sep).''); return $score.$badgeWo($p, $lado); } return collect($sets)->map(function ($s) use ($lado) { $g = $lado === 'a' ? $s->games_a : $s->games_b; $gOpp = $lado === 'a' ? $s->games_b : $s->games_a; $tb = $lado === 'a' ? $s->tie_break_a : $s->tie_break_b; $tbOpp = $lado === 'a' ? $s->tie_break_b : $s->tie_break_a; $huboTb = $tb !== null && $tbOpp !== null; $gTxt = $g === null ? '' : (string) $g; $base = $huboTb ? $gTxt.''.(int) $tb.'' : $gTxt; $ganoSet = $g !== null && $gOpp !== null && ($g > $gOpp || ($g === $gOpp && $huboTb && $tb > $tbOpp)); return ''.($ganoSet ? ''.$base.'' : $base).''; })->implode(''.e($sep).''); }; // Hay algo que mostrar en la columna de resultado. $tieneScoreVisible = function ($p) { return (($p->sets ?? collect())->count() > 0) || $p->estado === 'walkover'; }; @endphp {{ $torneo->nombre }} · {{ $nombre }} @include('taxes_subdomain.layouts.subdomain.tenis._estilos') @include('taxes_subdomain.layouts.subdomain.tenis._nav', ['navLogo' => $logo, 'navNombre' => $nombre, 'activo' => 'torneos'])
Volver a torneos
@if($torneo->foto_url) {{-- Igual que en el listado: el flyer se ve entero, con la misma imagen desenfocada de fondo para rellenar los costados. --}}
{{ $torneo->nombre }}
@endif

{{ $torneo->nombre }}

@if($torneo->tipo){{ $torneo->tipo->nombre }}@endif @if($torneo->categoria)Cat. {{ $torneo->categoria->nombre }}@endif @if($torneo->genero) {{ ['MASC' => 'Masculino', 'FEME' => 'Femenino', 'MIXT' => 'Mixto'][$torneo->genero] ?? $torneo->genero }} @endif {{ \Carbon\Carbon::parse($torneo->fecha_inicio)->format('d/m/Y') }} → {{ \Carbon\Carbon::parse($torneo->fecha_fin)->format('d/m/Y') }} @if($torneo->sede) {{ $torneo->sede->nombre }} @endif
@if(!empty($ganador))
Campeón
{!! $avatar($ganador) !!} {{ $ganador['nombre'] }}
@endif

Inscriptos ({{ $inscripciones->count() }})

@if($inscripciones->isEmpty())
Aún no hay inscripciones.
@else
@foreach($inscripciones->unique('tenis_jugador_id') as $i) @php $jug = $i->jugador; $foto = $jug ? $jug->foto_url : null; $nombreJ = $jug ? $jug->nombre : '—'; @endphp
@if($foto) {{ $nombreJ }} @else @endif
{{ $nombreJ }} @if($jug && $jug->categoria) {{ $jug->categoria->nombre }} @endif @if($i->pareja)
Pareja: @if($i->pareja->jugador_1_id === $i->tenis_jugador_id && $i->pareja->jugador2) {{ $i->pareja->jugador2->nombre }} @elseif($i->pareja->jugador1) {{ $i->pareja->jugador1->nombre }} @endif
@endif
@endforeach
@endif @if(!empty($tablasGrupos))

Fase de grupos

@foreach($tablasGrupos as $zona => $filas)
Grupo {{ $zona }}
@foreach($filas as $i => $f) @endforeach
Jugador PJ G P Dif
{{ $f['nombre'] }} {{ $f['pj'] }} {{ $f['pg'] }} {{ $f['pp'] }} {{ $f['diff'] > 0 ? '+'.$f['diff'] : $f['diff'] }}
@endforeach
@endif

Fixture y resultados

@if(count($rondas) === 0)
El fixture todavía no se generó.
@elseif($esRoundRobin) {{-- Se recorren TODAS las fases, no `$rondas[0]`. `grupos` va primero en el orden de fases del controller, así que en un torneo americano con fase de grupos el `[0]` mostraba los de grupos y escondía todos los partidos de round robin. --}}
@foreach(collect($rondas)->pluck('partidos')->flatten() as $p)
{{ $labelFase($p->fase) }} · #{{ $p->numero_partido }}
{!! $avatar($p->participante_a) !!} {{ $p->participante_a['nombre'] ?? '—' }} @if($tieneScoreVisible($p)) {!! $setsLado($p, 'a', ' | ') !!} @endif
{!! $avatar($p->participante_b) !!} {{ $p->participante_b['nombre'] ?? '—' }} @if($tieneScoreVisible($p)) {!! $setsLado($p, 'b', ' | ') !!} @endif
@endforeach
@else
@foreach($rondas as $ronda)
{{ $labelFase($ronda['fase']) }}
@foreach($ronda['partidos'] as $p)
#{{ $p->numero_partido }}
{!! $avatar($p->participante_a) !!} {{ $p->participante_a['nombre'] ?? '—' }} @if($tieneScoreVisible($p)) {!! $setsLado($p, 'a', '·') !!} @endif
{!! $avatar($p->participante_b) !!} {{ $p->participante_b['nombre'] ?? '—' }} @if($tieneScoreVisible($p)) {!! $setsLado($p, 'b', '·') !!} @endif
@endforeach
@endforeach
@endif
@include('taxes_subdomain.layouts.subdomain.tenis._publicidad_taxes')