1. 31 May, 2026 3 commits
    • Mahmoud Aglan's avatar
      Retroactive wizard: strict validation, no placeholders, clear error messages · 1445d411
      Mahmoud Aglan authored
      Client-side: validates ALL mandatory DB fields before allowing next/submit
      - Step 1: name, phone, gender, date_of_birth (or NID)
      - Step 2: form_date, join_date
      - Step 3: membership_value
      - Step 5: each spouse needs name, DOB/NID, marriage_date, join_date
               each child needs name, DOB/NID, join_date
               each temp member needs name, DOB/NID, category
      - Red border + Arabic error on each missing field, scrolls to first error
      
      Server-side: full validation before any DB write
      - Rejects with clear Arabic messages listing every missing field
      - No more placeholder dates or fake phone numbers
      - If anything bypasses JS, server still blocks with human-readable errors
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      1445d411
    • Mahmoud Aglan's avatar
      Bulletproof retroactive wizard: fix all NOT NULL violations and edge cases · b98382dd
      Mahmoud Aglan authored
      - spouses: add spouse_order, gender, classification, fallback date_of_birth
      - children: add child_order, relationship, classification, fallback date_of_birth
      - temporary_members: fallback date_of_birth, gender
      - members: phone_mobile defaults to placeholder, date_of_birth fallback
      - installment_plans: down_payment_receipt cast to string (VARCHAR column)
      - All dates go through safeDate() — rejects garbage, parses valid formats
      - All timestamps go through safeTimestamp() — never produces invalid datetime
      - financial_year '2020/2021' extracted correctly for created_at
      - bccomp amounts always cast to string to avoid type errors
      - Null-safe on every optional field — zero room for SQL errors
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      b98382dd
    • Mahmoud Aglan's avatar
      Fix retroactive wizard: phone_mobile NOT NULL, datetime format, client-side validation · 36a0cad4
      Mahmoud Aglan authored
      - phone_mobile column is NOT NULL; pass empty string instead of null
      - financial_year '2020/2021' was used directly in created_at datetime; extract first year
      - Add client-side step validation with red border highlights instead of alert() popups
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      36a0cad4
  2. 30 May, 2026 3 commits
    • Mahmoud Aglan's avatar
      Add seed: 32 bot players + test tournament for bracket testing · 56cb4395
      Mahmoud Aglan authored
      Run: php cli.php seed:run Phase_88_001_seed_tournament_bot_players
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      56cb4395
    • Mahmoud Aglan's avatar
      Fix retroactive wizard: parse NID for date_of_birth and gender · 0f4ca990
      Mahmoud Aglan authored
      The members table has date_of_birth as NOT NULL, but the wizard passed
      null when no explicit DOB was entered. Now NationalIdParser extracts
      DOB and gender from the 14-digit national ID for the main member,
      spouses, children, and temporary members.
      
      If no NID and no DOB provided, returns a clear validation error instead
      of letting the DB constraint violation propagate.
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      0f4ca990
    • Mahmoud Aglan's avatar
      Fix 5 support ticket bugs: AJAX errors, capacity validation, audit export,... · 30062682
      Mahmoud Aglan authored
      Fix 5 support ticket bugs: AJAX errors, capacity validation, audit export, player lookup, fee display
      
      TKT-59: ExceptionHandler now returns JSON for AJAX/XHR requests instead of
      HTML error pages. Booking wizard JS improved to show actual error messages.
      
      TKT-57: Pricing rule creation now validates group_size_max against the
      facility unit's max_capacity, preventing over-capacity rules.
      
      TKT-46: Added audit log CSV export with all current filters applied.
      New route GET /audit/export and export button in the filter bar.
      
      TKT-55: Player registration member lookup now uses only the DB id
      (set by AJAX member lookup) instead of ambiguous membership_number/id
      fallback. National ID field locked when auto-filled from member record.
      
      TKT-50: Fee breakdown text now shows base amount and development fee
      separately (e.g. "اشتراك سنوي: 222.00 + تنمية: 35.00 = 257.00")
      instead of just the combined total.
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      30062682
  3. 24 May, 2026 15 commits
  4. 23 May, 2026 19 commits