Idempotent provisioning, service soft-delete, Plans page redesign, doc updates
Part A: Fix duplicate Service creation on provisioning retry - All 4 provisioning services use Service::firstOrCreate() keyed on subscription_id+service_type to prevent duplicates on queue retries - HandleSubscriptionCreated sends notification before provisioning, no longer re-throws on failure - RetryProvisioningCommand simplified to reuse existing Service records Part B: Plans/Pricing page complete redesign - Service type tabs (VPS, Dedicated, Web Hosting, MySQL) - Billing cycle segmented toggle (monthly/quarterly/semi-annual/annual) - Feature icons per service type, Popular/Best Value badges - Stock indicators, effective monthly price calculations Part C: Admin service soft-delete/archive - Service model uses SoftDeletes trait - Admin can archive and restore services - Show archived toggle on services list - Migration adds deleted_at column Docs: Updated TASKS.md, CLAUDE.md, PROJECT_DEVELOPMENT.md, MEMORY.md - Phase 3 marked complete, test counts updated (252 passing) - SupportPal references replaced with standalone ticket system - Frontend design skill background rule added - Closed GitHub issues #3, #6, #7, #8, #9 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
19
CLAUDE.md
19
CLAUDE.md
@@ -42,17 +42,18 @@ The Laravel application is in **`website/`**. All artisan, composer, and npm com
|
||||
```
|
||||
website/
|
||||
├── app/
|
||||
│ ├── Models/ # 14 Eloquent models
|
||||
│ ├── Models/ # 14 Eloquent models (Service uses SoftDeletes)
|
||||
│ ├── Http/Controllers/ # Account/ and Admin/ controllers
|
||||
│ ├── 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/ # 30 migrations (15 custom + defaults + packages)
|
||||
│ ├── factories/ # 7 factories
|
||||
│ ├── migrations/ # 44 migrations
|
||||
│ ├── factories/ # 8 factories
|
||||
│ └── seeders/ # Roles, plans, admin user
|
||||
├── resources/
|
||||
│ ├── ts/ # TypeScript source (migrated from js/)
|
||||
@@ -65,7 +66,7 @@ website/
|
||||
│ │ ├── @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/ (2), Checkout/ (1), Subscriptions/ (2), Billing/ (3), Admin/ (1), Marketing/ (9), Dashboard
|
||||
│ │ └── Pages/ # Auth/ (7), Profile/ (2), Plans/ (1), Checkout/ (1), Subscriptions/ (2), Billing/ (3), Services/ (2), Tickets/ (3), Admin/ (25+), Marketing/ (13), Dashboard
|
||||
│ ├── styles/ # SCSS with Vuexy @core overrides
|
||||
│ │ ├── @core/ # Copied from Vuexy: base + template SCSS overrides
|
||||
│ │ ├── variables/ # _vuetify.scss, _template.scss
|
||||
@@ -73,7 +74,7 @@ website/
|
||||
│ ├── images/
|
||||
│ └── views/app.blade.php # Inertia root template
|
||||
├── routes/ # web.php, account.php, admin.php, marketing.php, webhooks.php, api.php
|
||||
├── tests/ # 53 Pest tests (Phase 1 + Phase 2)
|
||||
├── tests/ # 252 Pest tests passing (1310 assertions)
|
||||
├── composer.json
|
||||
├── package.json
|
||||
└── vite.config.js
|
||||
@@ -83,12 +84,13 @@ website/
|
||||
- **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
|
||||
- **Testing:** Pest 4 + PHPUnit 12 (252 tests, 1310 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
|
||||
@@ -188,6 +190,9 @@ Always maximize use of subagents (Task tool) to reduce context usage in the main
|
||||
- **Background agents**: Use `run_in_background: true` for long-running tasks that don't block other work. Check results later with the Read tool on the output file.
|
||||
- **Batch similar work**: If updating 10+ files with the same pattern, send them to an agent rather than editing each one in the main context.
|
||||
|
||||
### Frontend Design Skill
|
||||
When using the `frontend-design` skill, **ALWAYS** run it in the background using `run_in_background: true`. Never run it in the main context window — it consumes significant context and produces large outputs. Check its output file when complete using the Read tool.
|
||||
|
||||
### Headless Chrome
|
||||
Chrome is available for visual testing and screenshot comparison. Use it to verify UI matches design references.
|
||||
```bash
|
||||
@@ -259,7 +264,7 @@ google-chrome --headless=new --disable-gpu --no-sandbox --screenshot=/tmp/screen
|
||||
|
||||
## Key Business Domains
|
||||
1. **Billing** — Subscriptions, invoices, payments (Stripe + PayPal), dunning, coupons
|
||||
2. **Provisioning** — VirtFusion (VPS), Pterodactyl (Game), SynergyCP (Dedicated), Enhance (Hosting)
|
||||
2. **Provisioning** — VirtFusion (VPS), Pterodactyl (Game), SynergyCP (Dedicated), Enhance (Hosting) — idempotent provisioning with retry
|
||||
3. **Customer Management** — Profiles, support tickets, notifications
|
||||
4. **Admin Panel** — Dashboard, analytics, user/service management
|
||||
5. **SSO** — Single sign-on via Laravel Passport
|
||||
|
||||
Reference in New Issue
Block a user