Spaces:
Sleeping
Sleeping
File size: 2,523 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 | <?php
namespace App\Services;
use App\Models\Attendee;
use App\Models\Order;
use Illuminate\Support\Facades\DB;
class TicketService
{
/**
* Process payment (mock) and generate attendees + ticket codes.
*/
public function processPayment(Order $order, string $paymentMethod = 'mock_gateway'): Order
{
if (!$order->isPending()) {
throw new \Exception('Order tidak dalam status pending.');
}
return DB::transaction(function () use ($order, $paymentMethod) {
$order->update([
'status' => 'paid',
'payment_method' => $paymentMethod,
'paid_at' => now(),
]);
// Generate attendees for each order item
foreach ($order->items as $item) {
for ($i = 0; $i < $item->qty; $i++) {
Attendee::create([
'order_item_id' => $item->id,
'full_name' => $order->user->name,
'email' => $order->user->email,
'phone' => $order->user->phone,
]);
}
}
return $order->fresh(['items.ticketTier', 'attendees', 'event', 'user']);
});
}
/**
* Check in an attendee by ticket code.
*
* @return array{success: bool, message: string, attendee: ?Attendee}
*/
public function checkIn(string $ticketCode): array
{
$attendee = Attendee::where('ticket_code', $ticketCode)
->with('orderItem.ticketTier', 'orderItem.order.event')
->first();
if (!$attendee) {
return ['success' => false, 'message' => 'Kode tiket tidak ditemukan.', 'attendee' => null];
}
// Verify order is paid
$order = $attendee->orderItem->order;
if (!$order->isPaid()) {
return ['success' => false, 'message' => 'Order belum dibayar (status: ' . $order->status . ').', 'attendee' => $attendee];
}
// Check if already scanned
if ($attendee->isCheckedIn()) {
return [
'success' => false,
'message' => 'Tiket sudah di-check-in pada ' . $attendee->checkin_at->format('d M Y H:i') . '.',
'attendee' => $attendee,
];
}
$attendee->checkIn();
return ['success' => true, 'message' => 'Check-in berhasil! ✅', 'attendee' => $attendee->fresh()];
}
}
|