diff --git a/app/Http/Controllers/CategoryDaftarPustakaController.php b/app/Http/Controllers/CategoryDaftarPustakaController.php new file mode 100644 index 0000000..f1478e6 --- /dev/null +++ b/app/Http/Controllers/CategoryDaftarPustakaController.php @@ -0,0 +1,152 @@ +validated(); + if ($validated) { + try { + CategoryDaftarPustaka::create($validated); + return redirect()->route('category-daftar-pustaka.index')->with('success', 'Data Berhasil Disimpan'); + } catch (\Throwable $th) { + return redirect()->route('category-daftar-pustaka.index')->with('error', $th->getMessage()); + } + } + + } + + /** + * Show the specified resource. + */ + public function show($id) + { + $category = CategoryDaftarPustaka::where('id', $id)->first(); + return view('lpj::category-daftar-pustaka.show', compact('category')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + return view('lpj::category-daftar-pustaka.create', ['category' => CategoryDaftarPustaka::where('id', $id)->first()]); + } + + /** + * Update the specified resource in storage. + */ + public function update(CategoryDaftarPustakaRequest $request, $id) + { + $validated = $request->validated(); + if ($validated) { + try { + CategoryDaftarPustaka::where('id', $id)->update($validated); + return redirect()->route('category-daftar-pustaka.index')->with('success', 'Data Berhasil Disimpan'); + } catch (\Throwable $th) { + return redirect()->route('category-daftar-pustaka.index')->with('error', $th->getMessage()); + } + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + try { + CategoryDaftarPustaka::where('id', $id)->delete(); + return response()->json(['success' => true, 'message' => 'Data Berhasil Dihapus']); + } catch (\Throwable $th) { + return response()->json(['success' => false, 'message' => $th->getMessage()]); + } + } + + 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 = CategoryDaftarPustaka::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%"); + }); + } + + // 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/Controllers/DaftarPustakaController.php b/app/Http/Controllers/DaftarPustakaController.php new file mode 100644 index 0000000..2241607 --- /dev/null +++ b/app/Http/Controllers/DaftarPustakaController.php @@ -0,0 +1,129 @@ +daftarPustaka = app(DaftarPustakaService::class); + } + + /** + * Display a listing of the resource. + */ + public function index(Request $request) +{ + $categories = CategoryDaftarPustaka::all(); + $daftar_pustaka = $this->daftarPustaka->getAllDaftarPustaka($request); + + return view('lpj::daftar-pustaka.index', [ + 'categories' => $categories, + 'daftar_pustaka' => $daftar_pustaka, + 'page' => $daftar_pustaka->currentPage(), + 'pageCount' => $daftar_pustaka->lastPage(), + 'limit' => $daftar_pustaka->perPage(), + 'total' => $daftar_pustaka->total(), + ]); +} + + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $categories = CategoryDaftarPustaka::all(); + // dd($categories); + return view('lpj::daftar-pustaka.create', compact('categories')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(DaftarPustakaRequest $request) + { + + $validate = $request->validated(); + // dd($validate); + $file = $request->file('attachment'); + if ($validate) { + try { + // Save to database + $this->daftarPustaka->storeDaftarPustaka($validate, $file); + return redirect() + ->route('daftar-pustaka.index') + ->with('success', 'Daftar Pustaka created successfully'); + } catch (Exception $e) { + return redirect() + ->route('daftar-pustaka.create') + ->with('error', 'Failed to create daftar pustaka'); + } + } + + } + + /** + * Show the specified resource. + */ + public function show($id) + { + $daftarPustaka = $this->daftarPustaka->getDaftarPustakaById($id); + $categories = CategoryDaftarPustaka::all(); + + return view('lpj::daftar-pustaka.show', compact('daftarPustaka', 'categories')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + $daftarPustaka = $this->daftarPustaka->getDaftarPustakaById($id); + $categories = CategoryDaftarPustaka::all(); + return view('lpj::daftar-pustaka.create', compact('daftarPustaka', 'categories')); + } + + /** + * Update the specified resource in storage. + */ + public function update(DaftarPustakaRequest $request, $id) + { + $validate = $request->validated(); + if ($validate) { + try { + // Save to database + $file = $request->file('attachment'); + $this->daftarPustaka->updateDaftarPustaka($validate, $file, $id); + return redirect() + ->route('daftar-pustaka.index') + ->with('success', 'Daftar Pustaka updated successfully'); + } catch (Exception $e) { + return redirect() + ->route('daftar-pustaka.create') + ->with('error', 'Failed to update daftar pustaka'); + } + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + try { + $this->daftarPustaka->deleteDaftarPustaka($id); + return response()->json(['success' => true, 'message' => 'Daftar Pustaka deleted successfully']); + } catch (Exception $e) { + return response()->json(['success' => false, 'message' => 'Failed to delete daftar pustaka']); + } + } +} diff --git a/app/Http/Requests/CategoryDaftarPustakaRequest.php b/app/Http/Requests/CategoryDaftarPustakaRequest.php new file mode 100644 index 0000000..0907835 --- /dev/null +++ b/app/Http/Requests/CategoryDaftarPustakaRequest.php @@ -0,0 +1,33 @@ + 'required|max:255', + ]; + + if ($this->method() == 'PUT') { + $rules['code'] = 'required|max:50|unique:category_daftar_pustaka,code,' . $this->id; + } else { + $rules['code'] = 'required|max:50|unique:category_daftar_pustaka,code'; + } + return $rules; + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } +} diff --git a/app/Http/Requests/DaftarPustakaRequest.php b/app/Http/Requests/DaftarPustakaRequest.php new file mode 100644 index 0000000..285da48 --- /dev/null +++ b/app/Http/Requests/DaftarPustakaRequest.php @@ -0,0 +1,38 @@ + 'required|max:255', + 'category_id' => 'required', + 'deskripsi' => 'nullable', + ]; + + if ($this->method() == 'PUT') { + $rules['attachment'] = 'nullable|mimes:pdf,jpg,jpeg,png,gif'; + } else { + $rules['attachment'] = 'required|mimes:pdf,jpg,jpeg,png,gif'; + } + + return $rules; + + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } +} diff --git a/app/Models/CategoryDaftarPustaka.php b/app/Models/CategoryDaftarPustaka.php new file mode 100644 index 0000000..7101f18 --- /dev/null +++ b/app/Models/CategoryDaftarPustaka.php @@ -0,0 +1,27 @@ +hasMany(DaftarPustaka::class); + } + +} diff --git a/app/Models/DaftarPustaka.php b/app/Models/DaftarPustaka.php new file mode 100644 index 0000000..688b08c --- /dev/null +++ b/app/Models/DaftarPustaka.php @@ -0,0 +1,29 @@ +belongsTo(CategoryDaftarPustaka::class); + } +} diff --git a/app/Services/DaftarPustakaService.php b/app/Services/DaftarPustakaService.php new file mode 100644 index 0000000..0d18e35 --- /dev/null +++ b/app/Services/DaftarPustakaService.php @@ -0,0 +1,94 @@ +handleUpload($file); + } + return DaftarPustaka::create($data); + } + + public function updateDaftarPustaka($data, $file, $id) + { + // Ambil data inputan yang diperlukan saja + + $daftarPustaka = DaftarPustaka::findOrFail($id); + + // Jika ada file baru yang diupload + if ($file) { + // (Opsional) Hapus file lama + if ($daftarPustaka->attachment && file_exists(public_path($daftarPustaka->attachment))) { + unlink(public_path($daftarPustaka->attachment)); + } + + // Upload file baru + $data['attachment'] = $this->handleUpload($file); + } + + // Update data + $daftarPustaka->update($data); + + return $daftarPustaka; + } + + + public function deleteDaftarPustaka($id) + { + return DaftarPustaka::where('id', $id)->delete(); + } + + public function getDaftarPustakaById($id) + { + return DaftarPustaka::where('id', $id)->first(); + } + + // get all with pagination + public function getAllDaftarPustaka($request) +{ + $query = DaftarPustaka::query(); + + // Filter pencarian + if (!empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->orWhere('judul', 'LIKE', "%$search%"); + }); + } + + // Filter kategori + if (!empty($request->get('category'))) { + $category = explode(',', $request->input('category')); + $query->whereIn('category_id', $category); + } + + // Default pagination + $page = (int) $request->get('page', 1); + $size = (int) $request->get('size', 10); + + return $query->paginate($size, ['*'], 'page', $page); +} + + + private function handleUpload($file) + { + $today = now(); + $folderPath = 'daftar_pustaka/' . $today->format('Y/m/d'); + + if (!file_exists(public_path($folderPath))) { + mkdir(public_path($folderPath), 0755, true); + } + + $fileName = $file->getClientOriginalName(); + $file->move(public_path($folderPath), $fileName); + + return $folderPath . '/' . $fileName; + } + + +} diff --git a/database/migrations/2025_07_07_025336_create_category_daftar_pustaka_table.php b/database/migrations/2025_07_07_025336_create_category_daftar_pustaka_table.php new file mode 100644 index 0000000..ce6f6d8 --- /dev/null +++ b/database/migrations/2025_07_07_025336_create_category_daftar_pustaka_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('code')->unique()->index(); + $table->string('name'); + $table->timestamps(); + $table->timestamp('authorized_at')->nullable(); + $table->char('authorized_status', 1)->nullable(); + $table->softDeletes(); + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('category_daftar_pustaka'); + } +}; diff --git a/database/migrations/2025_07_07_025337_create_daftar_pustaka_table.php b/database/migrations/2025_07_07_025337_create_daftar_pustaka_table.php new file mode 100644 index 0000000..5b61e12 --- /dev/null +++ b/database/migrations/2025_07_07_025337_create_daftar_pustaka_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('judul'); + $table->string('attachment')->nullable(); + $table->text('deskripsi'); + $table->unsignedBigInteger('category_id'); + $table->foreign('category_id')->references('id')->on('category_daftar_pustaka'); + $table->timestamps(); + $table->timestamp('authorized_at')->nullable(); + $table->char('authorized_status', 1)->nullable(); + $table->softDeletes(); + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('daftar_pustaka'); + } +}; diff --git a/module.json b/module.json index fc81e7f..0b63135 100644 --- a/module.json +++ b/module.json @@ -607,6 +607,23 @@ "EO Appraisal", "senior-officer" ] + }, + { + "title": "Daftar Pustaka", + "path": "daftar-pustaka", + "icon": "ki-filled ki-filter-tablet text-lg text-primary", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator", + "pemohon-ao", + "pemohon-eo", + "admin", + "DD Appraisal", + "EO Appraisal", + "senior-officer" + ] } ], "master": [ @@ -1149,6 +1166,17 @@ "administrator", "admin" ] + }, + { + "title": "Kategori Daftar Pustaka", + "path": "category-daftar-pustaka", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator", + "admin" + ] } ] } diff --git a/resources/views/category-daftar-pustaka/create.blade.php b/resources/views/category-daftar-pustaka/create.blade.php new file mode 100644 index 0000000..3d94986 --- /dev/null +++ b/resources/views/category-daftar-pustaka/create.blade.php @@ -0,0 +1,64 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}} +@endsection + +@section('content') +
| + + | ++ Code + + | ++ Name + + | +Action | +
|---|
+ {{-- batasi panjang deskripsi 50 --}} + {{ substr($item->deskripsi, 0, 50) }} +
+ ++ # {{ $item->category->name }}
+ + @auth + @if (auth()->user()->hasRole(['administrator', 'admin'])) +