Commit 00b63658 authored by Mahmoud Aglan's avatar Mahmoud Aglan

fix(sports): coach assessment filters by coach discipline + player selection

- Controller detects logged-in coach's disciplines via employee_id → sa_coaches
- Pending players filtered to those whose selected_disciplines overlap with
  coach's disciplines (or manual dropdown filter)
- Available groups in assess form filtered by player's selected disciplines
  intersected with coach's disciplines
- Added discipline filter dropdown to assessment index page
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 94d8d11b
......@@ -13,14 +13,21 @@ class CoachAssessmentController extends Controller
{
public function index(Request $request): Response
{
$players = CoachAssessmentService::getPendingPlayers();
$disciplines = App::getInstance()->db()->select(
$db = App::getInstance()->db();
$coachDisciplineIds = $this->getCoachDisciplineIds();
$filterDiscipline = (int) $request->get('discipline_id', 0);
$disciplines = $db->select(
"SELECT id, name_ar FROM sa_disciplines WHERE is_active = 1 AND is_archived = 0 ORDER BY name_ar"
);
$players = CoachAssessmentService::getPendingPlayers($coachDisciplineIds, $filterDiscipline ?: null);
return $this->view('SportsActivity.Views.assessment.index', [
'players' => $players,
'disciplines' => $disciplines,
'coachDisciplines' => $coachDisciplineIds,
'filterDiscipline' => $filterDiscipline,
]);
}
......@@ -43,14 +50,58 @@ class CoachAssessmentController extends Controller
return $this->redirect('/sa/coach-assessment')->withError('التسجيل غير موجود');
}
$groups = CoachAssessmentService::getAvailableGroups();
$selectedDisciplineIds = [];
if (!empty($registration['selected_disciplines'])) {
$decoded = json_decode($registration['selected_disciplines'], true);
if (is_array($decoded)) {
foreach ($decoded as $d) {
$selectedDisciplineIds[] = is_array($d) ? (int) ($d['id'] ?? 0) : (int) $d;
}
}
}
$coachDisciplineIds = $this->getCoachDisciplineIds();
$relevantDisciplineIds = !empty($coachDisciplineIds)
? array_intersect($selectedDisciplineIds, $coachDisciplineIds)
: $selectedDisciplineIds;
if (empty($relevantDisciplineIds)) {
$relevantDisciplineIds = $selectedDisciplineIds;
}
$groups = CoachAssessmentService::getAvailableGroups($relevantDisciplineIds);
return $this->view('SportsActivity.Views.assessment.assess', [
'registration' => $registration,
'groups' => $groups,
'selectedDisciplineIds' => $selectedDisciplineIds,
]);
}
private function getCoachDisciplineIds(): array
{
$db = App::getInstance()->db();
$employee = App::getInstance()->currentEmployee();
if (!$employee) {
return [];
}
$coach = $db->selectOne(
"SELECT id FROM sa_coaches WHERE employee_id = ? AND is_active = 1 AND is_archived = 0",
[(int) $employee->id]
);
if (!$coach) {
return [];
}
$rows = $db->select(
"SELECT discipline_id FROM sa_coach_disciplines WHERE coach_id = ?",
[(int) $coach['id']]
);
return array_map(fn($r) => (int) $r['discipline_id'], $rows);
}
public function submit(Request $request, string $id): Response
{
$registrationId = (int) $id;
......
......@@ -9,7 +9,7 @@ use App\Modules\Cashier\Services\PaymentRequestService;
final class CoachAssessmentService
{
public static function getPendingPlayers(?int $coachId = null): array
public static function getPendingPlayers(array $coachDisciplineIds = [], ?int $filterDisciplineId = null): array
{
$db = App::getInstance()->db();
......@@ -26,10 +26,37 @@ final class CoachAssessmentService
)
ORDER BY r.created_at DESC";
return $db->select($sql);
$players = $db->select($sql);
$effectiveFilter = $coachDisciplineIds;
if ($filterDisciplineId) {
$effectiveFilter = [$filterDisciplineId];
}
if (!empty($effectiveFilter)) {
$players = array_filter($players, function ($player) use ($effectiveFilter) {
if (empty($player['selected_disciplines'])) {
return true;
}
$decoded = json_decode($player['selected_disciplines'], true);
if (!is_array($decoded)) {
return true;
}
foreach ($decoded as $d) {
$id = is_array($d) ? (int) ($d['id'] ?? 0) : (int) $d;
if (in_array($id, $effectiveFilter, true)) {
return true;
}
}
return false;
});
$players = array_values($players);
}
return $players;
}
public static function getAvailableGroups(?int $disciplineId = null): array
public static function getAvailableGroups(array $disciplineIds = []): array
{
$db = App::getInstance()->db();
......@@ -45,9 +72,10 @@ final class CoachAssessmentService
WHERE g.status = 'active' AND g.is_archived = 0 AND g.is_full = 0";
$params = [];
if ($disciplineId) {
$sql .= " AND d.id = ?";
$params[] = $disciplineId;
if (!empty($disciplineIds)) {
$placeholders = implode(',', array_fill(0, count($disciplineIds), '?'));
$sql .= " AND d.id IN ({$placeholders})";
$params = array_map('intval', $disciplineIds);
}
$sql .= " ORDER BY d.name_ar ASC, g.name_ar ASC";
......
......@@ -4,10 +4,18 @@
<?php $__template->section('content'); ?>
<div class="card" style="margin-bottom:16px;">
<div style="padding:16px 20px;border-bottom:1px solid #E5E7EB;display:flex;align-items:center;gap:8px;">
<div style="padding:16px 20px;border-bottom:1px solid #E5E7EB;display:flex;align-items:center;gap:8px;flex-wrap:wrap;">
<i data-lucide="clipboard-check" style="width:20px;height:20px;color:#0D7377;"></i>
<h3 style="margin:0;color:#0D7377;font-size:16px;">لاعبين في انتظار التقييم الفني</h3>
<span style="margin-right:auto;background:#FEF3C7;color:#92400E;padding:3px 10px;border-radius:12px;font-size:12px;font-weight:700;"><?= count($players) ?></span>
<span style="background:#FEF3C7;color:#92400E;padding:3px 10px;border-radius:12px;font-size:12px;font-weight:700;"><?= count($players) ?></span>
<form method="GET" style="margin-right:auto;display:flex;align-items:center;gap:8px;">
<select name="discipline_id" class="form-input" style="padding:6px 12px;font-size:13px;border-radius:8px;min-width:140px;" onchange="this.form.submit()">
<option value="">كل الأنشطة</option>
<?php foreach ($disciplines as $d): ?>
<option value="<?= (int) $d['id'] ?>" <?= ($filterDiscipline ?? 0) == (int) $d['id'] ? 'selected' : '' ?>><?= e($d['name_ar']) ?></option>
<?php endforeach; ?>
</select>
</form>
</div>
<?php if (empty($players)): ?>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment