Add complete billing system with Stripe and PayPal gateway support, checkout flow with coupon validation, subscription management (cancel/resume/swap), payment method management, invoice and transaction history, webhook handlers, dunning/suspension system with scheduled processing, and 29 new tests (53 total passing). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
45 lines
3.1 KiB
PHP
45 lines
3.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Http\Controllers\Account\BillingController;
|
|
use App\Http\Controllers\Account\CheckoutController;
|
|
use App\Http\Controllers\Account\DashboardController;
|
|
use App\Http\Controllers\Account\PlanController;
|
|
use App\Http\Controllers\Account\ProfileController;
|
|
use App\Http\Controllers\Account\SubscriptionController;
|
|
use Illuminate\Support\Facades\Route;
|
|
|
|
Route::get('/dashboard', [DashboardController::class, 'index'])->name('account.dashboard');
|
|
|
|
Route::get('/profile', [ProfileController::class, 'show'])->name('account.profile');
|
|
Route::put('/profile', [ProfileController::class, 'update'])->name('account.profile.update');
|
|
|
|
// Plans
|
|
Route::get('/plans', [PlanController::class, 'index'])->name('account.plans.index');
|
|
Route::get('/plans/{plan}', [PlanController::class, 'show'])->name('account.plans.show');
|
|
|
|
// Checkout (static routes first to avoid parameter matching)
|
|
Route::post('/checkout/apply-coupon', [CheckoutController::class, 'applyCoupon'])->name('account.checkout.apply-coupon');
|
|
Route::get('/checkout/paypal/callback', [CheckoutController::class, 'paypalCallback'])->name('account.checkout.paypal-callback');
|
|
Route::get('/checkout/paypal/cancel', [CheckoutController::class, 'paypalCancel'])->name('account.checkout.paypal-cancel');
|
|
Route::get('/checkout/{plan}', [CheckoutController::class, 'show'])->name('account.checkout.show');
|
|
Route::post('/checkout/{plan}', [CheckoutController::class, 'store'])->name('account.checkout.store');
|
|
|
|
// Subscriptions
|
|
Route::get('/subscriptions', [SubscriptionController::class, 'index'])->name('account.subscriptions.index');
|
|
Route::get('/subscriptions/{subscription}', [SubscriptionController::class, 'show'])->name('account.subscriptions.show');
|
|
Route::post('/subscriptions/{subscription}/cancel', [SubscriptionController::class, 'cancel'])->name('account.subscriptions.cancel');
|
|
Route::post('/subscriptions/{subscription}/resume', [SubscriptionController::class, 'resume'])->name('account.subscriptions.resume');
|
|
Route::post('/subscriptions/{subscription}/swap', [SubscriptionController::class, 'swap'])->name('account.subscriptions.swap');
|
|
|
|
// Billing
|
|
Route::get('/billing', [BillingController::class, 'index'])->name('account.billing.index');
|
|
Route::post('/billing/payment-methods', [BillingController::class, 'addPaymentMethod'])->name('account.billing.add-payment-method');
|
|
Route::delete('/billing/payment-methods/{paymentMethod}', [BillingController::class, 'removePaymentMethod'])->name('account.billing.remove-payment-method');
|
|
Route::post('/billing/payment-methods/default', [BillingController::class, 'setDefaultPaymentMethod'])->name('account.billing.set-default-payment-method');
|
|
Route::get('/billing/invoices', [BillingController::class, 'invoices'])->name('account.billing.invoices');
|
|
Route::get('/billing/invoices/{invoice}/download', [BillingController::class, 'downloadInvoice'])->name('account.billing.invoices.download');
|
|
Route::get('/billing/transactions', [BillingController::class, 'transactions'])->name('account.billing.transactions');
|
|
Route::post('/billing/setup-intent', [BillingController::class, 'setupIntent'])->name('account.billing.setup-intent');
|