Commit Graph

88 Commits

Author SHA256 Message Date
2f985ab8f3 test(dedicated): phase 4 — Pest feature tests for the new lineup
11 tests covering:
- Landing page returns 16 plans (8 14th-gen + 8 legacy)
- All 8 14th-gen chassis have correct setup_fee per tier mapping
  (R440 $349, R540 $549, R640 $349, R740 $549, R740xd $549,
   R740xd LFF $549, R640 NVMe $799, R740xd NVMe $799)
- Legacy 12th/13th-gen plans are active with $0 setup fee
- Per-chassis detail page renders for every 14th-gen slug
- 404 for invalid slugs
- R740xd variants get the R740xd-specific CPU group; non-xd
  chassis get the standard CPU group
- All 6 dedicated 14th-gen config groups exist after seeding
- RAM upgrade group standardizes on DDR4-2400 (per Q5 brainstorm)
- Checkout setupFee prop exposed correctly on dedicated plans
- Checkout setupFee is 0 on VPS plans

All 22 of my session's Pest tests pass (11 dedicated + 11 VPS
estimator). Pre-existing project test failures (DOMAIN_* mismatch
between hardcoded test URLs and docker dev env) are unrelated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:02:46 -04:00
311a4e961c feat(dedicated): phase 3 — frontend lineup pages + configurator
New pages:
- /dedicated-servers (rewrite): chassis grid with generation filter
  (All / Build to Order / In Stock — Rack inventory), hardware band,
  ColoCrossing-vs-EZSCALE comparison table, 8-question FAQ, custom-
  build CTA. Uses ChassisCard + GenerationFilter components.
- /dedicated-servers/{slug}: per-chassis page with locked baseline
  spec sidebar, configurator section (4-cycle toggle, 6 option
  groups via OptionGroupSelector, sticky ConfiguratorFooter with
  setup-fee waiver display), bay-strategy reminder card.

New shared components:
- Components/Marketing/Dedicated/
  - ChassisCard.vue — uniform card for both build-to-order and
    in-stock variants; differentiates with badge + border tone
  - GenerationFilter.vue — 3-option chip toggle with counts
  - BuildStatusPanel.vue — 5-stage timeline (Ordered → Hardware
    acquired → Assembly → Racked → Deployed) with editable prop
    for admin use; reused on customer service detail page
  - DedicatedConfigurator/
    - index.vue — orchestrator, mounts store, debounces URL push
    - CycleToggle.vue — 4 cycles (Monthly/Quarterly/Semi/Annual)
      with setup-waived badges on 6+ month tiers
    - OptionGroupSelector.vue — generic radio for any config group
    - ConfiguratorFooter.vue — sticky total + share link + order CTA

Pinia store:
- stores/dedicatedConfigurator.ts: per-chassis state (selections
  keyed by group name, cycle), getters for all sub-totals, setup-
  fee waiver logic, hydrateFromUrl + shareUrl + checkoutUrl. URL
  param shape: ?cycle=&cpu=&ram=&os=&bw=&ipv4= (only non-default
  values serialized).

Comparison rows are sourced from the freshly-landed competitor
research at infrastructure/docs/json/competitors-2026q2.json
and ovh-2026q2.json — focuses on hardware transparency, iDRAC9
inclusion, BOSS boot, setup-fee policy, and engineer-first support.

Drive picker descoped to v1.1 (per design spec): the configurator
captures CPU/RAM/OS/Bandwidth/IPv4 self-serve; drive selection is
handled via post-order ticket in v1. Bay-strategy callout on the
detail page sets that expectation.

npm run build clean; DedicatedServers + DedicatedServerDetail
bundles are 14.7 / 16.3 kB (gzipped 5.8 each). Visually verified
in the docker dev stack.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:01:12 -04:00
9c178f289c chore(dedicated): standardize 14th-gen RAM on DDR4-2400 ECC
Procurement decision: simpler single-DIMM-SKU sourcing across all
RAM tiers. The Gold 6230 IMC supports up to DDR4-2666, but
standardizing on 2400 keeps RDIMM ↔ LRDIMM transitions on the same
speed and means we don't need two separate procurement streams.

The ~10-18% memory bandwidth penalty vs 2666 is invisible for
typical hosting workloads (general compute, web/db, virtualization).
Memory-bandwidth-bound workloads (in-memory caches, ML inference)
can request a custom 2666 build via the contact form.

