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'));
    }
}