From f14a0c634303fccebe972e2120b625e77dd1e376 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Fri, 14 Mar 2025 09:23:35 +0700 Subject: [PATCH] feat(jenis-lampiran): tambahkan fitur jenis lampiran - Menambahkan model JenisLampiran dengan relasi ke LampiranDokumen. - Membuat migrasi untuk tabel jenis_lampiran. - Menambahkan rute dan kontroler untuk operasi CRUD jenis lampiran. - Menambahkan permintaan validasi untuk jenis lampiran. - Menambahkan tampilan untuk membuat dan mengedit jenis lampiran. - Menambahkan breadcrumb untuk navigasi jenis lampiran. - Menambahkan fitur ekspor data jenis lampiran ke Excel. --- app/Exports/JenisLampiranExport.php | 46 +++++ .../Controllers/JenisLampiranController.php | 172 ++++++++++++++++++ app/Http/Requests/JenisLampiranRequest.php | 54 ++++++ app/Models/JenisLampiran.php | 20 ++ ..._14_013452_create_jenis_lampiran_table.php | 34 ++++ module.json | 11 ++ .../views/jenis_lampiran/create.blade.php | 62 +++++++ .../views/jenis_lampiran/index.blade.php | 145 +++++++++++++++ routes/breadcrumbs.php | 15 ++ routes/web.php | 12 +- 10 files changed, 570 insertions(+), 1 deletion(-) create mode 100644 app/Exports/JenisLampiranExport.php create mode 100644 app/Http/Controllers/JenisLampiranController.php create mode 100644 app/Http/Requests/JenisLampiranRequest.php create mode 100644 app/Models/JenisLampiran.php create mode 100644 database/migrations/2025_03_14_013452_create_jenis_lampiran_table.php create mode 100644 resources/views/jenis_lampiran/create.blade.php create mode 100644 resources/views/jenis_lampiran/index.blade.php diff --git a/app/Exports/JenisLampiranExport.php b/app/Exports/JenisLampiranExport.php new file mode 100644 index 0000000..5873a6e --- /dev/null +++ b/app/Exports/JenisLampiranExport.php @@ -0,0 +1,46 @@ +id, + $row->nama, + $row->deskripsi, + $row->created_at + ]; + } + + public function headings(): array + { + return [ + 'ID', + 'Nama', + 'Deskripsi', + 'Created At' + ]; + } + + public function columnFormats(): array + { + return [ + 'A' => NumberFormat::FORMAT_NUMBER, + 'D' => NumberFormat::FORMAT_DATE_DATETIME + ]; + } +} diff --git a/app/Http/Controllers/JenisLampiranController.php b/app/Http/Controllers/JenisLampiranController.php new file mode 100644 index 0000000..6588dd7 --- /dev/null +++ b/app/Http/Controllers/JenisLampiranController.php @@ -0,0 +1,172 @@ +validated(); + $validated['created_by'] = Auth::id(); + + $jenisLampiran = JenisLampiran::create($validated); + + DB::commit(); + return redirect() + ->route('basicdata.jenis-lampiran.index') + ->with('success', 'Jenis Lampiran berhasil ditambahkan.'); + } catch (Exception $e) { + DB::rollBack(); + return redirect() + ->back() + ->with('error', 'Gagal menambahkan Jenis Lampiran: ' . $e->getMessage()) + ->withInput(); + } + } + + public function create() + { + return view('lpj::jenis_lampiran.create'); + } + + public function show($id) + { + $jenisLampiran = JenisLampiran::findOrFail($id); + return view('lpj::jenis_lampiran.show', compact('jenisLampiran')); + } + + public function edit($id) + { + $jenisLampiran = JenisLampiran::findOrFail($id); + return view('lpj::jenis_lampiran.create', compact('jenisLampiran')); + } + + public function update(JenisLampiranRequest $request, $id) + { + DB::beginTransaction(); + try { + $jenisLampiran = JenisLampiran::findOrFail($id); + $validated = $request->validated(); + $validated['updated_by'] = Auth::id(); + + $jenisLampiran->update($validated); + + DB::commit(); + return redirect() + ->route('basicdata.jenis-lampiran.index') + ->with('success', 'Jenis Lampiran berhasil diperbarui.'); + } catch (Exception $e) { + DB::rollBack(); + return redirect() + ->back() + ->with('error', 'Gagal memperbarui Jenis Lampiran: ' . $e->getMessage()) + ->withInput(); + } + } + + public function destroy($id) + { + DB::beginTransaction(); + try { + $jenisLampiran = JenisLampiran::findOrFail($id); + $jenisLampiran->deleted_by = Auth::id(); + $jenisLampiran->save(); + + $jenisLampiran->delete(); + + DB::commit(); + echo json_encode(['success' => true, 'message' => 'Jenis Lampiran berhasil dihapus.']); + + } catch (Exception $e) { + DB::rollBack(); + echo json_encode([ + 'success' => false, + 'message' => 'Gagal menghapus Jenis Lampiran: ' . $e->getMessage() + ]); + } + } + + public function dataForDatatables(Request $request) + { + // Retrieve data from the database + $query = JenisLampiran::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('nama', 'LIKE', "%$search%") + ->orWhere('deskripsi', '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 = $request->get('page', 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, + ]); + } + + public function export() + { + if (is_null($this->user) || !$this->user->can('jenis_lampiran.export')) { + abort(403, 'Sorry! You are not allowed to export jenis lampiran.'); + } + + return Excel::download(new JenisLampiranExport, 'jenis_lampiran.xlsx'); + } + } diff --git a/app/Http/Requests/JenisLampiranRequest.php b/app/Http/Requests/JenisLampiranRequest.php new file mode 100644 index 0000000..7ba379b --- /dev/null +++ b/app/Http/Requests/JenisLampiranRequest.php @@ -0,0 +1,54 @@ + [ + 'required', + 'string', + 'max:255', + Rule::unique('jenis_lampiran')->where(function ($query) { + return $query->whereNull('deleted_at'); + })->ignore($this->route('jenis_lampiran')), + ], + 'deskripsi' => 'nullable|string', + ]; + + return $rules; + } + + /** + * Get custom messages for validator errors. + * + * @return array + */ + public function messages() + { + return [ + 'nama.required' => 'Nama jenis lampiran harus diisi.', + 'nama.max' => 'Nama jenis lampiran tidak boleh lebih dari 255 karakter.', + ]; + } + } diff --git a/app/Models/JenisLampiran.php b/app/Models/JenisLampiran.php new file mode 100644 index 0000000..dbd52bc --- /dev/null +++ b/app/Models/JenisLampiran.php @@ -0,0 +1,20 @@ +hasMany(LampiranDokumen::class); + } +} diff --git a/database/migrations/2025_03_14_013452_create_jenis_lampiran_table.php b/database/migrations/2025_03_14_013452_create_jenis_lampiran_table.php new file mode 100644 index 0000000..5b4d73a --- /dev/null +++ b/database/migrations/2025_03_14_013452_create_jenis_lampiran_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('nama'); + $table->text('deskripsi')->nullable(); + $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('jenis_lampiran'); + } +}; diff --git a/module.json b/module.json index 74efc94..694f353 100644 --- a/module.json +++ b/module.json @@ -880,6 +880,17 @@ "administrator", "admin" ] + }, + { + "title": "Jenis Lampiran", + "path": "basicdata.jenis-lampiran", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator", + "admin" + ] } ] } diff --git a/resources/views/jenis_lampiran/create.blade.php b/resources/views/jenis_lampiran/create.blade.php new file mode 100644 index 0000000..4ed347f --- /dev/null +++ b/resources/views/jenis_lampiran/create.blade.php @@ -0,0 +1,62 @@ +@extends('layouts.main') + +@section('breadcrumbs') + @if(isset($jenisLampiran->id)) + {{ Breadcrumbs::render(request()->route()->getName(),$jenisLampiran->id) }} + @else + {{ Breadcrumbs::render(request()->route()->getName()) }} + @endif +@endsection + +@section('content') +
+ @if(isset($jenisLampiran->id)) +
+ + @method('PUT') + @else + + @endif + @csrf +
+
+

+ {{ isset($jenisLampiran->id) ? 'Edit' : 'Tambah' }} Jenis Lampiran +

+
+ Back +
+
+
+
+ +
+ + @error('nama') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('deskripsi') + {{ $message }} + @enderror +
+
+
+ +
+
+
+
+
+@endsection diff --git a/resources/views/jenis_lampiran/index.blade.php b/resources/views/jenis_lampiran/index.blade.php new file mode 100644 index 0000000..2fa9275 --- /dev/null +++ b/resources/views/jenis_lampiran/index.blade.php @@ -0,0 +1,145 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render('basicdata.jenis-lampiran') }} +@endsection + +@section('content') +
+
+
+

