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

namespace App\Http\Controllers\Organizer;

use App\Http\Controllers\Controller;
use App\Models\Event;
use App\Models\TicketTier;
use Illuminate\Http\Request;

class TicketTierController extends Controller
{
    public function store(Request $request, Event $event)
    {
        $this->authorizeOrganizer($event);

        $validated = $request->validate([
            'name'           => 'required|string|max:255',
            'price'          => 'required|numeric|min:0',
            'quota'          => 'required|integer|min:1',
            'max_per_order'  => 'required|integer|min:1|max:50',
            'is_refundable'  => 'boolean',
            'sales_start'    => 'nullable|date',
            'sales_end'      => 'nullable|date|after:sales_start',
        ]);

        $validated['is_refundable'] = $request->boolean('is_refundable');
        $validated['event_id'] = $event->id;

        TicketTier::create($validated);

        return back()->with('success', 'Ticket tier berhasil ditambahkan!');
    }

    public function update(Request $request, Event $event, TicketTier $tier)
    {
        $this->authorizeOrganizer($event);
        abort_unless($tier->event_id === $event->id, 404);

        $validated = $request->validate([
            'name'           => 'required|string|max:255',
            'price'          => 'required|numeric|min:0',
            'quota'          => 'required|integer|min:' . $tier->sold_count,
            'max_per_order'  => 'required|integer|min:1|max:50',
            'is_refundable'  => 'boolean',
            'sales_start'    => 'nullable|date',
            'sales_end'      => 'nullable|date|after:sales_start',
        ]);

        $validated['is_refundable'] = $request->boolean('is_refundable');
        $tier->update($validated);

        return back()->with('success', 'Ticket tier berhasil diperbarui!');
    }

    public function destroy(Event $event, TicketTier $tier)
    {
        $this->authorizeOrganizer($event);
        abort_unless($tier->event_id === $event->id, 404);

        if ($tier->sold_count > 0) {
            return back()->with('error', 'Tidak bisa menghapus tier yang sudah terjual.');
        }

        $tier->delete();
        return back()->with('success', 'Ticket tier berhasil dihapus.');
    }

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