Agrego archivos iniciales

This commit is contained in:
Laucha1312
2026-06-04 14:47:50 -03:00
commit ed94601e34
76 changed files with 7737 additions and 0 deletions
+149
View File
@@ -0,0 +1,149 @@
<?php
namespace App\Services;
use App\Models\Torneo;
use App\Models\Evento;
use Illuminate\Support\Facades\DB;
class TournamentService
{
/**
* Calcula la tabla de posiciones de un torneo.
*
* @param int $idTorneo
* @param bool $onlyRegular Si true, solo toma partidos de fase regular
* @return array
*/
public function getStandings(int $idTorneo, bool $onlyRegular = true): array
{
$torneo = Torneo::with('equipos.club')->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;
}
}