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);
    }
}