- 19 May, 2026 2 commits
-
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
- 18 May, 2026 16 commits
-
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
Pool is now a real 2D grid (rows × cols = squares). Admin sets dimensions, selects time slot from timeline strip above, then assigns squares to academies/groups/hourly/blocked/maintenance via drag selection. - New table: sa_pool_zone_bookings (zone_row × zone_col per time slot) - ALTER sa_facilities: add pool_grid_rows, pool_grid_cols - Rewritten PoolGridService with zone-based logic + copy-slot feature - Interactive view: timeline strip, 2D grid with drag/click/shift-rect select - API: state, assign, clear, update-grid, copy-slot - Seed: 4×6 grid with sample zone bookings - Fix mirror route mismatch (/sa/mirror/{id} now works) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Lanes × time slots grid with drag selection, bulk assign (training/blocked/maintenance), bulk clear, date navigation, and real-time AJAX state loading. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Seeds: discipline, facility (8 lanes), time brackets (5), pricing rules (80 rules across all lanes × brackets × group sizes), 4 coaches, 4 programs, 6 training groups with weekly schedules, 20 players enrolled across groups, training bookings for current week, hourly bookings, and a maintenance blackout date. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Column fixes across 13 controllers/models/views: - sa_coaches: name_ar → full_name_ar, status → is_active - sa_players: serial_number → registration_serial, code → registration_serial - sa_facility_units: removed non-existent is_archived references - sa_player_documents: title → file_name, original_name → file_name, uploaded_by → created_by - sa_blackout_dates: wrong table name sa_facility_blackouts → sa_blackout_dates - sa_disciplines: wrong table name disciplines → sa_disciplines - sa_attendance: added missing attendance_date, removed non-existent recorded_at - sa_player_documents: document_type medical → medical_cert, status → approval_status - card_status: not_issued → inactive, expired → revoked - player_type: removed invalid academy_player - academy_type: removed invalid partnership - gender_restriction: store NULL instead of 'mixed' - Added missing [] params to $db->select() calls Membership tutorials: 25 tutorial files covering all membership operations. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
Covers all use cases: setup, registration, academies, scheduling, financial operations, daily operations, and 3 full end-to-end scenarios (swimming pool, football academy, tennis courts). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
-
- 17 May, 2026 3 commits
-
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
- Add payment_request.cancelled listener that reverts member/dependent to payment_pending when their payment is cancelled from the queue - Allow cancellation of completed payment requests (voids linked payment) - Add cancel button for completed items in queue UI - Fix self-healing logic to not re-activate dependents whose payment was intentionally cancelled (checks for cancelled requests without a valid completed replacement) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 16 May, 2026 2 commits
-
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 15 May, 2026 5 commits
-
-
Mahmoud Aglan authored
- MatchCenter: schedule/start/end matches, live pitch-side event entry - Events auto-increment score on goals, timeline view by minute - Dashboard shows live (pulsing), scheduled, and finished matches - News module: full CRUD with cover image upload, publish/unpublish toggle - Category-based filtering (match/facility/announcement/schedule/general) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Club level: total revenue, player demographics, discipline breakdown, utilization - Sport level: discipline-specific KPIs, coach performance, academy links - Facility level: bookings, revenue, utilization rate, popular time slots - Reusable time filter partial (day/week/month/year/3year/5year/custom) - PDF export via PdfExportService - DashboardMetricsService for centralized metric calculations Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Zone trainee assignment now validates player card_status and medical_status - Zone schedule creation validates coach/academy active registration - Academy contracts support PDF document upload on create/edit - New MedicalBoard module for board review of player medical certificates Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Fix payment void cascade, enhance death workflow, and transfer same-number with companion validation - Payment void now also voids linked payment_requests and reverts frozen/suspended members - Death case requires full form fill for spouse, charges 570+annual, supports secondary wives as separate memberships - Transfers keep the SAME membership number, archive source, charge surcharge for extra companions Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Divorce requests now go through board review before payment - Board sets fee percentage based on qualification + divorce certificate - Total fee = (percentage × membership value) + 570 form fee + annual subscription - New member page shows old/new membership number transfer link - Full workflow: submit → board_review → board_approved → payment → complete Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 14 May, 2026 12 commits
-
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Payment void now reverts entity status: added payment.voided listener that sets dependents back to pending_payment (or reverts member to payment_pending if membership payment is voided with no other valid payment) 2. Added join_date column to children and temporary_members tables (migration), set on activation. Display in family tree tables. 3. Removed stepchild (ابن/ابنة الزوج) from children relationship dropdown 4. Form fee (570) now includes annual subscription on post-activation additions (restored bcadd with getAnnualSubscriptionForAddition) 5. Added join_date to Child and TemporaryMember model fillables Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replace unsupported DROP INDEX IF EXISTS with information_schema check. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Gender: strictly enforce male/female only in member, spouse, child, temporary creation (validated from NID or manual input) - Spouse classification: under 21 = عضو تابع (dependent), 21+ = عضو عامل (working) - Post-activation lock: after membership payment (membership_number assigned), all member/dependent data becomes non-editable except by super admin - Locks: create, edit, update, archive on spouses, children, temporaries - Locks: edit, fill-form, update on member itself - UI: hides add/edit buttons when locked, shows lock indicator - Marriage rules already enforced: male→4 females max, female→1 male max (via Spouse::getMaxSpouses and gender cross-check from NID) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Phase_64_002: Convert to closure-based migration with column existence checks (was failing because movement_type already existed from partial prior run) - Phase_65_012: Backtick-quote `row_number` (MySQL 8.0 reserved word) - Phase_64_001 seed: Use description_ar instead of non-existent description column, remove is_active (not in schema), add config_type and group_name Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Penalties only apply for late additions (post-activation). When adding spouses during the initial membership form, only the percentage fee applies — no yearly fines for marriage before membership. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- BillingService now marks dependents as paid when their DB status is active (handles combined membership payment where no individual addition_fee payment exists) - Remove annual subscription from addition form fee calculation (570 only, not 827) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Fix membership payment sync, auto-send post-activation additions to cashier, and add fee calculation transparency - Fix critical bug in Cashier bootstrap where children/temporary_members activation failed silently due to non-existent join_date column (only spouses have it) - Add self-healing sync in MemberController::show() to fix historically stuck dependents - Auto-create payment_request when adding dependents to active members (post-activation) - Add pending additions UI section for active members showing cashier queue status - Store fee calculation breakdowns in new fee_breakdown_json column on dependent tables - Display expandable fee breakdowns in family tree for full calculation transparency - Add migration Phase_65_014 for fee_breakdown_json column Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- create.php: passport section (hidden by default) with passport number, manual DOB, manual gender - create.php: checkbox toggle to switch between NID and passport modes - create.php: JS hides NID card and shows passport section when toggled - MemberController: store() reads date_of_birth_manual/gender_manual for passport path - MemberController: nationality auto-set to أجنبي when using passport ID type - MemberController: saveFillForm() now includes passport_number in allowed fields Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
NID is the only ID verification needed. The FormBridge NEW_MEMBERSHIP schema had passport_number as required (with conditional visibility), causing browser validation errors. Now always uses our custom form which has no passport field. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Restructured create.php: NID is now primary input with auto-extracted DOB/age/gender/governorate displayed in highlighted results box - Rebuilt fill-form.php to match paper form sections: personal data, contact, residence, work details, referral source, special discount - All fill-form fields non-mandatory except qualification_id (pricing) - Spouse form: NID locks DOB field when parsed, shows source indicators - Children form: NID locks both DOB and gender when parsed - Added discount document upload handling to saveFillForm controller - Bilingual labels (Arabic/English) matching physical paper forms Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-