Undangan/backend-baru/app/Http/Controllers/Api/GuestApiController.php
2025-10-24 17:05:32 +07:00

138 lines
4.2 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Guest;
use App\Models\Pelanggan;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class GuestApiController extends Controller
{
public function index(string $code)
{
$pelanggan = Pelanggan::where('kode_pelanggan', $code)->first();
if (!$pelanggan) {
return response()->json([
'success' => false,
'message' => 'Pelanggan tidak ditemukan.',
], 404);
}
if ($pelanggan->status !== 'diterima') {
return response()->json([
'success' => false,
'message' => 'Pesanan belum diterima.',
], 400);
}
$guests = Guest::where('id_pelanggan', $pelanggan->id)->get();
return response()->json([
'success' => true,
'data' => $guests,
]);
}
public function store(Request $request)
{
try {
$validated = $request->validate([
'kode_pelanggan' => 'required|exists:pelanggans,kode_pelanggan',
'nama_tamu' => 'required|string|max:255',
]);
$pelanggan = Pelanggan::where('kode_pelanggan', $validated['kode_pelanggan'])->firstOrFail();
$jumlah_tamu = Guest::where('id_pelanggan', $pelanggan->id)->count();
$paket = $pelanggan->template->paket;
if ($paket === 'starter' && $jumlah_tamu >= 10) {
return response()->json([
'success' => false,
'message' => 'Batas tamu untuk paket starter adalah 10.',
], 400);
} elseif ($paket === 'basic' && $jumlah_tamu >= 20) {
return response()->json([
'success' => false,
'message' => 'Batas tamu untuk paket Basic adalah 20.',
], 400);
} elseif ($paket === 'premium' && $jumlah_tamu >= 30) {
return response()->json([
'success' => false,
'message' => 'Batas tamu untuk paket Premium adalah 30.',
], 400);
}
// cek anunya udah diterima
if ($pelanggan->status !== 'diterima') {
return response()->json([
'success' => false,
'message' => 'Pesanan belum diterima.',
], 400);
}
$guest = Guest::create([
'id_pelanggan' => $pelanggan->id,
'nama_tamu' => $validated['nama_tamu'],
'kode_invitasi' => 'INV-' . strtoupper(Str::random(6)),
]);
return response()->json([
'success' => true,
'data' => $guest,
], 201);
} catch (\Illuminate\Validation\ValidationException $e) {
return response()->json([
'success' => false,
'message' => 'Validation failed',
'errors' => $e->errors(),
], 422);
}
}
public function destroy(int $id)
{
$guest = Guest::find($id);
if (!$guest) {
return response()->json([
'success' => false,
'message' => 'Tamu tidak ditemukan.',
], 404);
}
try {
$guest->delete();
return response()->json([
'success' => true,
'message' => 'Tamu berhasil dihapus.',
], 200);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal menghapus tamu.',
], 500);
}
}
// Ambil undangan berdasarkan invitation code
public function getByInvitationCode($code)
{
$data = Guest::with('pelanggan.template', 'pelanggan.rsvp')
->where('kode_invitasi', $code)
->first();
if (!$data) {
return response()->json([
'success' => false,
'message' => 'Data undangan tidak ditemukan.',
], 404);
}
return response()->json([
'success' => true,
'data' => $data,
]);
}
}