12 KiB
12 KiB
Complete PHP Filter Class and Usage
<?php
class PlayerDto {
public int $id;
public string $name;
public string $gender;
public DateTime $dob;
public int $clubId;
public ?float $weight;
public function __construct($id, $name, $gender, $dob, $clubId, $weight = null) {
$this->id = $id;
$this->name = $name;
$this->gender = $gender;
$this->dob = new DateTime($dob);
$this->clubId = $clubId;
$this->weight = $weight;
}
public function calculateAge(): int {
$now = new DateTime();
$diff = $now->diff($this->dob);
return $diff->y;
}
}
class TaekwondoPredrawHelper {
public static function getAgeCategory(int $age): string {
if ($age >= 6 && $age <= 11) return "Child";
if ($age >= 12 && $age <= 14) return "Cadet";
if ($age >= 15 && $age <= 17) return "Junior";
if ($age >= 18 && $age <= 32) return "Senior";
if ($age >= 33 && $age <= 40) return "Ultra 1";
if ($age >= 41 && $age <= 50) return "Ultra 2";
if ($age >= 51 && $age <= 60) return "Ultra 3";
if ($age >= 61) return "Ultra 4";
return "Unknown";
}
public static function getWeightClass(string $gender, int $age, ?float $weight): string {
if ($weight === null) return "Unknown";
// Weight classes fully specified per WT 2025 categories:
if ($gender === "Male") {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 45) return "-45kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 61) return "-61kg";
if ($weight <= 65) return "-65kg";
return "+65kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 45) return "-45kg";
if ($weight <= 48) return "-48kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 73) return "-73kg";
if ($weight <= 78) return "-78kg";
return "+78kg";
}
if ($age >= 18) {
if ($weight <= 54) return "-54kg";
if ($weight <= 58) return "-58kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 74) return "-74kg";
if ($weight <= 80) return "-80kg";
if ($weight <= 87) return "-87kg";
return "+87kg";
}
}
if ($gender === "Female") {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 29) return "-29kg";
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 47) return "-47kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
return "+59kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 42) return "-42kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 52) return "-52kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
return "+68kg";
}
if ($age >= 18) {
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 62) return "-62kg";
if ($weight <= 67) return "-67kg";
if ($weight <= 73) return "-73kg";
return "+73kg";
}
}
return "Unknown";
}
public static function groupPlayersForPredraw(array $players): array {
$groups = [];
foreach ($players as $player) {
$age = $player->calculateAge();
$gender = $player->gender;
$ageCategory = self::getAgeCategory($age);
$weightClass = self::getWeightClass($gender, $age, $player->weight);
$key = "$gender|$ageCategory|$weightClass";
if (!isset($groups[$key])) {
$groups[$key] = [
'gender' => $gender,
'ageCategory' => $ageCategory,
'weightClass' => $weightClass,
'players' => []
];
}
$groups[$key]['players'][] = $player;
}
return array_values($groups);
}
}
Laravel Service Class (full filter included)
<?php
namespace App\Services;
use App\Models\Player;
use Carbon\Carbon;
class TaekwondoFilterService {
public function calculateAge($dob) {
return Carbon::parse($dob)->age;
}
public function getAgeCategory($age) {
if ($age >= 6 && $age <= 11) return "Child";
if ($age >= 12 && $age <= 14) return "Cadet";
if ($age >= 15 && $age <= 17) return "Junior";
if ($age >= 18 && $age <= 32) return "Senior";
if ($age >= 33 && $age <= 40) return "Ultra 1";
if ($age >= 41 && $age <= 50) return "Ultra 2";
if ($age >= 51 && $age <= 60) return "Ultra 3";
if ($age >= 61) return "Ultra 4";
return "Unknown";
}
public function getWeightClass($gender, $age, $weight) {
if (empty($weight)) return "Unknown";
if ($gender === 'Male') {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 45) return "-45kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 61) return "-61kg";
if ($weight <= 65) return "-65kg";
return "+65kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 45) return "-45kg";
if ($weight <= 48) return "-48kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 73) return "-73kg";
if ($weight <= 78) return "-78kg";
return "+78kg";
}
if ($age >= 18) {
if ($weight <= 54) return "-54kg";
if ($weight <= 58) return "-58kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 74) return "-74kg";
if ($weight <= 80) return "-80kg";
if ($weight <= 87) return "-87kg";
return "+87kg";
}
}
if ($gender === 'Female') {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 29) return "-29kg";
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 47) return "-47kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
return "+59kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 42) return "-42kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 52) return "-52kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
return "+68kg";
}
if ($age >= 18) {
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 62) return "-62kg";
if ($weight <= 67) return "-67kg";
if ($weight <= 73) return "-73kg";
return "+73kg";
}
}
return "Unknown";
}
public function groupPlayersForPredraw()
{
$players = Player::all();
$groups = [];
foreach ($players as $player) {
$age = $this->calculateAge($player->dob);
$gender = $player->gender;
$ageCategory = $this->getAgeCategory($age);
$weightClass = $this->getWeightClass($gender, $age, $player->weight);
$key = "$gender|$ageCategory|$weightClass";
if (!isset($groups[$key])) {
$groups[$key] = [
'gender' => $gender,
'ageCategory' => $ageCategory,
'weightClass' => $weightClass,
'players' => []
];
}
$groups[$key]['players'][] = $player;
}
return array_values($groups);
}
}