diff --git a/app/Http/Controllers/FrontEnd/PpidController.php b/app/Http/Controllers/FrontEnd/PpidController.php new file mode 100644 index 000000000..a4e3f4a44 --- /dev/null +++ b/app/Http/Controllers/FrontEnd/PpidController.php @@ -0,0 +1,261 @@ +urut()->get(); + $dokumen_terbaru = PpidDokumen::where('status', true) + ->with('jenisDokumen') + ->latest() + ->take(10) + ->get(); + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.index', compact( + 'page_title', + 'page_description', + 'jenis_dokumen', + 'dokumen_terbaru', + 'pengaturan' + )); + } + + /** + * Display documents by category. + * + * @param int|null $id + * @return \Illuminate\View\View + */ + public function dokumen($id = null) + { + $page_title = 'Dokumen PPID'; + $page_description = 'Daftar Dokumen PPID'; + + $jenis_dokumen = PpidJenisDokumen::aktif()->urut()->get(); + + if ($id) { + $jenis = PpidJenisDokumen::findOrFail($id); + $dokumen = PpidDokumen::where('status', true) + ->where('id_jenis_dokumen', $id) + ->with('jenisDokumen') + ->latest() + ->paginate(12); + } else { + $jenis = null; + $dokumen = PpidDokumen::where('status', true) + ->with('jenisDokumen') + ->latest() + ->paginate(12); + } + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.dokumen', compact( + 'page_title', + 'page_description', + 'jenis_dokumen', + 'dokumen', + 'jenis', + 'pengaturan' + )); + } + + /** + * Display document detail. + * + * @param int $id + * @return \Illuminate\View\View + */ + public function showDokumen($id) + { + $dokumen = PpidDokumen::with('jenisDokumen')->findOrFail($id); + + if (!$dokumen->status) { + abort(404); + } + + $page_title = $dokumen->judul; + $page_description = 'Detail Dokumen PPID'; + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.show_dokumen', compact( + 'page_title', + 'page_description', + 'dokumen', + 'pengaturan' + )); + } + + /** + * Download document. + * + * @param int $id + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ + public function downloadDokumen($id) + { + $dokumen = PpidDokumen::findOrFail($id); + + if (!$dokumen->status || !$dokumen->file) { + abort(404); + } + + $filePath = public_path('storage/ppid_dokumen/' . $dokumen->file); + + if (!file_exists($filePath)) { + return back()->with('error', 'File tidak ditemukan!'); + } + + return response()->download($filePath, $dokumen->judul . '.' . pathinfo($filePath, PATHINFO_EXTENSION)); + } + + /** + * Display permohonan form. + * + * @return \Illuminate\View\View + */ + public function permohonan() + { + $page_title = 'Permohonan Informasi'; + $page_description = 'Formulir Permohonan Informasi Publik'; + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.permohonan', compact( + 'page_title', + 'page_description', + 'pengaturan' + )); + } + + /** + * Store permohonan. + * + * @param \App\Http\Requests\Ppid\PermohonanRequest $request + * @return \Illuminate\Http\Response + */ + public function storePermohonan(PermohonanRequest $request) + { + try { + $input = $request->validated(); + $input['status'] = 'MENUNGGU'; + + PpidPermohonan::create($input); + + return redirect()->route('ppid.permohonan') + ->with('success', 'Permohonan informasi berhasil dikirim! Permohonan Anda akan diproses dalam waktu maksimal 10 hari kerja sesuai dengan peraturan perundang-undangan.'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Permohonan gagal dikirim. Silakan coba lagi atau hubungi admin.'); + } + } + + /** + * Check permohonan status. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\View\View + */ + public function cekPermohonan(Request $request) + { + $page_title = 'Cek Status Permohonan'; + $page_description = 'Cek Status Permohonan Informasi Publik'; + + $permohonan = null; + + if ($request->has('nomor_permohonan')) { + $permohonan = PpidPermohonan::where('id', $request->nomor_permohonan) + ->first(); + + if (!$permohonan) { + return back()->with('error', 'Permohonan tidak ditemukan!'); + } + } + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.cek_permohonan', compact( + 'page_title', + 'page_description', + 'permohonan', + 'pengaturan' + )); + } + + /** + * Get PPID settings. + * + * @return array + */ + private function getPengaturan() + { + return [ + 'nama_ppid' => PpidPengaturan::getValue('nama_ppid', 'PPID'), + 'alamat_ppid' => PpidPengaturan::getValue('alamat_ppid', ''), + 'nomor_telepon' => PpidPengaturan::getValue('nomor_telepon', ''), + 'email_ppid' => PpidPengaturan::getValue('email_ppid', ''), + 'jam_operasional' => PpidPengaturan::getValue('jam_operasional', ''), + 'nama_pejabat' => PpidPengaturan::getValue('nama_pejabat', ''), + 'nip_pejabat' => PpidPengaturan::getValue('nip_pejabat', ''), + 'jabatan_pejabat' => PpidPengaturan::getValue('jabatan_pejabat', ''), + ]; + } +} diff --git a/app/Http/Controllers/FrontEnd/PpidPublicController.php b/app/Http/Controllers/FrontEnd/PpidPublicController.php new file mode 100644 index 000000000..705820e59 --- /dev/null +++ b/app/Http/Controllers/FrontEnd/PpidPublicController.php @@ -0,0 +1,234 @@ +urut()->get(); + $dokumen_terbaru = PpidDokumen::where('status', true) + ->with('jenisDokumen') + ->latest() + ->take(10) + ->get(); + } catch (\Exception $e) { + $jenis_dokumen = collect(); + $dokumen_terbaru = collect(); + } + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.index', compact( + 'page_title', + 'page_description', + 'jenis_dokumen', + 'dokumen_terbaru', + 'pengaturan' + )); + } + + public function dokumen($id = null) + { + $page_title = 'Dokumen PPID'; + $page_description = 'Daftar Dokumen PPID'; + + try { + $jenis_dokumen = PpidJenisDokumen::aktif()->urut()->get(); + + if ($id) { + $jenis = PpidJenisDokumen::findOrFail($id); + $dokumen = PpidDokumen::where('status', true) + ->where('id_jenis_dokumen', $id) + ->with('jenisDokumen') + ->latest() + ->paginate(12); + } else { + $jenis = null; + $dokumen = PpidDokumen::where('status', true) + ->with('jenisDokumen') + ->latest() + ->paginate(12); + } + } catch (\Exception $e) { + $jenis_dokumen = collect(); + $dokumen = null; + $jenis = null; + } + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.dokumen', compact( + 'page_title', + 'page_description', + 'jenis_dokumen', + 'dokumen', + 'jenis', + 'pengaturan' + )); + } + + public function showDokumen($id) + { + $dokumen = PpidDokumen::with('jenisDokumen')->findOrFail($id); + + if (!$dokumen->status) { + abort(404); + } + + $page_title = $dokumen->judul; + $page_description = 'Detail Dokumen PPID'; + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.show_dokumen', compact( + 'page_title', + 'page_description', + 'dokumen', + 'pengaturan' + )); + } + + public function downloadDokumen($id) + { + $dokumen = PpidDokumen::findOrFail($id); + + if (!$dokumen->status || !$dokumen->file) { + abort(404); + } + + $filePath = public_path('storage/ppid_dokumen/' . $dokumen->file); + + if (!file_exists($filePath)) { + return back()->with('error', 'File tidak ditemukan!'); + } + + return response()->download($filePath, $dokumen->judul . '.' . pathinfo($filePath, PATHINFO_EXTENSION)); + } + + public function permohonan() + { + $page_title = 'Permohonan Informasi'; + $page_description = 'Formulir Permohonan Informasi Publik'; + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.permohonan', compact( + 'page_title', + 'page_description', + 'pengaturan' + )); + } + + public function storePermohonan(PermohonanRequest $request) + { + try { + $input = $request->validated(); + $input['status'] = 'MENUNGGU'; + + PpidPermohonan::create($input); + + return redirect()->route('ppid.permohonan') + ->with('success', 'Permohonan informasi berhasil dikirim! Permohonan Anda akan diproses dalam waktu maksimal 10 hari kerja sesuai dengan peraturan perundang-undangan.'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Permohonan gagal dikirim. Silakan coba lagi atau hubungi admin.'); + } + } + + public function cekPermohonan(Request $request) + { + $page_title = 'Cek Status Permohonan'; + $page_description = 'Cek Status Permohonan Informasi Publik'; + + $permohonan = null; + + if ($request->has('nomor_permohonan')) { + $permohonan = PpidPermohonan::where('id', $request->nomor_permohonan) + ->first(); + + if (!$permohonan) { + return back()->with('error', 'Permohonan tidak ditemukan!'); + } + } + + $pengaturan = $this->getPengaturan(); + + return view('frontend.ppid.cek_permohonan', compact( + 'page_title', + 'page_description', + 'permohonan', + 'pengaturan' + )); + } + + private function getPengaturan() + { + try { + return [ + 'nama_ppid' => PpidPengaturan::getValue('nama_ppid', 'PPID'), + 'alamat_ppid' => PpidPengaturan::getValue('alamat_ppid', ''), + 'nomor_telepon' => PpidPengaturan::getValue('nomor_telepon', ''), + 'email_ppid' => PpidPengaturan::getValue('email_ppid', ''), + 'jam_operasional' => PpidPengaturan::getValue('jam_operasional', ''), + 'nama_pejabat' => PpidPengaturan::getValue('nama_pejabat', ''), + 'nip_pejabat' => PpidPengaturan::getValue('nip_pejabat', ''), + 'jabatan_pejabat' => PpidPengaturan::getValue('jabatan_pejabat', ''), + ]; + } catch (\Exception $e) { + return [ + 'nama_ppid' => 'PPID', + 'alamat_ppid' => '', + 'nomor_telepon' => '', + 'email_ppid' => '', + 'jam_operasional' => '', + 'nama_pejabat' => '', + 'nip_pejabat' => '', + 'jabatan_pejabat' => '', + ]; + } + } +} diff --git a/app/Http/Controllers/Ppid/DokumenController.php b/app/Http/Controllers/Ppid/DokumenController.php new file mode 100644 index 000000000..28c67d5a6 --- /dev/null +++ b/app/Http/Controllers/Ppid/DokumenController.php @@ -0,0 +1,217 @@ +get(); + + return view('ppid.dokumen.index', compact('page_title', 'page_description', 'jenis_dokumen')); + } + + /** + * Get data for DataTables. + * + * @return \Yajra\DataTables\DataTables + */ + public function getDataDokumen() + { + $query = PpidDokumen::with('jenisDokumen'); + + return DataTables::of($query) + ->addColumn('aksi', function ($row) { + $data['edit_url'] = route('ppid.dokumen.edit', $row->id); + $data['delete_url'] = route('ppid.dokumen.destroy', $row->id); + $data['download_url'] = route('ppid.dokumen.download', $row->id); + return view('forms.aksi', $data); + }) + ->editColumn('jenis_dokumen', function ($row) { + return $row->jenisDokumen->nama ?? '-'; + }) + ->editColumn('status', function ($row) { + return $row->status ? 'Aktif' : 'Tidak Aktif'; + }) + ->editColumn('file', function ($row) { + return $row->file ? 'Ada File' : 'Tidak Ada File'; + }) + ->rawColumns(['aksi', 'status', 'file']) + ->make(); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\View\View + */ + public function create() + { + $page_title = 'Dokumen PPID'; + $page_description = 'Tambah Dokumen PPID'; + $jenis_dokumen = PpidJenisDokumen::aktif()->get(); + + return view('ppid.dokumen.create', compact('page_title', 'page_description', 'jenis_dokumen')); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Ppid\DokumenRequest $request + * @return \Illuminate\Http\Response + */ + public function store(DokumenRequest $request) + { + try { + $input = $request->validated(); + + // Handle file upload + $this->handleFileUpload($request, $input, 'file', 'ppid_dokumen'); + + // Set status default + if (!isset($input['status'])) { + $input['status'] = true; + } + + PpidDokumen::create($input); + + return redirect()->route('ppid.dokumen.index')->with('success', 'Dokumen PPID berhasil ditambahkan!'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Dokumen PPID gagal ditambahkan!'); + } + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\PpidDokumen $dokumen + * @return \Illuminate\View\View + */ + public function edit(PpidDokumen $dokumen) + { + $page_title = 'Dokumen PPID'; + $page_description = 'Ubah Dokumen PPID'; + $jenis_dokumen = PpidJenisDokumen::aktif()->get(); + + return view('ppid.dokumen.edit', compact('page_title', 'page_description', 'dokumen', 'jenis_dokumen')); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Ppid\DokumenRequest $request + * @param \App\Models\PpidDokumen $dokumen + * @return \Illuminate\Http\Response + */ + public function update(DokumenRequest $request, PpidDokumen $dokumen) + { + try { + $input = $request->validated(); + + // Handle file upload + $this->handleFileUpload($request, $input, 'file', 'ppid_dokumen'); + + // Set status default + if (!isset($input['status'])) { + $input['status'] = false; + } + + $dokumen->update($input); + + return redirect()->route('ppid.dokumen.index')->with('success', 'Dokumen PPID berhasil diupdate!'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Dokumen PPID gagal diupdate!'); + } + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\PpidDokumen $dokumen + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(PpidDokumen $dokumen) + { + try { + $dokumen->delete(); + } catch (\Exception $e) { + report($e); + + return back()->with('error', 'Dokumen PPID gagal dihapus!'); + } + + return redirect()->route('ppid.dokumen.index')->with('success', 'Dokumen PPID berhasil dihapus!'); + } + + /** + * Download the specified document. + * + * @param \App\Models\PpidDokumen $dokumen + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ + public function download(PpidDokumen $dokumen) + { + try { + $filePath = public_path('storage/ppid_dokumen/' . $dokumen->file); + + if (!file_exists($filePath)) { + return back()->with('error', 'File tidak ditemukan!'); + } + + return response()->download($filePath, $dokumen->judul . '.' . pathinfo($filePath, PATHINFO_EXTENSION)); + } catch (\Exception $e) { + report($e); + + return back()->with('error', 'File tidak dapat diunduh!'); + } + } +} diff --git a/app/Http/Controllers/Ppid/JenisDokumenController.php b/app/Http/Controllers/Ppid/JenisDokumenController.php new file mode 100644 index 000000000..e479bf4ba --- /dev/null +++ b/app/Http/Controllers/Ppid/JenisDokumenController.php @@ -0,0 +1,181 @@ +orderBy('urutan')) + ->addColumn('aksi', function ($row) { + $data['modal_form'] = $row->id; + $data['delete_url'] = route('ppid.jenis-dokumen.destroy', $row->id); + return view('forms.aksi', $data); + }) + ->editColumn('status', function ($row) { + return $row->status ? 'Aktif' : 'Tidak Aktif'; + }) + ->rawColumns(['aksi', 'status']) + ->make(); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\View\View + */ + public function create() + { + return view('ppid.jenis-dokumen.create'); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Ppid\JenisDokumenRequest $request + * @return \Illuminate\Http\Response + */ + public function store(JenisDokumenRequest $request) + { + try { + PpidJenisDokumen::create($request->validated()); + + session()->flash('success', 'Jenis Dokumen berhasil ditambahkan!'); + + return response()->json([ + 'success' => true, + 'message' => session('success') + ]); + } catch (\Exception $e) { + report($e); + + session()->flash('error', 'Jenis Dokumen gagal ditambahkan!'); + + return response()->json([ + 'success' => false, + 'message' => session('error') + ]); + } + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\PpidJenisDokumen $jenisDokumen + * @return \Illuminate\Http\Response + */ + public function edit(PpidJenisDokumen $jenisDokumen) + { + return response()->json($jenisDokumen); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Ppid\JenisDokumenRequest $request + * @param \App\Models\PpidJenisDokumen $jenisDokumen + * @return \Illuminate\Http\Response + */ + public function update(JenisDokumenRequest $request, PpidJenisDokumen $jenisDokumen) + { + try { + $jenisDokumen->update($request->validated()); + + session()->flash('success', 'Jenis Dokumen berhasil diupdate!'); + + return response()->json([ + 'success' => true, + 'message' => session('success') + ]); + } catch (\Exception $e) { + report($e); + + session()->flash('error', 'Jenis Dokumen gagal diupdate!'); + + return response()->json([ + 'success' => false, + 'message' => session('error') + ]); + } + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\PpidJenisDokumen $jenisDokumen + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(PpidJenisDokumen $jenisDokumen) + { + try { + $isUsed = PpidDokumen::query() + ->where('id_jenis_dokumen', $jenisDokumen->id) + ->exists(); + + if ($isUsed) { + return back()->with('error', 'Jenis Dokumen tidak bisa dihapus karena sedang digunakan pada Dokumen PPID.'); + } + + $jenisDokumen->delete(); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Jenis Dokumen gagal dihapus!'); + } + + return redirect()->route('ppid.jenis-dokumen.index')->with('success', 'Jenis Dokumen berhasil dihapus!'); + } +} diff --git a/app/Http/Controllers/Ppid/PengaturanController.php b/app/Http/Controllers/Ppid/PengaturanController.php new file mode 100644 index 000000000..66c5199c0 --- /dev/null +++ b/app/Http/Controllers/Ppid/PengaturanController.php @@ -0,0 +1,95 @@ + PpidPengaturan::getValue('nama_ppid', ''), + 'alamat_ppid' => PpidPengaturan::getValue('alamat_ppid', ''), + 'nomor_telepon' => PpidPengaturan::getValue('nomor_telepon', ''), + 'email_ppid' => PpidPengaturan::getValue('email_ppid', ''), + 'jam_operasional' => PpidPengaturan::getValue('jam_operasional', ''), + 'nama_pejabat' => PpidPengaturan::getValue('nama_pejabat', ''), + 'nip_pejabat' => PpidPengaturan::getValue('nip_pejabat', ''), + 'jabatan_pejabat' => PpidPengaturan::getValue('jabatan_pejabat', ''), + ]; + + return view('ppid.pengaturan.index', compact('page_title', 'page_description', 'pengaturan')); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function update(Request $request) + { + try { + $pengaturanList = [ + 'nama_ppid' => ['value' => $request->nama_ppid, 'keterangan' => 'Nama Instansi PPID'], + 'alamat_ppid' => ['value' => $request->alamat_ppid, 'keterangan' => 'Alamat PPID'], + 'nomor_telepon' => ['value' => $request->nomor_telepon, 'keterangan' => 'Nomor Telepon PPID'], + 'email_ppid' => ['value' => $request->email_ppid, 'keterangan' => 'Email PPID'], + 'jam_operasional' => ['value' => $request->jam_operasional, 'keterangan' => 'Jam Operasional Pelayanan'], + 'nama_pejabat' => ['value' => $request->nama_pejabat, 'keterangan' => 'Nama Pejabat PPID'], + 'nip_pejabat' => ['value' => $request->nip_pejabat, 'keterangan' => 'NIP Pejabat PPID'], + 'jabatan_pejabat' => ['value' => $request->jabatan_pejabat, 'keterangan' => 'Jabatan Pejabat PPID'], + ]; + + foreach ($pengaturanList as $key => $data) { + PpidPengaturan::setValue($key, $data['value'], $data['keterangan']); + } + + return back()->with('success', 'Pengaturan PPID berhasil disimpan!'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Pengaturan PPID gagal disimpan!'); + } + } +} diff --git a/app/Http/Controllers/Ppid/PermohonanController.php b/app/Http/Controllers/Ppid/PermohonanController.php new file mode 100644 index 000000000..17c7637d5 --- /dev/null +++ b/app/Http/Controllers/Ppid/PermohonanController.php @@ -0,0 +1,277 @@ +has('status') && $request->status != '') { + $query->where('status', $request->status); + } + + return DataTables::of($query->latest()) + ->addColumn('aksi', function ($row) { + $data['show_url'] = route('ppid.permohonan.show', $row->id); + $data['edit_url'] = route('ppid.permohonan.edit', $row->id); + $data['delete_url'] = route('ppid.permohonan.destroy', $row->id); + return view('forms.aksi', $data); + }) + ->editColumn('status', function ($row) { + $badgeClass = match($row->status) { + 'MENUNGGU' => 'badge-warning', + 'DIPROSES' => 'badge-info', + 'SELESAI' => 'badge-success', + 'DITOLAK' => 'badge-danger', + default => 'badge-secondary' + }; + return '' . $row->status . ''; + }) + ->editColumn('cara_memperoleh', function ($row) { + return $row->cara_memperoleh == 'ONLINE' ? 'Online' : 'Offline'; + }) + ->editColumn('created_at', function ($row) { + return $row->created_at->format('d/m/Y H:i'); + }) + ->filterColumn('status', function ($query, $keyword) { + $query->where('status', 'like', '%' . $keyword . '%'); + }) + ->rawColumns(['aksi', 'status']) + ->make(); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\View\View + */ + public function create() + { + $page_title = 'Permohonan Informasi PPID'; + $page_description = 'Tambah Permohonan Informasi PPID'; + + return view('ppid.permohonan.create', compact('page_title', 'page_description')); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Ppid\PermohonanRequest $request + * @return \Illuminate\Http\Response + */ + public function store(PermohonanRequest $request) + { + try { + $input = $request->validated(); + + // Set default status + if (!isset($input['status'])) { + $input['status'] = 'MENUNGGU'; + } + + PpidPermohonan::create($input); + + return redirect()->route('ppid.permohonan.index')->with('success', 'Permohonan berhasil ditambahkan!'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Permohonan gagal ditambahkan!'); + } + } + + /** + * Display the specified resource. + * + * @param \App\Models\PpidPermohonan $permohonan + * @return \Illuminate\View\View + */ + public function show(PpidPermohonan $permohonan) + { + $page_title = 'Detail Permohonan'; + $page_description = 'Detail Permohonan Informasi PPID'; + + return view('ppid.permohonan.show', compact('page_title', 'page_description', 'permohonan')); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\PpidPermohonan $permohonan + * @return \Illuminate\View\View + */ + public function edit(PpidPermohonan $permohonan) + { + $page_title = 'Permohonan Informasi PPID'; + $page_description = 'Ubah Permohonan Informasi PPID'; + + return view('ppid.permohonan.edit', compact('page_title', 'page_description', 'permohonan')); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Ppid\PermohonanRequest $request + * @param \App\Models\PpidPermohonan $permohonan + * @return \Illuminate\Http\Response + */ + public function update(PermohonanRequest $request, PpidPermohonan $permohonan) + { + try { + $permohonan->update($request->validated()); + + return redirect()->route('ppid.permohonan.index')->with('success', 'Permohonan berhasil diupdate!'); + } catch (\Exception $e) { + report($e); + + return back()->withInput()->with('error', 'Permohonan gagal diupdate!'); + } + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\PpidPermohonan $permohonan + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(PpidPermohonan $permohonan) + { + try { + $permohonan->delete(); + } catch (\Exception $e) { + report($e); + + return back()->with('error', 'Permohonan gagal dihapus!'); + } + + return redirect()->route('ppid.permohonan.index')->with('success', 'Permohonan berhasil dihapus!'); + } + + /** + * Proses permohonan. + * + * @param \App\Models\PpidPermohonan $permohonan + * @return \Illuminate\Http\Response + */ + public function proses(PpidPermohonan $permohonan) + { + try { + $permohonan->update([ + 'status' => 'DIPROSES', + 'tanggal_proses' => now(), + ]); + + return back()->with('success', 'Permohonan berhasil diproses!'); + } catch (\Exception $e) { + report($e); + + return back()->with('error', 'Permohonan gagal diproses!'); + } + } + + /** + * Selesaikan permohonan. + * + * @param \App\Models\PpidPermohonan $permohonan + * @return \Illuminate\Http\Response + */ + public function selesaikan(PpidPermohonan $permohonan) + { + try { + $permohonan->update([ + 'status' => 'SELESAI', + 'tanggal_proses' => now(), + ]); + + return back()->with('success', 'Permohonan berhasil diselesaikan!'); + } catch (\Exception $e) { + report($e); + + return back()->with('error', 'Permohonan gagal diselesaikan!'); + } + } + + /** + * Tolak permohonan. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\PpidPermohonan $permohonan + * @return \Illuminate\Http\Response + */ + public function tolak(Request $request, PpidPermohonan $permohonan) + { + try { + $request->validate([ + 'keterangan' => 'required|string', + ]); + + $permohonan->update([ + 'status' => 'DITOLAK', + 'keterangan' => $request->keterangan, + 'tanggal_proses' => now(), + ]); + + return back()->with('success', 'Permohonan berhasil ditolak!'); + } catch (\Exception $e) { + report($e); + + return back()->with('error', 'Permohonan gagal ditolak!'); + } + } +} diff --git a/app/Models/PpidDokumen.php b/app/Models/PpidDokumen.php new file mode 100644 index 000000000..f15bf32e2 --- /dev/null +++ b/app/Models/PpidDokumen.php @@ -0,0 +1,66 @@ +belongsTo(PpidJenisDokumen::class, 'id_jenis_dokumen'); + } +} diff --git a/app/Models/PpidJenisDokumen.php b/app/Models/PpidJenisDokumen.php new file mode 100644 index 000000000..d5d1eee3c --- /dev/null +++ b/app/Models/PpidJenisDokumen.php @@ -0,0 +1,67 @@ +where('status', true); + } + + /** + * Scope untuk ordering berdasarkan urutan. + */ + public function scopeUrut($query) + { + return $query->orderBy('urutan'); + } + + public function dokumen() + { + return $this->hasMany(PpidDokumen::class, 'id_jenis_dokumen'); + } +} diff --git a/app/Models/PpidPengaturan.php b/app/Models/PpidPengaturan.php new file mode 100644 index 000000000..2a293aee4 --- /dev/null +++ b/app/Models/PpidPengaturan.php @@ -0,0 +1,73 @@ +where('key', $key); + } + + /** + * Helper untuk mendapatkan nilai pengaturan berdasarkan key. + */ + public static function getValue($key, $default = null) + { + $setting = static::key($key)->first(); + return $setting ? $setting->value : $default; + } + + /** + * Helper untuk set nilai pengaturan. + */ + public static function setValue($key, $value, $keterangan = null) + { + return static::updateOrCreate( + ['key' => $key], + ['value' => $value, 'keterangan' => $keterangan] + ); + } +} diff --git a/app/Models/PpidPermohonan.php b/app/Models/PpidPermohonan.php new file mode 100644 index 000000000..641ca35fa --- /dev/null +++ b/app/Models/PpidPermohonan.php @@ -0,0 +1,68 @@ + 'date', + ]; + + /** + * Scope untuk filter berdasarkan status. + */ + public function scopeStatus($query, $status) + { + if ($status) { + return $query->where('status', $status); + } + return $query; + } +} diff --git a/database/migrations/2026_02_08_000001_create_das_ppid_dokumen_table.php b/database/migrations/2026_02_08_000001_create_das_ppid_dokumen_table.php new file mode 100644 index 000000000..a1a60922b --- /dev/null +++ b/database/migrations/2026_02_08_000001_create_das_ppid_dokumen_table.php @@ -0,0 +1,67 @@ +increments('id'); + $table->string('judul', 255); + $table->string('nomor_dokumen', 255)->nullable(); + $table->text('deskripsi')->nullable(); + $table->integer('id_jenis_dokumen')->nullable(); + $table->string('file', 255)->nullable(); + $table->integer('tahun')->nullable(); + $table->boolean('status')->default(true); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('das_ppid_dokumen'); + } +} diff --git a/database/migrations/2026_02_08_000002_create_das_ppid_permohonan_table.php b/database/migrations/2026_02_08_000002_create_das_ppid_permohonan_table.php new file mode 100644 index 000000000..d2798aa39 --- /dev/null +++ b/database/migrations/2026_02_08_000002_create_das_ppid_permohonan_table.php @@ -0,0 +1,71 @@ +increments('id'); + $table->string('nama_pemohon', 255); + $table->string('nik', 255); + $table->text('alamat'); + $table->string('nomor_telepon', 255); + $table->string('email', 255)->nullable(); + $table->longText('rincian_informasi'); + $table->longText('tujuan_penggunaan'); + $table->string('cara_memperoleh', 255)->default('ONLINE'); + $table->string('status', 255)->default('MENUNGGU'); + $table->text('keterangan')->nullable(); + $table->date('tanggal_proses')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('das_ppid_permohonan'); + } +} diff --git a/database/migrations/2026_02_08_000003_create_das_ppid_jenis_dokumen_table.php b/database/migrations/2026_02_08_000003_create_das_ppid_jenis_dokumen_table.php new file mode 100644 index 000000000..95e35b819 --- /dev/null +++ b/database/migrations/2026_02_08_000003_create_das_ppid_jenis_dokumen_table.php @@ -0,0 +1,64 @@ +increments('id'); + $table->string('nama', 255); + $table->text('keterangan')->nullable(); + $table->integer('urutan')->default(0); + $table->boolean('status')->default(true); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('das_ppid_jenis_dokumen'); + } +} diff --git a/database/migrations/2026_02_08_000004_create_das_ppid_pengaturan_table.php b/database/migrations/2026_02_08_000004_create_das_ppid_pengaturan_table.php new file mode 100644 index 000000000..0b6edeb4e --- /dev/null +++ b/database/migrations/2026_02_08_000004_create_das_ppid_pengaturan_table.php @@ -0,0 +1,63 @@ +increments('id'); + $table->string('key', 255); + $table->text('value')->nullable(); + $table->text('keterangan')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('das_ppid_pengaturan'); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 484a6adec..14edfea87 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -68,6 +68,7 @@ public function run() $this->call(RefSubSubCoaTableSeeder::class); $this->call(RefCoaTableSeeder::class); $this->call(DasMenuTableSeeder::class); + $this->call(PpidMenuSeeder::class); $this->call(DasSettingTableSeeder::class); $this->call(DasNavigationTableSeeder::class); // Other diff --git a/database/seeders/PpidMenuSeeder.php b/database/seeders/PpidMenuSeeder.php new file mode 100644 index 000000000..886dbf0d7 --- /dev/null +++ b/database/seeders/PpidMenuSeeder.php @@ -0,0 +1,116 @@ +where('slug', 'ppid')->first(); + + if ($existingMenu) { + $this->command->info('Menu PPID sudah ada. Melewati seeder.'); + return; + } + + // Insert menu parent PPID + $ppidMenuId = DB::table('das_menu')->insertGetId([ + 'parent_id' => 0, + 'name' => 'PPID', + 'slug' => 'ppid', + 'icon' => 'fa-file-text-o', + 'url' => '#', + 'is_active' => 1, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + // Insert submenu Daftar Dokumen + DB::table('das_menu')->insert([ + 'parent_id' => $ppidMenuId, + 'name' => 'Daftar Dokumen', + 'slug' => 'ppid-dokumen', + 'icon' => '', + 'url' => 'ppid/dokumen', + 'is_active' => 1, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + // Insert submenu Permohonan Informasi + DB::table('das_menu')->insert([ + 'parent_id' => $ppidMenuId, + 'name' => 'Permohonan Informasi', + 'slug' => 'ppid-permohonan', + 'icon' => '', + 'url' => 'ppid/permohonan', + 'is_active' => 1, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + // Insert submenu Jenis Dokumen + DB::table('das_menu')->insert([ + 'parent_id' => $ppidMenuId, + 'name' => 'Jenis Dokumen', + 'slug' => 'ppid-jenis-dokumen', + 'icon' => '', + 'url' => 'ppid/jenis-dokumen', + 'is_active' => 1, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + // Insert submenu Pengaturan + DB::table('das_menu')->insert([ + 'parent_id' => $ppidMenuId, + 'name' => 'Pengaturan', + 'slug' => 'ppid-pengaturan', + 'icon' => '', + 'url' => 'ppid/pengaturan', + 'is_active' => 1, + 'created_at' => now(), + 'updated_at' => now(), + ]); + + $this->command->info('Menu PPID berhasil ditambahkan.'); + } +} diff --git a/resources/views/frontend/ppid/cek_permohonan.blade.php b/resources/views/frontend/ppid/cek_permohonan.blade.php new file mode 100644 index 000000000..6d034ffd2 --- /dev/null +++ b/resources/views/frontend/ppid/cek_permohonan.blade.php @@ -0,0 +1,102 @@ +@extends('layouts.app_template') + +@section('title', 'Cek Status Permohonan - PPID') + +@section('content') + + + +
| Nomor Permohonan | +#{{ $permohonan->id }} | +
|---|---|
| Nama Pemohon | +{{ $permohonan->nama_pemohon }} | +
| NIK | +{{ $permohonan->nik }} | +
| Rincian Informasi | +{{ $permohonan->rincian_informasi }} | +
| Tanggal Permohonan | +{{ $permohonan->created_at->format('d/m/Y H:i') }} | +
| Status | ++ @if($permohonan->status == 'MENUNGGU') + MENUNGGU + @elseif($permohonan->status == 'DIPROSES') + DIPROSES + @elseif($permohonan->status == 'SELESAI') + SELESAI + @elseif($permohonan->status == 'DITOLAK') + DITOLAK + @endif + | +
| Tanggal Proses | +{{ $permohonan->tanggal_proses->format('d/m/Y H:i') }} | +
| Keterangan | +{{ $permohonan->keterangan }} | +
Kategori: {{ $jenis->nama }}
+ @endif +No: {{ $item->nomor_dokumen }}
+ @endif + @if($item->jenisDokumen) + {{ $item->jenisDokumen->nama }} + @endif + @if($item->tahun) + {{ $item->tahun }} + @endif +{{ Str::limit($item->deskripsi, 100) ?? '-' }}
+Pejabat Pengelola Informasi dan Dokumentasi
+{{ $pengaturan['alamat_ppid'] ?? '' }}
+PPID (Pejabat Pengelola Informasi dan Dokumentasi) adalah pejabat yang bertanggung jawab atas penyimpanan, pendokumentasian, penyediaan, dan/atau pelayanan informasi di badan publik.
+PPID berfungsi mengelola dan menyampaikan dokumen publik, memastikan transparansi, serta mempermudah akses informasi bagi masyarakat sesuai amanat UU No. 14 Tahun 2008 tentang Keterbukaan Informasi Publik (KIP).
+{{ $pengaturan['nomor_telepon'] ?? '-' }}
+{{ $pengaturan['email_ppid'] ?? '-' }}
+{{ $pengaturan['jam_operasional'] ?? '-' }}
+ @if($pengaturan['nama_pejabat']) +Pejabat PPID:
+{{ $pengaturan['nama_pejabat'] }}
+NIP: {{ $pengaturan['nip_pejabat'] ?? '-' }}
+{{ $pengaturan['jabatan_pejabat'] }}
+ @endif +| No | +Judul Dokumen | +Jenis | +Tahun | +Aksi | +
|---|---|---|---|---|
| {{ $index + 1 }} | +{{ $dokumen->judul }} | +{{ $dokumen->jenisDokumen->nama ?? '-' }} | +{{ $dokumen->tahun ?? '-' }} | ++ @if($dokumen->file) + + Unduh + + @else + Tidak ada file + @endif + | +
Ajukan permohonan informasi publik sesuai dengan UU Keterbukaan Informasi Publik
+ + Ajukan Permohonan + +{{ $pengaturan['nama_ppid'] ?? 'PPID' }}
+{{ $pengaturan['alamat_ppid'] ?? '-' }}
+{{ $pengaturan['nomor_telepon'] ?? '-' }}
+{{ $pengaturan['email_ppid'] ?? '-' }}
+Nomor Dokumen: {{ $dokumen->nomor_dokumen }}
+ @endif + +{{ $dokumen->deskripsi ?: '-' }}
+Tidak ada file tersedia.
+ @endif +Nama: {{ $pengaturan['nama_ppid'] ?? 'PPID' }}
+Alamat: {{ $pengaturan['alamat_ppid'] ?? '-' }}
+Telepon: {{ $pengaturan['nomor_telepon'] ?? '-' }}
+Email: {{ $pengaturan['email_ppid'] ?? '-' }}
+Ajukan permohonan informasi publik
+ + Ajukan Permohonan + +Format yang diperbolehkan: PDF, DOC, DOCX, XLS, XLSX, ZIP, RAR. Maksimal 10MB.
+File saat ini: {{ $dokumen->file }}
+ @endif + {!! html()->file('file')->class('form-control')->accept('pdf,doc,docx,xls,xlsx,zip,rar') !!} +Format yang diperbolehkan: PDF, DOC, DOCX, XLS, XLSX, ZIP, RAR. Maksimal 10MB. Kosongkan jika tidak ingin mengubah file.
+| Aksi | +Judul | +Nomor Dokumen | +Jenis Dokumen | +Tahun | +File | +Status | +
|---|
| Aksi | +Nama | +Keterangan | +Urutan | +Status | +
|---|
| Aksi | +Nama Pemohon | +NIK | +Telepon | +Status | +Tanggal Permohonan | +
|---|
| Nama Pemohon | +{{ $permohonan->nama_pemohon }} | +
|---|---|
| NIK | +{{ $permohonan->nik }} | +
| Alamat | +{{ $permohonan->alamat }} | +
| Nomor Telepon | +{{ $permohonan->nomor_telepon }} | +
| {{ $permohonan->email ?: '-' }} | +|
| Cara Memperoleh | +{{ $permohonan->cara_memperoleh == 'ONLINE' ? 'Online' : 'Offline' }} | +
| Rincian Informasi | +{{ $permohonan->rincian_informasi }} | +
| Tujuan Penggunaan | +{{ $permohonan->tujuan_penggunaan }} | +
| Status | ++ @if($permohonan->status == 'MENUNGGU') + MENUNGGU + @elseif($permohonan->status == 'DIPROSES') + DIPROSES + @elseif($permohonan->status == 'SELESAI') + SELESAI + @elseif($permohonan->status == 'DITOLAK') + DITOLAK + @endif + | +
| Tanggal Permohonan | +{{ $permohonan->created_at->format('d/m/Y H:i') }} | +
| Tanggal Proses | +{{ $permohonan->tanggal_proses ? $permohonan->tanggal_proses->format('d/m/Y H:i') : '-' }} | +
| Keterangan | +{{ $permohonan->keterangan ?: '-' }} | +