From 38b22bce38a3a2b9274eef06f6c3c700008b58fa Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Thu, 6 Mar 2025 08:41:03 +0700 Subject: [PATCH] feat(laporan_external): tambahkan fitur laporan eksternal - Menambahkan controller LaporanExternalController untuk mengelola laporan eksternal. - Menambahkan request LaporanExternalRequest untuk validasi data laporan eksternal. - Menambahkan model LaporanExternal untuk interaksi dengan database. - Menambahkan migrasi untuk tabel laporan_externals dengan kolom yang diperlukan. --- .../Controllers/LaporanExternalController.php | 171 ++++++++++++++++++ app/Http/Requests/LaporanExternalRequest.php | 41 +++++ app/Models/LaporanExternal.php | 32 ++++ ..._012851_create_laporan_externals_table.php | 46 +++++ 4 files changed, 290 insertions(+) create mode 100644 app/Http/Controllers/LaporanExternalController.php create mode 100644 app/Http/Requests/LaporanExternalRequest.php create mode 100644 app/Models/LaporanExternal.php create mode 100644 database/migrations/2025_03_06_012851_create_laporan_externals_table.php diff --git a/app/Http/Controllers/LaporanExternalController.php b/app/Http/Controllers/LaporanExternalController.php new file mode 100644 index 0000000..44cc89f --- /dev/null +++ b/app/Http/Controllers/LaporanExternalController.php @@ -0,0 +1,171 @@ +paginate(10); + return view('lpj::laporan_external.index', compact('laporanExternals')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + return view('lpj::laporan_external.create'); + } + + /** + * Store a newly created resource in storage. + */ + public function store(LaporanExternalRequest $request) + { + $validatedData = $request->validated(); + + if ($request->hasFile('file_resume')) { + $validatedData['file_resume'] = $request->file('file_resume')->store('laporan_external/resume', 'public'); + } + + if ($request->hasFile('file_laporan')) { + $validatedData['file_laporan'] = $request->file('file_laporan')->store('laporan_external/laporan', 'public'); + } + + LaporanExternal::create($validatedData); + + return redirect()->route('lpj.laporan_external.index')->with('success', 'Laporan External berhasil ditambahkan.'); + } + + /** + * Show the specified resource. + */ + public function show(LaporanExternal $laporanExternal) + { + return view('lpj::laporan_external.show', compact('laporanExternal')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(LaporanExternal $laporanExternal) + { + return view('lpj::laporan_external.edit', compact('laporanExternal')); + } + + /** + * Update the specified resource in storage. + */ + public function update(LaporanExternalRequest $request, LaporanExternal $laporanExternal) + { + $validatedData = $request->validated(); + + if ($request->hasFile('file_resume')) { + $validatedData['file_resume'] = $request->file('file_resume')->store('laporan_external/resume', 'public'); + } + + if ($request->hasFile('file_laporan')) { + $validatedData['file_laporan'] = $request->file('file_laporan')->store('laporan_external/laporan', 'public'); + } + + $laporanExternal->update($validatedData); + + return redirect()->route('lpj.laporan_external.index')->with('success', 'Laporan External berhasil diperbarui.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(LaporanExternal $laporanExternal) + { + $laporanExternal->delete(); + + return redirect()->route('lpj.laporan_external.index')->with('success', 'Laporan External berhasil dihapus.'); + } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('jenis_aset.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = LaporanExternal::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('nomor_laporan', 'LIKE', "%$search%") + ->orWhere('tanggal_laporan', 'LIKE', "%$search%") + ->orWhereHas('permohonan', function($q) use ($search) { + $q->where('nomor_permohonan', 'LIKE', "%$search%"); + }) + ->orWhere('tgl_final_laporan', 'LIKE', "%$search%") + ->orWhere('nilai_pasar', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_likuidasi', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_tanah', 'LIKE', "%$search%") + ->orWhere('estimasi_harga_tanah', 'LIKE', "%$search%") + ->orWhere('estimasi_harga_bangunan', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_bangunan', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_sarana_pelengkap', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_mesin', 'LIKE', "%$search%") + ->orWhere('indikasi_nilai_pasar_kendaraan_alat_berat', 'LIKE', "%$search%") + ->orWhere('file_resume', 'LIKE', "%$search%") + ->orWhere('file_laporan', 'LIKE', "%$search%"); + ->orWhere('tanggal_laporan', '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; + + // 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, + ]); + } +} diff --git a/app/Http/Requests/LaporanExternalRequest.php b/app/Http/Requests/LaporanExternalRequest.php new file mode 100644 index 0000000..8b2b5a0 --- /dev/null +++ b/app/Http/Requests/LaporanExternalRequest.php @@ -0,0 +1,41 @@ + 'required|exists:permohonans,id', + 'nomor_laporan' => 'required|string|max:255', + 'tgl_final_laporan' => 'required|date', + 'nilai_pasar' => 'required|numeric', + 'indikasi_nilai_likuidasi' => 'required|numeric', + 'indikasi_nilai_pasar_tanah' => 'required|numeric', + 'estimasi_harga_tanah' => 'required|numeric', + 'estimasi_harga_bangunan' => 'required|numeric', + 'indikasi_nilai_pasar_bangunan' => 'required|numeric', + 'indikasi_nilai_pasar_sarana_pelengkap' => 'required|numeric', + 'indikasi_nilai_pasar_mesin' => 'required|numeric', + 'indikasi_nilai_pasar_kendaraan_alat_berat' => 'required|numeric', + 'file_resume' => 'nullable|file|mimes:pdf|max:10240', // 10MB max + 'file_laporan' => 'nullable|file|mimes:pdf|max:10240', + ]; + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize() + : bool + { + return true; + } + } diff --git a/app/Models/LaporanExternal.php b/app/Models/LaporanExternal.php new file mode 100644 index 0000000..77a63e3 --- /dev/null +++ b/app/Models/LaporanExternal.php @@ -0,0 +1,32 @@ +belongsTo(Permohonan::class); + } +} diff --git a/database/migrations/2025_03_06_012851_create_laporan_externals_table.php b/database/migrations/2025_03_06_012851_create_laporan_externals_table.php new file mode 100644 index 0000000..727abcf --- /dev/null +++ b/database/migrations/2025_03_06_012851_create_laporan_externals_table.php @@ -0,0 +1,46 @@ +id(); + $table->foreignId('permohonan_id')->constrained('permohonans')->onDelete('cascade'); + $table->string('nomor_laporan'); + $table->date('tgl_final_laporan'); + $table->decimal('nilai_pasar', 15, 2); + $table->decimal('indikasi_nilai_likuidasi', 15, 2); + $table->decimal('indikasi_nilai_pasar_tanah', 15, 2); + $table->decimal('estimasi_harga_tanah', 15, 2); + $table->decimal('estimasi_harga_bangunan', 15, 2); + $table->decimal('indikasi_nilai_pasar_bangunan', 15, 2); + $table->decimal('indikasi_nilai_pasar_sarana_pelengkap', 15, 2); + $table->decimal('indikasi_nilai_pasar_mesin', 15, 2); + $table->decimal('indikasi_nilai_pasar_kendaraan_alat_berat', 15, 2); + $table->string('file_resume')->nullable(); // New field for resume file + $table->string('file_laporan')->nullable(); // New field for report file + $table->timestamps(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('laporan_externals'); + } +};