Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
Plan::orderBy('sort_order')->get()]);
}
public function create()
{
return view('admin.plans.form', ['plan' => new Plan]);
}
public function store(Request $request)
{
Plan::create($this->validated($request));
return redirect()->route('admin.plans.index')->with('success', 'Package created.');
}
public function edit(Plan $plan)
{
return view('admin.plans.form', compact('plan'));
}
public function update(Request $request, Plan $plan)
{
$plan->update($this->validated($request, $plan));
return redirect()->route('admin.plans.index')->with('success', 'Package updated.');
}
public function destroy(Plan $plan)
{
$plan->update(['is_active' => false]);
return back()->with('success', 'Package archived.');
}
private function validated(Request $request, ?Plan $plan = null): array
{
$data = $request->validate([
'name' => ['required', 'string', 'max:100'],
'slug' => ['nullable', 'string', 'max:120', Rule::unique('plans')->ignore($plan)],
'description' => ['nullable', 'string', 'max:1000'],
'price' => ['required', 'numeric', 'min:0', 'max:999999'],
'currency' => ['required', 'string', 'size:3'],
'interval' => ['required', Rule::in(['one_time', 'month', 'year'])],
'features' => ['nullable', 'string', 'max:5000'],
'case_limit' => ['nullable', 'integer', 'min:1'],
'ai_request_limit' => ['nullable', 'integer', 'min:1'],
'stripe_price_id' => ['nullable', 'string', 'max:150'],
'sort_order' => ['nullable', 'integer', 'min:0'],
]);
return [
...$data,
'slug' => ($data['slug'] ?? null) ?: Str::slug($data['name']).'-'.Str::lower(Str::random(4)),
'amount_cents' => (int) round($data['price'] * 100),
'currency' => strtolower($data['currency']),
'features' => collect(preg_split('/\r\n|\r|\n/', $data['features'] ?? ''))->map(fn ($feature) => trim($feature))->filter()->values()->all(),
'is_active' => $request->boolean('is_active'),
'is_featured' => $request->boolean('is_featured'),
'sort_order' => $data['sort_order'] ?? 0,
];
}
}