File size: 2,300 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
<?php

namespace App\Http\Controllers\Organizer;

use App\Http\Controllers\Controller;
use App\Models\Attendee;
use App\Models\Event;
use App\Models\Order;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;

class OrderController extends Controller
{
    public function index(Event $event)
    {
        $this->authorizeOrganizer($event);

        $orders = Order::where('event_id', $event->id)
            ->with('user', 'items.ticketTier')
            ->latest()
            ->paginate(20);

        return view('organizer.orders.index', compact('event', 'orders'));
    }

    public function show(Event $event, Order $order)
    {
        $this->authorizeOrganizer($event);
        abort_unless($order->event_id === $event->id, 404);

        $order->load('user', 'items.ticketTier', 'attendees');

        return view('organizer.orders.show', compact('event', 'order'));
    }

    public function exportCsv(Event $event): StreamedResponse
    {
        $this->authorizeOrganizer($event);

        $attendees = Attendee::whereHas('orderItem.order', function ($q) use ($event) {
            $q->where('event_id', $event->id)->where('status', 'paid');
        })->with('orderItem.ticketTier', 'orderItem.order')->get();

        $filename = 'attendees-' . $event->slug . '-' . now()->format('Ymd') . '.csv';

        return response()->streamDownload(function () use ($attendees) {
            $handle = fopen('php://output', 'w');
            fputcsv($handle, ['No', 'Nama', 'Email', 'Telepon', 'Ticket Tier', 'Ticket Code', 'Checked In']);

            foreach ($attendees as $i => $att) {
                fputcsv($handle, [
                    $i + 1,
                    $att->full_name,
                    $att->email,
                    $att->phone ?? '-',
                    $att->orderItem->ticketTier->name,
                    $att->ticket_code,
                    $att->checkin_at ? $att->checkin_at->format('d/m/Y H:i') : 'Belum',
                ]);
            }
            fclose($handle);
        }, $filename, ['Content-Type' => 'text/csv']);
    }

    private function authorizeOrganizer(Event $event): void
    {
        if ($event->organizer_id !== auth()->id() && !auth()->user()->isAdmin()) {
            abort(403);
        }
    }
}