# CLAUDE.md - EZSCALE Site ## Project EZSCALE Site — Laravel 12 application replacing WHMCS for VPS/Dedicated Server hosting management (billing, subscriptions, provisioning, customer management, SSO). ## Phase Tracking (MANDATORY) All work MUST be tracked against GitHub issues and `TASKS.md`: 1. **Before starting any phase work:** Check the relevant GitHub issue (see `gh issue list`) and `TASKS.md` for current status. 2. **While working:** Update the GitHub issue with progress comments as significant milestones are completed (e.g., `gh issue comment --body "Completed X"`). 3. **After completing work:** Update `TASKS.md` to check off completed items and close/update the corresponding GitHub issue. 4. **New tasks discovered during work:** Create sub-issues or add items to `TASKS.md` immediately. 5. **Commit messages:** Reference the GitHub issue number (e.g., `Fix checkout validation (#3)`). GitHub issues: https://github.com/EZSCALE/accounting/issues ## Documentation Updates (MANDATORY) When a phase is completed or a significant task within a phase is finished: 1. **Update `TASKS.md`** — Check off completed items, add new items discovered during work 2. **Update GitHub issues** — Add progress comments (`gh issue comment --body "..."`) and close completed issues 3. **Update `CLAUDE.md`** — Reflect any new tech stack changes, directory structure changes, or convention updates 4. **Update memory files** — Record key patterns, gotchas, and environment details learned during the work 5. **Update `PROJECT_DEVELOPMENT.md`** — If architectural decisions changed or new integrations were added ### Visual Verification (MANDATORY) After every successful `npm run build`: 1. Take headless Chrome screenshots of affected pages 2. Compare layout and design against the Vuexy demo at: https://demos.pixinvent.com/vuexy-vuejs-laravel-admin-template/demo-6/ 3. Fix any visual discrepancies before considering the task complete 4. Key demo pages for reference: - Login: `.../demo-6/pages/authentication/login-v2` - Register: `.../demo-6/pages/authentication/register-v2` - Forgot Password: `.../demo-6/pages/authentication/forgot-password-v2` - Dashboard: `.../demo-6/dashboards/analytics` - Account Settings: `.../demo-6/pages/account-settings/account` - Pricing: `.../demo-6/pages/pricing` ## Laravel App Location The Laravel application is in **`website/`**. All artisan, composer, and npm commands run from there. ``` website/ ├── app/ │ ├── Models/ # 16 Eloquent models (Service uses SoftDeletes, TaxRate, EmailTemplate) │ ├── Http/Controllers/ # Account/, Admin/, and Api/V1/ controllers │ │ └── Api/V1/ # RESTful API controllers (Customer + Admin/) │ ├── Http/Resources/ # API Resources (Service, Invoice, Subscription, Ticket, Customer, etc.) │ ├── Services/Billing/ # BillingServiceInterface, Stripe, PayPal, Dunning │ ├── Events/ # PaymentSucceeded/Failed, SubscriptionCreated/Cancelled │ ├── Listeners/ # HandlePaymentSucceeded/Failed │ ├── Console/Commands/ # RetryProvisioningCommand, SyncStripePrices │ └── Providers/ # AppServiceProvider, FortifyServiceProvider ├── bootstrap/app.php # Middleware, exceptions, routing (Laravel 12 style) ├── config/ # App, auth, fortify, passport, cashier, paypal, permission ├── database/ │ ├── migrations/ # 44 migrations │ ├── factories/ # 8 factories │ └── seeders/ # Roles, plans, admin user ├── resources/ │ ├── ts/ # TypeScript source (migrated from js/) │ │ ├── app.ts # Entry point with Vuetify + Pinia │ │ ├── bootstrap.ts │ │ ├── types/ # TypeScript interfaces │ │ ├── utils/ # Resolvers, formatters │ │ ├── navigation/ # account.ts, admin.ts, marketing.ts │ │ ├── plugins/vuetify/ # theme.ts, defaults.ts, icons.ts, index.ts │ │ ├── @layouts/ # Layout SCSS stubs for Vuexy compatibility │ │ ├── Layouts/ # AccountLayout, AdminLayout, AuthLayout, MarketingLayout │ │ ├── Components/ # FlashMessages, StatCard, StatusChip, ThemeSwitcher, app-form-elements/ │ │ └── Pages/ # Auth/ (7), Profile/ (2), Plans/ (1), Checkout/ (1), Subscriptions/ (2), Billing/ (3), Services/ (2), Tickets/ (3), Admin/ (30+), Marketing/ (14), Dashboard │ ├── styles/ # SCSS with Vuexy @core overrides │ │ ├── @core/ # Copied from Vuexy: base + template SCSS overrides │ │ ├── variables/ # _vuetify.scss, _template.scss │ │ └── styles.scss # Main entry — imports @core SCSS chain │ ├── images/ │ └── views/app.blade.php # Inertia root template ├── routes/ # web.php, account.php, admin.php, marketing.php, webhooks.php, api.php ├── tests/ # 252 Pest tests passing (1310 assertions) ├── composer.json ├── package.json └── vite.config.js ``` ## Tech Stack - **Framework:** Laravel 12 (PHP 8.3), Laravel 12 slim structure (no Kernel files) - **Frontend:** Vue 3 + Inertia.js v2 + TypeScript (REQUIRED) + Vuetify 3 (Vuexy design system) + Vite 7 - **UI Theme:** Vuexy Vue + Laravel Admin Dashboard — SCSS overrides from @core integrated, AppTextField/AppSelect/AppTextarea wrapper components, purple primary (#7367F0) - **Testing:** Pest 4 + PHPUnit 12 (347 tests, 1866 assertions) - **Formatting:** Laravel Pint - **Payments:** Laravel Cashier (Stripe) + srmklive/paypal (PayPal) - **Database:** MySQL 8.x, Redis for cache/queue/sessions - **Auth:** Laravel Fortify (login, register, 2FA, password reset, email verify) + Passport (OAuth2/SSO) - **Roles:** spatie/laravel-permission (admin, customer) - **Queue:** Laravel Horizon for queue management ## Commands ```bash cd website composer run dev # Start all dev servers (artisan serve + queue + pail + vite) php artisan serve # Laravel dev server only php artisan test --compact # Run Pest tests php artisan migrate # Run migrations npm run dev # Vite dev server only npm run build # Production build vendor/bin/pint --dirty --format agent # Format changed files ``` ## TypeScript Requirement (MANDATORY) **All frontend code MUST use TypeScript.** This applies to all Vue components, composables, utilities, and type definitions. ### Rules - All `.vue` files must use ` ``` ### Migration Note Existing `.vue` files in `resources/js/` were written in plain JavaScript during Phase 1-2. They must be migrated to TypeScript as they are touched. When working on a page, convert it to TypeScript as part of the work. ## Vuexy Theme Reference The Vuexy theme is at `../vuexy-theme-vue-laravel-full-example-typescript/`. Use it as a **reference** for UI patterns, component design, and styling conventions. ### Key Vuexy Patterns to Follow - **Component structure:** `