diff --git a/app/Exports/NilaiPlafondExport.php b/app/Exports/NilaiPlafondExport.php index a937c50..0a3e7b5 100644 --- a/app/Exports/NilaiPlafondExport.php +++ b/app/Exports/NilaiPlafondExport.php @@ -24,6 +24,7 @@ $row->id, $row->code, $row->name, + $row->biaya, $row->created_at ]; } @@ -35,6 +36,7 @@ 'ID', 'Code', 'Name', + 'Biaya', 'Created At' ]; } @@ -44,7 +46,8 @@ { return [ 'A' => NumberFormat::FORMAT_NUMBER, - 'D' => NumberFormat::FORMAT_DATE_DATETIME + 'D' => NumberFormat::FORMAT_NUMBER_00, + 'E' => NumberFormat::FORMAT_DATE_DATETIME ]; } } diff --git a/app/Http/Controllers/NilaiPlafondController.php b/app/Http/Controllers/NilaiPlafondController.php index 6a2f41f..fc843b9 100644 --- a/app/Http/Controllers/NilaiPlafondController.php +++ b/app/Http/Controllers/NilaiPlafondController.php @@ -5,6 +5,8 @@ use App\Http\Controllers\Controller; use Exception; use Illuminate\Http\Request; + use Illuminate\Support\Facades\DB; + use Illuminate\Support\Facades\Log; use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Exports\NilaiPlafondExport; use Modules\Lpj\Http\Requests\NilaiPlafondRequest; @@ -14,74 +16,147 @@ { public $user; + /** + * Tampilkan halaman daftar Nilai Plafond. + * + * @return \Illuminate\Contracts\View\View + */ public function index() { + Log::info('[NilaiPlafondController@index] Return view index nilai_plafond'); return view('lpj::nilai_plafond.index'); } + /** + * Simpan data Nilai Plafond baru ke database. + * Menggunakan transaksi untuk menjamin konsistensi data. + * + * @param NilaiPlafondRequest $request + * @return \Illuminate\Http\RedirectResponse + */ public function store(NilaiPlafondRequest $request) { $validate = $request->validated(); if ($validate) { + DB::beginTransaction(); try { // Save to database - NilaiPlafond::create($validate); + $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', 'Jenis Aset created successfully'); + ->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', 'Failed to create nilai plafond'); + ->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', 'Jenis Aset updated successfully'); + ->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', 'Failed to update nilai plafond'); + ->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' => 'Jenis Aset deleted successfully']); + echo json_encode(['success' => true, 'message' => 'Nilai Plafond berhasil dihapus']); } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Failed to delete nilai plafond']); + 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')) { @@ -97,6 +172,8 @@ $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%"]); }); } @@ -131,6 +208,13 @@ // 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'), @@ -143,8 +227,14 @@ ]); } + /** + * 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'); } } diff --git a/app/Http/Requests/NilaiPlafondRequest.php b/app/Http/Requests/NilaiPlafondRequest.php index 3890ed7..4222090 100644 --- a/app/Http/Requests/NilaiPlafondRequest.php +++ b/app/Http/Requests/NilaiPlafondRequest.php @@ -14,6 +14,7 @@ { $rules = [ 'name' => 'required|max:255', + 'biaya' => 'nullable|numeric|min:0', ]; if ($this->method() == 'PUT') { diff --git a/app/Models/NilaiPlafond.php b/app/Models/NilaiPlafond.php index 3b0bcaf..dca7b61 100644 --- a/app/Models/NilaiPlafond.php +++ b/app/Models/NilaiPlafond.php @@ -6,5 +6,5 @@ class NilaiPlafond extends Base { protected $table = 'nilai_plafond'; - protected $fillable = ['code', 'name']; + protected $fillable = ['code', 'name', 'biaya']; } diff --git a/database/migrations/2025_10_03_091000_update_nilai_plafond_table_add_biaya.php b/database/migrations/2025_10_03_091000_update_nilai_plafond_table_add_biaya.php new file mode 100644 index 0000000..bac343a --- /dev/null +++ b/database/migrations/2025_10_03_091000_update_nilai_plafond_table_add_biaya.php @@ -0,0 +1,34 @@ +decimal('biaya', 15, 2)->nullable(); + }); + } + + /** + * Rollback perubahan: hapus kolom biaya dari tabel nilai_plafond + */ + public function down(): void + { + if (Schema::hasColumn('nilai_plafond', 'biaya')) { + Schema::table('nilai_plafond', function (Blueprint $table) { + $table->dropColumn('biaya'); + }); + } + } +}; \ No newline at end of file diff --git a/resources/views/nilai_plafond/create.blade.php b/resources/views/nilai_plafond/create.blade.php index a256457..b84fb0c 100644 --- a/resources/views/nilai_plafond/create.blade.php +++ b/resources/views/nilai_plafond/create.blade.php @@ -5,54 +5,68 @@ @endsection @section('content') -
- @if(isset($nilaiPlafond->id)) +
+ @if (isset($nilaiPlafond->id))
@method('PUT') - @else - - @endif - @csrf -
-
-

- {{ isset($nilaiPlafond->id) ? 'Edit' : 'Tambah' }} Nilai Plafond -

-
- Back -
-
-
-
- -
- - @error('code') - {{ $message }} - @enderror -
-
-
- -
- - @error('name') - {{ $message }} - @enderror -
-
-
- -
-
-
-
+ @else +
+ @endif + @csrf +
+
+

+ {{ isset($nilaiPlafond->id) ? 'Edit' : 'Tambah' }} Nilai Plafond +

+
+ Back +
+
+
+
+ +
+ + @error('code') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('name') + {{ $message }} + @enderror +
+
+ {{-- Field Biaya --}} +
+ + + @error('biaya') +
{{ $message }}
+ @enderror +
Contoh: 1500000 untuk satu juta lima ratus ribu
+
+
+
+ +
+
+
+
@endsection diff --git a/resources/views/nilai_plafond/index.blade.php b/resources/views/nilai_plafond/index.blade.php index 3a5d229..fd0fa22 100644 --- a/resources/views/nilai_plafond/index.blade.php +++ b/resources/views/nilai_plafond/index.blade.php @@ -6,8 +6,8 @@ @section('content')
-
-
+
+

Daftar Nilai Plafond

@@ -26,7 +26,7 @@
- +
+
@@ -40,17 +40,21 @@ Nilai Plafond + Biaya + + Action
-