ARRiSE — Rehabilitation Clinic Platform
A full-stack Laravel application combining a public marketing site, an education academy, a charity shop, and three role-segregated portals (admin, therapist, patient) for a fictional sports-rehabilitation clinic.
Context & Background
Personal project for the 2ACS Web Development module at Thomas More (2025–2026). The brief was to design and ship a complete real-world Laravel application individually, starting from the laravel/livewire-starter-kit. I picked a clinic platform because it forces several non-trivial concerns into one codebase: multi-role authorization, structured clinical data with PDF output, an enrolment system with deadlines, bilingual public content, and a transactional email pipeline.
Features
- Role-aware
/dashboardrouter and three separate portals (admin, therapist, patient), gated by a custom role middleware that also verifies a matching profile record exists. - Therapist clinical workflow: a Livewire form capturing mobility, stability, strength, power and functional data, auto-calculating left/right asymmetry into a JSON column, with multi-file uploads (PDF, images, video, Office docs up to 10 MB) and on-save DomPDF generation + optional email delivery to the patient.
- Patient progress dashboard derived from historical session reports — time-series for
dorsiflexion (L/R) and hip extension (L/R) — with a profile-completion flow that flips
a patient from
pendingtoactive. - Admin back-office with KPI dashboards and CRUD for users, internal courses, speakers, external conferences, webinars, podcasts, products and shop orders.
- Academy module with derived enrolment status (
open,closing_soon,closed,full,ongoing,past), capacity and deadline checks, plus confirmation emails. - Charity shop: public catalog with reservation workflow (pending / collected / cancelled),
and a separate
shop_orders/shop_orderlinesschema for admin tracking. - EN / NL / FR internationalization via translation dictionaries, a
SetLocalemiddleware (session/cookie/config), and bilingual model fields surfaced through a runtime accessor. - Five Mailable classes with local
/mail-preview/*routes for designing templates in Mailpit.
My Contribution
I was the sole developer. I designed the data model (23 custom migrations and the matching
Eloquent models — users with role normalisation, patients with consent / insurance / no-show
tracking, therapists, the therapist–patient pivot, session reports with the JSON
objective_data column, courses, registrations, speakers, products, orders,
reservations, contacts) and authored the seeders that boot a usable demo dataset.
On the authorization side I built the CheckRole middleware, the
EnsurePatientProfileComplete guard, the role-aware dashboard redirector,
and the PatientPolicy / SessionReportPolicy gating the report
download route through Gate::authorize. I implemented the therapist
session-report form, the asymmetry computation, and the
SessionReportPdfService that renders a Blade-based DomPDF, caches it on the
public disk and regenerates on demand if the cached file is missing.
I built every interactive page as a full-page Livewire component, designed the custom
arrise layout, the transactional email templates, the PDF template, the
EN/NL/FR translation layer, and the zip.cjs packaging script. The standard
Fortify auth flow and the Settings screens come from the starter kit and were not authored by me.