- 02 Jul, 2026 1 commit
-
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 01 Jul, 2026 35 commits
-
-
Mahmoud Aglan authored
- enrollInProgram() was called with an array but expects (Participant, TrainingProgram, User, options[]) — would crash at runtime - View referenced $program->fee_amount which doesn't exist on TrainingProgram (prices live in base_prices table) — fees never displayed - Added #[Computed] selectedProgramFee() to resolve price from base_prices - Updated view to use computed property and inline BasePrice query for program list Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
These files were modified locally but never committed, causing production errors (customerPays() method missing, LoginRedirectService not found). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Blade's regex compiler treats literal {{ inside __() strings as directive openings, causing unclosed-paren parse errors. Replaced with single braces in placeholder text. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Livewire 4 dropped support for the legacy get*Property() magic accessor. Migrated all 6 affected components to use the #[Computed] attribute: - NewRegistrationWizard (hotbuyResults, hotbuyTotal, selectedProgram, etc.) - WeeklySchedule (weekDays, timeSlots) - InvoiceCreate (subtotal, total) - InvoiceShow (canCancel, canRecordPayment) - SystemSettings (activeSchema) - NotificationTemplateForm (availableVariables) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Branch::users() was hasMany (users.branch_id doesn't exist), now belongsToMany through role_user pivot - NotificationLog missing read_at in $fillable despite column existing - Trainer::assignments() used wrong FK join (employee PK vs user FK), replaced with hasManyThrough via Employee - POSService referenced phantom wallet.frozen_amount column Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Full vertical slice with migrations, enums, models, services, Livewire CRUD, views, permissions, routes, and sidebar navigation for the HR domain. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The @script block renders @json($gridSegments) once at page load (empty array). When a time slot is selected and gridSegments populates, the JS still references the stale empty array. Switch to this.$wire.gridSegments for live data access. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Segments use 1-based row/col (R1C1 = row:1, col:1). The loop was starting at 0, creating an empty row and column with no matching segments. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replace the broken flex+grid layout with a proper CSS Grid that includes header gutters for row/column selection buttons. Cells now fill naturally. Corner button selects all, row/col headers toggle-select entire rows/columns. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The knob was offset because `after:start-[2px]` + `rtl:peer-checked:after:-translate-x-full` creates conflicting positioning in RTL. Fix: wrap the toggle in dir="ltr" and use `after:left-[2px]` so the switch itself is always LTR (knob moves left→right when on), while the label text around it remains RTL. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The facility-surface grid wasn't stretching to fill available viewport height because intermediate wrappers broke the flex chain. Now all parent divs propagate flex-1 and the grid uses 1fr rows. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The surface was too saturated and the boundary too dark/thick. Now barely tinted with very faded colors that don't scream at you. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The hardcoded schema used different key names (tax_rate, default_locale, grace_period_participants, etc.) than what the seeder + DB actually stores. Aligned all keys, added missing groups (pricing), and seeded platform_fee_customer_pays into production. 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
Replace floating card buttons with a single sport-surface container that feels like one field/court/pool divided by painted lines. Type-based theming (green turf for fields, aqua for pools, tan for courts, neutral for gyms). CSS component system via @theme + @layer components. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The component was querying a non-existent 'channels' JSON column. The table uses separate boolean columns: channel_email, channel_sms, channel_in_app. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Fixes ->invoice_number to ->number across all financial listeners, console commands, and POS services. Fixes ->full_name_ar to ->full_name (participant accessor) and ->name_ar (person column). Fixes POSService passing wrong keys ('invoice_number' → 'number', 'subtotal' → 'subtotal_amount') to InvoiceService. Fixes ReceiptService using non-existent participant relationship on Invoice. Fixes SendOverdueReminders using ->participant instead of ->billable. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Per project rule 01-migration-first.md, FK columns must follow {singular_table}_id convention. Updates migration, models, services, and all Livewire queries/views that reference this column. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Critical SQL fixes (pages were crashing): - GlobalSearch: remove non-existent branch_id/invoice_number, fix relationship - RevenueWidget: payment_method → method - FinancialReport: line_total → total_amount, balance_due → due_amount - PaymentPlanCreate: rewrite to match actual payment_plans/installments schema High-priority display fixes (features showing null): - invoice_number → number (8 locations) - balance_due → due_amount (6 locations) - full_name_ar → full_name (7 locations, accessor doesn't exist) - payment_method → method in print view - subtotal → subtotal_amount - description → notes on invoice - line_total → total_amount on invoice items - receipt_number → reference on payment Medium fixes: - Dashboard: fix format() call on string time column - Participant card: access person fields via relationship Low fixes: - daily-financial-print: createdBy → creator relationship - reports-page: payment_method key → method Infrastructure: - Add migration for cash_session_id on payments table - Add cash_session_id to Payment model fillable - Fix float → decimal:2 casts on Evaluation/EvaluationScore - Update enum registry docs to match actual DB CHECK constraints 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
- Fix "Record Payment" button on participant-show (was linking to list) - Add clickable links in enrollment-list (participant, group, program) - Add participant links on invoice contact names (list + show) - Add print button on invoice-show, print link on group-list - Add bulk-status link on participant-list - Link wizard success screens to participant/invoice views - Fix guardian dashboard: child names, invoices, groups now clickable - Add missing model relationships: Branch (participants, groups, facilities, cashSessions), Payment (branch, cashSession), CashSession (payments, posTransactions), TrainingSchedule (facility), Participant (branch, wallet, invoices, payments, attendance, POS, evaluations), Invoice (enrollments, posTransaction) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Problems fixed: - -webkit-tap-highlight-color:transparent killed OS default feedback but no custom active states existed → users got zero confirmation of their taps on mobile. Now ALL buttons/links get scale(0.97) on :active via CSS base layer, plus explicit active:bg-* on key buttons. - No modal/dropdown had a visible X close button → users couldn't discover how to dismiss on touch. Added X buttons to: sidebar (mobile), topbar user menu, global search dropdown, POS receipt modal, and all confirmation modals (enrollment cancel, waitlist, freeze, status change, reschedule, evaluation criteria form). - Sidebar nav links had no hover/press states → added hover:bg-white/10 and active:bg-white/20 + active:scale-[0.97]. - POS terminal: program cards, quantity +/-, checkout, split-add, mobile pay bar all now have active:scale and active:bg-* feedback. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Wizard inline invoice and the print/invoice view were using hardcoded colors and no logo/branch info. Now they pull from SettingsService: logo, primary_color, receipt_footer_text, and branch address/phone. 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
- Remaining form views: touch-friendly inputs, stacked buttons - assignment-list, pricing-rule-list: mobile card layouts - visual-schedule-builder: stacked sidebar on mobile - reports-page, user-profile: responsive grids and padding Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- All 96 blade views optimized for mobile (touch targets, responsive grids, stacked layouts) - Guest/login layout: respects branding CSS vars, touch-friendly inputs - Sidebar: RTL-correct mobile slide-in with backdrop blur - Topbar: compact mobile layout, overflow actions in user dropdown - All list views: dual layout (desktop table + mobile cards) - All forms: responsive padding, stacked submit buttons, 44px inputs - Attendance: 4-col action grid on mobile for quick marking - POS terminal: sticky bottom cart bar, radio card payment methods - Dashboard/receptionist: 2x2 stat grids, large action cards - app.css: safe-area utilities, print styles, touch min-heights - Zero RTL violations (logical properties only: ms/me/ps/pe/start/end) - Branding CSS vars respected throughout (--brand-primary etc.) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Invoice now includes service_fee_amount via PlatformFeeService (3% env-configurable) - Review step and payment step both show fee breakdown (subtotal + service fee = total) - Payment records the full total (including fee), not just the program price - Success screen shows a proper printable invoice with items table, totals breakdown, payment status badge, and a print button that hides nav/sidebar - Stores invoiceId for the computed invoiceForPrint property Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Wizard now checks on mount: active academy, branch, activities, programs with groups, and base prices. Shows a clear Arabic error screen instead of silently failing at confirm(). Also blocks step 3→4 if no price exists for the selected program. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
invoices.type only allows: standard, recurring, credit_note, proforma. The wizard was passing 'enrollment' which violated the DB constraint, causing a silent failure caught by the try/catch. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Step 2 now shows member vs non-member toggle + membership_id field - Price resolution checks base_prices.metadata->membership_type first, falls back to generic price if no membership-specific price exists - Membership type saved to participant record - Review step shows membership status - Computed property selectedProgramFee updates live when membership changes Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Bugs fixed: - Step 2 was skipped: checkDuplicates() advanced step AND nextStep() advanced again after it returned. Now nextStep() returns early after checkDuplicates() - No invoice was ever created: confirm() now creates a real invoice via InvoiceService with the price resolved from base_prices table - No payment was ever recorded: now uses PaymentService.recordPayment() which creates double-entry transaction and updates invoice paid_amount - fee_amount doesn't exist on training_programs — price comes from base_prices (polymorphic). Added resolveProgramFee() + selectedProgramFee computed property - Success screen now shows: participant number, program, invoice number/amount, payment status (paid vs outstanding) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
A receptionist should only: - Register participants (wizard) - Look up participant info (read-only) - Collect payments on existing invoices - Sell via POS - Open/close their cash session Removed: invoices.list (gates financial overview), invoices.create, wallets.list/view/credit, participants.update, guardians.update, enrollments.list, cash_sessions.manage, payments.list, pos_sessions.open/close/list Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Problems fixed: - MissingRulesException crash on step 4 (empty rules passed to validate()) - Guardian was never actually created as Person + Guardian record - Guardian was never linked to participant via guardian_participant pivot - Enrollment in program never happened (service didn't handle program_id) - medical_notes was passed at wrong level (it's on people table, not participants) - relation 'guardian' missing from validation (exists in DB CHECK constraint) Now the wizard properly: 1. Creates guardian Person + Guardian record (or reuses existing) 2. Creates participant Person record with all fields (phone, national_id, medical_notes) 3. Creates Participant via ParticipantService with guardian linked 4. Attaches guardian via guardian_participant pivot 5. Enrolls in program via EnrollmentService (auto-finds/creates group) 6. Added participant phone + national_id fields to step 2 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>
-
- 30 Jun, 2026 4 commits
-
-
Mahmoud Aglan authored
1. ParticipantForm: set branch_id from session in mount() so new participants get the active branch (was null, invisible in list) 2. SpaceLayoutService::update: compare config BEFORE updating the model so change detection works (was comparing same value to itself) 3. ReceiptSettings: use session branch_id instead of user->branch_id which could be null, preventing template save Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Livewire reserves $errors for the validation MessageBag. Using the same name as a public property causes a 500 error on render. 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>
-