get(["kode", "nama"]); $jenisLanggananList = MasterJenisLangganan::orderBy("id")->get(["id", "nama"]); return view("Parking.setup.member.tarifstiker", compact("stasiunKerjaList", "jenisLanggananList")); } /** * Ambil seluruh data tarif stiker, sekalian join nama stasiun kerja * biar gak perlu N+1 query pas render tabel. */ public function data(): JsonResponse { $data = MasterTarifStiker::with(["stasiunKerja:kode,nama"]) ->orderByDesc("tarif_id") ->get(); return response()->json([ "success" => true, "data" => $data, ]); } /** * Ambil satu data berdasarkan tarif_id. */ public function show(string $tarif_id): JsonResponse { $item = MasterTarifStiker::with(["stasiunKerja:kode,nama"])->find($tarif_id); if (!$item) { return response()->json( [ "success" => false, "message" => "Data tarif stiker tidak ditemukan.", ], 404, ); } return response()->json([ "success" => true, "data" => $item, ]); } /** * Simpan data tarif stiker baru. * tarif_id tidak wajib diisi dari form — kalau kosong, di-generate * otomatis (max(tarif_id) + 1) karena tabel ini tidak punya * auto-increment/serial asli di database. */ public function store(Request $request): JsonResponse { $validator = Validator::make($request->all(), [ "tarif_id" => ["nullable", "integer", "unique:tarif_stiker,tarif_id"], "id_mobil" => ["required", "string", "max:10"], "jenis_langganan" => ["required", "string", "max:50"], "tarif" => ["required", "numeric"], "last_member" => ["nullable", "string", "max:5"], "tgl_akhir" => ["nullable", "string", "max:2"], "jenis" => ["nullable", "string", "max:30"], "jenis_member" => ["nullable", "string", "max:50"], "hitung_awal_bulan" => ["nullable", "integer"], "available_online" => ["nullable", "boolean"], "langganan" => ["nullable", "string", "max:32", "exists:stasiunkerja,kode"], "kode_akses" => ["nullable", "string", "max:5"], ]); if ($validator->fails()) { return response()->json( [ "success" => false, "message" => "Validasi gagal.", "errors" => $validator->errors(), ], 422, ); } $payload = $validator->validated(); $payload["available_online"] = $request->boolean("available_online"); // Transaksi + lock untuk menghindari race condition kalau // ada 2 request bersamaan sama-sama generate tarif_id baru. $item = DB::transaction(function () use ($payload) { if (empty($payload["tarif_id"])) { $maxId = MasterTarifStiker::lockForUpdate()->max("tarif_id"); $payload["tarif_id"] = ($maxId ?? 0) + 1; } return MasterTarifStiker::create($payload); }); $item->load("stasiunKerja:kode,nama"); return response()->json( [ "success" => true, "message" => "Data tarif stiker berhasil ditambahkan.", "data" => $item, ], 201, ); } /** * Perbarui data tarif stiker berdasarkan tarif_id. */ public function update(Request $request, string $tarif_id): JsonResponse { $item = MasterTarifStiker::find($tarif_id); if (!$item) { return response()->json( [ "success" => false, "message" => "Data tarif stiker tidak ditemukan.", ], 404, ); } $validator = Validator::make($request->all(), [ "id_mobil" => ["required", "string", "max:10"], "jenis_langganan" => ["required", "string", "max:50"], "tarif" => ["required", "numeric"], "last_member" => ["nullable", "string", "max:5"], "tgl_akhir" => ["nullable", "string", "max:2"], "jenis" => ["nullable", "string", "max:30"], "jenis_member" => ["nullable", "string", "max:50"], "hitung_awal_bulan" => ["nullable", "integer"], "available_online" => ["nullable", "boolean"], "langganan" => ["nullable", "string", "max:32", "exists:stasiunkerja,kode"], "kode_akses" => ["nullable", "string", "max:5"], ]); if ($validator->fails()) { return response()->json( [ "success" => false, "message" => "Validasi gagal.", "errors" => $validator->errors(), ], 422, ); } $payload = $validator->validated(); $payload["available_online"] = $request->boolean("available_online"); $item->update($payload); $item->load("stasiunKerja:kode,nama"); return response()->json([ "success" => true, "message" => "Data tarif stiker berhasil diperbarui.", "data" => $item, ]); } /** * Hapus data tarif stiker berdasarkan tarif_id. */ public function destroy(string $tarif_id): JsonResponse { $item = MasterTarifStiker::find($tarif_id); if (!$item) { return response()->json( [ "success" => false, "message" => "Data tarif stiker tidak ditemukan.", ], 404, ); } $item->delete(); return response()->json([ "success" => true, "message" => "Data tarif stiker berhasil dihapus.", ]); } }