webmoney/backend/app/Http/Controllers/Api/PlanController.php
marcoitaloesp-ai 6292b62315
feat: complete email system redesign with corporate templates
- Redesigned all email templates with professional corporate style
- Created base layout with dark header, status cards, and footer
- Updated: subscription-cancelled, account-activation, welcome, welcome-new-user, due-payments-alert
- Removed emojis and gradients for cleaner look
- Added multi-language support (ES, PT-BR, EN)
- Fixed email delivery (sync instead of queue)
- Fixed PayPal already-cancelled subscription handling
- Cleaned orphan subscriptions from deleted users
2025-12-18 00:44:37 +00:00

96 lines
3.3 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Plan;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class PlanController extends Controller
{
/**
* List all plans for pricing page (including coming soon)
*/
public function index(): JsonResponse
{
// Get active plans
$activePlans = Plan::active()->ordered()->get();
// Get coming soon plans (inactive but should be displayed)
$comingSoonPlans = Plan::where('is_active', false)
->whereIn('slug', ['business'])
->ordered()
->get();
$allPlans = $activePlans->merge($comingSoonPlans);
return response()->json([
'success' => true,
'data' => [
'plans' => $allPlans->map(function ($plan) {
return [
'id' => $plan->id,
'slug' => $plan->slug,
'name' => $plan->name,
'description' => $plan->description,
'price' => $plan->price,
'formatted_price' => $plan->formatted_price,
'monthly_price' => $plan->monthly_price,
'currency' => $plan->currency,
'billing_period' => $plan->billing_period,
'trial_days' => $plan->trial_days,
'features' => $plan->features,
'limits' => $plan->limits,
'is_free' => $plan->is_free,
'is_featured' => $plan->is_featured,
'is_active' => $plan->is_active,
'coming_soon' => !$plan->is_active,
'has_trial' => $plan->has_trial,
'savings_percent' => $plan->savings_percent,
];
}),
],
]);
}
/**
* Get a single plan by slug
*/
public function show(string $slug): JsonResponse
{
$plan = Plan::where('slug', $slug)->where('is_active', true)->first();
if (!$plan) {
return response()->json([
'success' => false,
'message' => 'Plan not found',
], 404);
}
return response()->json([
'success' => true,
'data' => [
'plan' => [
'id' => $plan->id,
'slug' => $plan->slug,
'name' => $plan->name,
'description' => $plan->description,
'price' => $plan->price,
'formatted_price' => $plan->formatted_price,
'monthly_price' => $plan->monthly_price,
'currency' => $plan->currency,
'billing_period' => $plan->billing_period,
'trial_days' => $plan->trial_days,
'features' => $plan->features,
'limits' => $plan->limits,
'is_free' => $plan->is_free,
'is_featured' => $plan->is_featured,
'has_trial' => $plan->has_trial,
'savings_percent' => $plan->savings_percent,
],
],
]);
}
}