get('per_page', 10); $search = $request->get('search'); $varietas = Varietas::with(['komoditas', 'jenisKomoditas']) ->when($search, function ($query) use ($search) { $query->where(function ($q) use ($search) { $q->where('nama', 'ILIKE', "%{$search}%") ->orWhere('path', 'ILIKE', "%{$search}%") ->orWhereHas('komoditas', function ($komoditasQuery) use ($search) { $komoditasQuery->where('nama', 'ILIKE', "%{$search}%"); }) ->orWhereHas('jenisKomoditas', function ($jenisQuery) use ($search) { $jenisQuery->where('nama', 'ILIKE', "%{$search}%"); }); }); }) ->latest() ->paginate($perPage); $komoditas = Komoditas::orderBy('nama', 'asc')->get(); return view('master.varietas.index', compact( 'varietas', 'komoditas' )); } public function getByJenisKomoditas($jenisKomoditasId) { $varietas = Varietas::where('jenis_komoditas_id', $jenisKomoditasId)->get(); return response()->json([ 'status' => 'success', 'data' => $varietas, ]); } public function store(Request $request) { $komoditasTable = (new Komoditas)->getTable(); $jenisKomoditasTable = (new JenisKomoditas)->getTable(); $varietasTable = (new Varietas)->getTable(); $validated = $request->validate([ 'komoditas_id' => [ 'required', 'integer', Rule::exists($komoditasTable, 'id'), ], 'jenis_komoditas_id' => [ 'required', 'integer', Rule::exists($jenisKomoditasTable, 'id') ->where('komoditas_id', $request->komoditas_id), ], 'nama' => [ 'required', 'string', 'max:255', Rule::unique($varietasTable, 'nama') ->where('komoditas_id', $request->komoditas_id) ->where('jenis_komoditas_id', $request->jenis_komoditas_id), ], 'deskripsi' => [ 'nullable', 'string', ], ]); try { DB::beginTransaction(); $varietas = Varietas::create([ 'komoditas_id' => $validated['komoditas_id'], 'jenis_komoditas_id' => $validated['jenis_komoditas_id'], 'nama' => $validated['nama'], 'deskripsi' => $validated['deskripsi'] ?? null, 'created_by' => auth()->id(), 'updated_by' => auth()->id(), ]); DB::commit(); return response()->json([ 'status' => 'success', 'message' => 'Data varietas berhasil disimpan.', 'data' => $varietas, ]); } catch (\Throwable $e) { DB::rollBack(); Log::error('Gagal menyimpan varietas', [ 'error' => $e->getMessage(), 'request' => $request->all(), ]); return response()->json([ 'status' => 'error', 'message' => 'Gagal menyimpan data: ' . $e->getMessage(), ], 500); } } public function show(string $id) { try { $varietas = Varietas::with(['komoditas', 'jenisKomoditas'])->findOrFail($id); return response()->json([ 'status' => 'success', 'data' => $varietas, ]); } catch (\Throwable $e) { return response()->json([ 'status' => 'error', 'message' => 'Data varietas tidak ditemukan.', ], 404); } } public function update(Request $request, string $id) { $komoditasTable = (new Komoditas)->getTable(); $jenisKomoditasTable = (new JenisKomoditas)->getTable(); $varietasTable = (new Varietas)->getTable(); $validated = $request->validate([ 'komoditas_id' => [ 'required', 'integer', Rule::exists($komoditasTable, 'id'), ], 'jenis_komoditas_id' => [ 'required', 'integer', Rule::exists($jenisKomoditasTable, 'id') ->where('komoditas_id', $request->komoditas_id), ], 'nama' => [ 'required', 'string', 'max:255', Rule::unique($varietasTable, 'nama') ->where('komoditas_id', $request->komoditas_id) ->where('jenis_komoditas_id', $request->jenis_komoditas_id), ], 'deskripsi' => [ 'nullable', 'string', ], ]); try { DB::beginTransaction(); $varietas = Varietas::findOrFail($id); $varietas->update([ 'komoditas_id' => $validated['komoditas_id'], 'jenis_komoditas_id' => $validated['jenis_komoditas_id'], 'nama' => $validated['nama'], 'deskripsi' => $validated['deskripsi'] ?? null, 'updated_by' => auth()->id(), ]); DB::commit(); return response()->json([ 'status' => 'success', 'message' => 'Data varietas berhasil diperbarui.', 'data' => $varietas->fresh(['komoditas', 'jenisKomoditas']), ]); } catch (\Throwable $e) { DB::rollBack(); Log::error('Gagal update varietas', [ 'error' => $e->getMessage(), 'id' => $id, 'request' => $request->all(), ]); return response()->json([ 'status' => 'error', 'message' => 'Gagal mengupdate data: ' . $e->getMessage(), ], 500); } } public function destroy(string $id) { try { DB::beginTransaction(); $varietas = Varietas::findOrFail($id); $varietas->update(['deleted_by' => auth()->id()]); $varietas->delete(); DB::commit(); return response()->json([ 'status' => 'success', 'message' => 'Data varietas berhasil dihapus.', ]); } catch (\Throwable $e) { DB::rollBack(); Log::error('Gagal hapus varietas', [ 'error' => $e->getMessage(), 'id' => $id, ]); return response()->json([ 'status' => 'error', 'message' => 'Gagal menghapus data: ' . $e->getMessage(), ], 500); } } }