From 838d6419f48ed5d2b9e185d82b537843cd9a7852 Mon Sep 17 00:00:00 2001 From: salam Date: Mon, 12 Oct 2026 23:43:23 +0200 Subject: [PATCH] removed precalculation --- app/Console/Commands/PreCalcPlayer.php | 22 -- .../Pages/ListStatistikoImports.php | 16 - .../Pages/Selections/LoadPlayerSelection.php | 47 +-- app/Filament/Pages/Statistic.php | 1 - .../Widgets/Boxes/LoadPlayerAverages.php | 146 ++++---- app/Filament/Widgets/PlayerPropsDrop.php | 131 ++++--- app/Livewire/PlayerCalculator.php | 125 ++++--- app/Models/SofaScorePlayerPerSeason.php | 36 -- app/Models/StatistikoDetail.php | 5 - app/Traits/UpdateHelper.php | 319 ------------------ ...te_sofa_score_player_per_seasons_table.php | 46 --- 11 files changed, 214 insertions(+), 680 deletions(-) delete mode 100644 app/Console/Commands/PreCalcPlayer.php delete mode 100644 app/Models/SofaScorePlayerPerSeason.php delete mode 100644 app/Traits/UpdateHelper.php delete mode 100644 database/migrations/2026_06_27_091506_create_sofa_score_player_per_seasons_table.php diff --git a/app/Console/Commands/PreCalcPlayer.php b/app/Console/Commands/PreCalcPlayer.php deleted file mode 100644 index 0180a486..00000000 --- a/app/Console/Commands/PreCalcPlayer.php +++ /dev/null @@ -1,22 +0,0 @@ -updatePlayers($playerCount); - } -} diff --git a/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Pages/ListStatistikoImports.php b/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Pages/ListStatistikoImports.php index f616f083..a3ce466d 100644 --- a/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Pages/ListStatistikoImports.php +++ b/app/Filament/Clusters/StaticData/Resources/StatistikoImports/Pages/ListStatistikoImports.php @@ -7,7 +7,6 @@ use App\Models\StatistikoImport; use Filament\Actions\Action; use Filament\Actions\CreateAction; use Filament\Resources\Pages\ListRecords; -use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\File; class ListStatistikoImports extends ListRecords @@ -17,21 +16,6 @@ class ListStatistikoImports extends ListRecords protected function getHeaderActions(): array { return [ - Action::make('precalculation')->color('success') - ->icon('phosphor-gear') - ->requiresConfirmation() // Optional: Asks user before running - ->modalClickThrough() - ->action(function (Action $action) { - // Wir registrieren einen Shutdown-Terminating-Job, - // damit Filament die HTTP-Antwort an den Browser senden kann, - // BEVOR der speicherhungrige Befehl startet. - app()->terminating(function () { - Artisan::call('grp:ply'); - }); - - // Schließt das Modal SOFORT im Browser - $action->close(); - }), CreateAction::make('upload_file') ->modalIcon('phosphor-upload') ->modalHeading('Upload Statistiko Files') diff --git a/app/Filament/Pages/Selections/LoadPlayerSelection.php b/app/Filament/Pages/Selections/LoadPlayerSelection.php index fa65579c..59d7f239 100644 --- a/app/Filament/Pages/Selections/LoadPlayerSelection.php +++ b/app/Filament/Pages/Selections/LoadPlayerSelection.php @@ -3,8 +3,7 @@ namespace App\Filament\Pages\Selections; use App\Filament\Pages\Selections\Helper\GetSeason; -use App\Models\SofaScorePlayerPerSeason; -use App\Models\StatistikoDetail; +use App\Filament\Widgets\Boxes\LoadPlayerAverages; use App\Models\StatistikoEvent; class LoadPlayerSelection @@ -12,13 +11,6 @@ class LoadPlayerSelection public static function load(?int $team_id, ?string $team_position, ?int $sofascore_category_id, ?array $season, ?string $seasonmode) { $season = GetSeason::load($season, $seasonmode); - - // $hash = hash('crc32', $team_id.$team_position.$sofascore_category_id.serialize($season)); - // $cached_players = SofaScorePlayerCache::where('hash', $hash)->value('players'); - // if ($cached_players) { - // return $cached_players; - // } - $matches = StatistikoEvent::whereIn('season', $season) ->where(function ($query) use ($team_id, $team_position) { switch ($team_position) { @@ -36,29 +28,24 @@ class LoadPlayerSelection $positions_map = LoadPositions::load(); - $team_player_ids = StatistikoDetail::where('ss_team_id', $team_id)->pluck('ss_player_id')->toArray(); - - $players = SofaScorePlayerPerSeason::with('details')->where('season', $season)->whereIn('ss_player_id', $team_player_ids)->get(); + $players = LoadPlayerAverages::load($team_id, $season); $arr = []; - foreach ($players as $val) { - if ($val->details) { - $player_id = $val->ss_player_id; - if (! isset($arr[$player_id])) { - $arr[$player_id]['player_name'] = $val->details->player_name; - $arr[$player_id]['events_played_home'] = $val->events_played_home; - $arr[$player_id]['events_played_away'] = $val->events_played_away; - $arr[$player_id]['minutes_played_home'] = $val->minutes_played_home; - $arr[$player_id]['minutes_played_away'] = $val->minutes_played_away; - $arr[$player_id]['preferred_foot'] = $val->details->preferred_foot ?? ''; - $arr[$player_id]['player_position'] = $val->details->position ?? ''; - $arr[$player_id]['color_level'] = round($matches_count / 3); - } else { - $arr[$player_id]['events_played_home'] += $val->events_played_home; - $arr[$player_id]['events_played_away'] += $val->events_played_away; - $arr[$player_id]['minutes_played_home'] += $val->minutes_played_home; - $arr[$player_id]['minutes_played_away'] += $val->minutes_played_away; - } + foreach ($players as $ss_player_id => $val) { + if (! isset($arr[$ss_player_id])) { + $arr[$ss_player_id]['player_name'] = $val['player_name']; + $arr[$ss_player_id]['events_played_home'] = $val['events_played_home']; + $arr[$ss_player_id]['events_played_away'] = $val['events_played_away']; + $arr[$ss_player_id]['minutes_played_home'] = $val['minutes_played_home']; + $arr[$ss_player_id]['minutes_played_away'] = $val['minutes_played_away']; + $arr[$ss_player_id]['preferred_foot'] = $val['preferred_foot'] ?? ''; + $arr[$ss_player_id]['player_position'] = $val['position'] ?? ''; + $arr[$ss_player_id]['color_level'] = round($matches_count / 3); + } else { + $arr[$ss_player_id]['events_played_home'] += $val['events_played_home']; + $arr[$ss_player_id]['events_played_away'] += $val['events_played_away']; + $arr[$ss_player_id]['minutes_played_home'] += $val['minutes_played_home']; + $arr[$ss_player_id]['minutes_played_away'] += $val['minutes_played_away']; } } diff --git a/app/Filament/Pages/Statistic.php b/app/Filament/Pages/Statistic.php index e8a96f39..edd60383 100644 --- a/app/Filament/Pages/Statistic.php +++ b/app/Filament/Pages/Statistic.php @@ -146,7 +146,6 @@ class Statistic extends BaseDashboard Actions::make([ Action::make('esc') ->hiddenLabel() - ->hidden(fn (Get $get) => $get('similar_past_matches') != 'none') ->tooltip('Clear All (esc)') ->icon('phosphor-x') ->color('gray') diff --git a/app/Filament/Widgets/Boxes/LoadPlayerAverages.php b/app/Filament/Widgets/Boxes/LoadPlayerAverages.php index 4f5aa728..a4a242c6 100644 --- a/app/Filament/Widgets/Boxes/LoadPlayerAverages.php +++ b/app/Filament/Widgets/Boxes/LoadPlayerAverages.php @@ -3,93 +3,104 @@ namespace App\Filament\Widgets\Boxes; use App\Models\StatistikoDetail; +use App\Models\StatistikoEvent; use App\Models\StatistikoPlayer; class LoadPlayerAverages { - public static function load(int &$team_id, string $season) + public static function load(int &$team_id, string|array $season) { - $players = StatistikoDetail::where('ss_team_id', $team_id)->get(); + $player_ids = []; + foreach ($players as $player) { + $player_ids[] = $player->ss_player_id; + } + $arr = []; - foreach ($players as $val) { + if (is_array($season)) { + $matches_for_season = StatistikoEvent::whereIn('season', $season)->pluck('match_id')->toArray(); + $res = StatistikoPlayer::with('details')->whereIn('match_id', $matches_for_season)->whereIn('ss_player_id', $player_ids)->get(); + } else { + $res = StatistikoPlayer::with('details')->whereIn('ss_player_id', $player_ids)->get(); + } - $res = StatistikoPlayer::whereIn('ss_player_id', $val->ss_player_id)->get(); + foreach ($res as $val) { - foreach ($res as $val) { + $ss_player_id = (int) $val->ss_player_id; + $activeteam_id = (int) $val->activeteam_id; + $minutes_played = (int) $val->minutes_played; + $home_id = (int) $val->event->home_id; + $away_id = (int) $val->event->away_id; + $startime = $val->event->starttime; - $ss_player_id = (int) $val->ss_player_id; - $activeteam_id = (int) $val->activeteam_id; - $minutes_played = (int) $val->minutes_played; - $season = $val->event->season; - $home_id = (int) $val->event->home_id; - $away_id = (int) $val->event->away_id; - $startime = $val->event->starttime; + if ($startime->greaterThan(now()->subDays(180))) { + $last_180_days = true; + } else { + $last_180_days = false; + } - if ($startime->greaterThan(now()->subDays(180))) { - $last_180_days = true; - } else { - $last_180_days = false; - } + if (! isset($arr[$ss_player_id])) { + self::array_template($arr, $ss_player_id); + } - if (! isset($arr[$ss_player_id])) { - self::array_template($arr, $ss_player_id); - } - - if ($activeteam_id == $home_id) { + if ($activeteam_id == $home_id) { + $arr[$ss_player_id]['events_played_home'] += 1; + $arr[$ss_player_id]['minutes_played_home'] += $minutes_played; + $arr[$ss_player_id]['events_played_home'] += 1; + $arr[$ss_player_id]['minutes_played_home'] += $minutes_played; + if ($last_180_days) { $arr[$ss_player_id]['events_played_home'] += 1; $arr[$ss_player_id]['minutes_played_home'] += $minutes_played; - $arr[$ss_player_id]['events_played_home'] += 1; - $arr[$ss_player_id]['minutes_played_home'] += $minutes_played; - if ($last_180_days) { - $arr[$ss_player_id]['events_played_home'] += 1; - $arr[$ss_player_id]['minutes_played_home'] += $minutes_played; - } - } elseif ($activeteam_id == $away_id) { + } + } elseif ($activeteam_id == $away_id) { + $arr[$ss_player_id]['events_played_away'] += 1; + $arr[$ss_player_id]['minutes_played_away'] += $minutes_played; + $arr[$ss_player_id]['events_played_away'] += 1; + $arr[$ss_player_id]['minutes_played_away'] += $minutes_played; + if ($last_180_days) { $arr[$ss_player_id]['events_played_away'] += 1; $arr[$ss_player_id]['minutes_played_away'] += $minutes_played; - $arr[$ss_player_id]['events_played_away'] += 1; - $arr[$ss_player_id]['minutes_played_away'] += $minutes_played; - if ($last_180_days) { - $arr[$ss_player_id]['events_played_away'] += 1; - $arr[$ss_player_id]['minutes_played_away'] += $minutes_played; - } + } - } - $cards = $val->card_yellow + $val->card_yellowred; + } + $cards = $val->card_yellow + $val->card_yellowred; - if ($season == 'last180days' && $last_180_days) { - $arr[$ss_player_id]['ss_player_id'] = $ss_player_id; - $arr[$ss_player_id]['season'] = 'last180days'; - $arr[$ss_player_id]['total_events']++; - $arr[$ss_player_id]['total_min'] += $minutes_played; - $arr[$ss_player_id]['average_min'] = round($arr[$ss_player_id]['total_min'] / $arr[$ss_player_id]['total_events']); - $arr[$ss_player_id]['goals'] += $val->goals; - $arr[$ss_player_id]['fouls'] += $val->fouls; - $arr[$ss_player_id]['cards'] += $cards; - $arr[$ss_player_id]['offsides'] += $val->offsides; - $arr[$ss_player_id]['shots_on_target'] += $val->shots_on_target; - $arr[$ss_player_id]['shots_off_target'] += $val->shots_off_target; - $arr[$ss_player_id]['shots_blocked'] += $val->shots_blocked; - $arr[$ss_player_id]['total_shots'] += $val->shots_on_target + $val->shots_off_target + $val->shots_blocked; - } - if ($season != 'last180days') { - $arr[$ss_player_id]['ss_player_id'] = $ss_player_id; - $arr[$ss_player_id]['season'] = $season; - $arr[$ss_player_id]['total_events']++; - $arr[$ss_player_id]['total_min'] += $minutes_played; - $arr[$ss_player_id]['average_min'] = round($arr[$ss_player_id]['total_min'] / $arr[$ss_player_id]['total_events']); - $arr[$ss_player_id]['goals'] += $val->goals; - $arr[$ss_player_id]['fouls'] += $val->fouls; - $arr[$ss_player_id]['cards'] += $cards; - $arr[$ss_player_id]['offsides'] += $val->offsides; - $arr[$ss_player_id]['shots_on_target'] += $val->shots_on_target; - $arr[$ss_player_id]['shots_off_target'] += $val->shots_off_target; - $arr[$ss_player_id]['shots_blocked'] += $val->shots_blocked; - $arr[$ss_player_id]['total_shots'] += $val->shots_on_target + $val->shots_off_target + $val->shots_blocked; - } + if ($season == 'last180days' && $last_180_days) { + $arr[$ss_player_id]['ss_player_id'] = $ss_player_id; + $arr[$ss_player_id]['total_events']++; + $arr[$ss_player_id]['total_min'] += $minutes_played; + $arr[$ss_player_id]['average_min'] = round($arr[$ss_player_id]['total_min'] / $arr[$ss_player_id]['total_events']); + $arr[$ss_player_id]['goals'] += $val->goals; + $arr[$ss_player_id]['fouls'] += $val->fouls; + $arr[$ss_player_id]['cards'] += $cards; + $arr[$ss_player_id]['offsides'] += $val->offsides; + $arr[$ss_player_id]['shots_on_target'] += $val->shots_on_target; + $arr[$ss_player_id]['shots_off_target'] += $val->shots_off_target; + $arr[$ss_player_id]['shots_blocked'] += $val->shots_blocked; + $arr[$ss_player_id]['total_shots'] += $val->shots_on_target + $val->shots_off_target + $val->shots_blocked; + } + if ($season != 'last180days') { + $arr[$ss_player_id]['ss_player_id'] = $ss_player_id; + $arr[$ss_player_id]['total_events']++; + $arr[$ss_player_id]['total_min'] += $minutes_played; + $arr[$ss_player_id]['average_min'] = round($arr[$ss_player_id]['total_min'] / $arr[$ss_player_id]['total_events']); + $arr[$ss_player_id]['goals'] += $val->goals; + $arr[$ss_player_id]['fouls'] += $val->fouls; + $arr[$ss_player_id]['cards'] += $cards; + $arr[$ss_player_id]['offsides'] += $val->offsides; + $arr[$ss_player_id]['shots_on_target'] += $val->shots_on_target; + $arr[$ss_player_id]['shots_off_target'] += $val->shots_off_target; + $arr[$ss_player_id]['shots_blocked'] += $val->shots_blocked; + $arr[$ss_player_id]['total_shots'] += $val->shots_on_target + $val->shots_off_target + $val->shots_blocked; + } + } + + foreach ($players as $value) { + if (isset($arr[$value->ss_player_id])) { + $arr[$value->ss_player_id]['position'] = $value->position; + $arr[$value->ss_player_id]['player_name'] = $value->player_name; } } @@ -99,7 +110,6 @@ class LoadPlayerAverages public static function array_template(array &$arr, int $ss_player_id) { $arr[$ss_player_id]['ss_player_id'] = 0; - $arr[$ss_player_id]['season'] = ''; $arr[$ss_player_id]['total_events'] = 0; $arr[$ss_player_id]['total_min'] = 0; $arr[$ss_player_id]['average_min'] = 0; diff --git a/app/Filament/Widgets/PlayerPropsDrop.php b/app/Filament/Widgets/PlayerPropsDrop.php index 76e9243e..7895c1ba 100644 --- a/app/Filament/Widgets/PlayerPropsDrop.php +++ b/app/Filament/Widgets/PlayerPropsDrop.php @@ -9,12 +9,10 @@ use App\Filament\Widgets\PlayerProps\LineUpMap; use App\Filament\Widgets\PlayerProps\PositionHirarchie; use App\Livewire\PlayerCalculator; use App\Models\ExpectedMinimumPosition; -use App\Models\SofaScorePlayerPerSeason; use App\Models\SofaScorePlayerPosition; use App\Models\SofaScoreRosa; use App\Models\SsLineupMemory; use App\Models\StatisticFixtures; -use App\Models\StatistikoDetail; use Filament\Notifications\Notification; use Filament\Widgets\Widget; use Illuminate\Support\Collection; @@ -392,24 +390,19 @@ class PlayerPropsDrop extends Widget $team_home_away = 'away'; } - // $player_totals = LoadPlayerAverages::load($team_id, 'total'); - - $team_player_ids = StatistikoDetail::where('ss_team_id', $team_id)->pluck('ss_player_id')->toArray(); - $player_totals = SofaScorePlayerPerSeason::with('details')->where('season', 'total')->whereIn('ss_player_id', $team_player_ids)->get(); + $players = LoadPlayerAverages::load($team_id, 'total'); $count_player = 0; - $tmp = []; - foreach ($player_totals as $ss_player_id => $value) { - $tmp[] = $ss_player_id; - if ($value->details != null && $value->details->position != 'GK' && (int) $value->details->is_active) { + foreach ($players as $ss_player_id => $value) { + if ($value['position'] != 'GK') { $count_player++; } } $results = []; - foreach ($player_totals as $val) { - if ($val->details != null && $val->details->position != 'GK' && (int) $val->details->is_active) { + foreach ($players as $val) { + if ($val['position'] != 'GK') { /*** "goals" => 0 @@ -421,12 +414,12 @@ class PlayerPropsDrop extends Widget "total_shots" => 4 */ - $ss_player_id = $val->ss_player_id; - $position = $val->details->position; + $ss_player_id = $val['ss_player_id']; + $position = $val['position']; $tmp = []; $tmp['id'] = $ss_player_id; - $tmp['name'] = $val->details->player_name; + $tmp['name'] = $val['player_name']; $tmp['id_team'] = $team_id; $tmp['asp_team'] = $asp_team; @@ -446,10 +439,10 @@ class PlayerPropsDrop extends Widget // Il valore Y dovrebbe essere configurabile in una interfaccia. Il valore iniziale lo fissiamo a Y = 180 // Somma Minuti Giocati da Player (SMG) nel DB - $tmp['somma_minuti'] = $val->total_min; - $tmp['shots_on_target'] = $val->shots_on_target; - $tmp['shots_off_target'] = $val->shots_off_target; - $tmp['shots_blocked'] = $val->shots_blocked; + $tmp['somma_minuti'] = $val['total_min']; + $tmp['shots_on_target'] = $val['shots_on_target']; + $tmp['shots_off_target'] = $val['shots_off_target']; + $tmp['shots_blocked'] = $val['shots_blocked']; // il valore corrispondente al ruolo del Player (esempio un giocatore in Details ha ruolo = RW // quindi Aspettativa Statistica (AS) per RW = 0.219) @@ -479,8 +472,8 @@ class PlayerPropsDrop extends Widget switch ($bettype) { case 'goals': - $asp_gioco = $val->goals / $val->total_min * 90; - if ($asp_gioco == 0 || $val->total_min < $this->y_value) { + $asp_gioco = $val['goals'] / $val['total_min'] * 90; + if ($asp_gioco == 0 || $val['total_min'] < $this->y_value) { $tmp['asp_gioco_'.$bettype] = 0; $tmp['asp_teorica_'.$bettype] = $asp_statistica; } else { @@ -489,8 +482,8 @@ class PlayerPropsDrop extends Widget } break; case 'cards': - $asp_gioco = $val->cards / $val->total_min * 90; - if ($asp_gioco == 0 || $val->total_min < $this->y_value) { + $asp_gioco = $val['cards'] / $val['total_min'] * 90; + if ($asp_gioco == 0 || $val['total_min'] < $this->y_value) { $tmp['asp_gioco_'.$bettype] = 0; $tmp['asp_teorica_'.$bettype] = $asp_statistica; } else { @@ -499,8 +492,8 @@ class PlayerPropsDrop extends Widget } break; case 'fouls': - $asp_gioco = $val->fouls / $val->total_min * 90; - if ($asp_gioco == 0 || $val->total_min < $this->y_value) { + $asp_gioco = $val['fouls'] / $val['total_min'] * 90; + if ($asp_gioco == 0 || $val['total_min'] < $this->y_value) { $tmp['asp_gioco_'.$bettype] = 0; $tmp['asp_teorica_'.$bettype] = $asp_statistica; } else { @@ -509,8 +502,8 @@ class PlayerPropsDrop extends Widget } break; case 'offsides': - $asp_gioco = $val->offsides / $val->total_min * 90; - if ($asp_gioco == 0 || $val->total_min < $this->y_value) { + $asp_gioco = $val['offsides'] / $val['total_min'] * 90; + if ($asp_gioco == 0 || $val['total_min'] < $this->y_value) { $tmp['asp_gioco_'.$bettype] = 0; $tmp['asp_teorica_'.$bettype] = $asp_statistica; } else { @@ -519,8 +512,8 @@ class PlayerPropsDrop extends Widget } break; case 'total_shots': - $asp_gioco = $val->total_shots / $val->total_min * 90; - if ($asp_gioco == 0 || $val->total_min < $this->y_value) { + $asp_gioco = $val['total_shots'] / $val['total_min'] * 90; + if ($asp_gioco == 0 || $val['total_min'] < $this->y_value) { $tmp['asp_gioco_'.$bettype] = 0; $tmp['asp_teorica_'.$bettype] = $asp_statistica; } else { @@ -529,8 +522,8 @@ class PlayerPropsDrop extends Widget } break; case 'shots_on_target': - $asp_gioco = $val->shots_on_target / $val->total_min * 90; - if ($asp_gioco == 0 || $val->total_min < $this->y_value) { + $asp_gioco = $val['shots_on_target'] / $val['total_min'] * 90; + if ($asp_gioco == 0 || $val['total_min'] < $this->y_value) { $tmp['asp_gioco_'.$bettype] = 0; $tmp['asp_teorica_'.$bettype] = $asp_statistica; } else { @@ -629,41 +622,43 @@ class PlayerPropsDrop extends Widget $pos = $this->players[$k]['pos_ori']; } - $tamx = number_format($map[$pos]['gls'], 3); - $final = number_format($result['asp_player_goals'], 3); - $results[$key]['finale_tamx_gls'] = $tamx; - $results[$key]['finale_calc_gls'] = $final; - $this->players[$k]['gls'] = (float) $final > (float) $tamx ? $final : $tamx; + if ($pos != 'GK') { + $tamx = number_format($map[$pos]['gls'], 3); + $final = number_format($result['asp_player_goals'], 3); + $results[$key]['finale_tamx_gls'] = $tamx; + $results[$key]['finale_calc_gls'] = $final; + $this->players[$k]['gls'] = (float) $final > (float) $tamx ? $final : $tamx; - $tamx = number_format($map[$pos]['crd'], 3); - $final = number_format($result['asp_player_cards'], 3); - $results[$key]['finale_tamx_crd'] = $tamx; - $results[$key]['finale_calc_crd'] = $final; - $this->players[$k]['crd'] = (float) $final > (float) $tamx ? $final : $tamx; + $tamx = number_format($map[$pos]['crd'], 3); + $final = number_format($result['asp_player_cards'], 3); + $results[$key]['finale_tamx_crd'] = $tamx; + $results[$key]['finale_calc_crd'] = $final; + $this->players[$k]['crd'] = (float) $final > (float) $tamx ? $final : $tamx; - $tamx = number_format($map[$pos]['fls'], 3); - $final = number_format($result['asp_player_fouls'], 3); - $results[$key]['finale_tamx_fls'] = $tamx; - $results[$key]['finale_calc_fls'] = $final; - $this->players[$k]['fls'] = (float) $final > (float) $tamx ? $final : $tamx; + $tamx = number_format($map[$pos]['fls'], 3); + $final = number_format($result['asp_player_fouls'], 3); + $results[$key]['finale_tamx_fls'] = $tamx; + $results[$key]['finale_calc_fls'] = $final; + $this->players[$k]['fls'] = (float) $final > (float) $tamx ? $final : $tamx; - $tamx = number_format($map[$pos]['ofs'], 3); - $final = number_format($result['asp_player_offsides'], 3); - $results[$key]['finale_tamx_ofs'] = $tamx; - $results[$key]['finale_calc_ofs'] = $final; - $this->players[$k]['ofs'] = (float) $final > (float) $tamx ? $final : $tamx; + $tamx = number_format($map[$pos]['ofs'], 3); + $final = number_format($result['asp_player_offsides'], 3); + $results[$key]['finale_tamx_ofs'] = $tamx; + $results[$key]['finale_calc_ofs'] = $final; + $this->players[$k]['ofs'] = (float) $final > (float) $tamx ? $final : $tamx; - $tamx = number_format($map[$pos]['tsh'], 3); - $final = number_format($result['asp_player_total_shots'], 3); - $results[$key]['finale_tamx_tsh'] = $tamx; - $results[$key]['finale_calc_tsh'] = $final; - $this->players[$k]['tsh'] = (float) $final > (float) $tamx ? $final : $tamx; + $tamx = number_format($map[$pos]['tsh'], 3); + $final = number_format($result['asp_player_total_shots'], 3); + $results[$key]['finale_tamx_tsh'] = $tamx; + $results[$key]['finale_calc_tsh'] = $final; + $this->players[$k]['tsh'] = (float) $final > (float) $tamx ? $final : $tamx; - $tamx = number_format($map[$pos]['snt'], 3); - $final = number_format($result['asp_player_shots_on_target'], 3); - $results[$key]['finale_tamx_snt'] = $tamx; - $results[$key]['finale_calc_snt'] = $final; - $this->players[$k]['snt'] = (float) $final > (float) $tamx ? $final : $tamx; + $tamx = number_format($map[$pos]['snt'], 3); + $final = number_format($result['asp_player_shots_on_target'], 3); + $results[$key]['finale_tamx_snt'] = $tamx; + $results[$key]['finale_calc_snt'] = $final; + $this->players[$k]['snt'] = (float) $final > (float) $tamx ? $final : $tamx; + } } } } @@ -687,18 +682,16 @@ class PlayerPropsDrop extends Widget public function prepareLineUp() { - $team_player_ids = StatistikoDetail::where('ss_team_id', $this->team_id)->pluck('ss_player_id')->toArray(); - - $players = SofaScorePlayerPerSeason::with('details')->where('season', 'last_180_days')->whereIn('ss_player_id', $team_player_ids)->get(); + $players = LoadPlayerAverages::load($this->team_id, 'last180days'); $arr = collect(); foreach ($players as $value) { - if ($value?->details->position ?? 0) { + if ($value['position'] != '') { $arr->push([ - 'id' => $value->ss_player_id, - 'min' => $value->average_min, - 'pos' => $value->details->position, - 'name' => $value->details->player_name, + 'id' => $value['ss_player_id'], + 'min' => $value['average_min'], + 'pos' => $value['position'], + 'name' => $value['player_name'], ]); } } diff --git a/app/Livewire/PlayerCalculator.php b/app/Livewire/PlayerCalculator.php index 1481e5ac..f7868242 100644 --- a/app/Livewire/PlayerCalculator.php +++ b/app/Livewire/PlayerCalculator.php @@ -3,8 +3,7 @@ namespace App\Livewire; use App\Filament\Pages\Selections\LoadPositions; -use App\Models\SofaScorePlayerPerSeason; -use App\Models\StatistikoDetail; +use App\Filament\Widgets\Boxes\LoadPlayerAverages; use Livewire\Component; class PlayerCalculator extends Component @@ -13,86 +12,76 @@ class PlayerCalculator extends Component { $positions_map = LoadPositions::load(); - $team_player_ids = StatistikoDetail::where('ss_team_id', $team_id)->pluck('ss_player_id')->toArray(); - - $players = SofaScorePlayerPerSeason::with('details')->where('season', 'total')->whereIn('ss_player_id', $team_player_ids)->get(); + $players = LoadPlayerAverages::load($team_id, 'total'); $result = []; foreach ($players as $val) { - if ($val->details != null && $val->details->is_active) { - $tmp = []; - $tmp['id'] = $val->ss_player_id; - if (! isset($val->details)) { - $tmp['name'] = $val->ss_player_id; - $tmp['pos_ori'] = 'GK'; - $tmp['foot'] = 'Both'; + $tmp = []; + $tmp['id'] = $val['ss_player_id']; + if (! isset($val->details)) { + $tmp['name'] = $val['ss_player_id']; + $tmp['pos_ori'] = 'GK'; + $tmp['foot'] = 'Both'; + } else { + $tmp['name'] = $val['player_name']; + $tmp['pos_ori'] = $val['position']; + $tmp['foot'] = $val['preferred_foot']; + } + $tmp['pos'] = ''; + $tmp['active'] = 0; + $tmp['tot_evt'] = $val['total_events']; + $tmp['tot_min'] = $val['total_min']; + $tmp['ave_min'] = $val['average_min']; + $tmp['gls'] = $val['goals']; + $tmp['fls'] = $val['fouls']; + $tmp['ofs'] = $val['offsides']; + $tmp['crd'] = $val['cards']; + $tmp['snt'] = $val['shots_on_target']; + $tmp['tsh'] = $val['shots_off_target']; + + $level = round($val['total_events'] / 3); + if ($val['total_events']) { + if ($level > 1 && $val['total_events'] < $level) { + $tmp['color_evt'] = 'danger'; + } elseif ($val['total_events'] < $level * 2) { + $tmp['color_evt'] = 'info'; } else { - $tmp['name'] = $val->details->player_name; - $tmp['pos_ori'] = $val->details->position; - $tmp['foot'] = $val->details->preferred_foot; + $tmp['color_evt'] = 'success'; } - $tmp['pos'] = ''; - $tmp['active'] = 0; - $tmp['tot_evt'] = $val->total_events; - $tmp['tot_min'] = $val->total_min; - $tmp['ave_min'] = $val->average_min; - $tmp['gls'] = $val->goals; - $tmp['fls'] = $val->fouls; - $tmp['ofs'] = $val->offsides; - $tmp['crd'] = $val->cards; - $tmp['snt'] = $val->shots_on_target; - $tmp['tsh'] = $val->shots_off_target; + } - $level = round($val->total_events / 3); - if ($val->total_events) { - if ($level > 1 && $val->total_events < $level) { - $tmp['color_evt'] = 'danger'; - } elseif ($val->total_events < $level * 2) { - $tmp['color_evt'] = 'info'; - } else { - $tmp['color_evt'] = 'success'; - } - } - - if (! isset($val->details)) { + if (! isset($val->details)) { + $tmp['area'] = 'goalkeeper'; + $tmp['color_pos'] = 'gray'; + $tmp['order'] = 5; + } else { + if (in_array($val['position'], $positions_map['MIDFIELD'])) { + $tmp['area'] = 'midfield'; + $tmp['color_pos'] = 'info'; + $tmp['order'] = 2; + } elseif (in_array($val['position'], $positions_map['DEFENCE'])) { + $tmp['area'] = 'defence'; + $tmp['color_pos'] = 'success'; + $tmp['order'] = 1; + } elseif (in_array($val['position'], $positions_map['ATTACK'])) { + $tmp['area'] = 'attack'; + $tmp['color_pos'] = 'warning'; + $tmp['order'] = 3; + } elseif (in_array($val['position'], $positions_map['GOALKEEPER'])) { $tmp['area'] = 'goalkeeper'; $tmp['color_pos'] = 'gray'; - $tmp['order'] = 5; + $tmp['order'] = 4; } else { - if (in_array($val->details->position, $positions_map['MIDFIELD'])) { - $tmp['area'] = 'midfield'; - $tmp['color_pos'] = 'info'; - $tmp['order'] = 2; - } elseif (in_array($val->details->position, $positions_map['DEFENCE'])) { - $tmp['area'] = 'defence'; - $tmp['color_pos'] = 'success'; - $tmp['order'] = 1; - } elseif (in_array($val->details->position, $positions_map['ATTACK'])) { - $tmp['area'] = 'attack'; - $tmp['color_pos'] = 'warning'; - $tmp['order'] = 3; - } elseif (in_array($val->details->position, $positions_map['GOALKEEPER'])) { - $tmp['area'] = 'goalkeeper'; - $tmp['color_pos'] = 'gray'; - $tmp['order'] = 4; - } else { - $tmp['area'] = 'defence'; - $tmp['color_pos'] = 'success'; - $tmp['order'] = 5; - } + $tmp['area'] = 'defence'; + $tmp['color_pos'] = 'success'; + $tmp['order'] = 5; } - - $result[] = $tmp; } + + $result[] = $tmp; } - // dd($result); - - // $pos = array_column($result, 'pos'); - // $area = array_column($result, 'area'); - // array_multisort($area, SORT_ASC, $pos, SORT_ASC, $result); - return $result; } } diff --git a/app/Models/SofaScorePlayerPerSeason.php b/app/Models/SofaScorePlayerPerSeason.php deleted file mode 100644 index 2c398334..00000000 --- a/app/Models/SofaScorePlayerPerSeason.php +++ /dev/null @@ -1,36 +0,0 @@ -belongsTo(StatistikoDetail::class, 'ss_player_id', 'ss_player_id'); - } -} diff --git a/app/Models/StatistikoDetail.php b/app/Models/StatistikoDetail.php index bbba97a5..050f0796 100644 --- a/app/Models/StatistikoDetail.php +++ b/app/Models/StatistikoDetail.php @@ -32,11 +32,6 @@ class StatistikoDetail extends Model 'last_update' => 'datetime', ]; - // public function season() - // { - // return $this->hasMany(SofaScorePlayerPerSeason::class, 'ss_player_id', 'ss_player_id'); - // } - public function team(): BelongsTo { return $this->belongsTo(SofaScoreRosa::class, 'ss_team_id', 'ss_team_id'); diff --git a/app/Traits/UpdateHelper.php b/app/Traits/UpdateHelper.php deleted file mode 100644 index 584729f0..00000000 --- a/app/Traits/UpdateHelper.php +++ /dev/null @@ -1,319 +0,0 @@ -options(); - $this->debug = $tmp['d'] ?? 0; - - if ($this->debug) { - Notice::note('Update Player Season', 'g'); - } - - if ($this->debug) { - $playerCount = $this->selectPlayer(); - } else { - $playerCount = 1000000; - } - - if ($this->debug) { - $this->startBenchmark(); - } - - try { - $this->updatePlayers($playerCount); - } catch (\Exception $e) { - $this->error(get_class($e).' '.Str::of($e->getMessage())->limit(100)->value()); - } - - if ($this->debug) { - $this->endBenchmark(); - } - } - - // Flight::upsert([ - // ['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99], - // ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150] - // ], uniqueBy: ['departure', 'destination'], update: ['price']); - - protected function selectPlayer(): string - { - $file = select( - label: 'How many players to update?', - options: ['100 Player', '1k Player', '10k Player', '100k Player', '1m Player'] - ); - - return match ($file) { - '100 Player' => 100, - '1k Player' => 1000, - '10k Player' => 10000, - '100k Player' => 100000, - '1m Player' => 1000000, - }; - } - - protected function startBenchmark(string $table = 'ss_player_seasons'): void - { - $this->startRowCount = DB::table($table)->count(); - $this->benchmarkStartTime = microtime(true); - $this->benchmarkStartMemory = memory_get_usage(); - DB::enableQueryLog(); - $this->startQueries = DB::select("SHOW SESSION STATUS LIKE 'Questions'")[0]->Value; - } - - protected function endBenchmark(string $table = 'ss_player_seasons'): void - { - $executionTime = microtime(true) - $this->benchmarkStartTime; - $memoryUsage = round((memory_get_usage() - $this->benchmarkStartMemory) / 1024 / 1024, 2); - $queriesCount = DB::select("SHOW SESSION STATUS LIKE 'Questions'")[0]->Value - $this->startQueries - 1; // Subtract the Questions query itself - - // Get row count after we've stopped tracking queries - $rowDiff = DB::table($table)->count() - $this->startRowCount; - - $formattedTime = match (true) { - $executionTime >= 60 => sprintf('%dm %ds', floor($executionTime / 60), $executionTime % 60), - $executionTime >= 1 => round($executionTime, 2).'s', - default => round($executionTime * 1000).'ms', - }; - - $this->newLine(); - $this->line(sprintf( - '⚡ TIME: %s MEM: %sMB SQL: %s ROWS: %s ', - $formattedTime, - $memoryUsage, - number_format($queriesCount), - number_format($rowDiff) - )); - $this->newLine(); - } - - protected function updatePlayers(int $playerCount) - { - $res_player = StatistikoDetail::query()->where('is_active', 1)->limit($playerCount)->pluck('ss_player_id')->toArray(); - - $chunks = array_chunk($res_player, 500); - - foreach ($chunks as $chunk) { - - if ($this->debug) { - echo '#'; - } - - $res = StatistikoPlayer::with('event')->with('details')->whereIn('ss_player_id', $chunk)->orderBy('ss_player_id')->get(); - - $collection = []; - foreach ($res as $val) { - - if (isset($val->event) && $val->ss_player_id != 0) { - - $ss_player_id = (int) $val->ss_player_id; - $activeteam_id = (int) $val->activeteam_id; - $minutes_played = (int) $val->minutes_played; - $season = $val->event->season; - $home_id = (int) $val->event->home_id; - $away_id = (int) $val->event->away_id; - $startime = $val->event->starttime; - - if ($startime->greaterThan(now()->subDays(180))) { - $last_180_days = true; - } else { - $last_180_days = false; - } - - if (! isset($collection[$season][$ss_player_id])) { - $this->array_template($collection, $ss_player_id, $season); - } - if (! isset($collection['total'][$ss_player_id])) { - $this->array_template($collection, $ss_player_id, 'total'); - } - if (! isset($collection['last_180_days'][$ss_player_id])) { - $this->array_template($collection, $ss_player_id, 'last_180_days'); - } - - if ($minutes_played > 0) { - if ($activeteam_id == $home_id) { - $collection[$season][$ss_player_id]['events_played_home'] += 1; - $collection[$season][$ss_player_id]['minutes_played_home'] += $minutes_played; - $collection['total'][$ss_player_id]['events_played_home'] += 1; - $collection['total'][$ss_player_id]['minutes_played_home'] += $minutes_played; - if ($last_180_days) { - $collection['last_180_days'][$ss_player_id]['events_played_home'] += 1; - $collection['last_180_days'][$ss_player_id]['minutes_played_home'] += $minutes_played; - } - } elseif ($activeteam_id == $away_id) { - $collection[$season][$ss_player_id]['events_played_away'] += 1; - $collection[$season][$ss_player_id]['minutes_played_away'] += $minutes_played; - $collection['total'][$ss_player_id]['events_played_away'] += 1; - $collection['total'][$ss_player_id]['minutes_played_away'] += $minutes_played; - if ($last_180_days) { - $collection['last_180_days'][$ss_player_id]['events_played_away'] += 1; - $collection['last_180_days'][$ss_player_id]['minutes_played_away'] += $minutes_played; - } - - } - // ubaldo 18. Sep 26 intanto vado avanti, appena trovo qwuaqlcosa ti scrivo, tu togli i red cards dal conteggio - $cards = $val->card_yellow + $val->card_yellowred; - - $collection[$season][$ss_player_id]['ss_player_id'] = $ss_player_id; - $collection[$season][$ss_player_id]['season'] = $season; - $collection[$season][$ss_player_id]['total_events']++; - $collection[$season][$ss_player_id]['total_min'] += $minutes_played; - $collection[$season][$ss_player_id]['average_min'] = round($collection[$season][$ss_player_id]['total_min'] / $collection[$season][$ss_player_id]['total_events']); - $collection[$season][$ss_player_id]['goals'] += $val->goals; - $collection[$season][$ss_player_id]['fouls'] += $val->fouls; - $collection[$season][$ss_player_id]['cards'] += $cards; - $collection[$season][$ss_player_id]['offsides'] += $val->offsides; - $collection[$season][$ss_player_id]['shots_on_target'] += $val->shots_on_target; - $collection[$season][$ss_player_id]['shots_off_target'] += $val->shots_off_target; - $collection[$season][$ss_player_id]['shots_blocked'] += $val->shots_blocked; - $collection[$season][$ss_player_id]['total_shots'] += $val->shots_on_target + $val->shots_off_target + $val->shots_blocked; - - $collection['total'][$ss_player_id]['ss_player_id'] = $ss_player_id; - $collection['total'][$ss_player_id]['season'] = 'total'; - $collection['total'][$ss_player_id]['total_events']++; - $collection['total'][$ss_player_id]['total_min'] += $minutes_played; - $collection['total'][$ss_player_id]['average_min'] = round($collection['total'][$ss_player_id]['total_min'] / $collection['total'][$ss_player_id]['total_events']); - $collection['total'][$ss_player_id]['goals'] += $val->goals; - $collection['total'][$ss_player_id]['fouls'] += $val->fouls; - $collection['total'][$ss_player_id]['cards'] += $cards; - $collection['total'][$ss_player_id]['offsides'] += $val->offsides; - $collection['total'][$ss_player_id]['shots_on_target'] += $val->shots_on_target; - $collection['total'][$ss_player_id]['shots_off_target'] += $val->shots_off_target; - $collection['total'][$ss_player_id]['shots_blocked'] += $val->shots_blocked; - $collection['total'][$ss_player_id]['total_shots'] += $val->shots_on_target + $val->shots_off_target + $val->shots_blocked; - - if ($last_180_days) { - $collection['last_180_days'][$ss_player_id]['ss_player_id'] = $ss_player_id; - $collection['last_180_days'][$ss_player_id]['season'] = 'last_180_days'; - $collection['last_180_days'][$ss_player_id]['total_events']++; - $collection['last_180_days'][$ss_player_id]['total_min'] += $minutes_played; - $collection['last_180_days'][$ss_player_id]['average_min'] = round($collection['last_180_days'][$ss_player_id]['total_min'] / $collection['last_180_days'][$ss_player_id]['total_events']); - $collection['last_180_days'][$ss_player_id]['goals'] += $val->goals; - $collection['last_180_days'][$ss_player_id]['fouls'] += $val->fouls; - $collection['last_180_days'][$ss_player_id]['cards'] += $cards; - $collection['last_180_days'][$ss_player_id]['offsides'] += $val->offsides; - $collection['last_180_days'][$ss_player_id]['shots_on_target'] += $val->shots_on_target; - $collection['last_180_days'][$ss_player_id]['shots_off_target'] += $val->shots_off_target; - $collection['last_180_days'][$ss_player_id]['shots_blocked'] += $val->shots_blocked; - $collection['last_180_days'][$ss_player_id]['total_shots'] += $val->shots_on_target + $val->shots_off_target + $val->shots_blocked; - } - } - } - } - - $collection_1d = []; - foreach ($collection as $arr) { - foreach ($arr as $row) { - $collection_1d[] = $row; - } - } - - // ALTER TABLE ss_player_seasons ADD UNIQUE KEY eindeutiger_index (ss_player_id, season); - - SofaScorePlayerPerSeason::upsert( - $collection_1d, - uniqueBy: [ - 'ss_player_id', - 'season', - ], - update: [ - 'total_events', - 'total_min', - 'average_min', - 'events_played_home', - 'events_played_away', - 'minutes_played_home', - 'minutes_played_away', - 'goals', - 'fouls', - 'offsides', - 'shots_on_target', - 'shots_off_target', - 'shots_blocked', - 'total_shots', - 'cards', - ] - ); - } - - // 1. Finde alle Kombinationen, die mehrfach existieren - $duplicates = DB::table('ss_player_seasons') - ->select('season', 'ss_player_id', DB::raw('COUNT(*) as count')) - ->groupBy('season', 'ss_player_id') - ->having('count', '>', 1) - ->get(); - - // 2. Schleife durch die Duplikate und lösche die überschüssigen - foreach ($duplicates as $duplicate) { - // Hol dir alle IDs für diese spezifische Kombination, sortiert nach ID - $ids = SofaScorePlayerPerSeason::where('season', $duplicate->season) - ->where('ss_player_id', $duplicate->ss_player_id) - ->orderBy('id', 'asc') - ->pluck('id'); - - // Behalte die erste ID (Index 0) und hole alle anderen - $idsToDelete = $ids->slice(1); - - // Lösche die überflüssigen IDs aus der Datenbank - SofaScorePlayerPerSeason::whereIn('id', $idsToDelete)->delete(); - } - - SofaScorePlayerPerSeason::where('ss_player_id', 0)->delete(); - SofaScorePlayerPerSeason::where('season', null)->delete(); - - // Mail::to('hermann.telser@gmail.com')->send(new SimpleMail('STATISTIKO', 'Pre Calculation Completed')); - Mail::to(['hermann.telser@gmail.com', 'ubaldo.perrucci@gmail.com'])->send(new SimpleMail('STATISTIKO', 'Pre Calculation Completed')); - } - - private function array_template(array &$collection, int $ss_player_id, string $season) - { - $collection[$season][$ss_player_id]['ss_player_id'] = 0; - $collection[$season][$ss_player_id]['season'] = ''; - $collection[$season][$ss_player_id]['total_events'] = 0; - $collection[$season][$ss_player_id]['total_min'] = 0; - $collection[$season][$ss_player_id]['average_min'] = 0; - $collection[$season][$ss_player_id]['events_played_home'] = 0; - $collection[$season][$ss_player_id]['events_played_away'] = 0; - $collection[$season][$ss_player_id]['minutes_played_home'] = 0; - $collection[$season][$ss_player_id]['minutes_played_away'] = 0; - $collection[$season][$ss_player_id]['goals'] = 0; - $collection[$season][$ss_player_id]['fouls'] = 0; - $collection[$season][$ss_player_id]['offsides'] = 0; - $collection[$season][$ss_player_id]['shots_on_target'] = 0; - $collection[$season][$ss_player_id]['shots_off_target'] = 0; - $collection[$season][$ss_player_id]['shots_blocked'] = 0; - $collection[$season][$ss_player_id]['total_shots'] = 0; - $collection[$season][$ss_player_id]['cards'] = 0; - } -} diff --git a/database/migrations/2026_06_27_091506_create_sofa_score_player_per_seasons_table.php b/database/migrations/2026_06_27_091506_create_sofa_score_player_per_seasons_table.php deleted file mode 100644 index dff36b5d..00000000 --- a/database/migrations/2026_06_27_091506_create_sofa_score_player_per_seasons_table.php +++ /dev/null @@ -1,46 +0,0 @@ -id(); - $table->integer('ss_player_id')->index()->default(0); - $table->integer('ss_team_id')->index()->default(0); - $table->string('season')->index()->default(''); - $table->integer('total_events')->default(0)->nullable(); - $table->integer('total_min')->default(0)->nullable(); - $table->integer('average_min')->default(0)->nullable(); - $table->integer('events_played_home')->default(0)->nullable(); - $table->integer('events_played_away')->default(0)->nullable(); - $table->integer('minutes_played_home')->default(0)->nullable(); - $table->integer('minutes_played_away')->default(0)->nullable(); - $table->integer('goals')->default(0)->nullable(); - $table->integer('fouls')->default(0)->nullable(); - $table->integer('cards')->default(0)->nullable(); - $table->integer('offsides')->default(0)->nullable(); - $table->integer('shots_on_target')->default(0)->nullable(); - $table->integer('shots_off_target')->default(0)->nullable(); - $table->integer('shots_blocked')->default(0)->nullable(); - $table->integer('total_shots')->default(0)->nullable(); - $table->unique(['ss_player_id', 'season']); - $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('ss_player_seasons'); - } -};