- 02 Aug, 2026 12 commits
-
-
Mahmoud Aglan authored
Shows "مدفوع" (green) or "لم يدفع" (red) per participant. Row is highlighted red if participant has unpaid/overdue invoices or their enrollment billing date is past without payment. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Adds two new filters to the activity log: - Reference search: searches inside JSON old_values/new_values for invoice numbers (INV-...) or payment references (PAY-...) - Entity type filter: quickly narrow to invoices, payments, etc. Uses PostgreSQL jsonb::text ILIKE for the deep JSON search. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
SuperAdmin tool that finds enrolled participants with zero invoices in the system, then offers two reconciliation paths: - Two invoices: last month (auto-paid) + current month renewal - One invoice: combined amount for both months After reconciliation, participant is on the normal billing cycle. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The assignments table has a NOT NULL constraint on created_by. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
When a trainer opens a session for attendance, if no attendance_records exist (e.g. sessions created before enrollments were activated), the system now auto-generates 'expected' records from active enrollments. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Program delete: - Removed delete button from program list (was broken) - Added red "حذف البرنامج" button inside program show page - Cascade deletes: sessions, schedules, enrollments, waitlists, assignments, groups — all force-deleted in one transaction 2. Trainer-group assignment: - GroupShow: assign/remove trainers via polymorphic assignments table - TrainerShow: assign/remove groups, shows all assigned groups (both head_trainer_id and assignments-based) - A trainer can be assigned to multiple groups - A group can have multiple trainers assigned Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- cash, card, bank_transfer, wallet, online, cheque, other - Each with distinct color and icon in a responsive 4-col grid - Confirmation step uses PaymentMethod enum label() for display Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- OverdueRenewalsAlert now shows participants with unpaid renewal invoices (not just those missing invoices), with amounts and program names - EnrollmentService gates proration behind isEnabled() check - calculateFirstBillingDate defaults to monthly day-1 when billing_cycle is NULL - Alert shows total amount owed and links each participant to payment wizard Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Without this, invoices stay in 'draft' and don't appear in the payment wizard (which only queries sent/partially_paid/overdue). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- ProgramForm defaults: billing_cycle='monthly', billing_day=1 - PricingService.findBasePrice now resolves correct base price by participant.membership_type (member → member price, else → non_member price) - Resolution order: branch+membership > branch+any > global+membership > global - NULL membership_type defaults to non_member pricing Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Big red alert at the top of the dashboard showing participants who haven't renewed their subscription. Each row links directly to the payment wizard with participant pre-selected, auto-generating the renewal invoice. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Search now shows ALL active participants (not just those with existing invoices) - Auto-generates renewal invoices on-the-fly when participant has overdue billing - Radio buttons use wire:model.live for immediate state update (fixes Next button) - Upcoming renewals section shows "Generate Invoice" button as fallback - Next button always visible (disabled until invoice selected) - Advances next_billing_date after generating renewal invoice Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 01 Aug, 2026 4 commits
-
-
Mahmoud Aglan authored
Soft-deleted participants return null from the relationship, causing route('participants.show', null) to throw a missing parameter exception. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- TrainerShow: period_start→date, total_amount→amount, status 'pending'→'active' - trainer-show.blade: period_start→date, sessions_count→quantity, total_amount→amount - AttendanceResource: actual_check_in→check_in_at, date→session.session_date - InvoiceResource: invoice_number→number, balance_due→due_amount, remove description_ar - ReportService: paid_amount→status check, cancellation_reason→withdrawal_reason, wallet status→is_active, remove frozen_amount - SendDailySummary: Organization→Academy, is_active→status='active' - SendParentWeeklyReport: fix morph type + join through session_date - DeactivateExpiredEnrollments: expiry_date→end_date - CertificateController + NotifyGuardianOfAbsence + RemoveAttendanceRecords: morph type 'participant'→Participant::class - SendInvoiceCancelledNotification: cancellation_reason→notes - DeleteParticipant: remove phantom refunded_amount reference Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The grid now also displays training_schedules that have no matching space_reservation (orphan schedules). These appear on the grid so users can see and cancel them. The cancelReservation method now accepts both reservationId and scheduleId to handle both cases. Also added cancel button column to the FacilityShow reservations tab. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Users can now cancel reservations directly from the reservations tab inside the facility show page via a cancel button with confirmation. Previously reservations were display-only with no way to modify them. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 29 Jul, 2026 7 commits
-
-
Mahmoud Aglan authored
The enrollments table has no cancelled_at column — only update status. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The trait was appending _del_YYMMDDHHMMSS (16 chars) without respecting column length limits, causing varchar(20) overflow on employee_number. Now uses shorter _d{id} suffix and truncates the original value to fit within the declared max length per field. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Employee delete: removed from list table (was broken due to row click propagation), added as red button inside EmployeeShow with proper wire:confirm and redirect after success. Participant delete: removed from list table, added as red button inside ParticipantShow that opens the DeleteParticipant modal with per-invoice refund options. Redirects to list after deletion. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Super admin/academy owner can soft-delete participants from the list. A modal shows all paid invoices and allows refunding each one individually before confirming deletion. Cascading: cancels active enrollments, removes future attendance records, cancels unpaid invoices, sets status to withdrawn. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Transfer wizard: - Can now transfer between different programs (not just same-program) - Program dropdown in step 2 to pick destination program - Calculates price difference via PricingService - If new program costs more, shows the difference and creates an invoice - Success screen links to the created invoice Collect payment wizard: - Shows upcoming installments (from payment plans) with exact due dates - Shows upcoming monthly renewal dates from enrollments - Sorted by due_date so the most urgent appears first - Invoices now sorted ASC by due_date (urgent first) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Siblings in the same family share a club membership number. The unique constraint on (branch_id, membership_id) is dropped. When a receptionist or admin enters a membership_id that already exists, a confirmation prompt shows the existing participant's full name so staff can verify it's a sibling before proceeding. Both the wizard and participant form are updated. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The delete method had an unused EmployeeService parameter that could cause Livewire method resolution issues. Removed it, and added proper cascading: deactivate trainer record, unlink+soft-delete user account, then soft-delete the employee — all in one transaction. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 28 Jul, 2026 2 commits
-
-
Mahmoud Aglan authored
Add uniqueness check for membership_id per branch in step 1 validation, preventing the DB unique constraint violation when a membership_id is reused. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
All trainer attendance records are stored as subject_type=User::class with subject_id=user.id (via GenerateTrainerAttendance listener). Multiple places were querying the wrong type ('trainer', 'staff', or Trainer::class), returning zero results. Fixed: ReportService, GenerateTrainerCompensation, Dashboard, TrainerShow. Added trainer self-attendance section to TrainerDashboard with rate, breakdown, and recent records. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 27 Jul, 2026 15 commits
-
-
Mahmoud Aglan authored
- Add Step 5 (User Account) to CreateEmployeeWizard: email, password, role - Replace person dropdown in UserForm with live search by name/phone - PersonList.deletePerson: cascades to linked user - UserList.deleteUser: deletes user only, preserves person - Expense form: visual radio-card payment source selector - Dashboard: cash-on-hand card (collections - expenses this month) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Media->url accessor already returns full URL via Storage::url(). Remove redundant asset('storage/') wrapping. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Changed OTP from 6 digits to 4 digits - Code 0000 always works in demo mode (no external SMS needed) - Relaxed rate limit from 3 to 5 attempts, timeout 300s - Validation accepts 4-6 digit codes for flexibility Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Explains why total enrollments (211) > activity participants (199): one player can have multiple enrollments in the same sport. Now shows "199 لاعب · 211 تسجيل" per activity for clarity. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
After each deploy, Livewire's JS hash changes. Without no-cache on HTML, browsers serve the old page with the wrong /livewire-{hash}/update endpoint, causing 404s until the user hard-refreshes. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Single-academy deployments don't have current_academy bound for unauthenticated API requests. Fall back to Academy::first() so /api/v1/app/config works without auth. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add admin UIs for Video, Trainers, Schedule, and Pricing Plan sections - Redesign schedule section with interactive day-filter cards and Alpine.js - Fix video section click handler with Alpine.js reactive state - Add section reordering (up/down arrows) in SectionManager - Add SEO meta tags (OG, Twitter Card, canonical, robots) to website layout - Add site-btn--outline-accent CSS variant for pricing cards - Add scrollbar-hide utility to website.css - Fix broken routes: website.preview → website.manage.preview, parent.child-detail → parent.profile.child, parent.invoice-detail → parent.finances.invoice - Fix attendance "not_taken" filter to match dashboard logic (include scheduled sessions) - Add enrollment status breakdown (active/pending/cancelled) to subscription revenue widget - Add cancelled/suspended revenue explanation in activity breakdown - Add Phase C migration + events section key migration Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Fixes deploy build failure: composer dump-autoload couldn't find app/Helpers/video.php which is required by composer.json autoload.files. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Complete OpenAPI 3.1.0 YAML specification covering all mobile API endpoints: - 15 tags (Auth, Dashboard, Participants, Notifications, Shop, Payments, etc.) - 10 reusable schemas (User, Participant, Invoice, Session, Attendance, etc.) - Request/response bodies for every endpoint - Error responses, validation errors, rate limit documentation - Bearer token auth scheme documented - 2401 lines of production-ready API docs Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- 5 new push listeners: invoice overdue, installment overdue, attendance threshold, waitlist spot, service request resolved - Deep-link route field added to all push payloads for Flutter navigation - Announcement broadcast system: send push to all/group/branch/program parents - Push analytics tracking: delivered/opened/dismissed events from client - Badge count endpoint for silent background refresh - Device heartbeat for activity tracking - Scheduled announcement sender command (runs every minute) - ServiceRequestResolved event + push notification - 59 total API routes, 24 tests passing Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Profile view/edit (personal info + emergency contact) - Photo upload for profile and participant (multipart, 5MB max) - Branch locator endpoint (coordinates, operating hours, phone) - Health check endpoint (GET /health — no DB, instant response) - API response headers middleware (X-Request-Id, X-Api-Version) - Feature test suite: 17 tests covering auth, public access, rate limiting, and validation across all endpoint groups - 53 total API endpoints Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Evaluation list + detail with per-criterion scores and percentages - Dashboard endpoint: single-call home screen (all children, today's sessions, totals, announcement bar, unread counts) - Service requests: freeze/unfreeze/transfer/cancellation workflow with duplicate prevention and cancel-by-user - Invoice detail + payment receipt endpoints for mobile viewing - Fix: use correct column name `due_amount` (not `balance_due`) across all API controllers and PaymobService - 48 total API endpoints Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Wallet balance + transaction history per participant - Installment/payment plan tracking with progress percent - Document listing with expiry status summary - Event detail + registration from mobile (duplicate check) - Product order flow with Paymob fallback (graceful when unconfigured) - API rate limiting: 60/min general, 10/min auth, 3/min OTP, 5/min payments - Production-safe error responses (no stack traces when APP_DEBUG=false) - 40 total API endpoints Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Credential resolution order: academy system_settings → current_academy setting → config/services.php → env variable. Callback endpoint now resolves academy from the payment record itself (no auth context needed). Failed payments are explicitly marked with failure reason. Added HTTP timeouts to all Paymob API calls. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Paymob gateway integration (auth→order→payment key→HMAC callback) - Payment initiation endpoint with pending record + iframe URL - Webhook callback with double-processing prevention - Guardian absence reporting (excused status for future sessions) - Contact messages (send + list with reply support) - System settings migration seeding all mobile/payment config keys Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-