validate([ 'bibid' => 'required|string|max:30|unique:buku,bibid', 'judul' => 'required|string', 'pengarang' => 'required|string|max:100', 'penerbit' => 'required|string', 'tahun_terbit' => 'required|digits:4', 'edisi' => 'required|digits:4', 'deskripsi_fisik' => 'required|string|max:100', 'nomor_panggil' => 'required|string|max:50|unique:buku,nomor_panggil', 'eksemplar' => 'required|integer|min:1', 'id_kategori' => 'required|exists:kategori,id_kategori', 'cover' => 'image|mimes:jpeg,png,jpg,webp|max:2048', ]); if ($request->hasFile('cover')) { $validated['cover'] = $request->file('cover')->store('covers', 'public'); } $koordinat = $this->tentukanKoordinatRak($validated['nomor_panggil']); $validated['lokasi_x'] = $koordinat['x']; $validated['lokasi_y'] = $koordinat['y']; $validated['konten_digital'] = 0; Buku::create($validated); return back()->with('success', 'Aset buku baru berhasil ditambahkan.'); } public function index(Request $request) { $search = $request->input('search'); $buku = Buku::with('kategori') ->when($search, function ($query, $search) { return $query->where('judul', 'like', "%{$search}%") ->orWhere('bibid', 'like', "%{$search}%"); }) ->paginate(15); $kategori = Kategori::all(); return view('admin.buku.index', compact('buku', 'search', 'kategori')); } public function edit($id) { $buku = Buku::findOrFail($id); $kategori = Kategori::all(); return view('admin.buku.edit', compact('buku', 'kategori')); } public function update(Request $request, $id) { $buku = Buku::findOrFail($id); $validated = $request->validate([ 'bibid' => 'required|string|max:30|unique:buku,bibid,' . $id . ',id_buku', 'judul' => 'required|string', 'pengarang' => 'required|string|max:100', 'penerbit' => 'required|string', 'tahun_terbit' => 'required|digits:4', 'edisi' => 'required|digits:4', 'deskripsi_fisik' => 'required|string|max:100', 'nomor_panggil' => 'required|string|max:50|unique:buku,nomor_panggil,' . $id . ',id_buku', 'eksemplar' => 'required|integer|min:1', 'id_kategori' => 'required|exists:kategori,id_kategori', 'cover' => 'image|mimes:jpeg,png,jpg,webp|max:2048' ]); if ($request->hasFile('cover')) { if ($buku->cover && \Illuminate\Support\Facades\Storage::disk('public')->exists($buku->cover)) { \Illuminate\Support\Facades\Storage::disk('public')->delete($buku->cover); } $validated['cover'] = $request->file('cover')->store('covers', 'public'); } $koordinat = $this->tentukanKoordinatRak($validated['nomor_panggil']); $validated['lokasi_x'] = $koordinat['x']; $validated['lokasi_y'] = $koordinat['y']; $buku->update($validated); return redirect()->route('admin.buku.index')->with('success', 'Aset buku berhasil diperbarui.'); } public function destroy($id) { $buku = Buku::findOrFail($id); $buku->delete(); return redirect()->route('admin.buku.index')->with('success', 'Aset buku berhasil dihapus dari sistem.'); } private function tentukanKoordinatRak($nomor_panggil) { if (empty($nomor_panggil)) return ['x' => null, 'y' => null]; $kode_utama = (int) substr(trim(preg_replace('/[^0-9]/', '', $nomor_panggil)), 0, 3); return match (true) { $kode_utama >= 0 && $kode_utama <= 99 => match (true) { $kode_utama <= 19 => ['x' => 13.00, 'y' => 22.00], // Rak 01 $kode_utama <= 50 => ['x' => 18.00, 'y' => 22.00], // Rak 02 default => ['x' => 25.00, 'y' => 22.00], // Rak 03-05 }, $kode_utama >= 100 && $kode_utama <= 199 => match (true) { $kode_utama <= 150 => ['x' => 43.00, 'y' => 20.00], // Rak 06-10 default => ['x' => 57.00, 'y' => 20.00], // Rak 11-14 }, $kode_utama >= 200 && $kode_utama <= 299 => match (true) { $kode_utama == 297 => ['x' => 25.00, 'y' => 38.00], // Rak 25-32 (Islam) default => ['x' => 13.00, 'y' => 38.00], // Rak 15-24 }, $kode_utama >= 300 && $kode_utama <= 399 => match (true) { $kode_utama <= 330 => ['x' => 43.00, 'y' => 30.00], // Rak 33-36 $kode_utama <= 360 => ['x' => 50.00, 'y' => 30.00], // Rak 37-40 default => ['x' => 57.00, 'y' => 30.00], // Rak 41-44 }, $kode_utama >= 400 && $kode_utama <= 499 => ['x' => 18.00, 'y' => 62.00], // Rak 45 $kode_utama >= 500 && $kode_utama <= 599 => ['x' => 50.00, 'y' => 74.00], // Rak 46-48 $kode_utama >= 600 && $kode_utama <= 699 => match (true) { $kode_utama <= 610 => ['x' => 35.00, 'y' => 85.00], // Rak 49-53 $kode_utama <= 630 => ['x' => 45.00, 'y' => 85.00], // Rak 54-58 $kode_utama <= 650 => ['x' => 55.00, 'y' => 85.00], // Rak 59-63 default => ['x' => 65.00, 'y' => 85.00], // Rak 64-68 }, $kode_utama >= 700 && $kode_utama <= 799 => match (true) { $kode_utama <= 739 => ['x' => 77.00, 'y' => 22.00], // Rak 71 $kode_utama <= 769 => ['x' => 82.00, 'y' => 22.00], // Rak 72 $kode_utama <= 789 => ['x' => 87.00, 'y' => 22.00], // Rak 73 default => ['x' => 82.00, 'y' => 22.00], // Rak 74 }, $kode_utama >= 800 && $kode_utama <= 899 => ['x' => 82.00, 'y' => 32.00], // Rak 77-79 $kode_utama >= 900 && $kode_utama <= 999 => match (true) { $kode_utama <= 919 => ['x' => 77.00, 'y' => 42.00], // Rak 69-70 default => ['x' => 87.00, 'y' => 42.00], // Rak 80-84 }, default => ['x' => null, 'y' => null], }; } }