diff --git a/_ide_helper.php b/_ide_helper.php index 39fcaa71..469969f8 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -5,7 +5,7 @@ /** * A helper file for Laravel, to provide autocomplete information to your IDE - * Generated for Laravel 12.56.0. + * Generated for Laravel 12.70.0. * * This file should not be included in your code, only analyzed by your IDE! * @@ -3349,6 +3349,19 @@ namespace Illuminate\Support\Facades { $instance->precompiler($precompiler); } + /** + * Get the path to the compiled version of a view. + * + * @param string $path + * @return string + * @static + */ + public static function getCompiledPath($path) + { + /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ + return $instance->getCompiledPath($path); + } + /** * Execute the given callback using a custom echo format. * @@ -3412,20 +3425,6 @@ namespace Illuminate\Support\Facades { $instance->withoutComponentTags(); } - /** - * Get the path to the compiled version of a view. - * - * @param string $path - * @return string - * @static - */ - public static function getCompiledPath($path) - { - //Method inherited from \Illuminate\View\Compilers\Compiler - /** @var \Illuminate\View\Compilers\BladeCompiler $instance */ - return $instance->getCompiledPath($path); - } - /** * Determine if the view at the given path is expired. * @@ -10379,6 +10378,20 @@ namespace Illuminate\Support\Facades { return $instance->globalOptions($options); } + /** + * Execute a callback while requests are created without global middleware or global options. + * + * @template TReturn + * @param (\Closure(): TReturn) $callback + * @return TReturn + * @static + */ + public static function withoutGlobalConfiguration($callback) + { + /** @var \Illuminate\Http\Client\Factory $instance */ + return $instance->withoutGlobalConfiguration($callback); + } + /** * Create a new response instance for use during stubbing. * @@ -14154,7 +14167,6 @@ namespace Illuminate\Support\Facades { } /** - * @method static \BackedEnum|(\BackedEnum|null enum(string $key, string $enumClass, \BackedEnum|null $default = null) * @see \Illuminate\Http\Request */ class Request { @@ -15134,10 +15146,6 @@ namespace Illuminate\Support\Facades { * being the original client, and each successive proxy that passed the request * adding the IP address where it received the request from. * - * If your reverse proxy uses a different header name than "X-Forwarded-For", - * ("Client-Ip" for instance), configure it via the $trustedHeaderSet - * argument of the Request::setTrustedProxies() method instead. - * * @see getClientIps() * @see https://wikipedia.org/wiki/X-Forwarded-For * @static @@ -20614,6 +20622,7 @@ namespace Illuminate\Support\Facades { * @param array $headers * @param string|null $disposition * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws UnableToRetrieveMetadata * @static */ public static function response($path, $name = null, $headers = [], $disposition = 'inline') @@ -20631,6 +20640,7 @@ namespace Illuminate\Support\Facades { * @param string|null $name * @param array $headers * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws UnableToRetrieveMetadata * @static */ public static function serve($request, $path, $name = null, $headers = []) @@ -20647,6 +20657,7 @@ namespace Illuminate\Support\Facades { * @param string|null $name * @param array $headers * @return \Symfony\Component\HttpFoundation\StreamedResponse + * @throws UnableToRetrieveMetadata * @static */ public static function download($path, $name = null, $headers = []) @@ -20845,6 +20856,7 @@ namespace Illuminate\Support\Facades { * * @param string $path * @return string|false + * @throws UnableToRetrieveMetadata * @static */ public static function mimeType($path) @@ -23447,6 +23459,41 @@ namespace Illuminate\Support\Facades { } } +namespace AnourValar\EloquentSerialize\Facades { + /** + */ + class EloquentSerializeFacade { + /** + * Pack + * + * @param \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Relations\Relation $builder + * @return string + * @throws \RuntimeException + * @static + */ + public static function serialize($builder) + { + /** @var \AnourValar\EloquentSerialize\Service $instance */ + return $instance->serialize($builder); + } + + /** + * Unpack + * + * @param mixed $package + * @throws \LogicException + * @return \Illuminate\Database\Eloquent\Builder + * @static + */ + public static function unserialize($package) + { + /** @var \AnourValar\EloquentSerialize\Service $instance */ + return $instance->unserialize($package); + } + + } + } + namespace Fruitcake\LaravelDebugbar\Facades { /** * @method static void alert(mixed $message) @@ -24191,6 +24238,24 @@ namespace BezhanSalleh\FilamentShield\Facades { return $instance->buildPermissionKeyUsing($callback); } + /** + * @static + */ + public static function enforcePolicies($condition = true, $except = null) + { + /** @var \BezhanSalleh\FilamentShield\FilamentShield $instance */ + return $instance->enforcePolicies($condition, $except); + } + + /** + * @static + */ + public static function registerEnforcedPolicies() + { + /** @var \BezhanSalleh\FilamentShield\FilamentShield $instance */ + return $instance->registerEnforcedPolicies(); + } + /** * @static */ @@ -24327,6 +24392,19 @@ namespace BezhanSalleh\FilamentShield\Facades { } /** + * Transform custom permissions from config into formatted key => label pairs. + * + * When `format_custom_permission_keys` is enabled (default), permission keys are + * formatted according to the configured case. If the key contains the configured + * separator, each segment is formatted independently and rejoined. + * + * When a `buildPermissionKeyUsing` closure is registered, custom permissions are + * routed through it with `entity` set to `'custom'` and `affix` set to `null`. + * Returning `null` from the closure falls back to the default formatting behavior. + * + * When `format_custom_permission_keys` is disabled, keys are used exactly as + * defined in config — useful for externally managed permissions (Terraform, Keycloak, etc.). + * * @return array * @static */ @@ -25545,6 +25623,299 @@ namespace Livewire { } } +namespace Maatwebsite\Excel\Facades { + /** + */ + class Excel { + /** + * @param array $headers + * @param array $headers + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + * @static + */ + public static function download($export, $fileName, $writerType = null, $headers = []) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->download($export, $fileName, $writerType, $headers); + } + + /** + * @param string|null $disk Fallback for usage with named properties + * @throws Exception + * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception + * @static + */ + public static function store($export, $filePath, $diskName = null, $writerType = null, $diskOptions = [], $disk = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->store($export, $filePath, $diskName, $writerType, $diskOptions, $disk); + } + + /** + * @static + */ + public static function queue($export, $filePath, $disk = null, $writerType = null, $diskOptions = []) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->queue($export, $filePath, $disk, $writerType, $diskOptions); + } + + /** + * @static + */ + public static function raw($export, $writerType) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->raw($export, $writerType); + } + + /** + * @throws ValidationException + * @static + */ + public static function import($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->import($import, $filePath, $disk, $readerType); + } + + /** + * @return array>> + * @static + */ + public static function toArray($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->toArray($import, $filePath, $disk, $readerType); + } + + /** + * @return Collection>> + * @static + */ + public static function toCollection($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->toCollection($import, $filePath, $disk, $readerType); + } + + /** + * @static + */ + public static function queueImport($import, $filePath, $disk = null, $readerType = null) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->queueImport($import, $filePath, $disk, $readerType); + } + + /** + * Register a custom export source handler. + * + * The handler may implement SheetSourceHandler (sync), QueuedSheetSourceHandler + * (queued), or both. Pass a class name to have it resolved lazily from the + * service container, or pass an instance directly. + * + * @param \Maatwebsite\Excel\Contracts\SheetSourceHandler|\Maatwebsite\Excel\Contracts\QueuedSheetSourceHandler|class-string $handlers + * @static + */ + public static function registerSourceHandler(...$handlers) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->registerSourceHandler(...$handlers); + } + + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @param-closure-this static $macro + * @return void + * @static + */ + public static function macro($name, $macro) + { + \Maatwebsite\Excel\Excel::macro($name, $macro); + } + + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ + public static function mixin($mixin, $replace = true) + { + \Maatwebsite\Excel\Excel::mixin($mixin, $replace); + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ + public static function hasMacro($name) + { + return \Maatwebsite\Excel\Excel::hasMacro($name); + } + + /** + * Flush the existing macros. + * + * @return void + * @static + */ + public static function flushMacros() + { + \Maatwebsite\Excel\Excel::flushMacros(); + } + + /** + * @static + */ + public static function extend($concern, $handler, $event = 'Maatwebsite\\Excel\\Events\\BeforeWriting') + { + return \Maatwebsite\Excel\Excel::extend($concern, $handler, $event); + } + + /** + * Register local event listeners. + * + * @param array $listeners + * @static + */ + public static function registerListeners($listeners) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->registerListeners($listeners); + } + + /** + * @static + */ + public static function clearListeners() + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->clearListeners(); + } + + /** + * Register a global event listener. + * + * @static + */ + public static function listen($event, $listener) + { + return \Maatwebsite\Excel\Excel::listen($event, $listener); + } + + /** + * @static + */ + public static function raise($event) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->raise($event); + } + + /** + * @return callable[] + * @static + */ + public static function listeners($event) + { + /** @var \Maatwebsite\Excel\Excel $instance */ + return $instance->listeners($event); + } + + /** + * When asserting downloaded, stored, queued or imported, use regular expression + * to look for a matching file path. + * + * @static + */ + public static function matchByRegex() + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->matchByRegex(); + } + + /** + * When asserting downloaded, stored, queued or imported, use regular string + * comparison for matching file path. + * + * @static + */ + public static function doNotMatchByRegex() + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->doNotMatchByRegex(); + } + + /** + * @static + */ + public static function assertDownloaded($fileName, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertDownloaded($fileName, $callback); + } + + /** + * @static + */ + public static function assertStored($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertStored($filePath, $disk, $callback); + } + + /** + * @static + */ + public static function assertQueued($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertQueued($filePath, $disk, $callback); + } + + /** + * @param array $chain + * @static + */ + public static function assertQueuedWithChain($chain) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertQueuedWithChain($chain); + } + + /** + * @static + */ + public static function assertExportedInRaw($classname, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertExportedInRaw($classname, $callback); + } + + /** + * @static + */ + public static function assertImported($filePath, $disk = null, $callback = null) + { + /** @var \Maatwebsite\Excel\Fakes\ExcelFake $instance */ + return $instance->assertImported($filePath, $disk, $callback); + } + + } + } + namespace Stevebauman\Location\Facades { /** */ @@ -25678,6 +26049,34 @@ namespace Illuminate\Support { return \Illuminate\Support\Collection::debug(); } + /** + * @see \Maatwebsite\Excel\Mixins\DownloadCollectionMixin::downloadExcel() + * @param string $fileName + * @param string|null $writerType + * @param mixed $withHeadings + * @param array $responseHeaders + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + * @static + */ + public static function downloadExcel($fileName, $writerType = null, $withHeadings = false, $responseHeaders = []) + { + return \Illuminate\Support\Collection::downloadExcel($fileName, $writerType, $withHeadings, $responseHeaders); + } + + /** + * @see \Maatwebsite\Excel\Mixins\StoreCollectionMixin::storeExcel() + * @param string $filePath + * @param string|null $disk + * @param string|null $writerType + * @param mixed $withHeadings + * @return \Illuminate\Foundation\Bus\PendingDispatch|bool + * @static + */ + public static function storeExcel($filePath, $disk = null, $writerType = null, $withHeadings = false) + { + return \Illuminate\Support\Collection::storeExcel($filePath, $disk, $writerType, $withHeadings); + } + } /** */ @@ -25693,6 +26092,29 @@ namespace Illuminate\Support { return \Illuminate\Support\Str::sanitizeHtml($html); } + /** + * @see \Filament\Support\SupportServiceProvider::packageBooted() + * @param string|null $url + * @param array $allowedSchemes + * @return string|null + * @static + */ + public static function sanitizeUrl($url, $allowedSchemes = []) + { + return \Illuminate\Support\Str::sanitizeUrl($url, $allowedSchemes); + } + + /** + * @see \Filament\Support\SupportServiceProvider::packageBooted() + * @param \BackedEnum|string|null $color + * @return string|null + * @static + */ + public static function sanitizeCssColor($color) + { + return \Illuminate\Support\Str::sanitizeCssColor($color); + } + } /** */ @@ -25707,6 +26129,27 @@ namespace Illuminate\Support { return \Illuminate\Support\Stringable::sanitizeHtml(); } + /** + * @see \Filament\Support\SupportServiceProvider::packageBooted() + * @param array $allowedSchemes + * @return \Illuminate\Support\Stringable + * @static + */ + public static function sanitizeUrl($allowedSchemes = []) + { + return \Illuminate\Support\Stringable::sanitizeUrl($allowedSchemes); + } + + /** + * @see \Filament\Support\SupportServiceProvider::packageBooted() + * @return \Illuminate\Support\Stringable + * @static + */ + public static function sanitizeCssColor() + { + return \Illuminate\Support\Stringable::sanitizeCssColor(); + } + } } @@ -26123,6 +26566,9 @@ namespace Illuminate\Database\Eloquent\Relations { namespace Livewire\Features\SupportTesting { /** * @template TComponent of \Livewire\Component + * @method $this assertSuccessful() + * @method $this assertOk() + * @method $this assertStatus(int $status) * @mixin \Illuminate\Testing\TestResponse */ class Testable { @@ -26140,12 +26586,13 @@ namespace Livewire\Features\SupportTesting { /** * @see \Filament\Actions\Testing\TestsActions::unmountAction() + * @param string|bool|null $cancelParentActions * @return static * @static */ - public static function unmountAction() + public static function unmountAction($cancelParentActions = null) { - return \Livewire\Features\SupportTesting\Testable::unmountAction(); + return \Livewire\Features\SupportTesting\Testable::unmountAction($cancelParentActions); } /** @@ -28815,7 +29262,7 @@ namespace Illuminate\View { /** * @see \Filament\Support\SupportServiceProvider::packageBooted() * @param array|string|int|null $span - * @param array|int|null $start + * @param array|string|int|null $start * @param array|string|int|null $order * @param bool $isHidden * @return \Illuminate\View\ComponentAttributeBag @@ -28843,6 +29290,7 @@ namespace Illuminate\View { /** * @see \Livewire\Features\SupportPageComponents\SupportPageComponents::registerLayoutViewMacros() * @param mixed $data + * @return static * @static */ public static function layoutData($data = []) @@ -28853,6 +29301,7 @@ namespace Illuminate\View { /** * @see \Livewire\Features\SupportPageComponents\SupportPageComponents::registerLayoutViewMacros() * @param mixed $section + * @return static * @static */ public static function section($section) @@ -28863,6 +29312,7 @@ namespace Illuminate\View { /** * @see \Livewire\Features\SupportPageComponents\SupportPageComponents::registerLayoutViewMacros() * @param mixed $title + * @return static * @static */ public static function title($title) @@ -28873,6 +29323,7 @@ namespace Illuminate\View { /** * @see \Livewire\Features\SupportPageComponents\SupportPageComponents::registerLayoutViewMacros() * @param mixed $slot + * @return static * @static */ public static function slot($slot) @@ -28884,6 +29335,7 @@ namespace Illuminate\View { * @see \Livewire\Features\SupportPageComponents\SupportPageComponents::registerLayoutViewMacros() * @param mixed $view * @param mixed $params + * @return static * @static */ public static function extends($view, $params = []) @@ -28895,6 +29347,7 @@ namespace Illuminate\View { * @see \Livewire\Features\SupportPageComponents\SupportPageComponents::registerLayoutViewMacros() * @param mixed $view * @param mixed $params + * @return static * @static */ public static function layout($view, $params = []) @@ -28905,6 +29358,7 @@ namespace Illuminate\View { /** * @see \Livewire\Features\SupportPageComponents\SupportPageComponents::registerLayoutViewMacros() * @param callable $callback + * @return static * @static */ public static function response($callback) @@ -29577,7 +30031,7 @@ namespace { * @param string $pageName * @param int|null $page * @param \Closure|int|null $total - * @return \Illuminate\Pagination\LengthAwarePaginator + * @return \Illuminate\Pagination\LengthAwarePaginator * @throws \InvalidArgumentException * @static */ @@ -29594,7 +30048,7 @@ namespace { * @param array|string $columns * @param string $pageName * @param int|null $page - * @return \Illuminate\Contracts\Pagination\Paginator + * @return \Illuminate\Pagination\Paginator * @static */ public static function simplePaginate($perPage = null, $columns = [], $pageName = 'page', $page = null) @@ -29610,7 +30064,7 @@ namespace { * @param array|string $columns * @param string $cursorName * @param \Illuminate\Pagination\Cursor|string|null $cursor - * @return \Illuminate\Contracts\Pagination\CursorPaginator + * @return \Illuminate\Pagination\CursorPaginator * @static */ public static function cursorPaginate($perPage = null, $columns = [], $cursorName = 'cursor', $cursor = null) @@ -31352,6 +31806,60 @@ namespace { return \Illuminate\Database\Eloquent\Builder::getRelationWithoutConstraintsProxy($relation); } + /** + * @see \Maatwebsite\Excel\Mixins\DownloadQueryMacro::__invoke() + * @param string $fileName + * @param string|null $writerType + * @param mixed $withHeadings + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + * @static + */ + public static function downloadExcel($fileName, $writerType = null, $withHeadings = false) + { + return \Illuminate\Database\Eloquent\Builder::downloadExcel($fileName, $writerType, $withHeadings); + } + + /** + * @see \Maatwebsite\Excel\Mixins\StoreQueryMacro::__invoke() + * @param string $filePath + * @param string|null $disk + * @param string|null $writerType + * @param mixed $withHeadings + * @return \Illuminate\Foundation\Bus\PendingDispatch|bool + * @static + */ + public static function storeExcel($filePath, $disk = null, $writerType = null, $withHeadings = false) + { + return \Illuminate\Database\Eloquent\Builder::storeExcel($filePath, $disk, $writerType, $withHeadings); + } + + /** + * @see \Maatwebsite\Excel\Mixins\ImportMacro::__invoke() + * @param string $filename + * @param string|null $disk + * @param string|null $readerType + * @return \Maatwebsite\Excel\Importer|\Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Bus\PendingBatch + * @static + */ + public static function import($filename, $disk = null, $readerType = null) + { + return \Illuminate\Database\Eloquent\Builder::import($filename, $disk, $readerType); + } + + /** + * @see \Maatwebsite\Excel\Mixins\ImportAsMacro::__invoke() + * @param string $filename + * @param callable $mapping + * @param string|null $disk + * @param string|null $readerType + * @return \Maatwebsite\Excel\Importer|\Illuminate\Foundation\Bus\PendingDispatch|\Illuminate\Bus\PendingBatch + * @static + */ + public static function importAs($filename, $mapping, $disk = null, $readerType = null) + { + return \Illuminate\Database\Eloquent\Builder::importAs($filename, $mapping, $disk, $readerType); + } + /** * Set the columns to be selected. * @@ -34404,10 +34912,12 @@ namespace { class Validator extends \Illuminate\Support\Facades\Validator {} class View extends \Illuminate\Support\Facades\View {} class Vite extends \Illuminate\Support\Facades\Vite {} + class EloquentSerialize extends \AnourValar\EloquentSerialize\Facades\EloquentSerializeFacade {} class Debugbar extends \Fruitcake\LaravelDebugbar\Facades\Debugbar {} class FilamentShield extends \BezhanSalleh\FilamentShield\Facades\FilamentShield {} class Agent extends \Jenssegers\Agent\Facades\Agent {} class Livewire extends \Livewire\Livewire {} + class Excel extends \Maatwebsite\Excel\Facades\Excel {} class Location extends \Stevebauman\Location\Facades\Location {} } diff --git a/app/Filament/Imports/Helper/ImportDetails.php b/app/Filament/Imports/Helper/ImportDetails.php index 053cad9d..0b1688ab 100644 --- a/app/Filament/Imports/Helper/ImportDetails.php +++ b/app/Filament/Imports/Helper/ImportDetails.php @@ -30,6 +30,7 @@ class ImportDetails $row['birthdate'] = isset($row['birthday']) ? Carbon::parse($row['birthday'])->format('Y-m-d') : ''; unset($row['birthday']); $row['last_update'] = Carbon::parse($row['last_update'])->format('Y-m-d H:i:s'); + $collection[] = $row; } } @@ -56,6 +57,6 @@ class ImportDetails self::$teams = array_unique(self::$teams); - StatistikoDetail::where('last_import', 'no')->whereIn('ss_team_id', self::$teams)->update(['is_active' => 0, 'ss_team_id' => 0]); + // StatistikoDetail::where('last_import', 'no')->whereIn('ss_team_id', self::$teams)->update(['is_active' => 0, 'ss_team_id' => 0]); } } diff --git a/app/Filament/Pages/PlayerProps.php b/app/Filament/Pages/PlayerProps.php index 61a8a639..e0c67155 100644 --- a/app/Filament/Pages/PlayerProps.php +++ b/app/Filament/Pages/PlayerProps.php @@ -90,18 +90,17 @@ class PlayerProps extends Page implements HasForms $this->selectMatch(), $this->selectTeam(), $this->selectLineup(), - // $this->radioSeasonOrDate(), - // $this->datePickerStartDate(), - // $this->datePickerEndDate(), + $this->radioSeasonOrDate(), + $this->datePickerStartDate(), + $this->datePickerEndDate(), ])->statePath('filterData'); } #[On('team-update')] - public function syncData(?int $team_id) + public function syncData() { - if ($team_id) { - $this->team_id = $team_id; - $this->clientLineUps = SsLineupMemory::where('team_id', $team_id)->where('client_id', Auth::user()->client_id)->pluck('lineup')->toArray(); + if ($this->team_id) { + $this->clientLineUps = SsLineupMemory::where('team_id', $this->team_id)->where('client_id', Auth::user()->client_id)->pluck('lineup')->toArray(); } else { $this->players = []; $this->dispatch('clear-all'); @@ -302,6 +301,7 @@ class PlayerProps extends Page implements HasForms $set('mid', null); $set('tid', null); $this->dispatch('clear-all'); + $this->dispatch('season_mode-update', $state); }); } @@ -317,9 +317,11 @@ class PlayerProps extends Page implements HasForms ->default('season') ->hiddenLabel() ->options([ - 'season' => 'Season', + 'season' => 'Active Season', 'date' => 'Date', - ]); + ])->afterStateUpdated(function ($state) { + $this->dispatch('season_or_date-update', season_or_date: $state); + }); } private function datePickerStartDate(): DatePicker @@ -332,12 +334,15 @@ class PlayerProps extends Page implements HasForms ->prefixIconColor(fn (Get $get): string => $get('start_date') ? 'success' : 'primary') ->prefixIcon('phosphor-calendar') ->prefix('Start') + ->closeOnDateSelection() ->suffixAction( Action::make('clear_start') ->icon('phosphor-x') ->color('gray') ->action(fn (Set $set) => $set('start_date', null)) - ); + )->afterStateUpdated(function ($state) { + $this->dispatch('start_date-update', start_date: $state); + }); } private function datePickerEndDate(): DatePicker @@ -350,11 +355,14 @@ class PlayerProps extends Page implements HasForms ->prefixIconColor(fn (Get $get): string => $get('end_date') ? 'success' : 'primary') ->prefixIcon('phosphor-calendar') ->prefix('End') + ->closeOnDateSelection() ->suffixAction( Action::make('clear_end') ->icon('phosphor-x') ->color('gray') ->action(fn (Set $set) => $set('end_date', null)) - ); + )->afterStateUpdated(function ($state) { + $this->dispatch('end_date-update', end_date: $state); + }); } } diff --git a/app/Filament/Pages/Selections/Helper/GetSeason.php b/app/Filament/Pages/Selections/Helper/GetSeason.php index f1f705ed..376c98cc 100644 --- a/app/Filament/Pages/Selections/Helper/GetSeason.php +++ b/app/Filament/Pages/Selections/Helper/GetSeason.php @@ -6,14 +6,14 @@ use Illuminate\Support\Carbon; class GetSeason { - public static function load(?array $season, ?string $seasonmode) + public static function load(?array $season, ?string $season_mode) { if (! \is_array($season) || ! \count($season)) { $date = Carbon::now(); $season = []; - if ($seasonmode == 'halfyear') { + if ($season_mode == 'halfyear') { if ((int) date('m') > 7) { $season[] = (string) $date->format('y').'/'.$date->format('y') + 1; } else { @@ -27,13 +27,13 @@ class GetSeason return $season; } - public static function active(?string $seasonmode) + public static function active(?string $season_mode) { $date = Carbon::now(); $active_season = ''; - if ($seasonmode == 'halfyear') { + if ($season_mode == 'halfyear') { if ((int) date('m') > 7) { $active_season = (string) $date->format('y').'/'.$date->format('y') + 1; } else { diff --git a/app/Filament/Pages/Selections/LoadPlayerSelection.php b/app/Filament/Pages/Selections/LoadPlayerSelection.php index 1c50274b..f1cc393c 100644 --- a/app/Filament/Pages/Selections/LoadPlayerSelection.php +++ b/app/Filament/Pages/Selections/LoadPlayerSelection.php @@ -3,14 +3,20 @@ namespace App\Filament\Pages\Selections; use App\Filament\Pages\Selections\Helper\GetSeason; -use App\Filament\Widgets\Boxes\LoadPlayerAverages; +use App\Models\StatistikoDetail; use App\Models\StatistikoEvent; +use App\Models\StatistikoPlayer; class LoadPlayerSelection { - public static function load(?int $team_id, ?string $team_position, ?array $season, ?string $seasonmode) + public static function load(?array $arr) { - $season = GetSeason::load($season, $seasonmode); + $team_id = $arr['team_id']; + + $team_position = $arr['team_position']; + + $season = GetSeason::load($arr['season'], $arr['season_mode']); + $matches = StatistikoEvent::whereIn('season', $season) ->where(function ($query) use ($team_id, $team_position) { switch ($team_position) { @@ -22,30 +28,50 @@ class LoadPlayerSelection return $query->where('home_id', '=', $team_id) ->orWhere('away_id', '=', $team_id); } - })->pluck('match_id')->toArray(); + })->get(); - $matches_count = count($matches); + $matches_count = $matches->count(); $positions_map = LoadPositions::load(); - - $players = LoadPlayerAverages::load($team_id, $season); + $player_name_map = []; + $res = StatistikoDetail::where('ss_team_id', $team_id)->get(); + foreach ($res as $val) { + $player_name_map[$val->ss_player_id]['name'] = $val->player_name; + $player_name_map[$val->ss_player_id]['pos'] = $val->position; + $player_name_map[$val->ss_player_id]['foot'] = $val->preferred_foot; + } $arr = []; - 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']; + foreach ($matches as $match) { + $players = StatistikoPlayer::where('match_id', $match->match_id)->get(); + foreach ($players as $val) { + $ss_player_id = (int) $val->ss_player_id; + + if (isset($player_name_map[$ss_player_id])) { + + $activeteam_id = (int) $val->activeteam_id; + $minutes_played = (int) $val->minutes_played; + + if (! isset($arr[$ss_player_id])) { + self::array_template($arr, $ss_player_id); + $arr[$ss_player_id]['player_name'] = $player_name_map[$ss_player_id]['name'] ?? ''; + $arr[$ss_player_id]['preferred_foot'] = $player_name_map[$ss_player_id]['foot'] ?? ''; + $arr[$ss_player_id]['player_position'] = $player_name_map[$ss_player_id]['pos'] ?? ''; + $arr[$ss_player_id]['color_level'] = round($matches_count / 3); + } + + if ($activeteam_id == $match->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; + } elseif ($activeteam_id == $match->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; + } + } } } @@ -118,4 +144,16 @@ class LoadPlayerSelection return sprintf($format, $hours, $minutes); } + + public static function array_template(array &$arr, int $ss_player_id) + { + $arr[$ss_player_id]['ss_player_id'] = 0; + $arr[$ss_player_id]['color_level'] = 0; + $arr[$ss_player_id]['preferred_foot'] = ''; + $arr[$ss_player_id]['player_position'] = ''; + $arr[$ss_player_id]['events_played_home'] = 0; + $arr[$ss_player_id]['events_played_away'] = 0; + $arr[$ss_player_id]['minutes_played_home'] = 0; + $arr[$ss_player_id]['minutes_played_away'] = 0; + } } diff --git a/app/Filament/Pages/Selections/LoadSeasons.php b/app/Filament/Pages/Selections/LoadSeasons.php index 3bcb41e9..471bf1e2 100644 --- a/app/Filament/Pages/Selections/LoadSeasons.php +++ b/app/Filament/Pages/Selections/LoadSeasons.php @@ -7,16 +7,16 @@ use Illuminate\Support\Carbon; class LoadSeasons { - public static function load(string $seasonmode) + public static function load(string $season_mode) { - if (! $seasonmode) { + if (! $season_mode) { return []; } $season = []; $period = CarbonPeriod::create(Carbon::now()->year(2024), '1 year', Carbon::now()); foreach ($period as $date) { - if ($seasonmode == 'halfyear') { + if ($season_mode == 'halfyear') { if ((int) date('m') > 7) { $tmp = $date->format('y').'/'.$date->format('y') + 1; } else { diff --git a/app/Filament/Pages/Statistic.php b/app/Filament/Pages/Statistic.php index d1886ff2..d7b646f7 100644 --- a/app/Filament/Pages/Statistic.php +++ b/app/Filament/Pages/Statistic.php @@ -136,7 +136,7 @@ class Statistic extends BaseDashboard ]) ->columnSpanFull() ->schema([ - Hidden::make('seasonmode'), + Hidden::make('season_mode'), $this->selectSofascoreCategoryId(), $this->selectLeagueId(), $this->selectMatchId(), @@ -348,7 +348,7 @@ class Statistic extends BaseDashboard ->options(fn () => LoadSofaScoreCategory::load()) ->placeholder('Select Country') ->afterStateUpdated(function (callable $set, $state) { - $set('seasonmode', SofaScoreCategory::where('id', $state)->value('season_mode')); + $set('season_mode', SofaScoreCategory::where('id', $state)->value('season_mode')); $set('league_id', null); $set('match_id', null); $set('team_id', null); @@ -559,9 +559,9 @@ class Statistic extends BaseDashboard ->placeholder('Player') ->visible(fn (Get $get) => $get('team_id')) ->hidden(fn (Get $get) => $get('similar_past_matches') != 'none') + ->disabled(fn (Get $get) => $get('season_or_date') == 'date' && ($get('start_date') == null || $get('end_date') == null)) ->prefixIconColor(fn (Get $get): string => $get('similar_past_matches') == 'none' ? 'success' : '') ->prefixIcon('icon-player') - ->preload() ->searchable() ->extraAttributes(fn () => [ 'id' => 'player_selector', @@ -574,12 +574,18 @@ class Statistic extends BaseDashboard ->tooltip(fn () => $this->tooltip_player_info()) ) ->options(function (Get $get) { - $team_id = $get('team_id'); - $team_position = $get('team_position'); - $season = $get('season'); - $seasonmode = $get('seasonmode'); + $arr = [ + 'team_id' => $get('team_id'), + 'team_position' => $get('team_position'), + 'season' => $get('season'), + 'season_mode' => $get('season_mode'), + 'season_or_date' => $get('season_or_date'), + 'start_date' => $get('start_date'), + 'end_date' => $get('end_date'), + ]; + + return LoadPlayerSelection::load($arr); - return LoadPlayerSelection::load($team_id, $team_position, $season, $seasonmode); }); } @@ -634,7 +640,7 @@ class Statistic extends BaseDashboard ->hidden(fn (Get $get) => $get('season_or_date') == 'date' || $get('similar_past_matches') != 'none') ->prefixIcon('phosphor-calendar-star') ->options(function (Get $get) { - if ($get('seasonmode') == 'halfyear') { + if ($get('season_mode') == 'halfyear') { return ['26/27' => '26/27', '25/26' => '25/26', '24/25' => '24/25']; } else { return ['2026' => '2026', '2025' => '2025', '2024' => '2024']; diff --git a/app/Filament/Widgets/Boxes/AverageLeagueSeason.php b/app/Filament/Widgets/Boxes/AverageLeagueSeason.php index bf807dce..b2d2a06e 100644 --- a/app/Filament/Widgets/Boxes/AverageLeagueSeason.php +++ b/app/Filament/Widgets/Boxes/AverageLeagueSeason.php @@ -16,8 +16,8 @@ class AverageLeagueSeason public static function load(array &$expectations, array $filter) { $tournament_id = (int) $filter['league_id'] ?? 0; - $seasonmode = $filter['seasonmode']; - $active_season = GetSeason::active($seasonmode); + $season_mode = $filter['season_mode']; + $active_season = GetSeason::active($season_mode); $res = StatistikoEvent::where('league_id', $tournament_id) ->when($active_season, function ($query) use ($active_season) { diff --git a/app/Filament/Widgets/Boxes/AverageTeam.php b/app/Filament/Widgets/Boxes/AverageTeam.php index ab4fd253..9b7f8356 100644 --- a/app/Filament/Widgets/Boxes/AverageTeam.php +++ b/app/Filament/Widgets/Boxes/AverageTeam.php @@ -22,14 +22,14 @@ class AverageTeam $season_or_date = $filter['season_or_date'] ?? 'season'; $start = $filter['start_date'] ?? 0; $end = $filter['end_date'] ?? 0; - $seasonmode = $filter['seasonmode']; + $season_mode = $filter['season_mode']; if ($season_or_date != 'season') { $season = 0; } else { $end = 0; $start = 0; - $season = GetSeason::load($season, $seasonmode); + $season = GetSeason::load($season, $season_mode); } $res = StatistikoEvent::where('league_id', $tournament_id) diff --git a/app/Filament/Widgets/Boxes/AverageTeamSeason.php b/app/Filament/Widgets/Boxes/AverageTeamSeason.php index 315d7ba2..5d38e49b 100644 --- a/app/Filament/Widgets/Boxes/AverageTeamSeason.php +++ b/app/Filament/Widgets/Boxes/AverageTeamSeason.php @@ -16,8 +16,8 @@ class AverageTeamSeason $tournament_id = (int) $filter['league_id'] ?? 0; $team_position = $filter['team_position']; $team_id = (int) $filter['team_id'] ?? 0; - $seasonmode = $filter['seasonmode']; - $season = GetSeason::active($seasonmode); + $season_mode = $filter['season_mode']; + $season = GetSeason::active($season_mode); $res = StatistikoEvent::where('league_id', $tournament_id) ->when($season, function ($query) use ($season) { diff --git a/app/Filament/Widgets/Boxes/LoadPlayerAverages.php b/app/Filament/Widgets/Boxes/LoadPlayerAverages.php deleted file mode 100644 index cff518ae..00000000 --- a/app/Filament/Widgets/Boxes/LoadPlayerAverages.php +++ /dev/null @@ -1,132 +0,0 @@ -where('is_active', 1)->get(); - - $player_ids = []; - foreach ($players as $player) { - $player_ids[] = $player->ss_player_id; - } - - $arr = []; - - 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(); - } - - 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; - - 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 ($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; - } - } 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; - } - - } - $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]['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; - $arr[$value->ss_player_id]['preferred_foot'] = $value->preferred_foot; - } - } - - return $arr; - } - - public static function array_template(array &$arr, int $ss_player_id) - { - $arr[$ss_player_id]['ss_player_id'] = 0; - $arr[$ss_player_id]['total_events'] = 0; - $arr[$ss_player_id]['total_min'] = 0; - $arr[$ss_player_id]['average_min'] = 0; - $arr[$ss_player_id]['events_played_home'] = 0; - $arr[$ss_player_id]['events_played_away'] = 0; - $arr[$ss_player_id]['minutes_played_home'] = 0; - $arr[$ss_player_id]['minutes_played_away'] = 0; - $arr[$ss_player_id]['goals'] = 0; - $arr[$ss_player_id]['fouls'] = 0; - $arr[$ss_player_id]['offsides'] = 0; - $arr[$ss_player_id]['shots_on_target'] = 0; - $arr[$ss_player_id]['shots_off_target'] = 0; - $arr[$ss_player_id]['shots_blocked'] = 0; - $arr[$ss_player_id]['total_shots'] = 0; - $arr[$ss_player_id]['cards'] = 0; - } -} diff --git a/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQuery.php b/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQuery.php index 67899144..6f01e692 100644 --- a/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQuery.php +++ b/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQuery.php @@ -15,7 +15,7 @@ class LoadEventsQuery $league_id = (int) $filter['league_id'] ?? 0; $team_id = (int) $filter['team_id'] ?? 0; $season = $filter['season']; - $seasonmode = $filter['seasonmode']; + $season_mode = $filter['season_mode']; $season_or_date = $filter['season_or_date']; $start = $filter['start_date'] ?? 0; $end = $filter['end_date'] ?? 0; @@ -42,7 +42,7 @@ class LoadEventsQuery } // dd($season); - $season = GetSeason::load($season, $seasonmode); + $season = GetSeason::load($season, $season_mode); /** * IF WITH PLAYER diff --git a/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryAll.php b/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryAll.php index fde3dca9..3a68eba2 100644 --- a/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryAll.php +++ b/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryAll.php @@ -12,7 +12,7 @@ class LoadEventsQueryAll { $league_id = (int) $filter['league_id'] ?? 0; $season = $filter['season']; - $seasonmode = $filter['seasonmode']; + $season_mode = $filter['season_mode']; $season_or_date = $filter['season_or_date']; $accuracy = (float) $filter['accuracy'] ?? 0.5; $start = $filter['start_date'] ?? 0; @@ -36,7 +36,7 @@ class LoadEventsQueryAll } // dd($season); - $season = GetSeason::load($season, $seasonmode); + $season = GetSeason::load($season, $season_mode); /** * IF WITH PLAYER diff --git a/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryTP.php b/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryTP.php index 46352371..e1762865 100644 --- a/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryTP.php +++ b/app/Filament/Widgets/Charts/LoadEvents/LoadEventsQueryTP.php @@ -13,7 +13,7 @@ class LoadEventsQueryTP $league_id = (int) $filter['league_id'] ?? 0; $team_id = (int) $filter['team_id'] ?? 0; $season = $filter['season']; - $seasonmode = $filter['seasonmode']; + $season_mode = $filter['season_mode']; $season_or_date = $filter['season_or_date']; $accuracy = (float) $filter['accuracy'] ?? 0.5; $start = $filter['start_date'] ?? 0; @@ -40,7 +40,7 @@ class LoadEventsQueryTP } // dd($season); - $season = GetSeason::load($season, $seasonmode); + $season = GetSeason::load($season, $season_mode); /** * IF WITH PLAYER diff --git a/app/Filament/Widgets/Charts/LoadPerformance.php b/app/Filament/Widgets/Charts/LoadPerformance.php index 9b2a0333..1d6d37ee 100644 --- a/app/Filament/Widgets/Charts/LoadPerformance.php +++ b/app/Filament/Widgets/Charts/LoadPerformance.php @@ -44,12 +44,12 @@ class LoadPerformance $end = $filter['end_date'] ?? 0; $season_or_date = $filter['season_or_date']; $season = $filter['season']; - $seasonmode = $filter['seasonmode']; + $season_mode = $filter['season_mode']; if ($season_or_date == 'season') { $start = 0; $end = 0; } - $season = GetSeason::load($season, $seasonmode); + $season = GetSeason::load($season, $season_mode); $team_map = SofaScoreRosa::pluck('ss_team_name', 'ss_team_id')->toArray(); diff --git a/app/Filament/Widgets/Charts/LoadPlayerWidgets.php b/app/Filament/Widgets/Charts/LoadPlayerWidgets.php index fcc4a66e..79bced71 100644 --- a/app/Filament/Widgets/Charts/LoadPlayerWidgets.php +++ b/app/Filament/Widgets/Charts/LoadPlayerWidgets.php @@ -30,8 +30,8 @@ class LoadPlayerWidgets $player_on_field = $filter['player_on_field'] ?? 'all'; $season = $filter['season']; - $seasonmode = $filter['seasonmode']; - $season = GetSeason::load($season, $seasonmode); + $season_mode = $filter['season_mode']; + $season = GetSeason::load($season, $season_mode); // dd($player_on_field); diff --git a/app/Filament/Widgets/PlayerPropsDrop.php b/app/Filament/Widgets/PlayerPropsDrop.php index cbf85854..5340263e 100644 --- a/app/Filament/Widgets/PlayerPropsDrop.php +++ b/app/Filament/Widgets/PlayerPropsDrop.php @@ -2,19 +2,24 @@ namespace App\Filament\Widgets; -use App\Filament\Widgets\Boxes\LoadPlayerAverages; +use App\Filament\Pages\Selections\LoadPositions; +use App\Filament\Pages\Selections\LoadSeasons; use App\Filament\Widgets\PlayerProps\BoxNames; use App\Filament\Widgets\PlayerProps\Expectations; use App\Filament\Widgets\PlayerProps\LineUpMap; use App\Filament\Widgets\PlayerProps\PositionHirarchie; -use App\Livewire\PlayerCalculator; use App\Models\ExpectedMinimumPosition; +use App\Models\SofaScoreCategory; use App\Models\SofaScorePlayerPosition; use App\Models\SofaScoreRosa; use App\Models\SsLineupMemory; use App\Models\StatisticFixtures; +use App\Models\StatistikoDetail; +use App\Models\StatistikoEvent; +use App\Models\StatistikoPlayer; use Filament\Notifications\Notification; use Filament\Widgets\Widget; +use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; @@ -45,6 +50,16 @@ class PlayerPropsDrop extends Widget public string $team_name = ''; + public string $season_or_date = 'season'; + + public string $season_mode = ''; + + public array $season; + + public string $start_date = ''; + + public string $end_date = ''; + public int $team_id = 0; public int $match_id = 0; @@ -59,6 +74,8 @@ class PlayerPropsDrop extends Widget { $this->activeBoxes = BoxNames::load(); + $this->season_or_date = 'season'; + $this->lineUpMap = LineUpMap::load(); $this->player_on_field_counter = 0; @@ -103,15 +120,79 @@ class PlayerPropsDrop extends Widget } #[On('team-update')] - public function syncData(?int $team_id) + public function teamUpdate(int $team_id) { - if ($team_id) { + $this->team_id = $team_id; - $this->players = PlayerCalculator::load($team_id); + $this->syncData(); + } - $this->team_name = SofaScoreRosa::where('ss_team_id', $team_id)->value('ss_team_name'); + public function syncData() + { + if ($this->team_id) { + $this->players = []; + + $positions_map = LoadPositions::load(); + + $players = $this->loadAverages(); + + foreach ($players as $val) { + + $tmp = []; + $tmp['id'] = $val['ss_player_id']; + $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['color_evt'] = 'success'; + } + } + + 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'] = 4; + } else { + $tmp['area'] = 'defence'; + $tmp['color_pos'] = 'success'; + $tmp['order'] = 5; + } + + $this->players[] = $tmp; + } + + $this->team_name = SofaScoreRosa::where('ss_team_id', $this->team_id)->value('ss_team_name'); - $this->team_id = $team_id; $this->loadPlacement(); } else { $this->team_name = ''; @@ -124,8 +205,14 @@ class PlayerPropsDrop extends Widget public function lineUpUpdate(int|string $activeLineUp) { $this->activeLineUp = $activeLineUp; + $this->lineup = $this->lineUpMap[$activeLineUp]; + $this->loadPlacement(); + + $this->generateLineUp(); + + $this->calculateAspg(); } #[On('element-dropped-in-box')] @@ -168,6 +255,44 @@ class PlayerPropsDrop extends Widget } } + #[On('season_or_date-update')] + public function setSeasonOrData(string $season_or_date) + { + $this->season_or_date = $season_or_date; + + if ($this->player_on_field_counter >= 10) { + $this->calculateAspg(); + } + } + + #[On('start_date-update')] + public function setStartDate(string $start_date) + { + $this->start_date = $start_date; + + if ($this->player_on_field_counter >= 10) { + $this->calculateAspg(); + } + } + + #[On('end_date-update')] + public function setEndDate(string $end_date) + { + $this->end_date = $end_date; + + if ($this->player_on_field_counter >= 10) { + $this->calculateAspg(); + } + } + + #[On('season_mode-update')] + public function setSeason(string $country_id) + { + $season_mode = SofaScoreCategory::where('id', $country_id)->value('season_mode'); + $this->season_mode = $season_mode; + $this->season = LoadSeasons::load($season_mode); + } + public function loadPlacement() { $this->clearResultTable(); @@ -377,6 +502,8 @@ class PlayerPropsDrop extends Widget return; } + + // Log::info($this->team_id, ['calculateAspg']); // Calcolare Aspettativa Team per GOALS // (il valore che appare quando viene selezionato un Evento): nell' esempio, // se scegliamo come Team il Remo (Home) il valore di riferimento sarà 1.2 @@ -391,8 +518,16 @@ class PlayerPropsDrop extends Widget $asp_team = (float) $match->exp_away; $team_home_away = 'away'; } + $arr = [ + 'team_id' => $this->team_id, + 'season_or_date' => $this->season_or_date, + 'season' => $this->season, + 'season_mode' => $this->season_mode, + 'start_date' => $this->end_date, + 'end_date' => $this->end_date, + ]; - $players = LoadPlayerAverages::load($team_id, 'total'); + $players = $this->loadAverages(); $count_player = 0; foreach ($players as $ss_player_id => $value) { @@ -684,7 +819,16 @@ class PlayerPropsDrop extends Widget public function prepareLineUp() { - $players = LoadPlayerAverages::load($this->team_id, 'last180days'); + $arr = [ + 'team_id' => $this->team_id, + 'season_or_date' => $this->season_or_date, + 'season' => $this->season, + 'season_mode' => $this->season_mode, + 'start_date' => $this->start_date, + 'end_date' => $this->end_date, + ]; + + $players = $this->loadAverages(); $arr = collect(); foreach ($players as $value) { @@ -867,4 +1011,129 @@ class PlayerPropsDrop extends Widget } } } + + public function loadAverages(): array + { + if (! $this->team_id) { + return []; + } + // Log::debug('loadAverages', ['team_id' => $this->team_id]); + + $players = StatistikoDetail::where('ss_team_id', $this->team_id)->where('is_active', 1)->get(); + + $player_ids = []; + + foreach ($players as $player) { + $player_ids[] = $player->ss_player_id; + } + + // Log::debug('loadAverages', ['player_ids' => $player_ids]); + + $start_date = null; + $end_date = null; + if ($this->season_or_date == 'season') { + $now = Carbon::now(); + if ($this->season_mode == 'halfyear') { + if ((int) $now->month > 6) { + $season_start = $now->startOfYear()->addMonths(7); + } else { + $season_start = $now->startOfYear()->subMonths(7); + } + } else { + $season_start = $now->startOfYear(); + } + } else { + $season_start = ''; + $start_date = Carbon::parse($this->start_date); + $end_date = Carbon::parse($this->end_date); + // Log::debug('start end', [$start_date->format('Y-m-d').' - '.$end_date->format('Y-m-d')]); + } + + $match_ids = StatistikoEvent::when($start_date, function ($query) use ($start_date) { + return $query->whereDate('starttime', '>', $start_date); + })->when($end_date, function ($query) use ($end_date) { + return $query->whereDate('starttime', '<', $end_date); + })->when($season_start, function ($query) use ($season_start) { + return $query->whereDate('starttime', '>', $season_start); + })->pluck('match_id')->toArray(); + + // Log::debug('loadAverages', ['match_ids' => $match_ids]); + + $res = StatistikoPlayer::with('details') + ->whereIn('ss_player_id', $player_ids) + ->whereIn('match_id', $match_ids) + ->get(); + + $arr = []; + 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; + + if (! isset($arr[$ss_player_id])) { + self::array_template($arr, $ss_player_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; + } 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; + } + $cards = $val->card_yellow + $val->card_yellowred; + + $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; + $arr[$value->ss_player_id]['preferred_foot'] = $value->preferred_foot; + } + } + + // Log::debug('loadAverages final', $arr); + + return $arr; + } + + public static function array_template(array &$arr, int $ss_player_id) + { + $arr[$ss_player_id]['ss_player_id'] = 0; + $arr[$ss_player_id]['total_events'] = 0; + $arr[$ss_player_id]['total_min'] = 0; + $arr[$ss_player_id]['average_min'] = 0; + $arr[$ss_player_id]['events_played_home'] = 0; + $arr[$ss_player_id]['events_played_away'] = 0; + $arr[$ss_player_id]['minutes_played_home'] = 0; + $arr[$ss_player_id]['minutes_played_away'] = 0; + $arr[$ss_player_id]['goals'] = 0; + $arr[$ss_player_id]['fouls'] = 0; + $arr[$ss_player_id]['offsides'] = 0; + $arr[$ss_player_id]['shots_on_target'] = 0; + $arr[$ss_player_id]['shots_off_target'] = 0; + $arr[$ss_player_id]['shots_blocked'] = 0; + $arr[$ss_player_id]['total_shots'] = 0; + $arr[$ss_player_id]['cards'] = 0; + } } diff --git a/app/Livewire/PlayerCalculator.php b/app/Livewire/PlayerCalculator.php deleted file mode 100644 index 329ec1eb..00000000 --- a/app/Livewire/PlayerCalculator.php +++ /dev/null @@ -1,75 +0,0 @@ - 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 (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'] = 4; - } else { - $tmp['area'] = 'defence'; - $tmp['color_pos'] = 'success'; - $tmp['order'] = 5; - } - - $result[] = $tmp; - } - - return $result; - } -} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index df35a610..032b6a78 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -5,9 +5,12 @@ namespace App\Providers; use App\Filament\Resources\Events\Pages\ListEvents; use BezhanSalleh\FilamentShield\Facades\FilamentShield; use Carbon\Carbon; +use Filament\Notifications\Livewire\Notifications; use Filament\Support\Assets\Css; use Filament\Support\Assets\Js; use Filament\Support\Colors\Color; +use Filament\Support\Enums\Alignment; +use Filament\Support\Enums\VerticalAlignment; use Filament\Support\Facades\FilamentAsset; use Filament\Support\Facades\FilamentColor; use Filament\Support\Facades\FilamentTimezone; @@ -37,10 +40,13 @@ class AppServiceProvider extends ServiceProvider FilamentTimezone::set('Europe/Vienna'); + Notifications::alignment(Alignment::Center); + Notifications::verticalAlignment(VerticalAlignment::Start); + /** Alpine Plugin direct */ FilamentView::registerRenderHook( 'panels::head.end', - fn(): HtmlString => new HtmlString(' + fn (): HtmlString => new HtmlString('