- 27 Jul, 2026 10 commits
-
-
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>
-
Mahmoud Aglan authored
- Create AcademyController (public, no auth required): - GET academy/news — paginated news articles with images - GET academy/news/{uuid} — full article body - GET academy/programs — active training programs with activity info - GET academy/events — upcoming published events with registration status - GET academy/gallery — paginated media gallery - Create ShopController (auth required): - GET products — essential products with purchase history check (includes already_purchased_at per participant per year) - Total: 26 API endpoints Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Install kreait/firebase-php SDK - Create PushNotificationService with 3-tier credential resolution (system_settings → storage file → env var, graceful degradation) - Auto-deactivate invalid/unregistered FCM tokens on send failure - Add Push case to NotificationChannel enum - Create 6 event listeners for push notifications: - AttendanceMarked → notify guardians (present/absent) - PaymentReceived → confirm payment to guardians - InvoiceCreated → alert guardians of new invoice - SessionCancelled → notify all group participants - EnrollmentCreated → confirm enrollment to guardians - EvaluationShared → notify guardians of new evaluation - Register all listeners in EventServiceProvider (queued) - Create NotificationController API endpoints: - GET notifications (paginated + unread count) - PATCH notifications/{id}/read - POST notifications/read-all - GET/POST notifications/preferences - Create scheduled push commands: - push:session-reminder (every minute, 30min before session) - push:installment-due (daily, 1 and 3 days before due) - Add channel_push column to notification_preferences - Total: 20 API endpoints now live Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Install Laravel Sanctum, add HasApiTokens to User model - Register API routes under /api/v1/ prefix in bootstrap/app.php - Create AppConfigController (public): academy branding, feature flags, auth mode - Create AuthOtpController: OTP request/verify with demo mode, rate limiting - Create DeviceController: FCM token register/refresh/delete - Create ParticipantController: children, show, summary, schedule, attendance, invoices, enrollments - Create API Resources (User, Participant, Session, Attendance, Invoice, Enrollment) - Create device_tokens migration with platform CHECK constraint - Create DeviceToken model with BelongsToAcademy trait - Add mobile API implementation plan document Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- One app per client: single instance.dart config file change = new build - Firebase: one project per client, service account JSON uploaded to system settings - Auth: demo mode (OTP=123456) for testing, real SMS when provider configured - Runtime branding: logo/colors fetched from /api/v1/app/config, not hardcoded - Full Firebase setup checklist, notification flow diagram, deployment checklist - New client deployment: Firebase (5min) + Flutter build (5min) + config (2min) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
POS Terminal now checks if an essential product was already purchased by the selected participant this year. Shows amber warning with the purchase date — allows the sale to proceed, just warns the admin. Also expanded mobile app plan with: explore academy (news, gallery), shop for essential products from app, event registration, and the corresponding API endpoints needed on the system side. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 26 Jul, 2026 14 commits
-
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Pro-rata allocation from invoice_items where itemable_type = Product. Shows total collected from products, % of total revenue, units sold, and per-product breakdown with actual collections (not invoice totals). Handles bundled invoices and installment payments correctly. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The old query only found 30 enrollments (those with invoice_id set) and showed 33K (9.3%). The correct approach identifies subscription line items via invoice_items.itemable_type IS NULL (218 items), then pro-rates each payment by the subscription portion of that invoice's total. Result: 174K (48.5%) which matches actual subscription collections including bundled invoices and installment payments. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Full breakdown of اشتراكات revenue: total amount, % of total income, per-activity breakdown with bar charts, top 10 programs ranked by revenue, new enrollment count, average revenue per enrollment, and period comparison (today/week/month/year). Uses enrollment→invoice→payment chain for accuracy. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Anchor-only hrefs (#section-*) do nothing on non-homepage routes. Compute $navBase prefix (full homepage URL on subpages, empty on homepage) and prepend it to all section links in all 5 navbar variants, mobile menu, and footer blocks partial. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Dashboard: new "مصروفات اليوم" stat card with monthly total - Financial overview: includes direct expenses from expenses table in totals, expense breakdown by category, recent expenses list - Monthly P&L chart now includes direct expenses in calculation - Expense breakdown section links to expenses list and create form The /expenses/create form already records double-entry transactions via ExpenseService — this commit ensures those records are reflected in all financial statistics and reporting views. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
When a product has an installment plan selected, the receptionist can now choose how many installments (1, 2, etc.) to collect at the counter. The payment total adjusts dynamically, and paid installments are marked as 'paid' immediately on confirm. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
"الأحداث" has a negative connotation in Egyptian Arabic (juvenile detention). Using "إيفنتات" — formal, business-appropriate, universally understood in the Egyptian market. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Same ->value fix as registration list — enum object cannot be used directly as array offset. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Remove 2-column grid (caused fields cramming side-by-side) - All fields stack full-width for clean readability - Radio/checkbox options in bordered card-style containers - Proper focus states using site accent color - Shadow and rounded inputs for depth - Better section dividers with centered lines - Submit button with icon, shadow, and loading spinner - Error states with icon indicators - Terms field highlighted with amber background Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
$reg->status is a backed enum — use ->value to get the string for array indexing and string comparisons. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Add explicit bg-white text-gray-900 to all form inputs so text is visible regardless of inherited site CSS variables. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Remove fixed h-40 + object-cover from event list cards and gallery previews in the create wizard. Images now display at natural aspect ratio with object-contain so sponsor logos at edges are fully visible. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replace object-cover (crops to fill) with object-contain (fits entire image) across all event and news views. Remove fixed aspect-ratio constraints so sponsor logos at image edges are fully visible. Event show cover now bleeds full-width past the container. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 25 Jul, 2026 14 commits
-
-
Mahmoud Aglan authored
- 6 hero variants: fullscreen, split_right, split_left, centered_minimal, video_bg, slideshow - 5 navbar styles: solid, transparent, floating, centered, minimal (with CTA, logo position, social toggle) - 4 footer styles: dark, light, accent, transparent (with configurable blocks & columns) - Multi-column layout selector (grid_2/3/4, list, carousel) for activities, programs, trainers, news, branches - Visual variant picker in section editor with radio cards and mini previews - Footer block builder with add/remove/reorder (about, links, contact, social, hours) - Phase B migration adds navbar_cta_text, footer_blocks, footer_style, etc. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- CSS: all hardcoded colors replaced with CSS variables - CSS: data-animation system (fade-up/down/left/right, zoom, flip, bounce) - CSS: card style overrides via data-card, navbar variants via classes - CSS: reduced-motion support, RTL logical properties throughout - JS: IntersectionObserver for data-animation sections - JS: gallery lightbox, FAQ accordion, floating navbar scroll - Theme editor: mini-mockup template previews, better color preview strip - Theme editor: visual density indicators, shape/card mini previews - Theme editor: spinner on save, auto-dismiss success toast - Section manager: RTL-safe toggle switch, icon on visual controls header - Section manager: better save button with icon + spinner - Section manager: auto-dismiss success toast with Alpine transition 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
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
- Add 8 template presets with one-click color scheme application - Expand color palette from 4 to 8 (add background, surface, border, muted) - Add auto-palette generation from accent color (dark/light detection) - Add typography controls: font size scale, heading weight, line height, letter spacing - Add density control (compact/comfortable/spacious) affecting section padding and card gaps - Add border radius presets (sharp/subtle/rounded/pill) - Add card styles (flat/raised/bordered/glass) - Add section dividers (none/line/wave/angle/curve) rendered as SVG between sections - Add image shape control (square/rounded/circle/blob) - Add animation toggle and speed control - Add per-section: background type (solid/gradient/image/video), custom animation, padding override, mobile visibility toggle - All new columns have defaults — existing sites render unchanged until admin modifies settings - CSS variables drive all theming; public layout emits full token set Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add openRegistration() and closeRegistration() methods to EventShow Livewire component - Add registration control panel in event admin sidebar with status indicator and toggle buttons - Fix slug generation to produce ASCII-safe slugs (prevents WhatsApp/messaging apps from truncating URLs containing Arabic/Hindi numerals) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Events that have started (in_progress) should still accept registrations until registration_closes_at. Previously only 'published' status allowed registration. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Low stock: use min_stock_level (not reorder_point), eager-load inventoryLevels 2. Inventory movements: reference is a morphTo — show class_basename#id instead of raw object 3. Product sales: pos_transaction_items has item_type/item_id (not product_id) 4. POS transactions: relationship is processedBy (not user), field is receipt_number 5. Collect payment wizard: only search participants with outstanding invoices Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Session completion: column is 'session_date' not 'date' 2. Trainer workload: TrainingGroup has no assignments() — use TrainingSession.trainer_id via employee→user link, count groups via head_trainer_id 3. Wallet balances: Wallet uses polymorphic owner() not participant() — use owner with owner_type filter Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Enrollments by program: replace PostgreSQL-incompatible HAVING on alias with get()->filter() 2. New report "المتغيبون حسب المدرب": shows absent participants grouped by trainer, with min-absences filter (1/2/3/5 sessions), excludes suspended participants 3. Also fixes existing absentee report to exclude suspended via the new report variant Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Daily revenue: group by date only (removed method split per manager request) 2. Cash sessions: fix column names (cash_in→total_cash_in, cash_out→total_cash_out) and null-safe arithmetic to prevent string/int type error 3. Revenue by activity: fix column name (line_total→total_amount) and replace broken whereHasMorph with proper join for branch filter 4. Money formatting: cast to int before division to prevent type error on empty values Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Status/gender/method columns now display Arabic labels instead of raw English values 2. Enrollment search (receptionist wizard) includes 'registered' participants, not just 'active' 3. New report: participants without medical clearance (بدون شهادة طبية) 4. Expired memberships report no longer crashes when date field is cleared (empty string fallback) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add print_count and last_printed_at to invoices and payments tables - InvoicePrintController increments count on every print view - ReceiptController increments count on every payment receipt print - Print count badge shown next to print button on invoice show page - Print receipt button component accepts optional printCount prop - Rename dashboard revenue widget label from الإيرادات to التحصيلات Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 24 Jul, 2026 2 commits
-
-
Mahmoud Aglan authored
The guardians_relationship_type_check constraint allows: father, mother, grandfather, grandmother, uncle, aunt, sibling, legal_guardian, other. The ParticipantForm was inserting 'guardian' which isn't a valid value. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Remove draft-only restriction on delete button in EventShow - EventService::delete() no longer blocks deletion based on status - Migration sets website_settings.is_published default to true and updates existing rows - Fixes 404 on public event pages caused by unpublished website settings Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-