add 2 parts for claculation pp wip

This commit is contained in:
salam committed 2026-10-31 19:22:16 +01:00
1 parent 6d2f4c1052
commit ad45880506
19 files changed
+1403 -1049

No files matched your search

+67
View File
@@ -0,0 +1,67 @@
<?php
namespace App\Traits\PlayerProps;
trait BestLineUp
{
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);
}
}
+66
View File
@@ -0,0 +1,66 @@
<?php
namespace App\Traits\PlayerProps;
trait ClearBoxes
{
public function clearBox(int $boxNumber): void
{
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();
}
}
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);
}
}
+81
View File
@@ -0,0 +1,81 @@
<?php
namespace App\Traits\PlayerProps;
use Filament\Notifications\Notification;
trait CopyData
{
public function copyDevelopment()
{
if ($this->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();
}
}
+273
View File
@@ -0,0 +1,273 @@
<?php
namespace App\Traits\PlayerProps;
use App\Models\StatistikoEvent;
trait Expectations
{
public function loadExpectations()
{
$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'] == $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'] == $this->home_id) {
$work[$type]['home_made_total'][] = $value[$type.'_a'];
$work[$type]['home_got_total'][] = $value[$type.'_a'];
} 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'] == $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'] == $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'] == $this->home_id) {
$work[$type]['away_made_total'][] = $value[$type.'_h'];
$work[$type]['away_got_total'][] = $value[$type.'_h'];
} 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'] == $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'];
}
}
}
$num_home_crd = 0;
$num_away_crd = 0;
$num_home_gls = 0;
$num_away_gls = 0;
$num_home_fls = 0;
$num_away_fls = 0;
$num_home_ofs = 0;
$num_away_ofs = 0;
$num_home_snt = 0;
$num_away_snt = 0;
$num_home_tsh = 0;
$num_away_tsh = 0;
$num_home_wfl = 0;
$num_away_wfl = 0;
$bettypes = ['gls', 'crd', 'fls', 'ofs', 'snt', 'tsh', 'wfl'];
foreach ($work as $type => $value) {
switch ($type) {
case 'gls':
$sum_home_gls = array_sum($value['home_made_total']);
$num_home_gls = \count($value['home_made_total']);
$sum_home_gls += array_sum($value['home_made_home']);
$num_home_gls += \count($value['home_made_home']);
$sum_home_gls += array_sum($value['home_got_total']);
$num_home_gls += \count($value['home_got_total']);
$sum_home_gls += array_sum($value['home_got_home']);
$num_home_gls += \count($value['home_got_home']);
$sum_away_gls = array_sum($value['away_made_total']);
$num_away_gls = \count($value['away_made_total']);
$sum_away_gls += array_sum($value['away_made_away']);
$num_away_gls += \count($value['away_made_away']);
$sum_away_gls += array_sum($value['away_got_total']);
$num_away_gls += \count($value['away_got_total']);
$sum_away_gls += array_sum($value['away_got_away']);
$num_away_gls += \count($value['away_got_away']);
break;
case 'crd':
$sum_home_crd = array_sum($value['home_made_total']);
$num_home_crd = \count($value['home_made_total']);
$sum_home_crd += array_sum($value['home_made_home']);
$num_home_crd += \count($value['home_made_home']);
$sum_home_crd += array_sum($value['home_got_total']);
$num_home_crd += \count($value['home_got_total']);
$sum_home_crd += array_sum($value['home_got_home']);
$num_home_crd += \count($value['home_got_home']);
$sum_away_crd = array_sum($value['away_made_total']);
$num_away_crd = \count($value['away_made_total']);
$sum_away_crd += array_sum($value['away_made_away']);
$num_away_crd += \count($value['away_made_away']);
$sum_away_crd += array_sum($value['away_got_total']);
$num_away_crd += \count($value['away_got_total']);
$sum_away_crd += array_sum($value['away_got_away']);
$num_away_crd += \count($value['away_got_away']);
break;
case 'fls':
$sum_home_fls = array_sum($value['home_made_total']);
$num_home_fls = \count($value['home_made_total']);
$sum_home_fls += array_sum($value['home_made_home']);
$num_home_fls += \count($value['home_made_home']);
$sum_home_fls += array_sum($value['home_got_total']);
$num_home_fls += \count($value['home_got_total']);
$sum_home_fls += array_sum($value['home_got_home']);
$num_home_fls += \count($value['home_got_home']);
$sum_away_fls = array_sum($value['away_made_total']);
$num_away_fls = \count($value['away_made_total']);
$sum_away_fls += array_sum($value['away_made_away']);
$num_away_fls += \count($value['away_made_away']);
$sum_away_fls += array_sum($value['away_got_total']);
$num_away_fls += \count($value['away_got_total']);
$sum_away_fls += array_sum($value['away_got_away']);
$num_away_fls += \count($value['away_got_away']);
break;
case 'ofs':
$sum_home_ofs = array_sum($value['home_made_total']);
$num_home_ofs = \count($value['home_made_total']);
$sum_home_ofs += array_sum($value['home_made_home']);
$num_home_ofs += \count($value['home_made_home']);
$sum_home_ofs += array_sum($value['home_got_total']);
$num_home_ofs += \count($value['home_got_total']);
$sum_home_ofs += array_sum($value['home_got_home']);
$num_home_ofs += \count($value['home_got_home']);
$sum_away_ofs = array_sum($value['away_made_total']);
$num_away_ofs = \count($value['away_made_total']);
$sum_away_ofs += array_sum($value['away_made_away']);
$num_away_ofs += \count($value['away_made_away']);
$sum_away_ofs += array_sum($value['away_got_total']);
$num_away_ofs += \count($value['away_got_total']);
$sum_away_ofs += array_sum($value['away_got_away']);
$num_away_ofs += \count($value['away_got_away']);
break;
case 'snt':
$sum_home_snt = array_sum($value['home_made_total']);
$num_home_snt = \count($value['home_made_total']);
$sum_home_snt += array_sum($value['home_made_home']);
$num_home_snt += \count($value['home_made_home']);
$sum_home_snt += array_sum($value['home_got_total']);
$num_home_snt += \count($value['home_got_total']);
$sum_home_snt += array_sum($value['home_got_home']);
$num_home_snt += \count($value['home_got_home']);
$sum_away_snt = array_sum($value['away_made_total']);
$num_away_snt = \count($value['away_made_total']);
$sum_away_snt += array_sum($value['away_made_away']);
$num_away_snt += \count($value['away_made_away']);
$sum_away_snt += array_sum($value['away_got_total']);
$num_away_snt += \count($value['away_got_total']);
$sum_away_snt += array_sum($value['away_got_away']);
$num_away_snt += \count($value['away_got_away']);
break;
case 'tsh':
$sum_home_tsh = array_sum($value['home_made_total']);
$num_home_tsh = \count($value['home_made_total']);
$sum_home_tsh += array_sum($value['home_made_home']);
$num_home_tsh += \count($value['home_made_home']);
$sum_home_tsh += array_sum($value['home_got_total']);
$num_home_tsh += \count($value['home_got_total']);
$sum_home_tsh += array_sum($value['home_got_home']);
$num_home_tsh += \count($value['home_got_home']);
$sum_away_tsh = array_sum($value['away_made_total']);
$num_away_tsh = \count($value['away_made_total']);
$sum_away_tsh += array_sum($value['away_made_away']);
$num_away_tsh += \count($value['away_made_away']);
$sum_away_tsh += array_sum($value['away_got_total']);
$num_away_tsh += \count($value['away_got_total']);
$sum_away_tsh += array_sum($value['away_got_away']);
$num_away_tsh += \count($value['away_got_away']);
break;
case 'wfl':
$sum_home_wfl = array_sum($value['home_made_total']);
$num_home_wfl = \count($value['home_made_total']);
$sum_home_wfl += array_sum($value['home_made_home']);
$num_home_wfl += \count($value['home_made_home']);
$sum_home_wfl += array_sum($value['home_got_total']);
$num_home_wfl += \count($value['home_got_total']);
$sum_home_wfl += array_sum($value['home_got_home']);
$num_home_wfl += \count($value['home_got_home']);
$sum_away_wfl = array_sum($value['away_made_total']);
$num_away_wfl = \count($value['away_made_total']);
$sum_away_wfl += array_sum($value['away_made_away']);
$num_away_wfl += \count($value['away_made_away']);
$sum_away_wfl += array_sum($value['away_got_total']);
$num_away_wfl += \count($value['away_got_total']);
$sum_away_wfl += array_sum($value['away_got_away']);
$num_away_wfl += \count($value['away_got_away']);
break;
}
}
$aspettativa = [];
$aspettativa['home']['gls'] = round($sum_home_gls / $num_home_gls, 1);
$aspettativa['home']['crd'] = round($sum_home_crd / $num_home_crd, 1);
$aspettativa['home']['fls'] = round($sum_home_fls / $num_home_fls, 1);
$aspettativa['home']['ofs'] = round($sum_home_ofs / $num_home_ofs, 1);
$aspettativa['home']['snt'] = round($sum_home_snt / $num_home_snt, 1);
$aspettativa['home']['tsh'] = round($sum_home_tsh / $num_home_tsh, 1);
$aspettativa['home']['wfl'] = round($sum_home_wfl / $num_home_wfl, 1);
$aspettativa['away']['gls'] = round($sum_away_gls / $sum_away_gls, 1);
$aspettativa['away']['crd'] = round($sum_away_crd / $num_away_crd, 1);
$aspettativa['away']['fls'] = round($sum_away_fls / $num_away_fls, 1);
$aspettativa['away']['ofs'] = round($sum_away_ofs / $num_away_ofs, 1);
$aspettativa['away']['snt'] = round($sum_away_snt / $num_away_snt, 1);
$aspettativa['away']['tsh'] = round($sum_away_tsh / $num_away_tsh, 1);
$aspettativa['away']['wfl'] = round($sum_away_wfl / $num_away_wfl, 1);
return $aspettativa;
}
}
+122
View File
@@ -0,0 +1,122 @@
<?php
namespace App\Traits\PlayerProps;
trait LineUpMap
{
public static function loadLineUpMaps()
{
return [
'3313' => [9, 16, 23, 11, 18, 25, 19, 6, 34, 21],
'3331' => [9, 16, 23, 17, 11, 25, 12, 19, 26, 21],
'3331-' => [9, 16, 23, 10, 18, 24, 12, 19, 26, 21],
'3331+' => [9, 16, 23, 11, 18, 25, 12, 19, 26, 21],
'3412-' => [9, 16, 23, 4, 10, 24, 32, 19, 20, 21],
'3412+' => [9, 16, 23, 4, 11, 25, 32, 19, 20, 21],
'3421-' => [9, 16, 23, 4, 10, 24, 32, 12, 26, 21],
'3421+' => [9, 16, 23, 4, 11, 25, 32, 12, 26, 21],
'343-' => [9, 16, 23, 4, 10, 24, 32, 6, 34, 21],
'343+' => [9, 16, 23, 4, 11, 25, 32, 6, 34, 21],
'3511' => [9, 16, 23, 4, 11, 17, 25, 32, 19, 21],
'3511-' => [9, 16, 23, 4, 10, 18, 24, 32, 19, 21],
'3511+' => [9, 16, 23, 4, 11, 18, 25, 32, 19, 21],
'352' => [9, 16, 23, 4, 11, 17, 25, 32, 20, 21],
'352-' => [9, 16, 23, 4, 10, 18, 24, 32, 20, 21],
'352+' => [9, 16, 23, 4, 11, 18, 25, 32, 20, 21],
'4132' => [2, 9, 23, 30, 17, 12, 19, 26, 20, 21],
'4213-' => [2, 9, 23, 30, 10, 24, 19, 6, 34, 21],
'4213+' => [2, 9, 23, 30, 11, 25, 19, 6, 34, 21],
'4222' => [2, 9, 23, 30, 10, 24, 12, 26, 20, 21],
'4231' => [2, 9, 23, 30, 10, 24, 12, 19, 26, 21],
'424' => [2, 9, 23, 30, 10, 24, 6, 34, 20, 21],
'4312' => [2, 9, 23, 30, 17, 11, 25, 19, 20, 21],
'4312-' => [2, 9, 23, 30, 10, 18, 24, 19, 20, 21],
'4312+' => [2, 9, 23, 30, 11, 18, 25, 19, 20, 21],
'4321' => [2, 9, 23, 30, 17, 11, 25, 12, 26, 21],
'4321-' => [2, 9, 23, 30, 10, 18, 24, 12, 26, 21],
'4321+' => [2, 9, 23, 30, 11, 18, 25, 12, 26, 21],
'433' => [2, 9, 23, 30, 17, 11, 25, 6, 34, 21],
'433-' => [2, 9, 23, 30, 10, 18, 24, 6, 34, 21],
'433+' => [2, 9, 23, 30, 11, 18, 25, 6, 34, 21],
'4411-' => [2, 9, 23, 30, 4, 10, 24, 32, 19, 21],
'4411+' => [2, 9, 23, 30, 4, 11, 25, 32, 19, 21],
'442' => [2, 9, 23, 30, 4, 17, 18, 32, 20, 21],
'442-' => [2, 9, 23, 30, 4, 10, 24, 32, 20, 21],
'442+' => [2, 9, 23, 30, 4, 11, 25, 32, 20, 21],
'451' => [2, 9, 23, 30, 4, 17, 11, 25, 32, 21],
'451-' => [2, 9, 23, 30, 4, 10, 18, 24, 32, 21],
'451+' => [2, 9, 23, 30, 4, 11, 18, 25, 32, 21],
'523-' => [2, 9, 16, 23, 30, 10, 24, 6, 34, 21],
'523+' => [2, 9, 16, 23, 30, 11, 25, 6, 34, 21],
'5311' => [2, 9, 16, 23, 30, 17, 11, 25, 19, 21],
'5311-' => [2, 9, 16, 23, 30, 10, 18, 24, 19, 21],
'5311+' => [2, 9, 16, 23, 30, 11, 18, 25, 19, 21],
'532' => [2, 9, 16, 23, 30, 17, 11, 25, 20, 21],
'532-' => [2, 9, 16, 23, 30, 10, 18, 24, 20, 21],
'532+' => [2, 9, 16, 23, 30, 11, 18, 25, 20, 21],
'541-' => [2, 9, 16, 23, 30, 4, 10, 24, 32, 21],
'541+' => [2, 9, 16, 23, 30, 4, 11, 25, 32, 21],
];
}
public static function getLineUpMap(string $key)
{
$lup = [
'3313' => [9, 16, 23, 11, 18, 25, 19, 6, 34, 21],
'3331' => [9, 16, 23, 17, 11, 25, 12, 19, 26, 21],
'3331-' => [9, 16, 23, 10, 18, 24, 12, 19, 26, 21],
'3331+' => [9, 16, 23, 11, 18, 25, 12, 19, 26, 21],
'3412-' => [9, 16, 23, 4, 10, 24, 32, 19, 20, 21],
'3412+' => [9, 16, 23, 4, 11, 25, 32, 19, 20, 21],
'3421-' => [9, 16, 23, 4, 10, 24, 32, 12, 26, 21],
'3421+' => [9, 16, 23, 4, 11, 25, 32, 12, 26, 21],
'343-' => [9, 16, 23, 4, 10, 24, 32, 6, 34, 21],
'343+' => [9, 16, 23, 4, 11, 25, 32, 6, 34, 21],
'3511' => [9, 16, 23, 4, 11, 17, 25, 32, 19, 21],
'3511-' => [9, 16, 23, 4, 10, 18, 24, 32, 19, 21],
'3511+' => [9, 16, 23, 4, 11, 18, 25, 32, 19, 21],
'352' => [9, 16, 23, 4, 11, 17, 25, 32, 20, 21],
'352-' => [9, 16, 23, 4, 10, 18, 24, 32, 20, 21],
'352+' => [9, 16, 23, 4, 11, 18, 25, 32, 20, 21],
'4132' => [2, 9, 23, 30, 17, 12, 19, 26, 20, 21],
'4213-' => [2, 9, 23, 30, 10, 24, 19, 6, 34, 21],
'4213+' => [2, 9, 23, 30, 11, 25, 19, 6, 34, 21],
'4222' => [2, 9, 23, 30, 10, 24, 12, 26, 20, 21],
'4231' => [2, 9, 23, 30, 10, 24, 12, 19, 26, 21],
'424' => [2, 9, 23, 30, 10, 24, 6, 34, 20, 21],
'4312' => [2, 9, 23, 30, 17, 11, 25, 19, 20, 21],
'4312-' => [2, 9, 23, 30, 10, 18, 24, 19, 20, 21],
'4312+' => [2, 9, 23, 30, 11, 18, 25, 19, 20, 21],
'4321' => [2, 9, 23, 30, 17, 11, 25, 12, 26, 21],
'4321-' => [2, 9, 23, 30, 10, 18, 24, 12, 26, 21],
'4321+' => [2, 9, 23, 30, 11, 18, 25, 12, 26, 21],
'433' => [2, 9, 23, 30, 17, 11, 25, 6, 34, 21],
'433-' => [2, 9, 23, 30, 10, 18, 24, 6, 34, 21],
'433+' => [2, 9, 23, 30, 11, 18, 25, 6, 34, 21],
'4411-' => [2, 9, 23, 30, 4, 10, 24, 32, 19, 21],
'4411+' => [2, 9, 23, 30, 4, 11, 25, 32, 19, 21],
'442' => [2, 9, 23, 30, 4, 17, 18, 32, 20, 21],
'442-' => [2, 9, 23, 30, 4, 10, 24, 32, 20, 21],
'442+' => [2, 9, 23, 30, 4, 11, 25, 32, 20, 21],
'451' => [2, 9, 23, 30, 4, 17, 11, 25, 32, 21],
'451-' => [2, 9, 23, 30, 4, 10, 18, 24, 32, 21],
'451+' => [2, 9, 23, 30, 4, 11, 18, 25, 32, 21],
'523-' => [2, 9, 16, 23, 30, 10, 24, 6, 34, 21],
'523+' => [2, 9, 16, 23, 30, 11, 25, 6, 34, 21],
'5311' => [2, 9, 16, 23, 30, 17, 11, 25, 19, 21],
'5311-' => [2, 9, 16, 23, 30, 10, 18, 24, 19, 21],
'5311+' => [2, 9, 16, 23, 30, 11, 18, 25, 19, 21],
'532' => [2, 9, 16, 23, 30, 17, 11, 25, 20, 21],
'532-' => [2, 9, 16, 23, 30, 10, 18, 24, 20, 21],
'532+' => [2, 9, 16, 23, 30, 11, 18, 25, 20, 21],
'541-' => [2, 9, 16, 23, 30, 4, 10, 24, 32, 21],
'541+' => [2, 9, 16, 23, 30, 4, 11, 25, 32, 21],
];
if (isset($lup[$key])) {
return $lup[$key];
}
return [];
}
}
+88
View File
@@ -0,0 +1,88 @@
<?php
namespace App\Traits\PlayerProps;
trait LineUps
{
public function prepareLineUp()
{
$arr = [
'team_id' => $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 = [];
}
}
}
+59
View File
@@ -0,0 +1,59 @@
<?php
namespace App\Traits\PlayerProps;
use App\Models\SsLineupMemory;
use Illuminate\Support\Facades\Auth;
trait Placements
{
public function loadPlacement()
{
$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) {
$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,
]);
}
}
+72
View File
@@ -0,0 +1,72 @@
<?php
namespace App\Traits\PlayerProps;
use App\Models\StatisticFixtures;
use App\Models\StatistikoDetail;
use Illuminate\Support\Facades\Log;
trait PlayerAspg
{
public function calculateAspg(): 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);
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);
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Traits\PlayerProps;
trait PlayerDataMerge
{
public function mergeData(array $filtered_part_1, array $filtered_part_2): void
{
foreach ($this->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);
}
}
+303
View File
@@ -0,0 +1,303 @@
<?php
namespace App\Traits\PlayerProps;
use App\Models\ExpectedMinimumPosition;
use App\Models\SofaScorePlayerPosition;
trait PlayerFilter
{
public function filterPlayer(array $collection)
{
$results = [];
foreach ($collection 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'] = $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;
}
}
@@ -0,0 +1,69 @@
<?php
namespace App\Traits\PlayerProps;
use App\Filament\Widgets\PlayerProps\PositionHirarchie;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
trait PlayerForPosition
{
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'];
}
}
}
}
}
}
}
+212
View File
@@ -0,0 +1,212 @@
<?php
namespace App\Traits\PlayerProps;
use App\Models\StatistikoDetail;
use App\Models\StatistikoEvent;
use App\Models\StatistikoPlayer;
use Illuminate\Support\Carbon;
trait PlayerQuery
{
public function loadPartsPlayer(int $part, object $players): array
{
$player_ids = [];
foreach ($players as $row) {
$player_ids[] = $row->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;
}
}
+84
View File
@@ -0,0 +1,84 @@
<?php
namespace App\Traits\PlayerProps;
use App\Filament\Pages\Selections\LoadPositions;
use App\Models\SofaScoreRosa;
trait SyncData
{
public function syncData(int $team_id)
{
if ($team_id) {
$this->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 = [];
}
}
}