Updates:
- All 8 14th-gen plan rows: features.ram now reads
  "32 GB DDR4-2400 ECC RDIMM" (was 2666).
- Dedicated 14th Gen — RAM Upgrade group: each value now carries
  its actual DIMM type — RDIMM up through 128 GB, LRDIMM at
  256 GB and above. All speeds DDR4-2400.

Note: this diverges from infrastructure/docs/dedicated-server-
configurations.md which still lists 2666 (matches what
SaveMyServer's configurator ships). Reconcile upstream when
procurement is finalized.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 17:52:49 -04:00
c7e545601e feat(dedicated): phase 2 — routes, configurator data, checkout setup fee
Routes:
- /dedicated-servers/{slug} (per-chassis detail) added alongside the
  existing /dedicated-servers landing. Landing route now eager-loads
  prices; detail route eager-loads chassis-specific config groups.

ConfigOptionSeeder — 6 new dedicated 14th-gen groups:
- CPU Upgrade (4 tiers; attached to R440/R540/R640/R740)
- CPU Upgrade R740xd (4 tiers, higher-TDP; attached to R740xd variants)
- RAM Upgrade (7 tiers, 32GB → 1.5TB)
- Operating System (6 options incl. Windows BYOL)
- Bandwidth (5 tiers, 1G unmetered → 10G unmetered fair-use)
- IPv4 Block (4 tiers, single → /27)
All idempotent via updateOrCreate, attached per chassis.

HandleSubscriptionCreated listener: build-to-order dedicated
plans (those with features.lead_time_days set) auto-create the
'ordered' build milestone. Other service types unaffected.

CheckoutController + Checkout/Show.vue:
- Pass plan.setup_fee as 'setupFee' Inertia prop
- Vue computes effectiveSetupFee (waived on semi_annual/annual,
  charged on monthly/quarterly per the brainstorm) and adds it
  to total. Display line-item still pending v3 polish.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 17:49:31 -04:00
c5fd4bcc7e feat(dedicated): phase 1 — backend data layer for new lineup
Migrations:
- add_setup_fee_to_plans_table: new decimal(10,2) default 0
- create_service_build_milestones_table: id, subscription_id,
  stage, reached_at, note, updated_by, timestamps; unique
  (subscription_id, stage); indexed (subscription_id, reached_at)

PlanSeeder:
- Removes the "archive 12th/13th-gen → hidden" block; flips all 8
  legacy slugs (dell-r330-lff..dell-r730-lff) to status=active so
  they surface as in-stock rack inventory alongside the new line.
- Replaces the 5-row 14th-gen placeholder with 8 proper SKUs:
  r440-4lff ($119, $349 setup), r540-8lff ($159, $549),
  r640-8sff ($179, $349), r740-16sff ($229, $549),
  r740xd-24sff ($279, $549), r740xd-12lff ($249, $549),
  r640-10nvme ($239, $799), r740xd-24nvme ($279, $799).
  Setup fees per the brainstorm tier mapping.
- Each new SKU carries full features (chassis, form_factor,
  bay_count, bay_type, locked baseline cpu/ram/boot/idrac/
  network/bandwidth, lead_time_days '7-10', tier).
- All 8 new SKUs have per-cycle prices (M/Q/Semi/A) at 5/10/15%
  discounts.

ServiceBuildMilestone model with STAGES const (ordered →
hardware_acquired → assembly → racked → deployed) and
subscription/updatedBy relations. Queries from this side until
we extend Cashier's Subscription model in a later phase.

Spec: docs/superpowers/specs/2026-04-26-dedicated-server-lineup-design.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 17:46:05 -04:00
0d0f6faf40 docs(spec): dedicated server lineup design
Captures the brainstorm: 8 new Dell 14th-gen chassis SKUs alongside
existing rack inventory, per-chassis configurator at
/dedicated-servers/{slug}, 5-stage post-order build tracker,
tiered setup fees waived at Semi-Annual+ cycles.

User approved design + skipped spec-review gate. Implementation
phasing in 4 commits per the spec.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 17:33:23 -04:00
e5b445efd5 fix(vps): shorten hardware band — "Dell PowerEdge hypervisors" → "Dell PowerEdge"
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:49:43 -04:00
ffb7f47e7d feat(vps): add hardware transparency band + per-card meta
Adds a "Built on" hardware band above the plan grid and a small
meta line on each plan card so shoppers can see what's actually
running their VPS.

Hardware band lists: Dell PowerEdge hypervisors · Intel Xeon · ECC
memory · Enterprise SSD storage · Atlanta, GA datacenter.

Per-card meta line: "Intel Xeon · ECC memory" in muted small type
under the regular spec list.

Copy is intentionally generic ("Intel Xeon", not Broadwell-EP /
Cascade Lake) to remain accurate across the current mixed pool
(R720xd Ivy Bridge being retired into the new R740xd ATL-04 next
week per infrastructure/docs/hypervisor-consolidation-r740xd-build.md).
Tighten the wording once consolidation lands.

Dropped the originally-proposed "10 Gbps inter-host" row — it's
internal cluster networking (used for live migration + shared
storage), and customers were likely to confuse it with their own
egress bandwidth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:49:18 -04:00
c688180842 fix(vps): correctly position Ezra in the support story
The differentiator card and comparison row were positioning EZSCALE
as "no chatbots" — but we DO run Ezra, an AI assistant that
extends the support team. Reframed honestly: engineer-first support
where Ezra helps the team triage and respond faster, not the
other way around. That's still differentiated against tier-1
outsourced or AI-only support models the big clouds run.

Also drops in docs/integrations/savemyserver/dedicated-server-catalog.json
— 27 Dell 14th-gen products from SaveMyServer with EZSCALE baseline
config and pricing, generated by a separate scraping session at
/tmp/sms-configurator. Lives next to other vendor integration data
in docs/integrations/. Will feed the dedicated-server PlanSeeder
refresh in a follow-up task.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:39:27 -04:00
28a4ca8d32 feat(vps): rewrite Why Choose section + 5 page improvements
The old "Why Choose EZSCALE VPS?" grid was duplicating the
Included With All Plans card right below it (RAID 10, ZFS Snapshots,
VirtFusion Panel, Full Root Access appeared in both). Replaced with
6 actual differentiators that answer "why us, not Linode/Hetzner/
Vultr": real US humans, ZFS-backed reliability, predictable billing,
optional Pilot tier, 14-day money-back, owner-operated.

Other improvements bundled in this pass:
- Hero subtitle rewritten from feature dump to identity-first one-liner.
- Plans table → responsive PlanCard grid with a "Most popular" badge
  on VPS-4 and a separate "Storage-focused" subgrid for stor-500/1tb.
  Each card carries Order Now + Estimate-this-plan link to the
  estimator (still wired to the prefillEstimator handler).
- Added a 5-row "EZSCALE vs typical big-cloud" comparison table —
  honest differences only, no specific competitor names to avoid
  liability.
- Added an 8-question FAQ section (provisioning time, OS list,
  upgrades, refunds, DDoS roadmap, rDNS, location, migrations) using
  a new reusable Faq accordion component.
- Bottom CTA copy fixed (it was still mentioning DDoS protection as
  current; it's coming-soon upstream): now reads "Real humans on
  support. 14-day money-back if it's not the right fit." Heading
  flipped to "Ready to spin one up?" / "Talk to a Human."

New shared components: Components/Marketing/PlanCard.vue,
Components/Marketing/Faq.vue, Components/Marketing/ComparisonTable.vue.
All three are reusable for the dedicated/web/game pages later.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:35:43 -04:00
66a65263c3 fix(vps): drop Windows License toggle from estimator
Windows BYOL is free and doesn't change the price, so the toggle
was UI clutter. The Included With All Plans card already
communicates the BYOL requirement (line updated to read
"Linux included; Windows supported (bring your own license)" for
clarity), and OS template selection at checkout still lets users
pick a Windows image when they're ready to deploy.

- AddOnsPanel.vue: removed the Windows License switch
- EstimatorSection.vue: removed onWindowsChange handler
- stores/estimator.ts: removed windowsLicense state, dropped from
  share/checkout URL params and hydration
- ConfigOptionSeeder.php: dropped the legacy 'Windows License'
  option from the VPS Add-ons group (deletes existing row)
- CheckoutController.php: removed ?windows=1 query-param handling
  from buildPrefilledSelections
- VpsHosting.vue: tightened the BYOL line in the Included card

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:28:03 -04:00
bc5ccf1731 fix(vps): harmonize estimator palette with rest of marketing site
Replaced --v-theme-surface-bright (auto-generated lighter tone that
clashed with the page's dark navy palette) with --v-theme-surface
across all 10 estimator components. Removed gradient backgrounds in
favor of the existing .glass-card / .section-alt-bg patterns from
resources/styles/_marketing.scss. Bumped contrast on the cycle toggle
discount badges and the EstimatorFooter card so the Copy share link
button reads clearly.

Components touched: EstimatorSection, BillingCycleToggle, WorkloadPicker,
MiniQuizDialog, RecommendedPlanCard, AddOnsPanel, IPv4Stepper,
ManagedSupportSelector, BackupTierSelector, EstimatorFooter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:18:03 -04:00
cfa2e4c8d3 feat(vps): add interactive estimator + refresh Included card
Implements the design captured in
docs/superpowers/specs/2026-04-26-vps-hosting-estimator-design.md.

Estimator (after the hero on /vps-hosting):
- Workload picker (9 chips) recommends a plan; "Not sure" opens a
  mini-quiz with a 12-app catalog and a traffic+priority follow-up.
- Recommended-plan card with "or pick another" alternates dropdown.
- Add-ons panel: IPv4 stepper (1-8, $8/extra), Windows BYOL toggle,
  4-tier Managed Support radio (Self/Basic/Pro/Pilot @ $0/29/79/99),
  5-tier Off-site Backup radio (None/Lite/Standard/Extended/Vault @
  $0/5/12/25/59).
- Pilot tier gated to VPS-8+ via plan.features.tier; auto-fallback to
  Pro on plan downgrade with snackbar warning.
- Billing cycle toggle (Monthly / Quarterly / Annual) reuses
  per-cycle prices already on plan_prices and plan_config_values.
- Sticky footer with live total, "Order this configuration"
  (deep-links to /checkout/{plan} with all params), and "Copy share
  link" (history.replaceState debounced 300ms).
- Plans-table rows get an "Estimate →" link that pre-fills the
  estimator with that plan and scrolls up.

Backend:
- PlanSeeder: each VPS plan gets features.tier (1-32) for gating.
- ConfigOptionSeeder: scope existing Server Management group to
  dedicated only; add VPS Managed Support and Off-site Backup
  groups with full per-cycle prices.
- routes/marketing.php /vps-hosting: pass addOns + workloadMap +
  appExamples Inertia props.
- CheckoutController::show: build prefilledSelections from
  ?ipv4&windows&managed&backup query params; Vue page hydrates
  configSelections from this prop.

Included With All Plans: rewritten to 13 accurate items with
per-line wording (10 Gbps fair-use uplink, ZFS snapshots free,
KVM virtualization, rDNS/PTR control, OOB console/VNC, 99.9%
SLA, etc.) plus a "Coming soon" badge for DDoS protection.

Tests: 10 Pest feature tests in tests/Feature/Marketing/
VpsHostingEstimatorTest.php cover the page props, both new
seeded groups, plan-tier metadata, Server Management dedicated
scope, configGroups attachment, and checkout query-param
pre-fill round-trip. All 10 pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 16:05:01 -04:00
d5f97d1240 docs(spec): VPS hosting estimator + included list refresh design
Design captured from brainstorming: workload-driven estimator with
plan + add-on configurator (managed support + off-site backup tiers),
URL state, share link, checkout pre-fill, and rewritten Included list.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 15:44:12 -04:00
Claude Dev
de8ec69ea0 feat: add advanced features — KB, tickets v2, multi-currency, cart, quotes, affiliates, credits, staff RBAC, fraud detection, service panels
Major additions:
- Knowledge base with categories, articles, revisions, and voting
- Enhanced ticket system: departments, SLA policies, canned responses, tags, custom fields, satisfaction ratings, internal notes
- Multi-currency support with exchange rate sync
- Shopping cart and quote system with PDF generation
- Affiliate program with referrals, commissions, and payouts
- Account credits, credit notes, and debit notes
- Staff management with granular role-based permissions
- Fraud detection and order risk assessment
- ServerHunter SEO integration
- Service lifecycle events (suspend/unsuspend/terminate)
- Service management panels for VPS, Dedicated, Hosting, and Game servers
- Plan lifecycle fields and per-customer overrides
- 30+ migrations, 17 factories, 8 feature test suites

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 07:35:10 -04:00
Claude Dev
2bf8a5b6bf docs: update README with current project status, optimize CLAUDE.md
README: reflect completed phases (1-5, 8-9), accurate tech stack
(Vuetify 3 not Tailwind, Passport not Sanctum, standalone tickets
not SupportPal), current codebase counts (59 migrations, 29 models,
85 pages, ~497 tests), and separate implemented vs planned features.

CLAUDE.md: reduce from 281 to 184 lines — trim derivable directory
listings, remove stale counts, cut redundant examples, update all
metrics to current state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 11:55:01 -04:00
Claude Dev
1d4a9f33f6 chore: clean up repo root — remove obsolete files, organize infra into docs/
Remove 21MB Vuexy theme directory (replaced by custom EZSCALE design system),
old session logs, patch notes, screenshots, and discovery artifacts. Move
infrastructure files (Horizon config, install script, VirtFusion API spec,
discover script) into docs/ subdirectories. Update CLAUDE.md reference docs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 11:49:07 -04:00
Claude Dev
b4ef90465c feat: complete pre-launch audit — frontend polish, churn prevention, login history, financial reports, configurable checkout
Includes all work from phases 6-9+ and frontend polish rounds 1 & 2:

- Login history with device trust, new device notifications, session management
- Churn prevention: cancellation surveys, winback campaigns with email sequences
- Financial reports: revenue, P&L, tax, aging, refund, subscription reports with PDF/CSV/JSON export
- Configurable checkout: plan config groups/options, build-your-own VPS
- Frontend polish: fix broken legal links, add SEO meta tags, favicon, font display=swap,
  Head titles on all 14 marketing pages, mobile responsive fixes, AuthLayout legal footer,
  remove false 24/7 claims, hide empty stats, correct uptime SLA to 99.9%,
  GameServers notify buttons linked to /contact, 301 redirects for /terms and /privacy
- WHMCS migration scripts
- Update legal page effective dates to March 16, 2026

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 11:39:25 -04:00
Claude Dev
5be235d35e feat: add billing cycle toggle to pricing page
Eager-load plan prices in the pricing route and add a billing cycle
toggle (monthly/quarterly/semi-annual/annual) with discount badges and
per-month equivalent display for longer cycles. CTA links now pass
the selected cycle as a query param.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:38:17 -04:00
Claude Dev
e0e38e47c6 feat: update checkout and API resources for cycle-aware pricing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:38:01 -04:00
Claude Dev
d1df4dd8b2 test: add multi-cycle checkout tests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:37:22 -04:00
Claude Dev
e0c83e36dc feat: add PlanPrice interface and update Plan/Subscription types
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:36:44 -04:00
Claude Dev
8fa389f51d feat: add MigrateVpsPlans command for customer migration
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:34:28 -04:00
Claude Dev
81995079e6 feat: seed new VPS plans with multi-cycle pricing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:33:27 -04:00
Claude Dev
82a069304f feat: update billing services for cycle-specific pricing and fix naming
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:32:57 -04:00
Claude Dev
c034be820e feat: add plan_prices table, PlanPrice model, and Plan relationship
- Create plan_prices migration with unique(plan_id, billing_cycle)
- PlanPrice model with factory
- Plan::prices() relationship and priceForCycle() helper
- Tests for model relationships, uniqueness, cascade delete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 23:31:12 -04:00
Claude Dev
b2fd5abc7e Update documentation after full frontend redesign and bug fix session
Updates CLAUDE.md (design system, tech stack, directory structure, conventions),
TASKS.md (redesign and bug fix items checked off), and creates session log for
the 2026-03-14 redesign session covering layout rebuild, SCSS replacement,
component migration, and 12 bug fixes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 19:20:41 -04:00
Claude Dev
0e7c363a04 Fix code review follow-up issues
- EnsureUserNotSuspended: bypass for impersonation stop, also check banned
- FlashProps: add info and new_password keys
- AccountLayout: impersonation stop link uses account domain (not admin)
- withCount alias: billingInvoices as invoices_count for frontend compat
- VPS Show: add secure password dialog with copy button for reset-password

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 19:02:05 -04:00
Claude Dev
9a410dc3c8 Fix impersonation routing, invoice numbers, dashboard caching, indexes, and Stripe property name
- Add impersonation stop route on account subdomain so impersonated users can exit (#11)
- Replace non-concurrency-safe invoice number generation (count+1, rand) with date+random string
- Wrap admin dashboard stats queries in Cache::remember with 5-minute TTL
- Add database indexes on invoices.status, orders.status, audit_logs.action, audit_logs.created_at
- Fix last_four to last4 matching Stripe's actual card property name

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 18:53:37 -04:00
Claude Dev
f194b60d5c Fix 5 critical issues: provisioning storage, webhook auth, password exposure, middleware, model conflict
- Store VirtFusion provisioning info in credentials column instead of non-existent provisioning_info key
- Add PayPal webhook header verification to reject unsigned requests
- Stop exposing VPS root password in flash message, use separate new_password key
- Apply ensure_not_suspended middleware to account routes
- Rename User::invoices() to billingInvoices() to avoid overriding Cashier's invoices() method

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 18:47:31 -04:00
Claude Dev
34a8ccd8c4 Fix missing platform column in admin placeOrder
Maps vps->virtfusion, dedicated->synergycp, hosting->enhance, game->pterodactyl
consistent with ProvisioningFactory routing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:47:33 -04:00
Claude Dev
ee5e1909e2 Fix missing service_type when admin places order for customer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:44:45 -04:00
Claude Dev
b83c2bcc8d Fix missing order_number when admin places order for customer
The orders table requires order_number (non-nullable, unique) but the
placeOrder method didn't set it, causing a QueryException.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:44:00 -04:00
Claude Dev
634b8916ae Set default VChip size to small for more compact badges/pills
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:39:21 -04:00
Claude Dev
56bd303254 Fix light mode contrast issues on marketing pages
Force white text inside .hero-dark-grid since its background is always
dark, and replace bg-surface-variant with the theme-aware section-alt-bg
class on the About page Values and Stats sections.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:31:42 -04:00
Claude Dev
9a12deeed3 Fix theme switcher persistence and hardcoded dark colors in SCSS
- ThemeSwitcher: save user's theme choice to localStorage and restore on mount
- Vuetify plugin: check localStorage before falling back to subdomain default
- _layouts.scss: make navbar and footer theme-aware using CSS custom properties
  (sidebar intentionally stays always-dark per design spec)
- _marketing.scss: make glass-card and hero-gradient-text theme-aware

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:24:51 -04:00
Claude Dev
65dcdebd5c Fix code review issues: flash toast dedup, sidebar CSS, pricing card colors
- Fix duplicate flash-to-toast watchers by tracking last shown flash JSON
- Replace inline sidebar margin styles with CSS class-driven approach
- Fix navbar left position to respond to sidebar collapse via CSS nesting
- Replace hardcoded white colors in PricingCard with theme-aware classes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:21:22 -04:00
Claude Dev
40c1ecc6fe Remove old Vuexy wrapper components (AppTextField, AppSelect, AppTextarea, FlashMessages, NotificationBell)
All pages now use native Vuetify components directly. Flash messages are handled
by the ToastStack component via Pinia store. Notifications use NotificationPanel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:10:23 -04:00
Claude Dev
dd1a5d7ffc Replace AppTextField/AppSelect/AppTextarea with native Vuetify equivalents across 22 pages
Vuetify defaults already configure VTextField/VSelect/VTextarea with the correct
settings (outlined variant, comfortable density, primary color, auto hideDetails),
making the wrapper components unnecessary.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:09:15 -04:00
Claude Dev
66bb180f8f Migrate marketing pages to new design system heroes and components (#5)
- Replace gradient hero sections with HeroSection + animated SVG components
  (NetworkHero, VpsHero, DedicatedHero, WebHostingHero, GameServerHero)
- Add ScrollReveal wrappers for scroll animations on Home.vue sections
- Replace AppTextField/AppSelect/AppTextarea with VTextField/VSelect/VTextarea in Contact.vue
- Merge BattlefieldAcp content into GameServers.vue as a featured section
- Delete redundant Products.vue and BattlefieldAcp.vue pages
- Add 301 redirects in routes for /products -> / and /battlefield-acp -> /game-servers

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:06:51 -04:00
Claude Dev
b9c3382564 Replace AppTextField with VTextField in auth pages (#4)
Remove AppTextField wrapper imports from all 6 auth pages (Login, Register,
ForgotPassword, ResetPassword, ConfirmPassword, TwoFactorChallenge) and use
VTextField directly, relying on Vuetify defaults for variant/density/color.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 17:01:17 -04:00
Claude Dev
f861510625 Add marketing UI components: hero sections, glass card, scroll reveal, pricing card
Create 9 reusable marketing components:
- HeroSection: wrapper with dark grid background and two-column layout
- NetworkHero: animated SVG network visualization with floating nodes
- VpsHero, DedicatedHero, WebHostingHero, GameServerHero: themed variants
- GlassCard: glass morphism card for feature sections
- ScrollReveal: intersection observer wrapper for scroll animations
- PricingCard: glass morphism pricing card with features and CTA

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:59:23 -04:00
Claude Dev
d01ea28a8b Phase 1: Rebuild layout infrastructure with new shared components
Delete old Vuexy VerticalNav layout system (5 components + 4 SCSS files)
and replace with new modular components: AppSidebar, AppTopNavbar,
CommandPalette, NotificationPanel, ToastStack, SkeletonLoader,
EmptyState, Breadcrumbs. Rebuild all 4 layouts (Admin, Account,
Marketing, Auth) using new components. Add Pinia toast store for
flash message integration. Update navigation with cleaner groupings.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:55:54 -04:00
Claude Dev
34e7fb62f3 Phase 0: Replace Vuexy design system with custom EZSCALE foundation
- Install echarts, vue-echarts, @vueuse/core; remove @mdi/font
- Switch fonts from Inter/Public Sans to Plus Jakarta Sans/JetBrains Mono
- Delete all 38 @core SCSS files, replace with 6 new design token files
  (_variables, _mixins, _animations, _typography, _component-overrides, _layouts)
- Rewrite _marketing.scss with glass morphism and dark grid hero styles
- Update Vuetify theme from purple (#7367F0) to navy blue (#1d4ed8)
- Add pill-shaped buttons, tonal chips, rounded cards to Vuetify defaults
- Make default theme subdomain-aware (light for marketing, dark for app)
- Remove @core-scss and @configured-variables Vite aliases
- Fix AuthLayout and AppStepper to remove deleted @core SCSS imports

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:47:00 -04:00
Claude Dev
9a2a2c251d Re-crop ML analytics screenshot to show top section
Show stats cards, server health overview with slot recommendations,
and health trends chart instead of the lower tables.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:19:21 -05:00
Claude Dev
e3efa0f11b Add screenshot showcases to ACP marketing page
Replace 6-card feature grid with alternating image/text showcase sections
for ML Analytics, Admin Dashboard, Ban Appeal, and Server Browser features.
Cropped screenshots from the live admin panel paired with bullet-point
descriptions for each feature.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:10:51 -05:00
Claude Dev
6237003b46 Remove demo link from ACP marketing page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:52:11 -05:00
Claude Dev
466b0eadc8 Enhance ACP marketing page with real plugin details and admin features
- List all 24 ported ProCon plugins by name with descriptions
- Update ML Analytics feature with actual dashboard details (flagged cheaters,
  toxicity leaderboard, player clustering, ban predictions, session anomalies)
- Add Admin Dashboard feature card (population charts, kick analytics,
  event logger, online admins, player reports)
- Add Live Demo button linking to tbg.app.ezscale.cloud/p
- Expand "More Features" grid to 12 items with descriptions
- Update ProCon section: accurate C#/.NET description, layer server context
- Update supported games with per-game plugin counts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:48:48 -05:00
Claude Dev
169b06e349 Dynamic product pages + Battlefield ACP marketing page
- Web Hosting & Game Servers now pull plans from database (same pattern as VPS/Dedicated)
- Add 6 game server plans to PlanSeeder (Minecraft, Rust, ARK, Valheim, CS2, Palworld)
- Create Battlefield ACP marketing page with ProCon replacement hero, 6 feature cards,
  ML analytics, ban appeals, PunkBuster screenshots, Discord integration sections
- Add Battlefield ACP to Products dropdown navigation
- Marketing pages use SectionHeader component, fade-in animations, Vuexy design patterns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 11:32:35 -05:00
Claude Dev
45d25d61ba 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>
2026-02-10 06:30:57 -05:00