diff --git a/app/Filament/Pages/EventMapper.php b/app/Filament/Pages/EventMapper.php
index 2ed6b7c0..ae3f3e9d 100644
--- a/app/Filament/Pages/EventMapper.php
+++ b/app/Filament/Pages/EventMapper.php
@@ -9,6 +9,7 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
+use Illuminate\Support\Facades\Auth;
class EventMapper extends Page
{
@@ -36,9 +37,9 @@ class EventMapper extends Page
ActionGroup::make([
Action::make('bet365')
->extraAttributes(['x-on:click' => 'toggle'])
- ->visible(fn (): bool => auth()->user()->provider_id != 2)
+ ->visible(fn (): bool => Auth::user()->provider_id != 2)
->action(function ($livewire) {
- User::where('id', auth()->user()->id)->update(['provider_id' => 2]);
+ User::where('id', Auth::user()->id)->update(['provider_id' => 2]);
Notification::make()
->title('Event Mapper changed to Bet365')
@@ -49,10 +50,10 @@ class EventMapper extends Page
Action::make('magloo_nigeria')
->label('MAGLOO NIGERIA')
->extraAttributes(['x-on:click' => 'toggle'])
- ->visible(fn (): bool => in_array(auth()->user()->provider_id, [2, 4]))
- ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [10, 16]))
+ ->visible(fn (): bool => in_array(Auth::user()->provider_id, [2, 4]))
+ ->hidden(fn (): bool => ! in_array(Auth::user()->bookmaker_id, [10, 16]))
->action(function ($livewire) {
- User::where('id', auth()->user()->id)->update(['provider_id' => 3]);
+ User::where('id', Auth::user()->id)->update(['provider_id' => 3]);
$livewire->dispatch('refresh');
Notification::make()
@@ -63,10 +64,10 @@ class EventMapper extends Page
Action::make('magloo_kenia')
->label('MAGLOO KENIA')
->extraAttributes(['x-on:click' => 'toggle'])
- ->visible(fn (): bool => in_array(auth()->user()->provider_id, [2, 3]))
- ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [10, 16]))
+ ->visible(fn (): bool => in_array(Auth::user()->provider_id, [2, 3]))
+ ->hidden(fn (): bool => ! in_array(Auth::user()->bookmaker_id, [10, 16]))
->action(function ($livewire) {
- User::where('id', auth()->user()->id)->update(['provider_id' => 4]);
+ User::where('id', Auth::user()->id)->update(['provider_id' => 4]);
$livewire->dispatch('refresh');
Notification::make()
@@ -77,10 +78,10 @@ class EventMapper extends Page
Action::make('logifuture_nigeria')
->label('LOGIFUTURE NIGERA')
->extraAttributes(['x-on:click' => 'toggle'])
- ->visible(fn (): bool => auth()->user()->provider_id == 6)
- ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [35, 36]))
+ ->visible(fn (): bool => Auth::user()->provider_id == 6)
+ ->hidden(fn (): bool => ! in_array(Auth::user()->bookmaker_id, [35, 36]))
->action(function ($livewire) {
- User::where('id', auth()->user()->id)->update(['provider_id' => 5]);
+ User::where('id', Auth::user()->id)->update(['provider_id' => 5]);
$livewire->dispatch('refresh');
@@ -92,10 +93,10 @@ class EventMapper extends Page
Action::make('logifuture_colombia')
->label('LOGIFUTURE COLOMBIA')
->extraAttributes(['x-on:click' => 'toggle'])
- ->visible(fn (): bool => auth()->user()->provider_id == 5)
- ->hidden(fn (): bool => ! in_array(auth()->user()->bookmaker_id, [35, 36]))
+ ->visible(fn (): bool => Auth::user()->provider_id == 5)
+ ->hidden(fn (): bool => ! in_array(Auth::user()->bookmaker_id, [35, 36]))
->action(function ($livewire) {
- User::where('id', auth()->user()->id)->update(['provider_id' => 6]);
+ User::where('id', Auth::user()->id)->update(['provider_id' => 6]);
$livewire->dispatch('refresh');
@@ -107,7 +108,7 @@ class EventMapper extends Page
])
->label('Swop Bookmaker')
->icon('phosphor-dots-three-vertical')
- ->visible(fn (): bool => auth()->user()->hasRole('mapper_source_betsapi'))
+ ->visible(fn (): bool => Auth::user()->hasRole('mapper_source_betsapi'))
->color('primary')
->button(),
];
diff --git a/app/Filament/Pages/PlayerProps.php b/app/Filament/Pages/PlayerProps.php
index 46697e44..5357d61c 100644
--- a/app/Filament/Pages/PlayerProps.php
+++ b/app/Filament/Pages/PlayerProps.php
@@ -15,14 +15,19 @@ use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Select;
+use Filament\Forms\Components\Slider;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Navigation\NavigationItem;
use Filament\Pages\Page;
+use Filament\Schemas\Components\Grid;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set;
+use Filament\Schemas\Components\View;
use Filament\Schemas\Schema;
+use Filament\Support\RawJs;
use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\HtmlString;
use Livewire\Attributes\On;
class PlayerProps extends Page implements HasForms
@@ -83,21 +88,28 @@ class PlayerProps extends Page implements HasForms
public function form(Schema $schema): Schema
{
return $schema
- ->columns(5)
->components([
- $this->selectCountry(),
- $this->selectLeague(),
- $this->selectMatch(),
- $this->selectTeam(),
- $this->selectLineup(),
- $this->radioSeasonOrDate(),
- $this->datePickerStartDate(),
- $this->datePickerEndDate(),
+ Grid::make(9)
+ ->schema([
+ $this->selectCountry(),
+ $this->selectLeague(),
+ $this->selectMatch(),
+ $this->selectTeam(),
+ $this->selectLineup(),
+ $this->radioSeasonOrDate(),
+ $this->sliderValue(),
+ $this->selectSeason(),
+ $this->dateSplitter(),
+ View::make('components.form-lockout'),
+ ])
+ ->extraAttributes([
+ 'wire:loading.class' => 'opacity-60 pointer-events-none transition-opacity',
+ ]),
])->statePath('filterData');
}
#[On('team-update')]
- public function syncData($team_id)
+ public function syncData(int $team_id)
{
if ($team_id) {
$this->team_id = $team_id;
@@ -191,6 +203,7 @@ class PlayerProps extends Page implements HasForms
private function selectTeam(): Select
{
return Select::make('tid')
+ ->columnSpan(2)
->live()
->hiddenLabel()
->prefixIconColor(fn (Get $get): string => $get('tid') ? 'success' : 'danger')
@@ -211,8 +224,11 @@ class PlayerProps extends Page implements HasForms
->placeholder('Team')
->afterStateUpdated(function ($state, Set $set) {
if ($state) {
+
$this->dispatch('team-update', team_id: $state);
+
$tmp = SsLineupMemory::where('client_id', Auth::user()->client_id)->where('team_id', $state)->orderBy('created_at', 'desc')->first();
+
if ($tmp) {
$set('lineup', $tmp->lineup);
$this->dispatch('lineup-update', activeLineUp: $tmp->lineup);
@@ -224,6 +240,7 @@ class PlayerProps extends Page implements HasForms
private function selectLeague(): Select
{
return Select::make('lid')
+ ->columnSpan(2)
->live()
->preload()
->prefixIconColor(fn (Get $get): string => $get('lid') ? 'success' : 'danger')
@@ -231,16 +248,18 @@ class PlayerProps extends Page implements HasForms
->hiddenLabel()
->options(fn (Get $get) => LoadStatisticFixturesLeaguesOptions::load($get('cid')))
->placeholder('League')
- ->afterStateUpdated(function (callable $set) {
+ ->afterStateUpdated(function (callable $set, $state) {
$set('mid', null);
$set('tid', null);
$this->dispatch('clear-all');
+ $this->dispatch('liga_id-update', liga_id: $state);
});
}
private function selectMatch(): Select
{
return Select::make('mid')
+ ->columnSpan(2)
->live()
->hiddenLabel()
->prefixIconColor(fn (Get $get): string => $get('mid') ? 'success' : 'danger')
@@ -289,6 +308,7 @@ class PlayerProps extends Page implements HasForms
private function selectCountry(): Select
{
return Select::make('cid')
+ ->columnSpan(2)
->live()
->preload()
->searchable(false)
@@ -306,6 +326,9 @@ class PlayerProps extends Page implements HasForms
});
}
+ /**
+ * SECOND LINE
+ */
private function radioSeasonOrDate(): Radio
{
return Radio::make('season_or_date')
@@ -318,52 +341,137 @@ class PlayerProps extends Page implements HasForms
->default('season')
->hiddenLabel()
->options([
- 'season' => 'Active Season',
+ 'season' => 'Season',
'date' => 'Date',
])->afterStateUpdated(function ($state) {
$this->dispatch('season_or_date-update', season_or_date: $state);
});
}
- private function datePickerStartDate(): DatePicker
+ private function sliderValue(): Slider
{
- return DatePicker::make('start_date')
+ return Slider::make('part_1_value')
+ ->columnSpan(2)
+ ->live(debounce: 500)
+ ->hiddenLabel()
+ ->hidden(fn (Get $get) => $get('similar_past_matches') == 'none')
+ ->fillTrack()
+ ->minValue(0)
+ ->maxValue(100)
+ ->default(60)
+ ->decimalPlaces(0)
+ ->tooltips(RawJs::make(<<<'JS'
+ `${$value.toFixed()}%`
+ JS))
+ ->pips()
+ ->afterStateUpdated(function ($state) {
+ $this->dispatch('part_1_value-update', part_1_value: $state);
+ });
+ }
+
+ private function selectSeason(): Select
+ {
+ return Select::make('season_selected')
+ ->live()
+ ->columnSpan(2)
+ ->hiddenLabel()
+ ->multiple()
+ ->placeholder('Current Season')
+ ->disabled(fn (Get $get) => $get('cid') == null)
+ ->hidden(fn (Get $get) => $get('season_or_date') == 'date')
+ ->prefixIconColor(fn (Get $get): string => $get('cid') ? 'success' : 'danger')
+ ->prefixIcon('phosphor-calendar-star')
+ ->suffixAction(
+ Action::make('iconInfo')
+ ->icon('phosphor-question')
+ ->color('success')
+ ->tooltip(function (Get $get) {
+ if ($get('cid') == null) {
+ return 'Select country first';
+ } else {
+ return new HtmlString('Splits data in 2 Parts
A) Seasons selected, value is % from slider
B) Contains rest from DB, value is 100 - slider value');
+ }
+ }))
+ ->options(function (Get $get) {
+ 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'];
+ }
+ })
+ ->afterStateUpdated(function (callable $set, $state) {
+ $set('ss_player_id', null);
+ $this->dispatch('season_selected-update', season_selected: $state);
+ });
+ }
+
+ private function dateSplitter(): DatePicker
+ {
+ return DatePicker::make('date_spliter')
+ ->columnSpan(2)
->live()
->hiddenLabel()
->hidden(fn (Get $get) => $get('season_or_date') == 'season')
->native(false)
+ ->prefixAction(
+ Action::make('iconInfo')
+ ->tooltip(fn () => new HtmlString('Splits data in 2 Parts
A) Data before day selected, takes % from slider
B) Data after day selected takes rest, value is % 100 - slider value'))
+ ->icon('phosphor-question')
+ ->color('success')
+ )
->prefixIconColor(fn (Get $get): string => $get('start_date') ? 'success' : 'primary')
- ->prefixIcon('phosphor-calendar')
- ->prefix('Start')
+ // ->prefixIcon('phosphor-calendar')
+ ->prefix('Split')
->closeOnDateSelection()
->suffixAction(
Action::make('clear_start')
->icon('phosphor-x')
->color('gray')
- ->action(fn (Set $set) => $set('start_date', null))
+ ->action(fn (Set $set) => $set('date_spliter', null))
)->afterStateUpdated(function ($state) {
- $this->dispatch('start_date-update', start_date: $state);
+ $this->dispatch('date_spliter-update', $state);
});
}
- private function datePickerEndDate(): DatePicker
- {
- return DatePicker::make('end_date')
- ->live()
- ->hiddenLabel()
- ->hidden(fn (Get $get) => $get('season_or_date') == 'season')
- ->native(false)
- ->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);
- });
- }
+ // private function datePickerStartDate(): DatePicker
+ // {
+ // return DatePicker::make('start_date')
+ // ->live()
+ // ->hiddenLabel()
+ // ->hidden(fn (Get $get) => $get('season_or_date') == 'season')
+ // ->native(false)
+ // ->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
+ // {
+ // return DatePicker::make('end_date')
+ // ->live()
+ // ->hiddenLabel()
+ // ->hidden(fn (Get $get) => $get('season_or_date') == 'season')
+ // ->native(false)
+ // ->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/Widgets/PlayerPropsDrop.php b/app/Filament/Widgets/PlayerPropsDrop.php
index 4e359edb..2e1a9b9a 100644
--- a/app/Filament/Widgets/PlayerPropsDrop.php
+++ b/app/Filament/Widgets/PlayerPropsDrop.php
@@ -2,27 +2,22 @@
namespace App\Filament\Widgets;
-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\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 App\Traits\PlayerProps\BestLineUp;
+use App\Traits\PlayerProps\ClearBoxes;
+use App\Traits\PlayerProps\CopyData;
+use App\Traits\PlayerProps\Expectations;
+use App\Traits\PlayerProps\LineUpMap;
+use App\Traits\PlayerProps\LineUps;
+use App\Traits\PlayerProps\Placements;
+use App\Traits\PlayerProps\PlayerAspg;
+use App\Traits\PlayerProps\PlayerDataMerge;
+use App\Traits\PlayerProps\PlayerFilter;
+use App\Traits\PlayerProps\PlayerForPosition;
+use App\Traits\PlayerProps\PlayerQuery;
+use App\Traits\PlayerProps\SyncData;
use Filament\Widgets\Widget;
-use Illuminate\Support\Carbon;
-use Illuminate\Support\Collection;
-use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\Log;
use Livewire\Attributes\On;
/**
@@ -30,12 +25,36 @@ use Livewire\Attributes\On;
*/
class PlayerPropsDrop extends Widget
{
+ use BestLineUp;
+ use ClearBoxes;
+ use CopyData;
+ use Expectations;
+ use LineUpMap;
+ use LineUps;
+ use Placements;
+ use PlayerAspg;
+ use PlayerDataMerge;
+ use PlayerFilter;
+ use PlayerForPosition;
+ use PlayerQuery;
+ use SyncData;
+
protected string $view = 'livewire.player-props-drop';
public float $x_value = 3;
public float $y_value = 180;
+ public int $count_player;
+
+ public int $home_id;
+
+ public int $away_id;
+
+ public string $team_home_away;
+
+ public float $asp_team;
+
public array $activeBoxes;
public array $beschriftung;
@@ -54,16 +73,18 @@ class PlayerPropsDrop extends Widget
public string $season_mode = '';
- public array $season;
+ public string $date_spliter = '';
- public string $start_date = '';
-
- public string $end_date = '';
+ public array $season_selected;
public int $team_id = 0;
+ public int $liga_id = 0;
+
public int $match_id = 0;
+ public int $part_1_value = 60;
+
public int $player_on_field_counter;
public array $calculationVariables;
@@ -76,7 +97,7 @@ class PlayerPropsDrop extends Widget
$this->season_or_date = 'season';
- $this->lineUpMap = LineUpMap::load();
+ $this->lineUpMap = $this->loadLineUpMaps();
$this->player_on_field_counter = 0;
@@ -128,81 +149,23 @@ class PlayerPropsDrop extends Widget
$this->syncData($team_id);
}
- public function syncData(int $team_id)
+ #[On('part_1_value-update')]
+ public function setPart1Value(int $part_1_value)
{
- if ($team_id) {
- $this->players = [];
+ $this->part_1_value = $part_1_value;
- $positions_map = LoadPositions::load();
+ if ($this->player_on_field_counter >= 10) {
- $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'];
- $tmp['wfl'] = $val['was_fouled'];
-
- $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->loadPlacement();
- } else {
- $this->team_name = '';
- $this->clearResultTable();
- $this->players = [];
+ $this->calculateAspg();
}
}
+ #[On('liga_id-update')]
+ public function ligaUpdate(int $liga_id)
+ {
+ $this->liga_id = $liga_id;
+ }
+
#[On('lineup-update')]
public function lineUpUpdate(int|string $activeLineUp)
{
@@ -210,11 +173,7 @@ class PlayerPropsDrop extends Widget
$this->lineup = $this->lineUpMap[$activeLineUp];
- $this->loadPlacement();
-
$this->generateLineUp();
-
- $this->calculateAspg();
}
#[On('element-dropped-in-box')]
@@ -267,577 +226,32 @@ class PlayerPropsDrop extends Widget
}
}
- #[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()
+ #[On('season_selected-update')]
+ public function setSeasonSelected(array $season_selected)
{
- $this->clearResultTable();
-
- if ($this->team_id) {
-
- $this->player_on_field_counter = 0;
-
- $res = SsLineupMemory::where('client_id', Auth::user()->client_id)->where('team_id', $this->team_id)->where('lineup', $this->activeLineUp)->first();
-
- if ($res) {
-
- $placement = json_decode($res->placement, 1);
-
- foreach ($this->players as $k => $record) {
-
- // dd($this->lineup, $record, $stored_positions);
-
- $id = $record['id'];
- if (isset($placement[$id]) && in_array($placement[$id], $this->lineup)) {
- $this->boxes[$placement[$id]] = $record;
- $this->players[$k]['active'] = 1;
- $this->players[$k]['pos'] = $record['pos_ori'];
-
- $this->player_on_field_counter++;
- }
- }
- }
- }
- // dd('here');
- $this->calculateAspg();
- }
-
- public function storePlacement()
- {
- $store = [];
- foreach ($this->boxes as $pos => $value) {
- if ($value) {
- $store[$value['id']] = $pos;
- }
- }
- SsLineupMemory::updateOrCreate([
- 'client_id' => Auth::user()->client_id,
- 'team_id' => $this->team_id,
- 'lineup' => $this->activeLineUp,
- ], [
- 'placement' => json_encode($store),
- 'team_name' => $this->team_name,
- ]);
- }
-
- public function updateLineup(?string $state)
- {
- $this->clearResultTable();
-
- if (isset($this->lineupsMap[$state])) {
- $this->lineup = $this->lineupsMap[$state];
- } else {
- $this->lineup = [];
+ $this->season_selected = $season_selected;
+ if ($this->player_on_field_counter >= 10) {
+ $this->calculateAspg();
}
}
- public function clearBox(int $boxNumber): void
+ #[On('date_spliter-update')]
+ public function setDateSpliter(string $date_spliter)
{
- if (isset($this->boxes[$boxNumber])) {
- $tmp = $this->boxes[$boxNumber];
- $player_id = 0;
- foreach ($tmp as $key => $value) {
- if ($key == 'id') {
- $player_id = $value;
- }
- }
- foreach ($this->players as $k => $record) {
- if ($record['id'] == (int) $player_id) {
- $this->boxes[$boxNumber] = [];
- $this->players[$k]['pos'] = '';
- $this->players[$k]['active'] = 0;
-
- $this->player_on_field_counter--;
- }
- }
-
- foreach ($this->players as $k => $record) {
- $this->players[$k]['gls'] = '';
- $this->players[$k]['fls'] = '';
- $this->players[$k]['ofs'] = '';
- $this->players[$k]['crd'] = '';
- $this->players[$k]['snt'] = '';
- $this->players[$k]['tsh'] = '';
- $this->players[$k]['wfl'] = '';
- }
-
- $this->storePlacement();
-
- $this->loadPlacement();
+ $this->date_spliter = $date_spliter;
+ if ($this->player_on_field_counter >= 10) {
+ $this->calculateAspg();
}
}
- public function clearResultTable(): void
- {
-
- for ($i = 1; $i <= 35; $i++) {
- $this->boxes[$i] = [];
- }
-
- foreach ($this->players as $k => $record) {
- // $this->players[$k] = [];
- $this->players[$k]['active'] = 0;
- $this->players[$k]['gls'] = '';
- $this->players[$k]['fls'] = '';
- $this->players[$k]['ofs'] = '';
- $this->players[$k]['crd'] = '';
- $this->players[$k]['snt'] = '';
- $this->players[$k]['tsh'] = '';
- $this->players[$k]['wfl'] = '';
- }
-
- $this->player_on_field_counter = 0;
-
- $this->dispatch('update-players', players: $this->players);
- }
-
- public function copyDevelopment()
- {
- if ($this->player_on_field_counter < 10) {
- Notification::make()->title('Needs a calculation first ')
- ->info()
- ->send();
-
- return;
- }
-
- $copystring = '';
-
- foreach ($this->calculationVariables as $row) {
- if ($copystring == '') {
- $keys = array_keys($row);
- $copystring .= implode(';', $keys)."\n";
- }
- $copystring .= implode(';', $row)."\n";
- }
- $this->js("navigator.clipboard.writeText(`$copystring`)");
-
- Notification::make()
- ->title('Calculation variables copied')
- ->success()
- ->send();
- }
-
- public function copyResult()
- {
- if ($this->player_on_field_counter < 10) {
- Notification::make()->title('Needs a calculation first ')
- ->info()
- ->send();
-
- return;
- }
- $header = ['name', 'foot', 'events', 'average min', 'position', 'on field', 'gls', 'fls', 'ofs', 'crd', 'snt', 'tsh', 'wfl'];
- $copystring = implode(';', $header)."\n";
- foreach ($this->players as $row) {
- $tmp = [];
- $tmp[] = $row['name'];
- $tmp[] = $row['foot'];
- $tmp[] = $row['tot_evt'];
- $tmp[] = $row['ave_min'];
- if ($row['pos']) {
- $tmp[] = $row['pos'];
- } else {
- $tmp[] = $row['pos_ori'];
- }
- $tmp[] = $row['active'];
- $tmp[] = $row['gls'];
- $tmp[] = $row['fls'];
- $tmp[] = $row['ofs'];
- $tmp[] = $row['crd'];
- $tmp[] = $row['snt'];
- $tmp[] = $row['tsh'];
- $tmp[] = $row['wfl'];
-
- $copystring .= implode(';', $tmp)."\n";
- }
- $this->js("navigator.clipboard.writeText(`$copystring`)");
-
- Notification::make()
- ->title('Results copied')
- ->success()
- ->send();
- }
-
- public function calculateAspg($manual = false): void
- {
- if ($this->player_on_field_counter < 10) {
- foreach ($this->players as $k => $record) {
- $this->players[$k]['gls'] = '';
- $this->players[$k]['fls'] = '';
- $this->players[$k]['ofs'] = '';
- $this->players[$k]['crd'] = '';
- $this->players[$k]['snt'] = '';
- $this->players[$k]['tsh'] = '';
- $this->players[$k]['wfl'] = '';
- }
-
- $this->dispatch('update-players', players: $this->players);
-
- if ($manual) {
- Notification::make()->title('Calculation needs 10 player on field')
- ->info()
- ->send();
- }
-
- return;
- }
-
- if (! $this->team_id && ! $this->match_id) {
- 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
- $team_id = $this->team_id;
- $match = StatisticFixtures::where('id', $this->match_id)->first();
- $asp_team = 0;
- $team_home_away = 'home';
- if ((int) $match->home_id == (int) $team_id) {
- $asp_team = (float) $match->exp_home;
- $team_home_away = 'home';
- } elseif ((int) $match->away_id == (int) $team_id) {
- $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 = $this->loadAverages();
-
- $count_player = 0;
- foreach ($players as $ss_player_id => $value) {
- if ($value['position'] != 'GK') {
- $count_player++;
- }
- }
-
- $results = [];
-
- foreach ($players as $val) {
- if ($val['position'] != 'GK') {
-
- /***
- "goals" => 0
- "fouls" => 13
- "cards" => 3
- "offsides" => 0
- "shots_on_target" => 3
- "shots_off_target" => 2
- "total_shots" => 4
- */
-
- $ss_player_id = $val['ss_player_id'];
- $position = $val['position'];
-
- $tmp = [];
- $tmp['id'] = $ss_player_id;
- $tmp['name'] = $val['player_name'];
-
- $tmp['id_team'] = $team_id;
- $tmp['asp_team'] = $asp_team;
- $tmp['player_count_without_gk'] = $count_player;
-
- $position_field = $this->get_position($ss_player_id);
- if ($position_field) {
- $position = $position_field;
- $tmp['active'] = 1;
- } else {
- $tmp['active'] = 0;
- }
- $tmp['pos'] = $position;
-
- // Aspettativa di Gioco (AdG) = Somma Goals fatti da Player nel DB / Somma Minuti Giocati da Player (SMG) nel DB * 90.
- // Se la SMG è < Y per quel Player prenderemo in considerazione solo l'Aspettativa Statistica (AS).
- // 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'];
-
- // il valore corrispondente al ruolo del Player (esempio un giocatore in Details ha ruolo = RW
- // quindi Aspettativa Statistica (AS) per RW = 0.219)
- // exp_goals
- // exp_assists
- // exp_cards
- // exp_fouls
- // exp_was_fouled
- // exp_offsides
- // exp_total_shots
- // exp_shots_on_target
-
- $bettypes = ['goals', 'cards', 'fouls', 'offsides', 'total_shots', 'shots_on_target', 'was_fouled'];
- foreach ($bettypes as $bettype) {
-
- $asp_statistica = (float) SofaScorePlayerPosition::where('ss_code', $position)->value('exp_'.$bettype);
- $tmp['asp_statistica_'.$bettype] = $asp_statistica;
-
- // if ($val->ss_player_id == 243651)
- // dd($val, $asp_statistica);
-
- // if ($val->total_min < $this->y_value) {
- // $asp_gioco = 0;
- // } else {
- // $asp_gioco = $val->shots_on_target / $val->total_min * 90;
- // }
-
- switch ($bettype) {
- case 'goals':
- $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 {
- $tmp['asp_gioco_'.$bettype] = $asp_gioco;
- $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
- }
- break;
- case 'cards':
- $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 {
- $tmp['asp_gioco_'.$bettype] = $asp_gioco;
- $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
- }
- break;
- case 'fouls':
- $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 {
- $tmp['asp_gioco_'.$bettype] = $asp_gioco;
- $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
- }
- break;
- case 'offsides':
- $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 {
- $tmp['asp_gioco_'.$bettype] = $asp_gioco;
- $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
- }
- break;
- case 'total_shots':
- $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 {
- $tmp['asp_gioco_'.$bettype] = $asp_gioco;
- $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
- }
- 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) {
- $tmp['asp_gioco_'.$bettype] = 0;
- $tmp['asp_teorica_'.$bettype] = $asp_statistica;
- } else {
- $tmp['asp_gioco_'.$bettype] = $asp_gioco;
- $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
- }
- break;
- case 'was_fouled':
- $asp_gioco = $val['was_fouled'] / $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 {
- $tmp['asp_gioco_'.$bettype] = $asp_gioco;
- $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
- }
- break;
- }
- }
-
- // Calcolare la Somma di tutte le AT (colonna G della Tabella)
- // Considerare la ATR calcolata allo Step 1 (colonna I della Tabella)
- // Aspettativa per Player: AP = AT * ATR / TOT AT
- $results[] = $tmp;
- }
- }
-
- $asp_team_all = Expectations::load($match);
-
- // Aspettativa Team di Riferimento
- // (ATR) = Aspettativa Team * Numero di Giocatori di Team in Rosters (esclusi i portieri) / 10.
- // Ad esempio per Remo (supponiamo 24 giocatori nel Roster esclusi i portieri): ATR = 1.2 * 24 / 10 = 2.88
-
- $bettypes = ['goals', 'cards', 'fouls', 'offsides', 'total_shots', 'shots_on_target', 'was_fouled'];
- foreach ($bettypes as $bettype) {
-
- $total_bettype = array_sum(array_column($results, 'asp_teorica_'.$bettype));
-
- foreach ($results as $key => $value) {
- switch ($bettype) {
- case 'goals':
- // Aspettativa per Player: AP = AT * ATR / TOT AT
- // $results[$key]['asp_player_'.$bettype] = ((float) $value['asp_team'] * (float) $value['asp_teorica_'.$bettype]) / $total_bettype;
- // $results[$key]['asp_player_'.$bettype] = ($asp_team * $asp_team_riferimento) / $total_bettype;
-
- $asp_team_riferimento = (float) $asp_team * $count_player / 10;
- $results[$key]['asp_riferimento_goals'] = $asp_team_riferimento;
- $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
- $results[$key]['asp_total_'.$bettype] = $total_bettype;
- break;
- case 'cards':
- $asp_team_riferimento = (float) $asp_team_all[$team_home_away]['crd'] * $count_player / 10;
- $results[$key]['asp_team_riferimento_card'] = $asp_team_riferimento;
- $results[$key]['asp_total_'.$bettype] = $total_bettype;
- $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
- break;
- case 'fouls':
- $asp_team_riferimento = (float) $asp_team_all[$team_home_away]['fls'] * $count_player / 10;
- $results[$key]['asp_team_riferimento_fouls'] = $asp_team_riferimento;
- $results[$key]['asp_total_'.$bettype] = $total_bettype;
- $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
- break;
- case 'offsides':
- $asp_team_riferimento = (float) $asp_team_all[$team_home_away]['ofs'] * $count_player / 10;
- $results[$key]['asp_team_riferimento_offside'] = $asp_team_riferimento;
- $results[$key]['asp_total_'.$bettype] = $total_bettype;
- $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
- break;
- case 'total_shots':
- $asp_team_riferimento = (float) $asp_team_all[$team_home_away]['tsh'] * $count_player / 10;
- $results[$key]['asp_team_riferimento_tsh'] = $asp_team_riferimento;
- $results[$key]['asp_total_'.$bettype] = $total_bettype;
- $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
- break;
- case 'shots_on_target':
- $asp_team_riferimento = (float) $asp_team_all[$team_home_away]['snt'] * $count_player / 10;
- $results[$key]['asp_team_riferimento_snt'] = $asp_team_riferimento;
- $results[$key]['asp_total_'.$bettype] = $total_bettype;
- $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
- break;
- case 'was_fouled':
- $asp_team_riferimento = (float) $asp_team_all[$team_home_away]['wfl'] * $count_player / 10;
- $results[$key]['asp_team_riferimento_wfl'] = $asp_team_riferimento;
- $results[$key]['asp_total_'.$bettype] = $total_bettype;
- $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
- break;
- }
- }
- }
-
- $map = [];
- $res = ExpectedMinimumPosition::all();
- foreach ($res as $val) {
- $map[$val->position]['gls'] = $val->gls;
- $map[$val->position]['crd'] = $val->crd;
- $map[$val->position]['fls'] = $val->fls;
- $map[$val->position]['ofs'] = $val->ofs;
- $map[$val->position]['tsh'] = $val->tsh;
- $map[$val->position]['snt'] = $val->snt;
- $map[$val->position]['wfl'] = $val->wfl;
- }
-
- // stesso ordine di prima: GLS, CRD, FLS, OFS, TSH, SNT, WFL
-
- foreach ($this->players as $k => $player) {
- foreach ($results as $key => $result) {
- if ((int) $player['id'] == (int) $result['id']) {
-
- $this->players[$k]['active'] = $result['active'];
-
- $pos = $this->players[$k]['pos'];
- if (! $pos) {
- $pos = $this->players[$k]['pos_ori'];
- }
-
- 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]['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]['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]['wfl'], 3);
- $final = number_format($result['asp_player_was_fouled'], 3);
- $results[$key]['finale_tamx_wfl'] = $tamx;
- $results[$key]['finale_calc_wfl'] = $final;
- $this->players[$k]['wfl'] = (float) $final > (float) $tamx ? $final : $tamx;
- }
- }
- }
- }
-
- $this->calculationVariables = $results;
-
- $this->dispatch('update-players', players: $this->players);
- }
-
public function get_position(int $ss_player_id)
{
// see if player is in field and if yes get new position
@@ -849,325 +263,4 @@ class PlayerPropsDrop extends Widget
return false;
}
-
- public function prepareLineUp()
- {
- $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) {
- if ($value['position'] != '') {
- $arr->push([
- 'id' => $value['ss_player_id'],
- 'min' => $value['average_min'],
- 'pos' => $value['position'],
- 'name' => $value['player_name'],
- ]);
- }
- }
-
- return $arr;
- }
-
- public function generateLineUp(): void
- {
- if ($this->activeLineUp && $this->team_id) {
-
- $players = $this->prepareLineUp();
-
- $places = LineUpMap::get($this->activeLineUp);
-
- $lineup = [];
-
- $id_used = [];
-
- foreach ($places as $place) {
- $this->getPlayerForPosition($lineup, $id_used, $place, $players);
- }
-
- for ($i = 1; $i <= 35; $i++) {
- $this->boxes[$i] = [];
- }
-
- $this->clearResultTable();
-
- $this->player_on_field_counter = 0;
-
- foreach ($this->players as $k => $record) {
- $id = $record['id'];
- if (isset($lineup[$id])) {
-
- $this->boxes[$lineup[$id]['place']] = $record;
-
- $this->players[$k]['active'] = 1;
- $this->players[$k]['pos'] = $lineup[$id]['position'];
-
- $this->player_on_field_counter++;
- } else {
- $this->players[$k]['active'] = 0;
- $this->players[$k]['pos'] = '';
- }
- }
-
- $this->calculateAspg();
-
- $this->storePlacement();
- }
- }
-
- public function majorFormations(): array
- {
- // 343+
- // 352
- // 433+
- // 442+
- // 4231
- // 4321+
- // 4312+
- // 4411+
- return [
- '343+' => [9, 16, 23, 4, 11, 25, 32, 6, 34, 21],
- '352' => [9, 16, 23, 4, 11, 17, 25, 32, 20, 21],
- '433+' => [2, 9, 23, 30, 11, 18, 25, 6, 34, 21],
- '442+' => [2, 9, 23, 30, 4, 11, 25, 32, 20, 21],
- '4231' => [2, 9, 23, 30, 10, 24, 12, 19, 26, 21],
- '4321+' => [2, 9, 23, 30, 11, 18, 25, 12, 26, 21],
- '4312+' => [2, 9, 23, 30, 11, 18, 25, 19, 20, 21],
- '4411+' => [2, 9, 23, 30, 4, 11, 25, 32, 19, 21],
- ];
- }
-
- public function generateBestLineUp(): void
- {
- if (! $this->team_id) {
- return;
- }
-
- $all_lineups = [];
-
- $players = $this->prepareLineUp();
-
- $major_formations = self::majorFormations();
-
- foreach ($major_formations as $formation_name => $formation_positions) {
-
- $lineup = [];
-
- $id_used = [];
-
- foreach ($formation_positions as $place) {
- $this->getPlayerForPosition($lineup, $id_used, $place, $players);
- }
-
- $all_lineups[$formation_name] = $lineup;
- }
-
- $tmp = [];
- foreach ($all_lineups as $formation_name => $lineup) {
- $tmp[$formation_name] = array_sum(array_column($lineup, 'min'));
- }
- $formation_name = array_search(max($tmp), $tmp);
-
- // dd($all_lineups, $tmp, $formation_name);
-
- $this->dispatch('update-lineup', $formation_name);
-
- $this->lineUpUpdate($formation_name);
-
- }
-
- public function getPlayerForPosition(array &$lineup, array &$id_used, int $place, Collection $players)
- {
- $log = 0;
-
- $position = $this->activeBoxes[$place];
-
- $hirarchy = PositionHirarchie::load();
-
- $fitered = $players->where('pos', $position)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
-
- if (isset($fitered['id'])) {
-
- if ($log) {
- Log::debug("A $place - $position", $fitered);
- }
-
- $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
- $id_used[] = $fitered['id'];
- } else {
- if (isset($hirarchy[$position])) {
- $position2 = $hirarchy[$position][0];
- $fitered = $players->where('pos', $position2)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
-
- if (isset($fitered['id'])) {
- $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
- $id_used[] = $fitered['id'];
- if ($log) {
- Log::debug("B $place - $position $position2", $fitered);
- }
-
- } elseif (isset($hirarchy[$position][1])) {
- $position3 = $hirarchy[$position][1];
- $fitered = $players->where('pos', $position3)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
-
- if (isset($fitered['id'])) {
- if ($log) {
- Log::debug("C $place - $position $position2 $position3", $fitered);
- }
-
- $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
- $id_used[] = $fitered['id'];
- } elseif (isset($hirarchy[$position][2])) {
- $position4 = $hirarchy[$position][2];
- $fitered = $players->where('pos', $position4)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
-
- if (isset($fitered['id'])) {
- if ($log) {
- Log::debug("D $place - $position $position2 $position3 $position4", $fitered);
- }
-
- $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
- $id_used[] = $fitered['id'];
- }
- }
- }
- }
- }
- }
-
- 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;
- $arr[$ss_player_id]['was_fouled'] += $val->was_fouled;
- }
-
- 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]['was_fouled'] = 0;
- $arr[$ss_player_id]['cards'] = 0;
- }
}
diff --git a/app/Traits/PlayerProps/BestLineUp.php b/app/Traits/PlayerProps/BestLineUp.php
new file mode 100644
index 00000000..64556ef8
--- /dev/null
+++ b/app/Traits/PlayerProps/BestLineUp.php
@@ -0,0 +1,67 @@
+ [9, 16, 23, 4, 11, 25, 32, 6, 34, 21],
+ '352' => [9, 16, 23, 4, 11, 17, 25, 32, 20, 21],
+ '433+' => [2, 9, 23, 30, 11, 18, 25, 6, 34, 21],
+ '442+' => [2, 9, 23, 30, 4, 11, 25, 32, 20, 21],
+ '4231' => [2, 9, 23, 30, 10, 24, 12, 19, 26, 21],
+ '4321+' => [2, 9, 23, 30, 11, 18, 25, 12, 26, 21],
+ '4312+' => [2, 9, 23, 30, 11, 18, 25, 19, 20, 21],
+ '4411+' => [2, 9, 23, 30, 4, 11, 25, 32, 19, 21],
+ ];
+ }
+
+ public function generateBestLineUp(): void
+ {
+ if (! $this->team_id) {
+ return;
+ }
+
+ $all_lineups = [];
+
+ $players = $this->prepareLineUp();
+
+ $major_formations = self::majorFormations();
+
+ foreach ($major_formations as $formation_name => $formation_positions) {
+
+ $lineup = [];
+
+ $id_used = [];
+
+ foreach ($formation_positions as $place) {
+ $this->getPlayerForPosition($lineup, $id_used, $place, $players);
+ }
+
+ $all_lineups[$formation_name] = $lineup;
+ }
+
+ $tmp = [];
+ foreach ($all_lineups as $formation_name => $lineup) {
+ $tmp[$formation_name] = array_sum(array_column($lineup, 'min'));
+ }
+ $formation_name = array_search(max($tmp), $tmp);
+
+ // dd($all_lineups, $tmp, $formation_name);
+
+ $this->dispatch('update-lineup', $formation_name);
+
+ $this->lineUpUpdate($formation_name);
+
+ }
+}
diff --git a/app/Traits/PlayerProps/ClearBoxes.php b/app/Traits/PlayerProps/ClearBoxes.php
new file mode 100644
index 00000000..f1a8dae0
--- /dev/null
+++ b/app/Traits/PlayerProps/ClearBoxes.php
@@ -0,0 +1,66 @@
+boxes[$boxNumber])) {
+ $tmp = $this->boxes[$boxNumber];
+ $player_id = 0;
+ foreach ($tmp as $key => $value) {
+ if ($key == 'id') {
+ $player_id = $value;
+ }
+ }
+ foreach ($this->players as $k => $record) {
+ if ($record['id'] == (int) $player_id) {
+ $this->boxes[$boxNumber] = [];
+ $this->players[$k]['pos'] = '';
+ $this->players[$k]['active'] = 0;
+
+ $this->player_on_field_counter--;
+ }
+ }
+
+ foreach ($this->players as $k => $record) {
+ $this->players[$k]['gls'] = '';
+ $this->players[$k]['fls'] = '';
+ $this->players[$k]['ofs'] = '';
+ $this->players[$k]['crd'] = '';
+ $this->players[$k]['snt'] = '';
+ $this->players[$k]['tsh'] = '';
+ $this->players[$k]['wfl'] = '';
+ }
+
+ $this->storePlacement();
+
+ $this->loadPlacement();
+ }
+ }
+
+ public function clearResultTable(): void
+ {
+
+ for ($i = 1; $i <= 35; $i++) {
+ $this->boxes[$i] = [];
+ }
+
+ foreach ($this->players as $k => $record) {
+ // $this->players[$k] = [];
+ $this->players[$k]['active'] = 0;
+ $this->players[$k]['gls'] = '';
+ $this->players[$k]['fls'] = '';
+ $this->players[$k]['ofs'] = '';
+ $this->players[$k]['crd'] = '';
+ $this->players[$k]['snt'] = '';
+ $this->players[$k]['tsh'] = '';
+ $this->players[$k]['wfl'] = '';
+ }
+
+ $this->player_on_field_counter = 0;
+
+ $this->dispatch('update-players', players: $this->players);
+ }
+}
diff --git a/app/Traits/PlayerProps/CopyData.php b/app/Traits/PlayerProps/CopyData.php
new file mode 100644
index 00000000..1a73ecd1
--- /dev/null
+++ b/app/Traits/PlayerProps/CopyData.php
@@ -0,0 +1,81 @@
+player_on_field_counter < 10) {
+ Notification::make()->title('Needs a calculation first ')
+ ->info()
+ ->send();
+
+ return;
+ }
+
+ $copystring = "Part 1\n";
+
+ foreach ($this->calculationVariables as $k => $part) {
+ foreach ($part as $row) {
+ if ($copystring == '') {
+ $keys = array_keys($row);
+ $copystring .= implode(';', $keys)."\n";
+ }
+ $copystring .= implode(';', $row)."\n";
+ }
+ if ($k == 0) {
+ $copystring .= "\nPart 2\n";
+ }
+ }
+ $this->js("navigator.clipboard.writeText(`$copystring`)");
+
+ Notification::make()
+ ->title('Calculation variables copied')
+ ->success()
+ ->send();
+ }
+
+ public function copyResult()
+ {
+ if ($this->player_on_field_counter < 10) {
+ Notification::make()->title('Needs a calculation first ')
+ ->info()
+ ->send();
+
+ return;
+ }
+ $header = ['name', 'foot', 'events', 'average min', 'position', 'on field', 'gls', 'fls', 'ofs', 'crd', 'snt', 'tsh', 'wfl'];
+ $copystring = implode(';', $header)."\n";
+ foreach ($this->players as $row) {
+ $tmp = [];
+ $tmp[] = $row['name'];
+ $tmp[] = $row['foot'];
+ $tmp[] = $row['tot_evt'];
+ $tmp[] = $row['ave_min'];
+ if ($row['pos']) {
+ $tmp[] = $row['pos'];
+ } else {
+ $tmp[] = $row['pos_ori'];
+ }
+ $tmp[] = $row['active'];
+ $tmp[] = $row['gls'];
+ $tmp[] = $row['fls'];
+ $tmp[] = $row['ofs'];
+ $tmp[] = $row['crd'];
+ $tmp[] = $row['snt'];
+ $tmp[] = $row['tsh'];
+ $tmp[] = $row['wfl'];
+
+ $copystring .= implode(';', $tmp)."\n";
+ }
+ $this->js("navigator.clipboard.writeText(`$copystring`)");
+
+ Notification::make()
+ ->title('Results copied')
+ ->success()
+ ->send();
+ }
+}
diff --git a/app/Filament/Widgets/PlayerProps/Expectations.php b/app/Traits/PlayerProps/Expectations.php
similarity index 93%
rename from app/Filament/Widgets/PlayerProps/Expectations.php
rename to app/Traits/PlayerProps/Expectations.php
index 9a1865b0..7cfb4efa 100644
--- a/app/Filament/Widgets/PlayerProps/Expectations.php
+++ b/app/Traits/PlayerProps/Expectations.php
@@ -1,54 +1,51 @@
home_id;
- $away_id = $match->away_id;
- $data = StatistikoEvent::where(function ($query) use ($home_id, $away_id) {
- return $query->whereIn('home_id', [$home_id, $away_id])->orWhereIn('away_id', [$home_id, $away_id]);
+ $data = StatistikoEvent::where(function ($query) {
+ return $query->whereIn('home_id', [$this->home_id, $this->away_id])->orWhereIn('away_id', [$this->home_id, $this->away_id]);
})->get();
$work = [];
$bettypes = ['gls', 'fls', 'crn', 'ofs', 'crd', 'snt', 'tsh', 'wfl'];
foreach ($data as $value) {
foreach ($bettypes as $type) {
- if ($value['home_id'] == $home_id) {
+ if ($value['home_id'] == $this->home_id) {
$work[$type]['home_made_total'][] = $value[$type.'_h'];
$work[$type]['home_made_home'][] = $value[$type.'_h'];
$work[$type]['home_got_total'][] = $value[$type.'_a'];
$work[$type]['home_got_home'][] = $value[$type.'_a'];
- } elseif ($value['away_id'] == $home_id) {
+ } elseif ($value['away_id'] == $this->home_id) {
$work[$type]['home_made_total'][] = $value[$type.'_a'];
$work[$type]['home_got_total'][] = $value[$type.'_a'];
- } elseif ($value['home_id'] == $away_id) {
+ } elseif ($value['home_id'] == $this->away_id) {
$work[$type]['home_made_total'][] = $value[$type.'_a'];
$work[$type]['home_got_total'][] = $value[$type.'_a'];
- } elseif ($value['away_id'] == $away_id) {
+ } elseif ($value['away_id'] == $this->away_id) {
$work[$type]['home_made_total'][] = $value[$type.'_h'];
$work[$type]['home_made_home'][] = $value[$type.'_h'];
$work[$type]['home_got_total'][] = $value[$type.'_a'];
$work[$type]['home_got_home'][] = $value[$type.'_h'];
}
- if ($value['away_id'] == $away_id) {
+ if ($value['away_id'] == $this->away_id) {
$work[$type]['away_made_total'][] = $value[$type.'_a'];
$work[$type]['away_made_away'][] = $value[$type.'_a'];
$work[$type]['away_got_total'][] = $value[$type.'_h'];
$work[$type]['away_got_away'][] = $value[$type.'_a'];
- } elseif ($value['away_id'] == $home_id) {
+ } elseif ($value['away_id'] == $this->home_id) {
$work[$type]['away_made_total'][] = $value[$type.'_h'];
$work[$type]['away_got_total'][] = $value[$type.'_h'];
- } elseif ($value['home_id'] == $away_id) {
+ } elseif ($value['home_id'] == $this->away_id) {
$work[$type]['away_made_total'][] = $value[$type.'_h'];
$work[$type]['away_got_total'][] = $value[$type.'_h'];
- } elseif ($value['away_id'] == $away_id) {
+ } elseif ($value['away_id'] == $this->away_id) {
$work[$type]['away_made_total'][] = $value[$type.'_a'];
$work[$type]['away_made_away'][] = $value[$type.'_a'];
$work[$type]['away_got_total'][] = $value[$type.'_h'];
diff --git a/app/Filament/Widgets/PlayerProps/LineUpMap.php b/app/Traits/PlayerProps/LineUpMap.php
similarity index 97%
rename from app/Filament/Widgets/PlayerProps/LineUpMap.php
rename to app/Traits/PlayerProps/LineUpMap.php
index c5578aeb..56011d4e 100644
--- a/app/Filament/Widgets/PlayerProps/LineUpMap.php
+++ b/app/Traits/PlayerProps/LineUpMap.php
@@ -1,10 +1,10 @@
[9, 16, 23, 11, 18, 25, 19, 6, 34, 21],
@@ -59,7 +59,7 @@ class LineUpMap
];
}
- public static function get(string $key)
+ public static function getLineUpMap(string $key)
{
$lup = [
'3313' => [9, 16, 23, 11, 18, 25, 19, 6, 34, 21],
diff --git a/app/Traits/PlayerProps/LineUps.php b/app/Traits/PlayerProps/LineUps.php
new file mode 100644
index 00000000..d58e8029
--- /dev/null
+++ b/app/Traits/PlayerProps/LineUps.php
@@ -0,0 +1,88 @@
+ $this->team_id,
+ 'season_or_date' => $this->season_or_date,
+ 'season_mode' => $this->season_mode,
+ ];
+
+ $players = $this->loadPlayerAll();
+
+ $arr = collect();
+ foreach ($players as $value) {
+ if ($value['position'] != '') {
+ $arr->push([
+ 'id' => $value['ss_player_id'],
+ 'min' => $value['average_min'],
+ 'pos' => $value['position'],
+ 'name' => $value['player_name'],
+ ]);
+ }
+ }
+
+ return $arr;
+ }
+
+ public function generateLineUp(): void
+ {
+ if ($this->activeLineUp && $this->team_id) {
+
+ $players = $this->prepareLineUp();
+
+ $places = $this->getLineUpMap($this->activeLineUp);
+
+ $lineup = [];
+
+ $id_used = [];
+
+ foreach ($places as $place) {
+ $this->getPlayerForPosition($lineup, $id_used, $place, $players);
+ }
+
+ for ($i = 1; $i <= 35; $i++) {
+ $this->boxes[$i] = [];
+ }
+
+ $this->clearResultTable();
+
+ $this->player_on_field_counter = 0;
+
+ foreach ($this->players as $k => $record) {
+ $id = $record['id'];
+ if (isset($lineup[$id])) {
+
+ $this->boxes[$lineup[$id]['place']] = $record;
+
+ $this->players[$k]['active'] = 1;
+ $this->players[$k]['pos'] = $lineup[$id]['position'];
+
+ $this->player_on_field_counter++;
+ } else {
+ $this->players[$k]['active'] = 0;
+ $this->players[$k]['pos'] = '';
+ }
+ }
+
+ $this->calculateAspg();
+
+ $this->storePlacement();
+ }
+ }
+
+ public function updateLineup(?string $state)
+ {
+ $this->clearResultTable();
+
+ if (isset($this->lineupsMap[$state])) {
+ $this->lineup = $this->lineUpMap[$state];
+ } else {
+ $this->lineup = [];
+ }
+ }
+}
diff --git a/app/Traits/PlayerProps/Placements.php b/app/Traits/PlayerProps/Placements.php
new file mode 100644
index 00000000..c309dd6e
--- /dev/null
+++ b/app/Traits/PlayerProps/Placements.php
@@ -0,0 +1,59 @@
+clearResultTable();
+
+ if ($this->team_id) {
+
+ $this->player_on_field_counter = 0;
+
+ $res = SsLineupMemory::where('client_id', Auth::user()->client_id)->where('team_id', $this->team_id)->where('lineup', $this->activeLineUp)->first();
+
+ if ($res) {
+
+ $placement = json_decode($res->placement, 1);
+
+ foreach ($this->players as $k => $record) {
+
+ $id = $record['id'];
+
+ if (isset($placement[$id]) && in_array($placement[$id], $this->lineup)) {
+ $this->boxes[$placement[$id]] = $record;
+ $this->players[$k]['active'] = 1;
+ $this->players[$k]['pos'] = $record['pos_ori'];
+
+ $this->player_on_field_counter++;
+ }
+ }
+ }
+ }
+
+ // $this->calculateAspg();
+ }
+
+ public function storePlacement()
+ {
+ $store = [];
+ foreach ($this->boxes as $pos => $value) {
+ if ($value) {
+ $store[$value['id']] = $pos;
+ }
+ }
+ SsLineupMemory::updateOrCreate([
+ 'client_id' => Auth::user()->client_id,
+ 'team_id' => $this->team_id,
+ 'lineup' => $this->activeLineUp,
+ ], [
+ 'placement' => json_encode($store),
+ 'team_name' => $this->team_name,
+ ]);
+ }
+}
diff --git a/app/Traits/PlayerProps/PlayerAspg.php b/app/Traits/PlayerProps/PlayerAspg.php
new file mode 100644
index 00000000..61d4f514
--- /dev/null
+++ b/app/Traits/PlayerProps/PlayerAspg.php
@@ -0,0 +1,72 @@
+player_on_field_counter < 10) {
+ foreach ($this->players as $k => $record) {
+ $this->players[$k]['gls'] = '';
+ $this->players[$k]['fls'] = '';
+ $this->players[$k]['ofs'] = '';
+ $this->players[$k]['crd'] = '';
+ $this->players[$k]['snt'] = '';
+ $this->players[$k]['tsh'] = '';
+ $this->players[$k]['wfl'] = '';
+ }
+
+ $this->dispatch('update-players', players: $this->players);
+
+ return;
+ }
+
+ if (! $this->team_id && ! $this->match_id) {
+ return;
+ }
+
+ Log::debug('calculateAspg', $this->players);
+
+ // 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
+ $team_id = $this->team_id;
+ $match = StatisticFixtures::where('id', $this->match_id)->first();
+ $this->home_id = $match->home_id;
+ $this->away_id = $match->away_id;
+ $this->asp_team = 0;
+ $this->team_home_away = 'home';
+ if ((int) $match->home_id == (int) $team_id) {
+ $this->asp_team = (float) $match->exp_home;
+ $this->team_home_away = 'home';
+ } elseif ((int) $match->away_id == (int) $team_id) {
+ $this->asp_team = (float) $match->exp_away;
+ $this->team_home_away = 'away';
+ }
+
+ $players = StatistikoDetail::where('ss_team_id', $this->team_id)->where('is_active', 1)->get();
+ $this->count_player = 0;
+ foreach ($players as $value) {
+ if ($value['position'] != 'GK') {
+ $this->count_player++;
+ }
+ }
+
+ $this->calculationVariables = [];
+
+ $collection_1 = $this->loadPartsPlayer(1, $players);
+ $collection_2 = $this->loadPartsPlayer(2, $players);
+
+ $filtered_part_1 = $this->filterPlayer($collection_1);
+ $filtered_part_2 = $this->filterPlayer($collection_2);
+
+ $this->mergeData($filtered_part_1, $filtered_part_2);
+
+ $this->dispatch('update-players', players: $this->players);
+ }
+}
diff --git a/app/Traits/PlayerProps/PlayerDataMerge.php b/app/Traits/PlayerProps/PlayerDataMerge.php
new file mode 100644
index 00000000..0e548fec
--- /dev/null
+++ b/app/Traits/PlayerProps/PlayerDataMerge.php
@@ -0,0 +1,33 @@
+players as $k => $record) {
+
+ $players_id = $record['id'];
+
+ $part1 = $filtered_part_1[$players_id] ?? [];
+
+ $part2 = $filtered_part_2[$players_id] ?? [];
+
+ $this->players[$k]['active'] = $part1['active'] ?? 0;
+
+ $bets = ['gls', 'crn', 'fls', 'ofs', 'crd', 'snt', 'tsh', 'wfl'];
+ foreach ($bets as $bet) {
+ $this->players[$k][$bet] = $this->calc($bet, $part1, $part2);
+ }
+ }
+ }
+
+ private function calc(string $bettype, array $part1, array $part2)
+ {
+ $val1 = $part1[$bettype] ?? 0;
+ $val2 = $part2[$bettype] ?? 0;
+
+ return number_format(($val2 * (100 - $this->part_1_value) + $val1 * $this->part_1_value) / 100, 3);
+ }
+}
diff --git a/app/Traits/PlayerProps/PlayerFilter.php b/app/Traits/PlayerProps/PlayerFilter.php
new file mode 100644
index 00000000..8f926c38
--- /dev/null
+++ b/app/Traits/PlayerProps/PlayerFilter.php
@@ -0,0 +1,303 @@
+ 0
+ "fouls" => 13
+ "cards" => 3
+ "offsides" => 0
+ "shots_on_target" => 3
+ "shots_off_target" => 2
+ "total_shots" => 4
+ */
+
+ $ss_player_id = $val['ss_player_id'];
+ $position = $val['position'];
+
+ $tmp = [];
+ $tmp['id'] = $ss_player_id;
+ $tmp['name'] = $val['player_name'];
+
+ $tmp['id_team'] = $this->team_id;
+ $tmp['asp_team'] = $this->asp_team;
+ $tmp['player_count_without_gk'] = $this->count_player;
+
+ $position_field = $this->get_position($ss_player_id);
+ if ($position_field) {
+ $position = $position_field;
+ $tmp['active'] = 1;
+ } else {
+ $tmp['active'] = 0;
+ }
+ $tmp['pos'] = $position;
+
+ // Aspettativa di Gioco (AdG) = Somma Goals fatti da Player nel DB / Somma Minuti Giocati da Player (SMG) nel DB * 90.
+ // Se la SMG è < Y per quel Player prenderemo in considerazione solo l'Aspettativa Statistica (AS).
+ // 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'];
+
+ // il valore corrispondente al ruolo del Player (esempio un giocatore in Details ha ruolo = RW
+ // quindi Aspettativa Statistica (AS) per RW = 0.219)
+ // exp_goals
+ // exp_assists
+ // exp_cards
+ // exp_fouls
+ // exp_was_fouled
+ // exp_offsides
+ // exp_total_shots
+ // exp_shots_on_target
+
+ $bettypes = ['goals', 'cards', 'fouls', 'offsides', 'total_shots', 'shots_on_target', 'was_fouled'];
+ foreach ($bettypes as $bettype) {
+
+ $asp_statistica = (float) SofaScorePlayerPosition::where('ss_code', $position)->value('exp_'.$bettype);
+ $tmp['asp_statistica_'.$bettype] = $asp_statistica;
+
+ // if ($val->ss_player_id == 243651)
+ // dd($val, $asp_statistica);
+
+ // if ($val->total_min < $this->y_value) {
+ // $asp_gioco = 0;
+ // } else {
+ // $asp_gioco = $val->shots_on_target / $val->total_min * 90;
+ // }
+
+ switch ($bettype) {
+ case 'goals':
+ $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 {
+ $tmp['asp_gioco_'.$bettype] = $asp_gioco;
+ $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
+ }
+ break;
+ case 'cards':
+ $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 {
+ $tmp['asp_gioco_'.$bettype] = $asp_gioco;
+ $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
+ }
+ break;
+ case 'fouls':
+ $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 {
+ $tmp['asp_gioco_'.$bettype] = $asp_gioco;
+ $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
+ }
+ break;
+ case 'offsides':
+ $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 {
+ $tmp['asp_gioco_'.$bettype] = $asp_gioco;
+ $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
+ }
+ break;
+ case 'total_shots':
+ $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 {
+ $tmp['asp_gioco_'.$bettype] = $asp_gioco;
+ $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
+ }
+ 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) {
+ $tmp['asp_gioco_'.$bettype] = 0;
+ $tmp['asp_teorica_'.$bettype] = $asp_statistica;
+ } else {
+ $tmp['asp_gioco_'.$bettype] = $asp_gioco;
+ $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
+ }
+ break;
+ case 'was_fouled':
+ $asp_gioco = $val['was_fouled'] / $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 {
+ $tmp['asp_gioco_'.$bettype] = $asp_gioco;
+ $tmp['asp_teorica_'.$bettype] = ($this->x_value * $asp_gioco + $asp_statistica) / (1 + $this->x_value);
+ }
+ break;
+ }
+ }
+
+ // Calcolare la Somma di tutte le AT (colonna G della Tabella)
+ // Considerare la ATR calcolata allo Step 1 (colonna I della Tabella)
+ // Aspettativa per Player: AP = AT * ATR / TOT AT
+ $results[] = $tmp;
+ }
+ }
+
+ $asp_team_all = $this->loadExpectations();
+
+ // Aspettativa Team di Riferimento
+ // (ATR) = Aspettativa Team * Numero di Giocatori di Team in Rosters (esclusi i portieri) / 10.
+ // Ad esempio per Remo (supponiamo 24 giocatori nel Roster esclusi i portieri): ATR = 1.2 * 24 / 10 = 2.88
+
+ $bettypes = ['goals', 'cards', 'fouls', 'offsides', 'total_shots', 'shots_on_target', 'was_fouled'];
+ foreach ($bettypes as $bettype) {
+
+ $total_bettype = array_sum(array_column($results, 'asp_teorica_'.$bettype));
+
+ foreach ($results as $key => $value) {
+ switch ($bettype) {
+ case 'goals':
+ // Aspettativa per Player: AP = AT * ATR / TOT AT
+ // $results[$key]['asp_player_'.$bettype] = ((float) $value['asp_team'] * (float) $value['asp_teorica_'.$bettype]) / $total_bettype;
+ // $results[$key]['asp_player_'.$bettype] = ($asp_team * $asp_team_riferimento) / $total_bettype;
+
+ $asp_team_riferimento = (float) $this->asp_team * $this->count_player / 10;
+ $results[$key]['asp_riferimento_goals'] = $asp_team_riferimento;
+ $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
+ $results[$key]['asp_total_'.$bettype] = $total_bettype;
+ break;
+ case 'cards':
+ $asp_team_riferimento = (float) $asp_team_all[$this->team_home_away]['crd'] * $this->count_player / 10;
+ $results[$key]['asp_team_riferimento_card'] = $asp_team_riferimento;
+ $results[$key]['asp_total_'.$bettype] = $total_bettype;
+ $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
+ break;
+ case 'fouls':
+ $asp_team_riferimento = (float) $asp_team_all[$this->team_home_away]['fls'] * $this->count_player / 10;
+ $results[$key]['asp_team_riferimento_fouls'] = $asp_team_riferimento;
+ $results[$key]['asp_total_'.$bettype] = $total_bettype;
+ $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
+ break;
+ case 'offsides':
+ $asp_team_riferimento = (float) $asp_team_all[$this->team_home_away]['ofs'] * $this->count_player / 10;
+ $results[$key]['asp_team_riferimento_offside'] = $asp_team_riferimento;
+ $results[$key]['asp_total_'.$bettype] = $total_bettype;
+ $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
+ break;
+ case 'total_shots':
+ $asp_team_riferimento = (float) $asp_team_all[$this->team_home_away]['tsh'] * $this->count_player / 10;
+ $results[$key]['asp_team_riferimento_tsh'] = $asp_team_riferimento;
+ $results[$key]['asp_total_'.$bettype] = $total_bettype;
+ $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
+ break;
+ case 'shots_on_target':
+ $asp_team_riferimento = (float) $asp_team_all[$this->team_home_away]['snt'] * $this->count_player / 10;
+ $results[$key]['asp_team_riferimento_snt'] = $asp_team_riferimento;
+ $results[$key]['asp_total_'.$bettype] = $total_bettype;
+ $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
+ break;
+ case 'was_fouled':
+ $asp_team_riferimento = (float) $asp_team_all[$this->team_home_away]['wfl'] * $this->count_player / 10;
+ $results[$key]['asp_team_riferimento_wfl'] = $asp_team_riferimento;
+ $results[$key]['asp_total_'.$bettype] = $total_bettype;
+ $results[$key]['asp_player_'.$bettype] = $value['asp_teorica_'.$bettype] * $asp_team_riferimento / $total_bettype;
+ break;
+ }
+ }
+ }
+
+ $map = [];
+ $res = ExpectedMinimumPosition::all();
+ foreach ($res as $val) {
+ $map[$val->position]['gls'] = $val->gls;
+ $map[$val->position]['crd'] = $val->crd;
+ $map[$val->position]['fls'] = $val->fls;
+ $map[$val->position]['ofs'] = $val->ofs;
+ $map[$val->position]['tsh'] = $val->tsh;
+ $map[$val->position]['snt'] = $val->snt;
+ $map[$val->position]['wfl'] = $val->wfl;
+ }
+
+ // stesso ordine di prima: GLS, CRD, FLS, OFS, TSH, SNT, WFL
+
+ $return = [];
+ foreach ($this->players as $k => $player) {
+ foreach ($results as $key => $result) {
+ if ((int) $player['id'] == (int) $result['id']) {
+
+ $id = $result['id'];
+ $return[$id]['active'] = $result['active'];
+ $pos = $this->players[$k]['pos'];
+ if (! $pos) {
+ $pos = $this->players[$k]['pos_ori'];
+ }
+
+ 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;
+ $return[$id]['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;
+ $return[$id]['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;
+ $return[$id]['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;
+ $return[$id]['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;
+ $return[$id]['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;
+ $return[$id]['snt'] = (float) $final > (float) $tamx ? $final : $tamx;
+
+ $tamx = number_format($map[$pos]['wfl'], 3);
+ $final = number_format($result['asp_player_was_fouled'], 3);
+ $results[$key]['finale_tamx_wfl'] = $tamx;
+ $results[$key]['finale_calc_wfl'] = $final;
+ $return[$id]['wfl'] = (float) $final > (float) $tamx ? $final : $tamx;
+ }
+ }
+ }
+ }
+
+ $this->calculationVariables[] = $results;
+
+ return $return;
+ }
+}
diff --git a/app/Traits/PlayerProps/PlayerForPosition.php b/app/Traits/PlayerProps/PlayerForPosition.php
new file mode 100644
index 00000000..b613ee67
--- /dev/null
+++ b/app/Traits/PlayerProps/PlayerForPosition.php
@@ -0,0 +1,69 @@
+activeBoxes[$place];
+
+ $hirarchy = PositionHirarchie::load();
+
+ $fitered = $players->where('pos', $position)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
+
+ if (isset($fitered['id'])) {
+
+ if ($log) {
+ Log::debug("A $place - $position", $fitered);
+ }
+
+ $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
+ $id_used[] = $fitered['id'];
+ } else {
+ if (isset($hirarchy[$position])) {
+ $position2 = $hirarchy[$position][0];
+ $fitered = $players->where('pos', $position2)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
+
+ if (isset($fitered['id'])) {
+ $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
+ $id_used[] = $fitered['id'];
+ if ($log) {
+ Log::debug("B $place - $position $position2", $fitered);
+ }
+
+ } elseif (isset($hirarchy[$position][1])) {
+ $position3 = $hirarchy[$position][1];
+ $fitered = $players->where('pos', $position3)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
+
+ if (isset($fitered['id'])) {
+ if ($log) {
+ Log::debug("C $place - $position $position2 $position3", $fitered);
+ }
+
+ $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
+ $id_used[] = $fitered['id'];
+ } elseif (isset($hirarchy[$position][2])) {
+ $position4 = $hirarchy[$position][2];
+ $fitered = $players->where('pos', $position4)->whereNotIn('id', $id_used)->sortByDesc('min')->first();
+
+ if (isset($fitered['id'])) {
+ if ($log) {
+ Log::debug("D $place - $position $position2 $position3 $position4", $fitered);
+ }
+
+ $lineup[$fitered['id']] = ['id' => $fitered['id'], 'min' => $fitered['min'], 'place' => $place, 'position' => $position];
+ $id_used[] = $fitered['id'];
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/Traits/PlayerProps/PlayerQuery.php b/app/Traits/PlayerProps/PlayerQuery.php
new file mode 100644
index 00000000..134a501c
--- /dev/null
+++ b/app/Traits/PlayerProps/PlayerQuery.php
@@ -0,0 +1,212 @@
+ss_player_id;
+ }
+
+ $matches_ids = [];
+ switch ($this->season_or_date) {
+ case 'season':
+ if (! $this->season_selected) {
+ $this->season_selected = $this->getCurrentSeason();
+ // dd($this->liga_id, $this->season_selected);
+ }
+ $matches_ids = match ($part) {
+ 1 => StatistikoEvent::where('league_id', $this->liga_id)
+ ->when($this->season_selected, function ($query) {
+ return $query->whereIn('season', $this->season_selected);
+ })->pluck('match_id')->toArray(),
+ 2 => StatistikoEvent::where('league_id', $this->liga_id)
+ ->when($this->season_selected, function ($query) {
+ return $query->whereNotIn('season', $this->season_selected);
+ })->pluck('match_id')->toArray()
+ };
+ break;
+ default:
+ $matches_ids = match ($part) {
+ 1 => StatistikoEvent::where('league_id', $this->liga_id)
+ ->when($this->date_spliter, function ($query) {
+ return $query->whereDate('starttime', '>', $this->date_spliter);
+ })->pluck('match_id')->toArray(),
+ 2 => StatistikoEvent::where('league_id', $this->liga_id)
+ ->when($this->season_selected, function ($query) {
+ return $query->whereDate('starttime', '<=', $this->date_spliter);
+ })->pluck('match_id')->toArray()
+ };
+ }
+
+ $res = StatistikoPlayer::with('details')->whereIn('ss_player_id', $player_ids)->whereIn('match_id', $matches_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;
+ $arr[$ss_player_id]['was_fouled'] += $val->was_fouled;
+ }
+
+ foreach ($players as $player) {
+ if (isset($arr[$player->ss_player_id])) {
+ $arr[$player->ss_player_id]['position'] = $player->position;
+ $arr[$player->ss_player_id]['player_name'] = $player->player_name;
+ $arr[$player->ss_player_id]['preferred_foot'] = $player->preferred_foot;
+ }
+ }
+
+ return $arr;
+ }
+
+ public function loadPlayerAll(): array
+ {
+ if (! $this->team_id) {
+ return [];
+ }
+ if (! $this->liga_id) {
+ return [];
+ }
+
+ $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;
+ }
+
+ $matches_ids = StatistikoEvent::where('league_id', $this->liga_id)->pluck('match_id')->toArray();
+ $res = StatistikoPlayer::with('details')->whereIn('ss_player_id', $player_ids)->whereIn('match_id', $matches_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;
+ $arr[$ss_player_id]['was_fouled'] += $val->was_fouled;
+ }
+
+ 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]['was_fouled'] = 0;
+ $arr[$ss_player_id]['cards'] = 0;
+ }
+
+ public function getCurrentSeason()
+ {
+
+ $tmp = [];
+ $date = Carbon::now();
+ if ($this->season_mode == 'halfyear') {
+ if ((int) date('m') > 7) {
+ $tmp[] = $date->format('y').'/'.$date->format('y') + 1;
+ } else {
+ $tmp[] = $date->format('y') - 1 .'/'.$date->format('y');
+ }
+ } else {
+ $tmp[] = (string) $date->year;
+ }
+
+ return $tmp;
+ }
+}
diff --git a/app/Traits/PlayerProps/SyncData.php b/app/Traits/PlayerProps/SyncData.php
new file mode 100644
index 00000000..f82eb596
--- /dev/null
+++ b/app/Traits/PlayerProps/SyncData.php
@@ -0,0 +1,84 @@
+players = [];
+
+ $positions_map = LoadPositions::load();
+
+ $players = $this->loadPlayerAll();
+
+ 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'];
+ $tmp['wfl'] = $val['was_fouled'];
+
+ $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->loadPlacement();
+ } else {
+ $this->team_name = '';
+ $this->clearResultTable();
+ $this->players = [];
+ }
+ }
+}
diff --git a/app/Traits/Sofascore/GrappingTeams.php b/app/Traits/Sofascore/GrappingTeams.php
index 62af5e9e..816f4055 100644
--- a/app/Traits/Sofascore/GrappingTeams.php
+++ b/app/Traits/Sofascore/GrappingTeams.php
@@ -44,6 +44,9 @@ trait GrappingTeams
}
switch ($title = $this->select_what_to_grap()) {
+ case 'all':
+ $tournaments = SofaScoreTournament::where('enabled', 1)->pluck('tournament_id')->toArray();
+ break;
case 'major':
$tournaments = SofaScoreTournament::where('enabled', 1)->whereIn('tournament_id', $major)->pluck('tournament_id')->toArray();
break;
@@ -106,7 +109,9 @@ trait GrappingTeams
{
return select(
label: 'What teams should be grapped?',
+ default: 'all',
options: [
+ 'all' => 'All Leagues',
'major' => 'Major Leagues',
'others' => 'Others Leagues',
'manual' => 'Enter team_ids (sofa_score_rosas)',
diff --git a/bootstrap/app.php b/bootstrap/app.php
index c1832766..4881066a 100644
--- a/bootstrap/app.php
+++ b/bootstrap/app.php
@@ -10,9 +10,7 @@ return Application::configure(basePath: dirname(__DIR__))
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
- ->withMiddleware(function (Middleware $middleware): void {
- //
- })
+ ->withMiddleware(function (Middleware $middleware): void {})
->withExceptions(function (Exceptions $exceptions): void {
//
})->create();
diff --git a/resources/views/components/form-lockout.blade.php b/resources/views/components/form-lockout.blade.php
new file mode 100644
index 00000000..51ddcc87
--- /dev/null
+++ b/resources/views/components/form-lockout.blade.php
@@ -0,0 +1,18 @@
+