Spaces:
Sleeping
Sleeping
File size: 2,768 Bytes
10dc6f2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | <?php
namespace App\Http\Controllers;
use App\Models\Event;
use App\Models\Order;
use App\Services\OrderService;
use App\Services\TicketService;
use Illuminate\Http\Request;
class CheckoutController extends Controller
{
public function store(Request $request, Event $event, OrderService $orderService)
{
$request->validate([
'tiers' => 'required|array|min:1',
'tiers.*.tier_id' => 'required|exists:ticket_tiers,id',
'tiers.*.qty' => 'required|integer|min:1',
'promo_code' => 'nullable|string|max:32',
]);
// Filter out zero-qty tiers
$items = collect($request->tiers)->filter(fn($t) => ($t['qty'] ?? 0) > 0)->values()->toArray();
if (empty($items)) {
return back()->with('error', 'Pilih minimal 1 tiket.');
}
try {
$order = $orderService->createOrder(auth()->user(), $event, $items, $request->promo_code);
return redirect()->route('checkout.summary', $order);
} catch (\Exception $e) {
return back()->with('error', $e->getMessage());
}
}
public function summary(Order $order)
{
abort_unless($order->user_id === auth()->id(), 403);
$order->load('event', 'items.ticketTier', 'user');
// Check if already expired
if ($order->isExpirable()) {
app(OrderService::class)->expireOrder($order);
return redirect()->route('events.show', $order->event->slug)
->with('error', 'Order sudah expired. Silakan order ulang.');
}
return view('checkout.summary', compact('order'));
}
public function pay(Order $order, TicketService $ticketService)
{
abort_unless($order->user_id === auth()->id(), 403);
if (!$order->isPending()) {
return redirect()->route('orders.show', $order)
->with('error', 'Order tidak dalam status pending.');
}
// Check expiry
if ($order->isExpirable()) {
app(OrderService::class)->expireOrder($order);
return redirect()->route('events.show', $order->event->slug)
->with('error', 'Order sudah expired. Silakan order ulang.');
}
try {
$ticketService->processPayment($order, 'mock_gateway');
return redirect()->route('checkout.success', $order);
} catch (\Exception $e) {
return back()->with('error', $e->getMessage());
}
}
public function success(Order $order)
{
abort_unless($order->user_id === auth()->id(), 403);
$order->load('event', 'items.ticketTier', 'attendees');
return view('checkout.success', compact('order'));
}
}
|