+ Daftar Jenis Lampiran +

+ +
+
+
+ + + + + + + + + +
+ + + Nama + + + Deskripsi + + Action
+
+ +
+
+
+@endsection + +@push('scripts') + + +@endpush diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index b62b23d..7e554b8 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -699,5 +699,20 @@ Breadcrumbs::for('noc', function (BreadcrumbTrail $trail) { $trail->push('Data Laporan External'); }); + Breadcrumbs::for('basicdata.jenis-lampiran', function (BreadcrumbTrail $trail) { + $trail->parent('basicdata'); + $trail->push('Jenis Lampiran', route('basicdata.jenis-lampiran.index')); + }); + + Breadcrumbs::for('basicdata.jenis-lampiran.create', function (BreadcrumbTrail $trail) { + $trail->parent('basicdata.jenis-lampiran'); + $trail->push('Tambah Jenis Lampiran', route('basicdata.jenis-lampiran.create')); + }); + + Breadcrumbs::for('basicdata.jenis-lampiran.edit', function (BreadcrumbTrail $trail, $id) { + $trail->parent('basicdata.jenis-lampiran'); + $trail->push('Edit Jenis Lampiran', route('basicdata.jenis-lampiran.edit', $id)); + }); + // add andy require __DIR__ . '/breadcrumbs_registrasi.php'; diff --git a/routes/web.php b/routes/web.php index b497718..8c36181 100644 --- a/routes/web.php +++ b/routes/web.php @@ -12,7 +12,8 @@ use Modules\Lpj\Http\Controllers\IjinUsahaController; use Modules\Lpj\Http\Controllers\JenisDokumenController; use Modules\Lpj\Http\Controllers\JenisFasilitasKreditController; use Modules\Lpj\Http\Controllers\JenisJaminanController; -use Modules\Lpj\Http\Controllers\JenisLaporanController; + use Modules\Lpj\Http\Controllers\JenisLampiranController; + use Modules\Lpj\Http\Controllers\JenisLaporanController; use Modules\Lpj\Http\Controllers\JenisLegalitasJaminanController; use Modules\Lpj\Http\Controllers\JenisPenilaianController; use Modules\Lpj\Http\Controllers\KJPPController; @@ -55,6 +56,13 @@ Route::middleware(['auth'])->group(function () { Route::name('basicdata.')->prefix('basic-data')->group(function () { + Route::name('jenis-lampiran.')->prefix('jenis-lampiran')->group(function () { + Route::get('datatables', [JenisLampiranController::class, 'dataForDatatables'])->name('datatables'); + Route::get('export', [JenisLampiranController::class, 'export'])->name('export'); + }); + Route::delete('jenis-lampiran/{id}', [JenisLampiranController::class, 'destroy'])->name('jenis-lampiran.destroy'); + Route::resource('jenis-lampiran', JenisLampiranController::class); + Route::name('custom-field.')->prefix('custom-field')->group(function () { Route::get('restore/{id}', [CustomFieldController::class, 'restore'])->name('restore'); Route::get('datatables', [CustomFieldController::class, 'dataForDatatables'])->name( @@ -650,6 +658,8 @@ Route::middleware(['auth'])->group(function () { Route::post('lampiran/upload', [LampiranDokumenController::class, 'upload'])->name('lampiran.upload'); Route::delete('lampiran/{lampiran}', [LampiranDokumenController::class, 'delete'])->name('lampiran.delete'); + + }); require __DIR__ . '/registrasi.php';