- 28 Jul, 2026 10 commits
-
-
Fares authored
The INSERT was using non-existent columns (config_group, label_ar, field_type). The actual table has config_type, group_name, description_ar, is_editable. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Seasonal members don't need the استمارة fee. Set form_fee_paid=true in getSeasonalBill() so the member show page skips the form fee step entirely and goes straight to seasonal fee payment. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Seasonal memberships now require a manually entered temporary membership number (رقم العضوية الموسمية) instead of using the shared auto-increment sequence. The number is validated for uniqueness and assigned to the member record immediately, so the payment guard won't override it with an auto-generated one. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Instead of auto-generating form_number at execution time, require the user to enter it when creating the separation request. Stored in transfer_requests.form_number and used during TransferProcessor execution. Falls back to auto-generation if empty. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- Remove non-existent facility_unit_id from sa_groups insert in enrollByCoach, add required code column with auto-generated value - Guard schedule copy when no source group exists - Fix old() helper usage for array fields (additional_coaches) by reading directly from session _old_input instead of old() which only returns strings Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Redesign the player assignment page with a 3-step guided workflow (Sport → Program → Trainer) supporting both trainer-based and program-based assignments. Add multi-coach support for groups via sa_group_coaches pivot table. Add per-hour/per-game pricing type to recreational games. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The medical_grace_deadline column already exists in the live DB from a prior partial run. Converted to a closure-based migration that checks information_schema before altering. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Player Assignment Page (/sa/assignments): - General-purpose assignment flow for all disciplines (not just swimming) - Filter by discipline and unassigned status - Shows player medical status, type, current groups - Assign with capacity check, age validation, force-enroll option - Registered in sidebar menu with sa.player.assign permission Recreational Games (/sa/games): - Full CRUD for games with type/fee/duration/facility config - Game sessions with open/full/in_progress/completed lifecycle - Ticket issuance per session with player name, type, fee tracking - Session detail view with ticket list and payment status - Migration creates sa_games, sa_game_sessions, sa_game_tickets tables - Registered in sidebar with sa.game.view/manage permissions Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- Medical Level (1-3): added to approval flow, saved to players/sa_players/medical_records, displayed on player detail page with color-coded badge - Medical Grace Period: configurable days (system_config), set on enrollment when medical cert is missing, shown in attendance view, cron auto-suspends expired grace - Booking Postponement: new postpone method with max 3 attempts, change history table, availability check for new slot, UI form on booking detail page - Mirror Recurrence: templates now support daily/weekly/biweekly/monthly/custom patterns, expandTemplate respects recurrence_type, wizard UI updated with pattern selector - Attendance view: grace period deadline shown instead of generic medical warning Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- CSRF token now uses \App\Core\CSRF::token() to ensure it's always generated, not raw $_SESSION which could be empty - apiPost and loadState now check response.ok before parsing JSON, preventing silent failures when server returns 419/500/HTML - Error messages now include status code or exception details - Added guard for empty SLOTS array (missing operating hours) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 27 Jul, 2026 5 commits
-
-
Fares authored
The zone grid was previously restricted to pool-type facilities only. Now any facility can have a grid configured (rows × cols, max 25 each) via the create/edit forms. Facilities with grid dimensions get the visual grid manager; those without keep the unit-based mirror view. Changes: - Remove facility_type='pool' filter from PoolGridService::getFacility - MirrorController routes by grid dimensions instead of facility type - Facility create/edit forms now include grid rows/cols fields - FacilityController store/update save grid dimensions - Facility model fillable updated with grid columns - Grid size limit increased from 20 to 25 - Facility show page adds "الشبكة" button when grid is configured - MirrorStateService and SlotAvailabilityService check grid dims instead of facility_type for zone booking cross-checks Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- Player search now shows type (member/non-member), medical status, and serial number in dropdown results for accurate identification - Group player table adds columns for player type and medical status - Pending payment players now show a "الخزينة" button linking to cashier - Enrollment form stays visible when group is full (uses force-enroll) - SearchableSelect prioritizes label field for richer display text Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Display both fee tiers on each group card with the applicable one highlighted based on the player's registration type, preventing pricing confusion. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The assignment page now shows a dropdown to select which sport's programs/groups to display. Defaults to Swimming but allows switching to any active discipline. Groups are filtered by the selected discipline and show their program names. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
1. searchable-select.js: mouseover was calling renderList() which replaced innerHTML and destroyed the click target DOM node, making options unclickable. Now mouseover only toggles inline styles without re-rendering. 2. ProgramController: auto-creates a default group (code-G1) when a new program is created, using the first available coach for that discipline. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 26 Jul, 2026 5 commits
-
-
Fares authored
The medical board page reads from player_medical_records table. Without this insert, uploaded certificates would not appear in /medical-board for approval, and the player status would stay 'pending' forever. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- Membership number field with live search that auto-fills all player data - National ID field auto-extracts DOB, gender, and age (Egyptian 14-digit NID parsing) - NID also checks membership status automatically - Added date_of_birth, gender, age, and address fields - Matches the UX pattern of the existing SA registration wizard Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Adds /sa/swimming/* routes with a swimming-specific dashboard, player registration wizard (with mandatory medical certificate upload), and group assignment wizard that sends fees to the SA treasury. Players are stored in existing sa_players table and reuse EnrollmentService. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 23 Jul, 2026 3 commits
-
-
Fares authored
- Fix critical SQL error: ArchiveService queried installment_cheques ORDER BY due_date but actual column is cheque_date (broke auto-completion flow) - Include development_fee in debt table calculation (was missing 35 EGP per sub) - Add form_number field to waiver requests (migration + create/show views) - Block children over 21 from being transferred as children (must be temporary) - Add board approval and age checks to auto-complete status indicator - Update architecture map to reflect that dependents ARE transferred Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Retroactive fix for child that was separated but not archived from the parent's family tree due to the old code not setting is_archived=1. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
When a child separation completes, the child record now gets is_archived=1 so it no longer appears in the parent's family tree. Previously only status was changed to 'separated' but the record remained visible. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 22 Jul, 2026 17 commits
-
-
Fares authored
Removed membership_type gates that restricted the family tree section, add-family buttons, and related messaging to only working/foreign members. All types now see their dependents with payment status on the profile page. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Inline family member forms now collect all fields matching standalone creation forms (NID with auto-parsing, passport, DOB, gender, nationality, qualification, contact info, etc.) instead of just names. Also adds temporary member inline creation. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The seasonal membership form now allows adding spouses and children directly during registration (not just selecting pre-existing ones). New family members are created as actual spouse/child records and included in the pricing calculation. The price preview API also reflects inline additions in real-time. All discounts work correctly with inline members: - Parent + child <15: 500 EGP off - Husband + wife: 1000 EGP off - Family of 5+: 1000 EGP off - No qualification: 10% off - VAT applied on all amounts Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Sports, seasonal, and honorary members were blocked from adding spouses, children, and temporary members because allows_dependents was set to false. All membership types now allow dependents. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Sports membership fee is 50% of the membership price tier which is determined by the qualification. Added a qualification dropdown that appears when membership type is 'sports', with server-side validation requiring it. The qualification_id is saved on the member record so the billing and sports registration can correctly calculate the fee. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Three fixes applied across all non-working membership types: 1. Sports registration now calculates 50% fee and sends payment request to treasury automatically (like Seasonal already did). Also fixed billing fallback to find branch pricing without qualification_id. 2. Type-specific CTA now checks if registration record already exists in the DB (foreign_member_details, sports_members, etc.) — won't reappear after filling the form regardless of billing state. 3. Added duplicate-registration guards to all four type controllers (foreign, sports, seasonal, honorary) so users can't accidentally submit the registration form twice. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The SUB_MEM treasury queue was filtering payment_type with an allowlist that didn't include foreign_membership_fee or sports_membership_fee. Requests were created successfully but never appeared in the cashier queue. Also added proper Arabic labels and filter dropdown options. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The type-specific CTA (e.g. "تسجيل بيانات العضوية الأجنبية") was reappearing after sending payment to treasury because total_pending dropped to 0 (fee moved to in_queue). Now the CTA is suppressed when a payment is already pending, in queue, or paid. The "pending at cashier" block also now shows independently of total_pending. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Foreign membership dependents (spouses, children, temporary) are included in the membership fee — zero additional charges. Add a "not Egyptian" checkbox that toggles between NID and passport number fields on all three dependent creation forms. Server-side validation skips NID requirement when non-Egyptian is checked and requires passport instead. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Non-working types (foreign, sports, seasonal, honorary) stay in 'potential' status after form fee since they skip the acceptance process. The payment section and pending detection now recognize this status for those types. Also adds a type-specific CTA guiding members to their registration form when needed (seasonal/honorary where fee=0 until filled). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Foreign members can now add spouse/children (allowsDependents=true), and the $10k fee routes through the cashier queue instead of inline processing, matching the standard activation path used by other membership types. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Step 6 now shows year cards where each financial year contains all family members (member + spouses + children + temps) with a single shared status dropdown and payment date. Replaces the flat per-person-per-year table. Backend format unchanged — same hidden input naming for full compatibility. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
- Payment request includes child's name + fee breakdown in notes JSON - Cashier/Treasury queues display child's name instead of parent's - Skip archive snapshot for child_separation (parent keeps membership) - Generate form_number for new member via FormNumberGenerator - Auto-complete transfer immediately after cashier payment (no manual button) - Hide manual "إتمام التحويل" button for child_separation type Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
The سجل العمليات التفصيلي now shows step-by-step entries for ALL procedure types — death, waiver, and transfer/separation — not just death cases. Waiver and transfer timelines are reconstructed from request data (submission, approval, payment, data transfer, completion). Timeline entries are sorted chronologically and color-coded by type. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Fares authored
payments table uses related_entity_type/related_entity_id, not payment_request_id. Simplified query to filter by payment_type directly. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-