findOrFail($idTorneo); $stats = []; foreach ($torneo->equipos as $equipo) { $groupName = $equipo->pivot->grupo ?: ($equipo->categoria . ' ' . $equipo->division); $stats[$groupName][$equipo->id_equipo] = [ 'id' => $equipo->id_equipo, 'nombre' => $equipo->club->nombre ?? 'Equipo', 'logo' => $equipo->club->imagen ?? null, 'categoria' => $equipo->categoria, 'pj' => 0, 'pg' => 0, 'pp' => 0, 'tf' => 0, 'tc' => 0, 'pts' => 0, ]; } $query = Evento::where('id_torneo', $idTorneo) ->whereNotNull('marcador_local') ->whereNotNull('marcador_visitante'); if ($onlyRegular) { $query->where('fase', Evento::FASE_REGULAR); } $matches = $query->get(); foreach ($matches as $m) { $localGroup = null; $visitGroup = null; foreach ($stats as $group => $teams) { if (isset($teams[$m->id_equipo_local])) $localGroup = $group; if (isset($teams[$m->id_equipo_visitante])) $visitGroup = $group; } if (!$localGroup || !$visitGroup) continue; $stats[$localGroup][$m->id_equipo_local]['pj']++; $stats[$localGroup][$m->id_equipo_local]['tf'] += $m->marcador_local; $stats[$localGroup][$m->id_equipo_local]['tc'] += $m->marcador_visitante; $stats[$visitGroup][$m->id_equipo_visitante]['pj']++; $stats[$visitGroup][$m->id_equipo_visitante]['tf'] += $m->marcador_visitante; $stats[$visitGroup][$m->id_equipo_visitante]['tc'] += $m->marcador_local; if ($m->marcador_local > $m->marcador_visitante) { $stats[$localGroup][$m->id_equipo_local]['pg']++; $stats[$localGroup][$m->id_equipo_local]['pts'] += 2; $stats[$visitGroup][$m->id_equipo_visitante]['pp']++; $stats[$visitGroup][$m->id_equipo_visitante]['pts'] += 1; } elseif ($m->marcador_visitante > $m->marcador_local) { $stats[$visitGroup][$m->id_equipo_visitante]['pg']++; $stats[$visitGroup][$m->id_equipo_visitante]['pts'] += 2; $stats[$localGroup][$m->id_equipo_local]['pp']++; $stats[$localGroup][$m->id_equipo_local]['pts'] += 1; } else { $stats[$localGroup][$m->id_equipo_local]['pts'] += 1; $stats[$visitGroup][$m->id_equipo_visitante]['pts'] += 1; } } foreach ($stats as $group => &$teams) { usort($teams, function($a, $b) { if ($b['pts'] !== $a['pts']) return $b['pts'] - $a['pts']; $diffA = $a['tf'] - $a['tc']; $diffB = $b['tf'] - $b['tc']; if ($diffB !== $diffA) return $diffB - $diffA; return $b['tf'] - $a['tf']; }); } return $stats; } public function getPlayoffBrackets(int $idTorneo): array { $playoffs = Evento::where('id_torneo', $idTorneo) ->where('fase', '>', Evento::FASE_REGULAR) ->with(['equipoLocal.club', 'equipoVisitante.club']) ->orderBy('fase') ->orderBy('numero_partido_bracket') ->orderBy('fecha_evento') ->get(); $bracket = [ Evento::FASE_CUARTOS => collect(), Evento::FASE_SEMIS => collect(), Evento::FASE_FINAL => collect(), ]; // Agrupar por fase y nĂºmero de llave (bracket) $grouped = $playoffs->groupBy(function($item) { return $item->fase . '-' . $item->numero_partido_bracket; }); foreach ($grouped as $key => $matches) { $first = $matches->first(); $fase = $first->fase; $nro = $first->numero_partido_bracket; $winsLocal = 0; $winsVisit = 0; $finished = 0; foreach ($matches as $m) { if ($m->marcador_local !== null && $m->marcador_visitante !== null) { $finished++; if ($m->marcador_local > $m->marcador_visitante) $winsLocal++; elseif ($m->marcador_visitante > $m->marcador_local) $winsVisit++; } } $bracket[$fase][$nro] = [ 'matches' => $matches, 'wins_local' => $winsLocal, 'wins_visitante' => $winsVisit, 'total_partidos' => $matches->count(), 'terminados' => $finished, 'equipo_local' => $first->equipoLocal, 'equipo_visitante' => $first->equipoVisitante, ]; } return $bracket; } }