From 2d6918cdbc4b97e1e708a5449ab75d4158b0d1c1 Mon Sep 17 00:00:00 2001 From: marszayn Date: Mon, 10 Mar 2025 14:01:46 +0700 Subject: [PATCH] feat: Menambahkan controller, request, dan halaman index perizinan lingkungan --- .../PerizinanLingkunganController.php | 139 +++++++++ .../Requests/PerizinanLingkunganRequest.php | 31 ++ .../index_perizinan_lingkungan.tsx | 285 ++++++++++++++++++ 3 files changed, 455 insertions(+) create mode 100644 app/Http/Controllers/PerizinanLingkunganController.php create mode 100644 app/Http/Requests/PerizinanLingkunganRequest.php create mode 100644 resources/js/pages/admin/perizinan_lingkungan/index_perizinan_lingkungan.tsx diff --git a/app/Http/Controllers/PerizinanLingkunganController.php b/app/Http/Controllers/PerizinanLingkunganController.php new file mode 100644 index 0000000..42623c1 --- /dev/null +++ b/app/Http/Controllers/PerizinanLingkunganController.php @@ -0,0 +1,139 @@ +get(); + // Mengambil data jenis dokumen izin lingkungan + $jenisKegiatan = JenisKegiatan::all(); + $jenisDokIL = JenisDokIL::all(); + + return Inertia::render('admin/perizinan_lingkungan/index_perizinan_lingkungan', [ + 'perusahaan' => $perusahaan, + 'jenisKegiatan' => $jenisKegiatan, + 'jenisDokIL' => $jenisDokIL, + ]); + } + // public function update(PerusahaanRequest $request, Perusahaan $perusahaan) + // { + // try { + // DB::beginTransaction(); + + // $data = $request->validated(); + + // // Jika tidak ada file ILDokumen yang di-upload, hapus key tersebut agar tidak mengubah nilai sebelumnya + // if (!$request->hasFile('ILDokumen')) { + // unset($data['ILDokumen']); + // } else { + // // Jika sudah ada file sebelumnya, hapus file lama terlebih dahulu + // if ($perusahaan->ILDokumen && Storage::disk('public')->exists($perusahaan->ILDokumen)) { + // Storage::disk('public')->delete($perusahaan->ILDokumen); + // } + + // // Buat nama file baru berdasarkan waktu upload dan nama file asli + // $fileName = time() . '_' . $request->file('ILDokumen')->getClientOriginalName(); + // $path = $request->file('ILDokumen')->storeAs('files/il', $fileName, 'public'); + // $data['ILDokumen'] = $path; + // } + + // // Update data perusahaan (termasuk data perizinan lingkungan) + // $perusahaan->update($data); + + // DB::commit(); + + // return redirect()->route('admin.perizinan_lingkungan.index') + // ->with('success', 'Data perizinan lingkungan berhasil diperbarui'); + // } catch (\Exception $e) { + // DB::rollBack(); + // Log::error('Error updating perizinan lingkungan: ' . $e->getMessage()); + // return response()->json(['message' => 'Error: ' . $e->getMessage()], 500); + // } + // } + +// public function update(PerizinanLingkunganRequest $request, Perusahaan $perusahaan) +// { +// try { +// DB::beginTransaction(); + +// $data = $request->validated(); + +// $perusahaan->ILNomor = $data['ILNomor'] ?? $perusahaan->ILNomor; +// $perusahaan->ILTanggal = $data['ILTanggal'] ?? $perusahaan->ILTanggal; +// $perusahaan->JenisKegiatanId = $data['JenisKegiatanId'] ?? $perusahaan->JenisKegiatanId; + +// if ($request->hasFile('ILDokumen')) { +// if ($perusahaan->ILDokumen && Storage::disk('public')->exists($perusahaan->ILDokumen)) { +// Storage::disk('public')->delete($perusahaan->ILDokumen); +// } +// $file = $request->file('ILDokumen'); +// $filename = time() . '_' . $file->getClientOriginalName(); +// $path = $file->storeAs('files/il', $filename, 'public'); +// $perusahaan->ILDokumen = $path; +// } + +// $perusahaan->save(); +// DB::commit(); + +// return redirect()->route('admin.perizinan_lingkungan.index') +// ->with('success', 'Data perizinan lingkungan berhasil diperbarui'); +// } catch (\Exception $e) { +// DB::rollBack(); +// Log::error('Error updating perizinan lingkungan: ' . $e->getMessage()); +// return back()->withErrors(['error' => $e->getMessage()]); +// } +// } + +public function update(PerizinanLingkunganRequest $request, Perusahaan $perusahaan) +{ + try { + DB::beginTransaction(); + + // Ambil data lengkap dari model (pastikan semua field termasuk yang wajib ada) + $existingData = $perusahaan->getAttributes(); + + // Ambil data baru hanya dari field perizinan + $newData = $request->only(['ILNomor', 'ILTanggal', 'JenisKegiatanId']); + + if ($request->hasFile('ILDokumen')) { + if ($perusahaan->ILDokumen && Storage::disk('public')->exists($perusahaan->ILDokumen)) { + Storage::disk('public')->delete($perusahaan->ILDokumen); + } + $file = $request->file('ILDokumen'); + $filename = time() . '_' . $file->getClientOriginalName(); + $path = $file->storeAs('files/il', $filename, 'public'); + $newData['ILDokumen'] = $path; + } + + // Gabungkan data lama dengan data baru (field baru akan override data lama) + $data = array_merge($existingData, $newData); + + $perusahaan->update($data); + + DB::commit(); + + return redirect()->route('admin.perizinan_lingkungan.index') + ->with('success', 'Data perizinan lingkungan berhasil diperbarui'); + } catch (\Exception $e) { + DB::rollBack(); + Log::error('Error updating perizinan lingkungan: ' . $e->getMessage()); + return back()->withErrors(['error' => $e->getMessage()]); + } +} + + +} diff --git a/app/Http/Requests/PerizinanLingkunganRequest.php b/app/Http/Requests/PerizinanLingkunganRequest.php new file mode 100644 index 0000000..a1baa2f --- /dev/null +++ b/app/Http/Requests/PerizinanLingkunganRequest.php @@ -0,0 +1,31 @@ +|string> + */ + public function rules(): array + { + return [ + 'ILNomor' => 'nullable|string', + 'ILTanggal' => 'nullable|date', + 'JenisKegiatanId' => 'nullable|exists:JenisKegiatan,JenisKegiatanId', + 'ILDokumen' => 'nullable|file|mimes:pdf|max:20480', + ]; + } +} diff --git a/resources/js/pages/admin/perizinan_lingkungan/index_perizinan_lingkungan.tsx b/resources/js/pages/admin/perizinan_lingkungan/index_perizinan_lingkungan.tsx new file mode 100644 index 0000000..33ac546 --- /dev/null +++ b/resources/js/pages/admin/perizinan_lingkungan/index_perizinan_lingkungan.tsx @@ -0,0 +1,285 @@ +import React, { useState } from "react"; +import AuthenticatedLayout from "@/layouts/authenticated-layout"; +import { Head } from "@inertiajs/react"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import FilterPerizinanLingkungan from "@/components/PerizinanLingkungan/FilterPencarian"; +import { Perusahaan, JenisDokIL, JenisKegiatan } from "@/types/perusahaan"; +import { FileText } from "lucide-react"; +import { ModalIzinLingkungan } from "@/components/PerizinanLingkungan/ModalIzinLingkungan"; + +type PerizinanLingkunganIndexProps = { + perusahaan: Perusahaan[]; + jenisDokIL: JenisDokIL[]; + jenisKegiatan: JenisKegiatan[]; +}; + +export default function PerizinanLingkunganIndex({ + perusahaan, + jenisDokIL, + jenisKegiatan, +}: PerizinanLingkunganIndexProps) { + const [selectedPerusahaan, setSelectedPerusahaan] = + useState(null); + const [showModal, setShowModal] = useState(false); + + // Handler ketika klik kolom "Jenis Izin" + const handleJenisIzinClick = (p: Perusahaan) => { + setSelectedPerusahaan(p); + setShowModal(true); + }; + + const handleModalClose = () => { + setShowModal(false); + setSelectedPerusahaan(null); + }; + + // Callback jika upload dokumen sukses, maka reload atau refresh data + const handleUploadSuccess = () => { + setShowModal(false); + setSelectedPerusahaan(null); + // contoh reload: + // window.location.reload(); + // atau bisa panggil inertia visit: + // router.reload(); + }; + + // State untuk data yang ditampilkan pada tabel + const [filteredPerusahaan, setFilteredPerusahaan] = + useState(perusahaan); + + // Callback dari FilterPerizinanLingkungan + const handleSearch = (filters: { + selectedPerusahaan: { value: string; label: string } | null; + selectedJenisKegiatan: { value: string; label: string } | null; + Alamat: string; + TeleponFax: string; + Email: string; + selectedJenisIzin: { value: string; label: string } | null; + ILNomor: string; + ILTanggal: string | null; + }) => { + let result = [...perusahaan]; + + if (filters.selectedPerusahaan) { + result = result.filter( + (p) => + p.PerusahaanId.toString() === + filters.selectedPerusahaan?.value + ); + } + if (filters.selectedJenisKegiatan) { + result = result.filter( + (p) => + p.JenisKegiatanId?.toString() === + filters.selectedJenisKegiatan?.value + ); + } + if (filters.Alamat.trim() !== "") { + result = result.filter((p) => + p.Alamat?.toLowerCase().includes(filters.Alamat.toLowerCase()) + ); + } + if (filters.TeleponFax.trim() !== "") { + result = result.filter((p) => { + const telMatch = p.Telepon?.toLowerCase().includes( + filters.TeleponFax.toLowerCase() + ); + const faxMatch = p.Fax?.toLowerCase().includes( + filters.TeleponFax.toLowerCase() + ); + return telMatch || faxMatch; + }); + } + if (filters.Email.trim() !== "") { + result = result.filter((p) => + p.Email?.toLowerCase().includes(filters.Email.toLowerCase()) + ); + } + if (filters.selectedJenisIzin) { + result = result.filter( + (p) => + p.JenisDokILId?.toString() === + filters.selectedJenisIzin?.value + ); + } + if (filters.ILNomor.trim() !== "") { + result = result.filter((p) => + p.ILNomor?.toLowerCase().includes(filters.ILNomor.toLowerCase()) + ); + } + if (filters.ILTanggal) { + // Asumsikan format filter "yyyy-MM-dd" atau "yyyy-MM-dd - yyyy-MM-dd" + if (filters.ILTanggal.includes(" - ")) { + const [from, to] = filters.ILTanggal.split(" - "); + result = result.filter((p) => { + if (!p.ILTanggal) return false; + const itemDate = format( + new Date(p.ILTanggal), + "yyyy-MM-dd" + ); + return itemDate >= from && itemDate <= to; + }); + } else { + result = result.filter((p) => { + if (!p.ILTanggal) return false; + const itemDate = format( + new Date(p.ILTanggal), + "yyyy-MM-dd" + ); + return itemDate === filters.ILTanggal; + }); + } + } + + setFilteredPerusahaan(result); + }; + + return ( + + + + + + {/* Komponen Filter */} + + + {/* Tabel Data */} +
+ + + + + No. + + + Nama Perusahaan + + + Jenis Kegiatan + + + Alamat + + + Telepon / Fax + + + Email + + + Jenis Izin + + + Nomor Izin + + + Tanggal Izin + + + Dok + + + + + {filteredPerusahaan.length === 0 ? ( + + + Tidak ada data + + + ) : ( + filteredPerusahaan.map((p, index) => ( + + + {index + 1} + + + {p.NamaPerusahaan || "N/A"} + + + {p.jenis_kegiatan?.NamaJenisKegiatan || + "N/A"} + + + {p.Alamat || "N/A"} + + + {p.Telepon || "N/A"} / {p.Fax || "N/A"} + + + {p.Email || "N/A"} + + {/* + {p.jenis_dok_i_l?.NamaJenisDokIL || + "N/A"} + */} + + + + + {p.ILNomor || "-"} + + + {p.ILTanggal + ? new Date( + p.ILTanggal + ).toLocaleDateString("en-GB") + : "-"} + + + {p.ILDokumen ? ( + + + + ) : ( + "-" + )} + + + )) + )} + +
+
+
+ ); +}