validated(); if ($validate) { DB::beginTransaction(); try { // Save to database $created = NilaiPlafond::create($validate); DB::commit(); Log::info('[NilaiPlafondController@store] NilaiPlafond created', ['id' => $created->id, 'payload' => $validate]); return redirect() ->route('basicdata.nilai-plafond.index') ->with('success', 'Nilai Plafond berhasil dibuat'); } catch (Exception $e) { DB::rollBack(); Log::error('[NilaiPlafondController@store] Failed to create nilai plafond', ['error' => $e->getMessage(), 'payload' => $validate]); return redirect() ->route('basicdata.nilai-plafond.create') ->with('error', 'Gagal membuat Nilai Plafond'); } } Log::warning('[NilaiPlafondController@store] Validation failed'); return redirect() ->route('basicdata.nilai-plafond.create') ->with('error', 'Validasi gagal'); } /** * Tampilkan form pembuatan Nilai Plafond. * * @return \Illuminate\Contracts\View\View */ public function create() { Log::info('[NilaiPlafondController@create] Return view create nilai_plafond'); return view('lpj::nilai_plafond.create'); } /** * Tampilkan form edit Nilai Plafond berdasarkan ID. * * @param int $id * @return \Illuminate\Contracts\View\View */ public function edit($id) { $nilaiPlafond = NilaiPlafond::find($id); Log::info('[NilaiPlafondController@edit] Return view edit nilai_plafond', ['id' => $id]); return view('lpj::nilai_plafond.create', compact('nilaiPlafond')); } /** * Update data Nilai Plafond pada database. * Menggunakan transaksi untuk menjamin konsistensi data. * * @param NilaiPlafondRequest $request * @param int $id * @return \Illuminate\Http\RedirectResponse */ public function update(NilaiPlafondRequest $request, $id) { $validate = $request->validated(); if ($validate) { DB::beginTransaction(); try { // Update in database $nilaiPlafond = NilaiPlafond::find($id); $nilaiPlafond->update($validate); DB::commit(); Log::info('[NilaiPlafondController@update] NilaiPlafond updated', ['id' => $id, 'payload' => $validate]); return redirect() ->route('basicdata.nilai-plafond.index') ->with('success', 'Nilai Plafond berhasil diperbarui'); } catch (Exception $e) { DB::rollBack(); Log::error('[NilaiPlafondController@update] Failed to update nilai plafond', ['id' => $id, 'error' => $e->getMessage(), 'payload' => $validate]); return redirect() ->route('basicdata.nilai-plafond.edit', $id) ->with('error', 'Gagal memperbarui Nilai Plafond'); } } Log::warning('[NilaiPlafondController@update] Validation failed', ['id' => $id]); return redirect() ->route('basicdata.nilai-plafond.edit', $id) ->with('error', 'Validasi gagal'); } /** * Hapus data Nilai Plafond dari database. * Menggunakan transaksi untuk menjamin konsistensi data. * * @param int $id * @return void */ public function destroy($id) { DB::beginTransaction(); try { // Delete from database $nilaiPlafond = NilaiPlafond::find($id); $nilaiPlafond->delete(); DB::commit(); Log::info('[NilaiPlafondController@destroy] NilaiPlafond deleted', ['id' => $id]); echo json_encode(['success' => true, 'message' => 'Nilai Plafond berhasil dihapus']); } catch (Exception $e) { DB::rollBack(); Log::error('[NilaiPlafondController@destroy] Failed to delete nilai plafond', ['id' => $id, 'error' => $e->getMessage()]); echo json_encode(['success' => false, 'message' => 'Gagal menghapus Nilai Plafond']); } } /** * Endpoint data untuk DataTables custom. * Menyediakan pencarian, sorting, dan pagination. * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function dataForDatatables(Request $request) { if (is_null($this->user) || !$this->user->can('nilai_plafond.view')) { //abort(403, 'Sorry! You are not allowed to view users.'); } // Retrieve data from the database $query = NilaiPlafond::query(); // Apply search filter if provided if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('search'); $query->where(function ($q) use ($search) { $q->where('code', 'LIKE', "%$search%"); $q->orWhere('name', 'LIKE', "%$search%"); // CAST ke TEXT agar LIKE bekerja di PostgreSQL $q->orWhereRaw('CAST(biaya AS TEXT) LIKE ?', ["%$search%"]); }); } // Apply sorting if provided if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); $query->orderBy($column, $order); } // Get the total count of records $totalRecords = $query->count(); // Apply pagination if provided if ($request->has('page') && $request->has('size')) { $page = $request->get('page'); $size = $request->get('size'); $offset = ($page - 1) * $size; // Calculate the offset $query->skip($offset)->take($size); } // Get the filtered count of records $filteredRecords = $query->count(); // Get the data for the current page $data = $query->get(); // Calculate the page count $pageCount = ceil($totalRecords / $request->get('size')); // Calculate the current page number $currentPage = 0 + 1; Log::info('[NilaiPlafondController@dataForDatatables] Return datatables payload', [ 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, 'pageCount' => $pageCount, 'page' => $currentPage, ]); // Return the response data as a JSON object return response()->json([ 'draw' => $request->get('draw'), 'recordsTotal' => $totalRecords, 'recordsFiltered' => $filteredRecords, 'pageCount' => $pageCount, 'page' => $currentPage, 'totalCount' => $totalRecords, 'data' => $data, ]); } /** * Export data Nilai Plafond ke file Excel. * * @return \Symfony\Component\HttpFoundation\BinaryFileResponse */ public function export() { Log::info('[NilaiPlafondController@export] Export nilai_plafond to Excel'); return Excel::download(new NilaiPlafondExport, 'nilai_plafond.xlsx'); } }