diff --git a/app/Exports/KertasKerjaExport.php b/app/Exports/KertasKerjaExport.php index 57c61c6..6ea78de 100644 --- a/app/Exports/KertasKerjaExport.php +++ b/app/Exports/KertasKerjaExport.php @@ -2,271 +2,279 @@ namespace Modules\Lpj\Exports; -use Maatwebsite\Excel\Concerns\FromCollection; +// use Maatwebsite\Excel\Concerns\FromCollection; // use Maatwebsite\Excel\Concerns\WithColumnFormatting; -use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; -use Maatwebsite\Excel\Concerns\WithHeadings; -use Maatwebsite\Excel\Concerns\WithStyles; -use Maatwebsite\Excel\Concerns\WithColumnWidths; -use Maatwebsite\Excel\Concerns\WithEvents; -use Maatwebsite\Excel\Events\AfterSheet; - -class KertasKerjaExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithEvents +// use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; +// use Maatwebsite\Excel\Concerns\WithHeadings; +// use Maatwebsite\Excel\Concerns\WithStyles; +// use Maatwebsite\Excel\Concerns\WithColumnWidths; +// use Maatwebsite\Excel\Concerns\WithEvents; +// use Maatwebsite\Excel\Events\AfterSheet; +use Illuminate\Contracts\View\View; +use Maatwebsite\Excel\Concerns\FromView; +class KertasKerjaExport implements FromView { + +// class KertasKerjaExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithEvents +// { protected $data; - protected $headerInfo; - - public function __construct($data, $headerInfo) + public function __construct($data) { $this->data = $data; - $this->headerInfo = $headerInfo; } - public function collection() + public function view(): View { - $rows = []; - - $nomor = 1; - $fields = [ - 'jenis_aset' => 'Jenis Aset', - 'luas_tanah' => 'Luas Tanah (M²)', - 'luas_bangunan' => 'Luas Bangunan (M²)', - 'harga' => 'Harga Transaksi/Penawaran', - 'tanggal_penawaran' => 'Tanggal Penawaran/Transaksi', - 'diskon' => 'Diskon %', - 'esitmasi_harga' => 'Esitmasi Harga Transaksi (Rp)', - 'no_telepon' => 'Telepon Contact Person', - 'nama_nara_sumbr' => 'Nama Nara Sumber', - 'status_nara_sumbr' => 'Status Nara Sumber', - 'waktu_transaksi' => 'Waktu Transaksi/Penawaran', - 'alamat' => 'Alamat Titik Gps', - - 'jalan' => 'Jalan', - 'desa' => 'Desa/Kelurahan', - 'kecamatan' => 'Kecamatan', - 'kabupaten' => 'Kabupaten', - 'provinsi' => 'Provinsi', - - 'jarak_pembanding' => 'Jarak Pembanding dengan Objek', - 'elevasi' => 'Estimasi Ranking Tanah', - 'peruntukan' => 'Estiamsi Rangkin Bangunan' - - ]; - - foreach ($fields as $key => $label) { - $rows[] = [ - $nomor++, - $label, - $this->data['objek'][$key] ?? '', - $this->data['pembanding1'][$key] ?? '', - $this->data['pembanding2'][$key] ?? '', - $this->data['pembanding3'][$key] ?? '' - ]; - } - - // B. Perhitungan Penyesuaian - $rows[] = ['']; - $rows[] = ['']; - $rows[] = ['B. Estimasi Nilai Tanah Pembanding dengan Teknik Penyisaan Tanah untuk mendapatkan per meter persegi estimasi Nilai Tanah Pembanding']; - $rows[] = ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3']; - $nostimasi = 1; - $filedEstimasi = [ - 'estimasi' => 'Estimasi Biaya Pengganti Baru Bangunan (Rp)', - 'estimasi_spl' => 'Estimasi Biaya Pengganti Baru SPL (Rp)', - 'penyusutan' => 'Penyusutan Fisik Banguna', - - 'a' => 'a. rincian ttipe bangunan (MAPPI)', - 'b' => 'b. umur ekonomis (MAPPI)', - 'c' => 'c. estimasi Tahun tahun visual dengan mempertimbangkan renovasi', - 'd' => 'd. Sehingga sisa umur efektif', - 'e' => 'e. kondisi bagunan', - 'f' => 'f.sehinggan penyusutan fisik', - 'penyusutan_fungsi' => 'Penyusutan fungsi Bangunan (%)', - 'penyusutan_ekonomi' => 'Penyusutan Ekonomi Bangunan (%)', - 'total_penyusutan' => 'Total Penyusutan (%)', - 'estimasi_nilai' => 'Estimasi Nilai Bangunan dan SPL (Rp)', - 'estimasi_tanah' => 'Estimasi Nilai Tanah Pembanding (Rp)', - 'estimasi_nilai' => 'Estimasi Nilai Tanah Pembanding (Rp)', - ]; - - foreach ($filedEstimasi as $key => $label) { - $rows[] = [ - $nostimasi++, - $label, - $this->data['estimasi'][$key] ?? '', - $this->data['estimasi1'][$key] ?? '', - $this->data['estimasi2'][$key] ?? '', - $this->data['estimasi3'][$key] ?? '' - - ]; - } - - - $row[] = ['']; - $row[] = ['']; - $rows[] = ['INDIKASI NILAI TANAHATAS OBJEK PENILAIAN']; - - $indikasi=[ - 'luas_tanah' => 'Luas Tanah ', - 'indikasi_per' => 'INDIKASI TANAH PER M2 (RP/M2)', - 'indikasi_total' => 'INDIKASI TANAH TOTAL(RP)', - 'varian' => 'VARIANT(%)', - ]; - - foreach ($indikasi as $key => $label) { - $rows[] = [ - $label, - $this->data['indikasi'][$key] ?? '', - ]; - } - - - // C. Peta Lokasi - $rows[] = ['']; - $rows[] = ['']; - $rows[] = ['C. Peta Lokasi']; - $rows[] = [$this->data['foto_objek']['foto_objek_peta'] ?? '']; - - // D. Foto Objek dan Data Pembanding - $rows[] = ['']; - $rows[] = ['D. Foto Objek dan Data Pembanding']; - $rows[] = [ - $this->data['foto_objek1']['foto_objek'] ?? '', - $this->data['foto_objek2']['foto_objek'] ?? '', - '', '', '' - ]; - - // E. Foto Objek - $rows[] = ['']; - $rows[] = ['E. Foto Objek']; - $rows[] = [ - $this->data['foto']['foto_objek'] ?? '', - $this->data['foto']['foto_objek'] ?? '', - '', '', '' - ]; - - return collect($rows); + return view('lpj::component.kertas-kerja', [ + 'data' => $this->data, + ]); } - public function headings(): array - { - return [ - ['KERTAS KERJA PENILAIAN'], - ['Pendekatan Pasar'], - ['Metode Perbandingan Data Pasar'], - ['Tanggal Penilaian: ' . ($this->headerInfo['tanggal_penilaian'] ?? '')], - ['Nama Pemilik Aset: ' . ($this->headerInfo['nama_pemilik'] ?? '')], - ['Nama Pemberi Tugas: ' . ($this->headerInfo['nama_pemberi_tugas'] ?? '')], - ['Lokasi: ' . ($this->headerInfo['lokasi_lengkap'] ?? '')], - ['Nama Debitur: ' . ($this->headerInfo['nama_debitur'] ?? '')], - [''], - ['A. INFORMASI UMUM'], - ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3'] + // public function collection() + // { + // $rows = []; + + // $nomor = 1; + // $fields = [ + // 'jenis_aset' => 'Jenis Aset', + // 'luas_tanah' => 'Luas Tanah (M²)', + // 'luas_bangunan' => 'Luas Bangunan (M²)', + // 'harga' => 'Harga Transaksi/Penawaran', + // 'tanggal_penawaran' => 'Tanggal Penawaran/Transaksi', + // 'diskon' => 'Diskon %', + // 'esitmasi_harga' => 'Esitmasi Harga Transaksi (Rp)', + // 'no_telepon' => 'Telepon Contact Person', + // 'nama_nara_sumbr' => 'Nama Nara Sumber', + // 'status_nara_sumbr' => 'Status Nara Sumber', + // 'waktu_transaksi' => 'Waktu Transaksi/Penawaran', + // 'alamat' => 'Alamat Titik Gps', + + // 'jalan' => 'Jalan', + // 'desa' => 'Desa/Kelurahan', + // 'kecamatan' => 'Kecamatan', + // 'kabupaten' => 'Kabupaten', + // 'provinsi' => 'Provinsi', + + // 'jarak_pembanding' => 'Jarak Pembanding dengan Objek', + // 'elevasi' => 'Estimasi Ranking Tanah', + // 'peruntukan' => 'Estiamsi Rangkin Bangunan' + + // ]; + + // foreach ($fields as $key => $label) { + // $rows[] = [ + // $nomor++, + // $label, + // $this->data['objek'][$key] ?? '', + // $this->data['pembanding1'][$key] ?? '', + // $this->data['pembanding2'][$key] ?? '', + // $this->data['pembanding3'][$key] ?? '' + // ]; + // } + + // // B. Perhitungan Penyesuaian + // $rows[] = ['']; + // $rows[] = ['']; + // $rows[] = ['B. Estimasi Nilai Tanah Pembanding dengan Teknik Penyisaan Tanah untuk mendapatkan per meter persegi estimasi Nilai Tanah Pembanding']; + // $rows[] = ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3']; + // $nostimasi = 1; + // $filedEstimasi = [ + // 'estimasi' => 'Estimasi Biaya Pengganti Baru Bangunan (Rp)', + // 'estimasi_spl' => 'Estimasi Biaya Pengganti Baru SPL (Rp)', + // 'penyusutan' => 'Penyusutan Fisik Banguna', + + // 'a' => 'a. rincian ttipe bangunan (MAPPI)', + // 'b' => 'b. umur ekonomis (MAPPI)', + // 'c' => 'c. estimasi Tahun tahun visual dengan mempertimbangkan renovasi', + // 'd' => 'd. Sehingga sisa umur efektif', + // 'e' => 'e. kondisi bagunan', + // 'f' => 'f.sehinggan penyusutan fisik', + // 'penyusutan_fungsi' => 'Penyusutan fungsi Bangunan (%)', + // 'penyusutan_ekonomi' => 'Penyusutan Ekonomi Bangunan (%)', + // 'total_penyusutan' => 'Total Penyusutan (%)', + // 'estimasi_nilai' => 'Estimasi Nilai Bangunan dan SPL (Rp)', + // 'estimasi_tanah' => 'Estimasi Nilai Tanah Pembanding (Rp)', + // 'estimasi_nilai' => 'Estimasi Nilai Tanah Pembanding (Rp)', + // ]; + + // foreach ($filedEstimasi as $key => $label) { + // $rows[] = [ + // $nostimasi++, + // $label, + // $this->data['estimasi'][$key] ?? '', + // $this->data['estimasi1'][$key] ?? '', + // $this->data['estimasi2'][$key] ?? '', + // $this->data['estimasi3'][$key] ?? '' + + // ]; + // } - ]; - } - public function registerEvents(): array - { - return [ - AfterSheet::class => function (AfterSheet $event) { - // Styling untuk header utama + // $row[] = ['']; + // $row[] = ['']; + // $rows[] = ['INDIKASI NILAI TANAHATAS OBJEK PENILAIAN']; + + // $indikasi=[ + // 'luas_tanah' => 'Luas Tanah ', + // 'indikasi_per' => 'INDIKASI TANAH PER M2 (RP/M2)', + // 'indikasi_total' => 'INDIKASI TANAH TOTAL(RP)', + // 'varian' => 'VARIANT(%)', + // ]; + + // foreach ($indikasi as $key => $label) { + // $rows[] = [ + // $label, + // $this->data['indikasi'][$key] ?? '', + // ]; + // } - // Styling untuk setiap section header - $sectionRows = [10, 34, 56, 46, 52]; // Sesuaikan dengan posisi setiap section - foreach ($sectionRows as $row) { - $event->sheet->getStyle("A{$row}:F{$row}")->getFill() - ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) - ->getStartColor()->setRGB('E2EFDA'); - } + // // C. Peta Lokasi + // $rows[] = ['']; + // $rows[] = ['']; + // $rows[] = ['C. Peta Lokasi']; + // $rows[] = [$this->data['foto_objek']['foto_objek_peta'] ?? '']; - // Merge cells untuk headers - $event->sheet->mergeCells('A1:E1'); - $event->sheet->mergeCells('A2:E2'); - $event->sheet->mergeCells('A4:E4'); - $event->sheet->mergeCells('A5:E5'); - $event->sheet->mergeCells('A6:E6'); - $event->sheet->mergeCells('A7:E7'); - $event->sheet->mergeCells('A8:E8'); + // // D. Foto Objek dan Data Pembanding + // $rows[] = ['']; + // $rows[] = ['D. Foto Objek dan Data Pembanding']; + // $rows[] = [ + // $this->data['foto_objek1']['foto_objek'] ?? '', + // $this->data['foto_objek2']['foto_objek'] ?? '', + // '', '', '' + // ]; - // Alignment - $event->sheet->getStyle('A1:E8')->getAlignment() - ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT); - } - ]; - } - public function columnWidths(): array - { - return [ - 'A' => 5, - 'B' => 30, - 'C' => 30, - 'D' => 30, - 'E' => 30, - 'F' => 30, - ]; - } + // // E. Foto Objek + // $rows[] = ['']; + // $rows[] = ['E. Foto Objek']; + // $rows[] = [ + // $this->data['foto']['foto_objek'] ?? '', + // $this->data['foto']['foto_objek'] ?? '', + // '', '', '' + // ]; - public function styles(Worksheet $sheet) - { - return [ - // Style for the main header + // return collect($rows); + // } - // Style for section headers - 10 => ['font' => ['bold' => true]], // A. Informasi Umum - 34 => ['font' => ['bold' => true]], // B. Estimasi Nilai Tanah - 35 => ['font' => ['bold' => true]], // C. Peta Lokasi - 57 => ['font' => ['bold' => true]], // D. Foto Objek dan Pembanding - 60 => ['font' => ['bold' => true]], // E. Foto Objek - - // Default styling for columns - 'A:J' => [ - 'alignment' => ['horizontal' => 'left', 'vertical' => 'center'], - 'wrapText' => true, - ], - - // Style for other sections (like photo and map sections) - - // Style for the other headers - 'A11:F11' => [ - 'font' => ['bold' => true], - 'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']], - 'borders' => [ - 'allBorders' => [ - 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN - ] - ] - ], - 'A12:F31' => [ - 'borders' => [ - 'allBorders' => [ - 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN - ] - ] - ], + // public function headings(): array + // { + // return [ + // ['KERTAS KERJA PENILAIAN'], + // ['Pendekatan Pasar'], + // ['Metode Perbandingan Data Pasar'], + // ['Tanggal Penilaian: ' . ($this->headerInfo['tanggal_penilaian'] ?? '')], + // ['Nama Pemilik Aset: ' . ($this->headerInfo['nama_pemilik'] ?? '')], + // ['Nama Pemberi Tugas: ' . ($this->headerInfo['nama_pemberi_tugas'] ?? '')], + // ['Lokasi: ' . ($this->headerInfo['lokasi_lengkap'] ?? '')], + // ['Nama Debitur: ' . ($this->headerInfo['nama_debitur'] ?? '')], + // [''], + // ['A. INFORMASI UMUM'], + // ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3'] - 'A35:F35' => [ - 'font' => ['bold' => true], - 'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']], - 'borders' => [ - 'allBorders' => [ - 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN - ] - ] - ], - 'A35:F49' => [ - 'borders' => [ - 'allBorders' => [ - 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN - ] - ] - ], + // ]; + // } + // public function registerEvents(): array + // { + // return [ + // AfterSheet::class => function (AfterSheet $event) { + // // Styling untuk header utama - // end header - ]; - } + + // // Styling untuk setiap section header + // $sectionRows = [10, 34, 56, 46, 52]; // Sesuaikan dengan posisi setiap section + // foreach ($sectionRows as $row) { + // $event->sheet->getStyle("A{$row}:F{$row}")->getFill() + // ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) + // ->getStartColor()->setRGB('E2EFDA'); + // } + + // // Merge cells untuk headers + // $event->sheet->mergeCells('A1:E1'); + // $event->sheet->mergeCells('A2:E2'); + // $event->sheet->mergeCells('A4:E4'); + // $event->sheet->mergeCells('A5:E5'); + // $event->sheet->mergeCells('A6:E6'); + // $event->sheet->mergeCells('A7:E7'); + // $event->sheet->mergeCells('A8:E8'); + + // // Alignment + // $event->sheet->getStyle('A1:E8')->getAlignment() + // ->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT); + // } + // ]; + // } + // public function columnWidths(): array + // { + // return [ + // 'A' => 5, + // 'B' => 30, + // 'C' => 30, + // 'D' => 30, + // 'E' => 30, + // 'F' => 30, + // ]; + // } + + // public function styles(Worksheet $sheet) + // { + // return [ + // // Style for the main header + + // // Style for section headers + // 10 => ['font' => ['bold' => true]], // A. Informasi Umum + // 34 => ['font' => ['bold' => true]], // B. Estimasi Nilai Tanah + // 35 => ['font' => ['bold' => true]], // C. Peta Lokasi + // 57 => ['font' => ['bold' => true]], // D. Foto Objek dan Pembanding + // 60 => ['font' => ['bold' => true]], // E. Foto Objek + + // // Default styling for columns + // 'A:J' => [ + // 'alignment' => ['horizontal' => 'left', 'vertical' => 'center'], + // 'wrapText' => true, + // ], + + // // Style for other sections (like photo and map sections) + + // // Style for the other headers + // 'A11:F11' => [ + // 'font' => ['bold' => true], + // 'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']], + // 'borders' => [ + // 'allBorders' => [ + // 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + // ] + // ] + // ], + // 'A12:F31' => [ + // 'borders' => [ + // 'allBorders' => [ + // 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + // ] + // ] + // ], + + + // 'A35:F35' => [ + // 'font' => ['bold' => true], + // 'fill' => ['fillType' => 'solid', 'color' => ['rgb' => 'E2EFDA']], + // 'borders' => [ + // 'allBorders' => [ + // 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + // ] + // ] + // ], + // 'A35:F49' => [ + // 'borders' => [ + // 'allBorders' => [ + // 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN + // ] + // ] + // ], + + // // end header + // ]; + // } } diff --git a/app/Http/Controllers/KJPPController.php b/app/Http/Controllers/KJPPController.php index 231a2ba..4e86a1a 100644 --- a/app/Http/Controllers/KJPPController.php +++ b/app/Http/Controllers/KJPPController.php @@ -498,7 +498,7 @@ class KJPPController extends Controller $filteredRecords = $query->count(); // Get the data for the current page - $data = $query->get(); + $data = $query->with('city')->get(); // Calculate the page count $pageCount = ceil($totalRecords / $request->get('size')); diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index 11f5b8c..e6a578e 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -9,7 +9,7 @@ use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Exports\KertasKerjaExport; -use App\Http\Controllers\SurveyorController; +use Modules\Lpj\Http\Controllers\SurveyorController; class PenilaiController extends Controller { @@ -62,22 +62,43 @@ class PenilaiController extends Controller $basicData = $data->getCommonData(); $permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id); - return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'basicData')); + $jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id; + $inspeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); + $forminspeksi = null; + if ($inspeksi) { + $forminspeksi = json_decode($inspeksi->data_form, true); + } + return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'basicData', 'forminspeksi', 'inspeksi')); } public function standard($id) { $permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id); - return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan')); + + $jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id; + + $inspeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); + $forminspeksi = null; + if ($inspeksi) { + $forminspeksi = json_decode($inspeksi->data_form, true); + } + + $data = new SurveyorController(); + $basicData = $data->getCommonData(); + + return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi')); } - public function resume(){ - return view('lpj::resume.index'); + public function resume($id) + { + $permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id); + return view('lpj::penilai.components.resume', compact('permohonan')); } - public function memo(){ + public function memo() + { return view('lpj::resume.index'); - } + } /** @@ -192,19 +213,24 @@ class PenilaiController extends Controller ]); } - public function kertas_kerja($id, $jeniJaminan) + public function kertas_kerja($id, $jaminanId) { $data = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); - $headerInfo = [ - 'tanggal_penilaian' => '', - 'nama_pemilik' => '', - 'nama_pemberi_tugas' => '', - 'lokasi_lengkap' => '', - 'nama_debitur' => '' - ]; + // $data = null; + // $headerInfo = [ + // 'tanggal_penilaian' => '', + // 'nama_pemilik' => '', + // 'nama_pemberi_tugas' => '', + // 'lokasi_lengkap' => '', + // 'nama_debitur' => '' + // ]; - return Excel::download(new KertasKerjaExport($data, $headerInfo), 'kertas-kerja.xlsx'); + // $datas = json_decode($data->data_pembanding); + // return response()->json(['data' =>$datas ]); + + // return view('lpj::component.kertas-kerja', compact('data')); + return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx'); } diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index f20ee1e..445e095 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -164,7 +164,6 @@ class SurveyorController extends Controller return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', - 'data' => $processedData ], 200); } catch (\Exception $e) { @@ -178,30 +177,38 @@ class SurveyorController extends Controller private function getActionSpecificRules($data, $action, $request): array { - $pisah = explode(',', $action); - - $allRules = [ - 'tanah' => $this->getTanahData($data, $request), - 'bangunan' => $this->getBangunanData($data, $request), - 'kapal' => $this->getKapalData($data, $request), - 'kendaraan' => $this->getKendaraanData($data, $request), - 'mesin' => $this->getMesinData($data, $request), - 'pesawat' => $this->getPesawatData($data, $request), - 'alat-berat' => $this->getAlatBeratData($data, $request), - 'apartemen-kantor' => $this->getUnitData($data, $request), - 'lingkungan' => $this->getLingkunganData($data, $request), - 'fakta' => $this->getFactData($data, $request), + $allowedActions = [ + 'apartemen-kantor' => 'getUnitData', + 'tanah' => 'getTanahData', + 'bangunan' => 'getBangunanData', + 'kapal' => 'getKapalData', + 'kendaraan' => 'getKendaraanData', + 'mesin' => 'getMesinData', + 'pesawat' => 'getPesawatData', + 'alat-berat' => 'getAlatBeratData', + 'lingkungan' => 'getLingkunganData', + 'fakta' => 'getFactData' ]; $rules = []; $hasAssetDescriptionRules = false; + $pisah = array_filter( + explode(',', $action), + function($act) use ($allowedActions) { + return isset($allowedActions[trim($act)]); + } + ); + foreach ($pisah as $act) { - if (isset($allRules[$act])) { - $rules = array_merge($rules, $allRules[$act]); - if ($act == 'tanah' || $act == 'bangunan' || $act == 'apartemen-kantor') { - $hasAssetDescriptionRules = true; - } + $act = trim($act); + $method = $allowedActions[$act]; + + $actionRules = $this->$method($data, $request); + $rules = array_merge($rules, $actionRules); + + if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan'])) { + $hasAssetDescriptionRules = true; } } @@ -217,28 +224,39 @@ class SurveyorController extends Controller { try { $maxSize = getMaxFileSize('Foto'); - $validatedData = $request->validate([ - 'foto_denah' => 'required|file|mimes:jpeg,jpg,png,pdf,svg|max:'. $maxSize, + $validationRules = [ 'luas' => 'required|numeric', 'permohonan_id' => 'required', 'jenis_jaminan_id' => 'required' - ]); + ]; - $validatedData['foto_denah'] = $this->uploadFile($request->file('foto_denah'), 'foto_denah'); + if ($request->hasFile('foto_denah')) { + $maxSize = getMaxFileSize('Foto'); + $validationRules['foto_denah'] = 'file|mimes:jpeg,jpg,png,pdf,svg|max:'. $maxSize; + } + + $validatedData = $request->validate($validationRules); $formatJsonDenah = [ - 'foto_denah' => $validatedData['foto_denah'], 'luas' => $validatedData['luas'], ]; + if ($request->hasFile('foto_denah')) { + $formatJsonDenah['foto_denah'] = $this->uploadFile($request->file('foto_denah'), 'foto_denah'); + } + $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('jenis_jaminan_id', $request->input('jenis_jaminan_id')) ->first(); if ($inspeksi) { + $existingDenah = json_decode($inspeksi->denah_form, true) ?? []; + + $updatedDenah = array_merge($existingDenah, $formatJsonDenah); + $inspeksi->update([ - 'denah_form' => json_encode($formatJsonDenah) + 'denah_form' => json_encode($updatedDenah) ]); } else { Inspeksi::create([ @@ -537,7 +555,7 @@ class SurveyorController extends Controller $penilaian->update([ 'authorized_status' => 1, ]); - + $data['status'] = 'success'; $data['message']= 'Jadwal '.$request->noReg.' berhasil di aprove'; } catch (\Exception $e) { @@ -573,7 +591,7 @@ class SurveyorController extends Controller ->first(); if ($inspeksi) { - $existingData = $inspeksi->data_pembanding ?? []; + $existingData = json_decode($inspeksi->data_pembanding, true) ?? []; } } @@ -582,8 +600,8 @@ class SurveyorController extends Controller $existingFoto = null; - if ($existingData && isset($existingData[$i]['foto_objek'])) { - $existingFoto = $existingData[$i]['foto_objek']; + if ($existingData && isset($existingData['data_pembanding'][$i]['foto_objek'])) { + $existingFoto = $existingData['data_pembanding'][$i]['foto_objek']; } // Penanganan foto pembanding @@ -602,8 +620,8 @@ class SurveyorController extends Controller return $dataPembanding; } - - + + private function formatSinglePembanding($request, $index) { $fields = [ @@ -613,12 +631,12 @@ class SurveyorController extends Controller 'peruntukan', 'penawaran_transaksi', 'nomor_tlp', 'kordinat_lat', 'kordinat_lng', 'jenis_aset','foto_objek' ]; - + $pembanding = []; foreach ($fields as $field) { $inputName = "{$field}_pembanding"; $inputValue = $request->input($inputName); - + // Pastikan input adalah array dan index valid if (is_array($inputValue) && isset($inputValue[$index])) { $pembanding[$field] = $inputValue[$index]; @@ -627,10 +645,10 @@ class SurveyorController extends Controller } } - + return $pembanding; } - + private function handleupdateOrDeleteFile($file, $type, $prefix) @@ -662,54 +680,54 @@ class SurveyorController extends Controller 'status_nara_sumber', 'harga', 'nama_nara_sumber', 'kordinat_lat', 'kordinat_lng', 'jenis_aset', ]; - + $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id')) ->where('jenis_jaminan_id', $request->input('jenis_jaminan_id')) ->first(); - + if ($inspeksi) { $needsSave = false; - + // Handle foto_form $fotoForm = json_decode($inspeksi->foto_form, true) ?: []; if (!isset($fotoForm['object_jaminan'])) { $fotoForm['object_jaminan'] = [['foto_objek' => null]]; $needsSave = true; } - + // Handle data_form $dataForm = json_decode($inspeksi->data_form, true) ?: []; - + // Inisialisasi struktur data jika belum ada if(!isset($dataForm['bangunan'])) { $dataForm['bangunan'] = []; $needsSave = true; } - + if(!isset($dataForm['tanah'])) { $dataForm['tanah'] = []; $needsSave = true; } - + if (!isset($dataForm['asset'])) { $dataForm['asset'] = []; $needsSave = true; } - + // Update data dengan mempertahankan struktur sesuai/tidak sesuai foreach ($fields as $field) { if ($request->filled($field)) { $newValue = $request->input($field); - + // Fields untuk tanah if (in_array($field, ['luas_tanah'])) { - $cekLuas = $dataForm['tanah']['luas_tanah'] == 'sesuai' ? 'sesuai' : 'tidak sesuai'; + $cekLuas = $dataForm['tanah']['luas_tanah'] == 'sesuai' ? 'sesuai' : 'tidak sesuai'; $dataForm['tanah'][$field][$cekLuas] = $newValue; } // Fields untuk bangunan else if (in_array($field, ['luas_tanah_bagunan'])) { - $cekBanguan = $dataForm['bangunan']['luas_tanah_bagunan'] == 'sesuai' ? 'sesuai' : 'tidak sesuai'; + $cekBanguan = $dataForm['bangunan']['luas_tanah_bagunan'] == 'sesuai' ? 'sesuai' : 'tidak sesuai'; $dataForm['bangunan'][$field][$cekBanguan] = $newValue; } // Fields untuk alamat dalam asset @@ -718,12 +736,12 @@ class SurveyorController extends Controller if (!isset($dataForm['asset']['alamat'])) { $dataForm['asset']['alamat'] = []; } - + $alamatStatus = $dataForm['asset']['alamat'] == 'sesuai' ? 'sesuai' : 'tidak sesuai'; if (!isset($dataForm['asset']['alamat'][$alamatStatus])) { $dataForm['asset']['alamat'][$alamatStatus] = []; } - + $dataForm['asset']['alamat'][$alamatStatus][$field] = $newValue; } // Jenis asset dalam asset @@ -737,19 +755,19 @@ class SurveyorController extends Controller else { $dataForm['asset'][$field] = $newValue; } - + $needsSave = true; } } - + if ($needsSave) { $inspeksi->foto_form = json_encode($fotoForm); $inspeksi->data_form = json_encode($dataForm); $inspeksi->save(); } - + $existingFoto = $fotoForm['object_jaminan'][0]['foto_objek'] ?? null; - + // Gabungkan data dari tanah, bangunan, dan asset $objekPenilaian = array_merge( ['foto_objek' => $existingFoto], @@ -772,7 +790,7 @@ class SurveyorController extends Controller return $carry; }, []) ); - + } else { // Inisialisasi data baru $objekPenilaian = array_reduce($fields, function ($carry, $field) use ($request) { @@ -780,10 +798,10 @@ class SurveyorController extends Controller return $carry; }, ['foto_objek' => null]); } - + return $objekPenilaian; } - + private function saveInspeksi($formattedData) @@ -855,6 +873,7 @@ class SurveyorController extends Controller 'data_pembanding' => $this->formatDataPembanding($request) ]; + $inspeksi = $this->saveInspeksi($formattedData); DB::commit(); @@ -1023,7 +1042,6 @@ class SurveyorController extends Controller if (json_last_error() !== JSON_ERROR_NONE) { throw new \Exception('Error decoding comparison data: ' . json_last_error_msg()); } - } $fotoForm = json_decode($inspeksi->foto_form, true); @@ -1037,8 +1055,6 @@ class SurveyorController extends Controller $districts = District::where('city_code', $this->getCodeAlamat('city_code', $inspectionData))->get(); $villages = Village::where('district_code', $this->getCodeAlamat('district_code', $inspectionData))->get(); - - return view('lpj::surveyor.components.data-pembanding', compact( 'permohonan', 'id', @@ -1050,7 +1066,8 @@ class SurveyorController extends Controller 'cities', 'districts', 'villages', - 'provinces' + 'provinces', + 'inspeksi' )); } catch (\Exception $e) { @@ -1544,7 +1561,7 @@ class SurveyorController extends Controller - private function getCommonData() + public function getCommonData() { return [ 'branches' => Branch::all(), @@ -1660,7 +1677,7 @@ class SurveyorController extends Controller true ), 'hadap_mata_angin' => [ - $data['hadap_mata_angin'] => ($data['hadap_mata_angin'] == 'sesuai') ? $data['hadap_mata_angin_sesuai'] : $data['hadap_mata_angin_tidak_sesuai'] + $data['hadap_mata_angin'] => $data['hadap_mata_angin'] == 'sesuai' ? $data['hadap_mata_angin_sesuai'] : $data['hadap_mata_angin_tidak_sesuai'] ?? null ], 'bentuk_tanah' => $this->getFieldData( $data, @@ -1791,11 +1808,9 @@ class SurveyorController extends Controller 'jarak_tps' => $data['jarak_tps'] ?? null, 'nama_tps' => $data['nama_tps'] ?? null, 'merupakan_daerah' => $data['merupakan_daerah'] ?? null, - 'fasilitas_dekat_object' => $this->getFieldData( - $data, - 'fasilitas_dekat_object', - false, - 'lainnya' + 'fasilitas_dekat_object' => $this->mapArrayWithInputs( + $data['fasilitas_dekat_object'] ?? [], + $data['fasilitas_dekat_object_input'] ?? [] ), ] ]; diff --git a/app/Http/Requests/FormSurveyorRequest.php b/app/Http/Requests/FormSurveyorRequest.php index 02c3d8a..fe19acf 100644 --- a/app/Http/Requests/FormSurveyorRequest.php +++ b/app/Http/Requests/FormSurveyorRequest.php @@ -76,7 +76,7 @@ class FormSurveyorRequest extends FormRequest 'hadap_mata_angin' => 'required', 'hadap_mata_angin_sesuai' => 'nullable', 'hadap_mata_angin_tidak_sesuai' => 'nullable', - 'bentuk_tanah' => 'nullable|array', + 'bentuk_tanah' => 'required|array', 'bentuk_tanah_lainnya' => 'nullable', 'kontur_tanah' => 'required|array', 'ketinggian_jalan' => 'required|array', @@ -102,8 +102,8 @@ class FormSurveyorRequest extends FormRequest 'luas_tanah_bangunan_sesuai' => 'nullable', 'luas_tanah_bagunan' => 'required', 'luas_tanah_bangunan_tidak_sesuai' => 'nullable', - 'jenis_bangunan' => 'required', - 'kondisi_bangunan' => 'nullable', + 'jenis_bangunan' => 'required|array', + 'kondisi_bangunan' => 'required|array', 'sifat_bangunan' => 'required|array', 'sifat_bangunan_input' => 'nullable|array', @@ -167,7 +167,7 @@ class FormSurveyorRequest extends FormRequest 'nama_tpu' => 'nullable', 'merupakan_daerah' => 'nullable', 'fasilitas_dekat_object' => 'nullable|array', - 'fasilitas_dekat_object_lainnya' => 'nullable', + 'fasilitas_dekat_object_input' => 'nullable|array', ]; } diff --git a/app/Models/KJPP.php b/app/Models/KJPP.php index a558797..30ade6c 100644 --- a/app/Models/KJPP.php +++ b/app/Models/KJPP.php @@ -2,7 +2,7 @@ namespace Modules\Lpj\Models; -use Modules\Location\Models\Province; +use Modules\Location\Models\City; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -25,4 +25,12 @@ class KJPP extends Model { return $this->hasMany(PenawaranDetailTender::class, 'kjpp_rekanan_id', 'id'); } + + public function city() + { + return $this->belongsTo(City::class, 'city_code', 'code'); + } + + + } diff --git a/database/seeders/KJPPSeeder.php b/database/seeders/KJPPSeeder.php index a32e1a7..b8adebd 100644 --- a/database/seeders/KJPPSeeder.php +++ b/database/seeders/KJPPSeeder.php @@ -66,16 +66,16 @@ class KJPPSeeder extends Seeder $jenisUsaha = $this->checkJenisUsaha($row[18]); $jenisAsset = $this->checkJenisAsset($row[19]); - $detail_email_kantor = $this->checkDanJadikanJson($row[8]); - $nama_pic_reviewer = $this->checkDanJadikanJson($row[11]); - $nomor_hp_pic_reviewer = $this->checkDanJadikanJson($row[12]); - $detail_nama_pic_admin = $this->checkDanJadikanJson($row[13]); + $detail_email_kantor = $this->checkDanJadikanJson($row[9]); + $nama_pic_reviewer = $this->checkDanJadikanJson($row[12]); + $nomor_hp_pic_reviewer = $this->checkDanJadikanJson($row[13]); + $detail_nama_pic_admin = $this->checkDanJadikanJson($row[14]); - $nomor_hp_pic_admin = $this->checkDanJadikanJson($row[14]); - $nama_pic_marketing = $this->checkDanJadikanJson($row[15]); + $nomor_hp_pic_admin = $this->checkDanJadikanJson($row[15]); + $nama_pic_marketing = $this->checkDanJadikanJson($row[16]); - $nomor_hp_pic_marketing = $this->checkDanJadikanJson($row[16]); + $nomor_hp_pic_marketing = $this->checkDanJadikanJson($row[17]); try { @@ -91,23 +91,23 @@ class KJPPSeeder extends Seeder 'address' => $row[7], 'postal_code' => $locationData['postal_code'], 'nomor_telepon_kantor' => $row[8], - 'email_kantor' => $detail_email_kantor, - 'detail_email_kantor' => $detail_email_kantor, - 'nama_pimpinan' => $row[9], - 'nomor_hp_pimpinan' => $row[10], - 'nama_pic_reviewer' => $nama_pic_reviewer, - 'detail_nama_pic_reviewer' => $nama_pic_reviewer, - 'nomor_hp_pic_reviewer' => $nomor_hp_pic_reviewer, - 'detail_nomor_hp_pic_reviewer' => $nomor_hp_pic_reviewer, + 'email_kantor' => $detail_email_kantor[0], + 'detail_email_kantor' => json_encode($detail_email_kantor), + 'nama_pimpinan' => $row[10], + 'nomor_hp_pimpinan' => $row[11], + 'nama_pic_reviewer' => $nama_pic_reviewer[0], + 'detail_nama_pic_reviewer' => json_encode($nama_pic_reviewer), + 'nomor_hp_pic_reviewer' => $nomor_hp_pic_reviewer[0], + 'detail_nomor_hp_pic_reviewer' => json_encode($nomor_hp_pic_reviewer), - 'nama_pic_admin' => $detail_nama_pic_admin, - 'detail_nama_pic_admin' => $detail_nama_pic_admin, - 'nomor_hp_pic_admin' => $nomor_hp_pic_admin, - 'detail_nomor_hp_pic_admin' => $nomor_hp_pic_admin, - 'nama_pic_marketing' => $nama_pic_marketing, - 'detail_nama_pic_marketing' => $nama_pic_marketing, + 'nama_pic_admin' => $detail_nama_pic_admin[0], + 'detail_nama_pic_admin' => json_encode($detail_nama_pic_admin), + 'nomor_hp_pic_admin' => $nomor_hp_pic_admin[0], + 'detail_nomor_hp_pic_admin' => json_encode($nomor_hp_pic_admin), + 'nama_pic_marketing' => $nama_pic_marketing[0], + 'detail_nama_pic_marketing' => json_encode($nama_pic_marketing), 'nomor_hp_pic_marketing' => $nomor_hp_pic_marketing[0], - 'detail_nomor_hp_pic_marketing' => $nomor_hp_pic_marketing, + 'detail_nomor_hp_pic_marketing' => json_encode($nomor_hp_pic_marketing), 'ijin_usaha_id' => json_encode($jenisUsaha), 'jenis_aset_id' => json_encode($jenisAsset), 'attachment' => null, @@ -137,181 +137,186 @@ class KJPPSeeder extends Seeder } private function generateKJPPCode() -{ - do { - $code = 'K' . str_pad(rand(1, 99999), 5, '0', STR_PAD_LEFT); - } while (KJPP::where('code', $code)->exists()); + { + do { + $code = 'K' . str_pad(rand(1, 99999), 5, '0', STR_PAD_LEFT); + } while (KJPP::where('code', $code)->exists()); - return $code; -} - -public function checkKota($data) -{ - try { - $city = null; - if ($data) { - // Bersihkan data dan ubah ke uppercase - $cleanData = trim(strtoupper($data)); - - $possibleNames = [ - 'KAB. ' . $cleanData, - 'KOTA ' . $cleanData, - 'KAB. ADM. ' . $cleanData, - 'KOTA ADM. ' . $cleanData, - $cleanData - ]; - - $city = City::whereIn(DB::raw('UPPER(name)'), $possibleNames)->first(); - - if ($city) { - // Cari district berdasarkan city_code - $district = District::where('city_code', $city->code)->first(); - if (!$district) { - return null; - } - - $village = Village::where('district_code', $district->code)->first(); - if (!$village) { - - return null; - } - return [ - 'province' => $city->province_code, - 'city' => $city->code, - 'district' => $district->code, - 'village' => $village->code, - 'postal_code' => $village->postal_code - ]; - } else{ - return null; - } - } - - return null; - - } catch (\Exception $e) { - $this->command->error(" ❌ Error: " . $e->getMessage()); - return null; + return $code; } -} -public function checkJenisAsset($data) -{ - try { - if (!$data) return []; + public function checkKota($data) + { + try { + $city = null; + if ($data) { + // Bersihkan data dan ubah ke uppercase + $cleanData = trim(strtoupper($data)); - // Bersihkan dan ubah ke lowercase - $cleanData = trim(strtolower($data)); + $possibleNames = [ + 'KAB. ' . $cleanData, + 'KOTA ' . $cleanData, + 'KAB. ADM. ' . $cleanData, + 'KOTA ADM. ' . $cleanData, + $cleanData + ]; - // Pisahkan berdasarkan koma, titik koma, dan spasi - $assets = preg_split('/[;,]+|\\s+/', $cleanData); + $city = City::whereIn(DB::raw('UPPER(name)'), $possibleNames)->first(); - // Daftar asset yang valid di database - $validAssets = JenisJaminan::pluck('code')->toArray(); - $assetIds = []; + if ($city) { + // Cari district berdasarkan city_code + $district = District::where('city_code', $city->code)->first(); + if (!$district) { + return null; + } - foreach ($assets as $asset) { - // Hapus spasi di awal dan akhir - $asset = trim($asset); + $village = Village::where('district_code', $district->code)->first(); + if (!$village) { - // Cek jika ada tanda kurung - if (preg_match('/\((.*?)\)/', $asset, $matches)) { - // Ambil isi dalam tanda kurung dan pisahkan - $insideParentheses = explode(',', $matches[1]); - foreach ($insideParentheses as $insideAsset) { - $insideAsset = trim($insideAsset); - // Cari di database - $jenisAsset = JenisJaminan::whereRaw('LOWER(name) = ?', [$insideAsset])->first(); - if ($jenisAsset && in_array($jenisAsset->code, $validAssets)) { - $assetIds[] = $jenisAsset->code; + return null; + } + return [ + 'province' => $city->province_code, + 'city' => $city->code, + 'district' => $district->code, + 'village' => $village->code, + 'postal_code' => $village->postal_code + ]; + } else { + return null; + } + } + + return null; + + } catch (\Exception $e) { + $this->command->error(" ❌ Error: " . $e->getMessage()); + return null; + } + } + + public function checkJenisAsset($data) + { + try { + if (!$data) { + return []; + } + + // Bersihkan dan ubah ke lowercase + $cleanData = trim(strtolower($data)); + + // Pisahkan berdasarkan koma, titik koma, dan spasi + $assets = preg_split('/[;,]+|\\s+/', $cleanData); + + // Daftar asset yang valid di database + $validAssets = JenisJaminan::pluck('code')->toArray(); + $assetIds = []; + + foreach ($assets as $asset) { + // Hapus spasi di awal dan akhir + $asset = trim($asset); + + // Cek jika ada tanda kurung + if (preg_match('/\((.*?)\)/', $asset, $matches)) { + // Ambil isi dalam tanda kurung dan pisahkan + $insideParentheses = explode(',', $matches[1]); + foreach ($insideParentheses as $insideAsset) { + $insideAsset = trim($insideAsset); + // Cari di database + $jenisAsset = JenisJaminan::whereRaw('LOWER(name) = ?', [$insideAsset])->first(); + if ($jenisAsset && in_array($jenisAsset->code, $validAssets)) { + $assetIds[] = $jenisAsset->code; + } } } + + // Cek jenis aset utama (tanpa tanda kurung) + $jenisAsset = JenisJaminan::whereRaw('LOWER(name) = ?', [$asset])->first(); + if ($jenisAsset && in_array($jenisAsset->code, $validAssets)) { + $assetIds[] = $jenisAsset->code; + + } } - // Cek jenis aset utama (tanpa tanda kurung) - $jenisAsset = JenisJaminan::whereRaw('LOWER(name) = ?', [$asset])->first(); - if ($jenisAsset && in_array($jenisAsset->code, $validAssets)) { - $assetIds[] = $jenisAsset->code; + // Menghilangkan duplikat jika ada + $assetIds = array_unique($assetIds); - } + // Sort array untuk konsistensi + sort($assetIds); + + return $assetIds; + + } catch (\Exception $e) { + $this->command->error(" ❌ Error pada checkJenisAsset: " . $e->getMessage()); + return []; } - - // Menghilangkan duplikat jika ada - $assetIds = array_unique($assetIds); - - // Sort array untuk konsistensi - sort($assetIds); - - return $assetIds; - - } catch (\Exception $e) { - $this->command->error(" ❌ Error pada checkJenisAsset: " . $e->getMessage()); - return []; } -} -public function checkJenisUsaha($data) -{ - try { - if (!$data) return []; - - // Bersihkan dan ubah ke lowercase - $cleanData = trim(strtolower($data)); - - // Pisahkan berdasarkan koma, titik koma, atau garis miring - $usahas = preg_split('/[\s,;\/]+/', $cleanData); - - // Ambil daftar valid usaha dari database - $validUsaha = IjinUsaha::pluck('code')->toArray(); - $usahaIds = []; - - foreach ($usahas as $usaha) { - // Hapus spasi di awal dan akhir - $usaha = trim($usaha); - - // Cari jenis usaha di database - $jenisUsaha = IjinUsaha::whereRaw('LOWER(name) = ?', [$usaha])->first(); - - if ($jenisUsaha && in_array($jenisUsaha->code, $validUsaha)) { - $usahaIds[] = $jenisUsaha->code; + public function checkJenisUsaha($data) + { + try { + if (!$data) { + return []; } + + // Bersihkan dan ubah ke lowercase + $cleanData = trim(strtolower($data)); + + // Pisahkan berdasarkan koma, titik koma, atau garis miring + $usahas = preg_split('/[\s,;\/]+/', $cleanData); + + // Ambil daftar valid usaha dari database + $validUsaha = IjinUsaha::pluck('code')->toArray(); + $usahaIds = []; + + foreach ($usahas as $usaha) { + // Hapus spasi di awal dan akhir + $usaha = trim($usaha); + + // Cari jenis usaha di database + $jenisUsaha = IjinUsaha::whereRaw('LOWER(name) = ?', [$usaha])->first(); + + if ($jenisUsaha && in_array($jenisUsaha->code, $validUsaha)) { + $usahaIds[] = $jenisUsaha->code; + } + } + + // Menghilangkan duplikat jika ada + $usahaIds = array_unique($usahaIds); + + // Sort array untuk konsistensi + sort($usahaIds); + + return $usahaIds; + + } catch (\Exception $e) { + $this->command->error(" ❌ Error pada checkJenisUsaha: " . $e->getMessage()); + return []; } - - // Menghilangkan duplikat jika ada - $usahaIds = array_unique($usahaIds); - - // Sort array untuk konsistensi - sort($usahaIds); - - return $usahaIds; - - } catch (\Exception $e) { - $this->command->error(" ❌ Error pada checkJenisUsaha: " . $e->getMessage()); - return []; } -} -// Fungsi untuk memisahkan dan mengonversi data menjadi array JSON -function checkDanJadikanJson($input) { + // Fungsi untuk memisahkan dan mengonversi data menjadi array JSON + public function checkDanJadikanJson($input) + { + $input = trim($input); - $input = trim($input); + // Memisahkan berdasarkan "/", ";", "dan", atau baris baru ("\n") + $separatedData = preg_split('/\s*\/\s*|\s*;\s*|\s*dan\s*|\s*\n\s*/i', $input); - // memisahkan berdasarkan "/", ";", "dan", atau baris baru ("\n") - $separatedData = preg_split('/\s*\/\s*|\s*;\s*|\s*dan\s*|\s*\n\s*/i', $input); + // Membersihkan data + $cleanedData = array_map('trim', $separatedData); + // Menghapus elemen kosong + $cleanedData = array_filter($cleanedData, function ($item) { + return !empty($item); + }); - $cleanedData = array_map(function($item) { - return trim($item); - }, $separatedData); + // Kembalikan array yang sudah diurutkan ulang (indeks dimulai dari 0) + return array_values($cleanedData); + } - $cleanedData = array_filter($cleanedData, function($item) { - return !empty($item); - }); - - return json_encode(array_values($cleanedData)); -} diff --git a/resources/views/component/kertas-kerja.blade.php b/resources/views/component/kertas-kerja.blade.php new file mode 100644 index 0000000..8e197cf --- /dev/null +++ b/resources/views/component/kertas-kerja.blade.php @@ -0,0 +1,550 @@ + + + + + + + Penilaian Aset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pendekatan PasarMetode Perbandingan Data Pasar
Tanggal Penilaian{{ $tanggal_penilaian ?? '-' }}
Nama Pemilik Aset-
Nama Pemberi Tugas-
Lokasi{{ $lokasi ?? '-' }}
Nama Debitur-
+ +

A Informasi Umum +

+ + + + + + + + + + + + + @php + $dataform = json_decode($data->data_form, true) ?? []; + $dataPembanding = json_decode($data->data_pembanding, true) ?? []; + + // print_r($dataform); + // echo $dataform; + + @endphp + + @php + function getNestedValue($data, $keyPath, $default = '-') + { + // Pecah path kunci menjadi array + $keys = explode('.', $keyPath); + + // Mulai dari data awal + $value = $data; + + // Telusuri setiap kunci + foreach ($keys as $key) { + // Cek apakah kunci ada di level saat ini + if (is_array($value) && array_key_exists($key, $value)) { + $value = $value[$key]; + } else { + // Jika kunci tidak ditemukan, kembalikan default + return $default; + } + } + + // Kembalikan nilai akhir atau default jika kosong + return $value ?? $default; + } + + $rows = [ + [ + 'label' => 'Jenis Aset', + 'key' => 'asset.jenis_aset', + 'default' => 'Rumah Tinggal', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Luas Tanah (M²)', + 'key' => 'tanah.luas_tanah', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Luas Bangunan (M²)', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Penawaran Transaksi', + 'key' => '-', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Tanggal Penawaran', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Discon', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Estimasi Harga', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Telepon Contact person', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Nama Nara Sumber', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Status Nara Sumber', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Waktu Penawaran', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Alamat', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Jalan', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Desa/Kelurahan', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Kecamatan', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Kota/Kabupaten', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Provinsi', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + + [ + 'label' => 'Jarak Pembanding dengan Objek', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Esitmasi Rangking Tanah', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + [ + 'label' => 'Estimasi Ranking bangunan', + 'key' => 'bangunan.luas_tanah_bangunan', + 'default' => '-', + 'variants' => [ + 'sesuai' => 'Sesuai', + 'tidak sesuai' => 'Tidak Sesuai', + ], + ], + ]; + @endphp + + @foreach ($rows as $index => $item) + + + + + + + + @for ($i = 0; $i < 3; $i++) + + @endfor + + @endforeach + +
No.UraianObjek PenilaianData Pembanding 1Data Pembanding 2Data Pembanding 3
{{ $index + 1 }}{{ $item['label'] }} + @php + // Coba berbagai varian kunci + $objekValue = '-'; + foreach (['sesuai', 'tidak sesuai'] as $variant) { + $fullKey = $item['key'] . '.' . $variant; + $objekValue = getNestedValue($dataform, $fullKey, $item['default']); + + // Jika nilai ditemukan, hentikan pencarian + if ($objekValue !== $item['default']) { + break; + } + } + @endphp + {{ $objekValue }} + + @php + $pembandingValue = '-'; + + // Pastikan data pembanding tersedia + if (isset($dataPembanding['data_pembanding'][$i])) { + $pembandingItem = $dataPembanding['data_pembanding'][$i]; + + // Mapping key berdasarkan label + switch ($item['label']) { + case 'Jenis Aset': + $pembandingValue = $pembandingItem['jenis_aset'] ?? '-'; + break; + case 'Luas Tanah (M²)': + $pembandingValue = $pembandingItem['luas_tanah'] ?? '-'; + break; + case 'Luas Bangunan (M²)': + $pembandingValue = $pembandingItem['luas_bangunan'] ?? '-'; + break; + default: + $pembandingValue = '-'; + } + } + @endphp + {{ $pembandingValue }} +
+ +

B. Estimasi Nilai Tanah Pembanding dengan Teknik Penyisaan Tanah untuk mendapatkan per meter persegi estimasi + Nilai Tanah Pembanding

+ + +
+ + + + + + + + + + + + @php + $estimasi = [ + [ + 'label' => 'Biaya Teknis Bangunan', + ], + [ + 'label' => 'Estimasi Biaya Pengganti Baru Bangunan', + ], + [ + 'label' => 'Estimasi Biaya Pengganti SPL (Rp)', + ], + [ + 'label' => 'Penyusutan Fisik Banguan', + ], + ]; + @endphp + + @foreach ($estimasi as $index => $item) + + + + + @for ($i = 0; $i < 3; $i++) + + @endfor + + @endforeach + +
No.UraianObjek PenilaianData Pembanding 1Data Pembanding 2Data Pembanding 3
{{ $index + 1 }}{{ $item['label'] }}- + @php + $pembandingValue = '-'; + + // Pastikan data pembanding tersedia + if (isset($dataPembanding['data_pembanding'][$i])) { + $pembandingItem = $dataPembanding['data_pembanding'][$i]; + + // Mapping key berdasarkan label + switch ($item['label']) { + case 'Jenis Aset': + $pembandingValue = $pembandingItem['jenis_aset'] ?? '-'; + break; + case 'Luas Tanah (M²)': + $pembandingValue = $pembandingItem['luas_tanah'] ?? '-'; + break; + case 'Luas Bangunan (M²)': + $pembandingValue = $pembandingItem['luas_bangunan'] ?? '-'; + break; + default: + $pembandingValue = '-'; + } + } + @endphp + {{ $pembandingValue }} +
+ +

Peta Objek dan Pembanding +

+ + @php + $fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat']; + + // echo $dataForm; + + @endphp + + @for ($i = 0; $i < count($fotoTypes); $i++) + {{ $fotoTypes[$i] }} + @endfor + +

FOTO OBJEK DAN DATA PEMBANDING

+ + @foreach ($dataPembanding['data_pembanding'] as $item) + Foto Objek +

Data Pembanding {{ $loop->iteration }}

+ @endforeach + + + @php + $dataFoto = json_decode($data->foto_form, true); + @endphp +

FOTO OBJEK

+ + @php + $images = []; + + // Rute Menuju Lokasi + foreach ($dataFoto['rute_menuju_lokasi'] ?? [] as $rute) { + $images[] = $rute['foto_rute'] ?? null; + } + + // Objek Jaminan + foreach ($dataFoto['object_jaminan'] ?? [] as $objek) { + $images[] = $objek['foto_objek'] ?? null; + } + + // Lingkungan + foreach ($dataFoto['lingkungan'] ?? [] as $lingkungan) { + $images[] = $lingkungan['foto_lingkungan'] ?? null; + } + + // Lantai Unit + foreach ($dataFoto['foto_lantai_unit'] ?? [] as $lantai) { + $images[] = $lantai['foto_lantai_unit'] ?? null; + } + + // Tambahan foto lainnya + $images[] = $dataFoto['foto_basement'] ?? null; + $images[] = $dataFoto['foto_gerbang'] ?? null; + $images[] = $dataFoto['pendamping'] ?? null; + + // Filter null values + $images = array_filter($images); + @endphp + +
+ @foreach ($images as $image) + Foto Survey + @endforeach +
+ + + + + + + + diff --git a/resources/views/kjpp/index.blade.php b/resources/views/kjpp/index.blade.php index efb272b..4496fa4 100644 --- a/resources/views/kjpp/index.blade.php +++ b/resources/views/kjpp/index.blade.php @@ -48,6 +48,14 @@ Jenis Kantor + + Kota/Kabupaten + + + + Alamat + + Action @@ -131,6 +139,15 @@ jenis_kantor: { title: 'Jenis Kantor', }, + city: { + title: 'Kota/Kabupaten', + render: (item, data) => { + return data.city.name; + } + }, + address: { + title: 'Alamat KJPP', + }, actions: { title: 'Action', render: (item, data) => { diff --git a/resources/views/penilai/components/informasi-pembanding.blade.php b/resources/views/penilai/components/informasi-pembanding.blade.php new file mode 100644 index 0000000..e0a65a2 --- /dev/null +++ b/resources/views/penilai/components/informasi-pembanding.blade.php @@ -0,0 +1,71 @@ +
+ + @php + $informasiPembanding = isset($inspeksi->data_pembanding) ? json_decode($inspeksi->data_pembanding, true) : []; + @endphp + + @foreach ($informasiPembanding['data_pembanding'] as $key => $item) +
+
+
+ + Gambar foto_objek +
+
+
+ +
+ {{ $item['jenis_aset'] }} +
+
+ +
+ +
+ {{ $item['harga_diskon'] }} +
+
+ +
+ +
+ {{ $item['harga'] }} +
+
+ +
+ +
+ {{ $item['harga'] }} +
+
+ +
+ +
+ {{ $item['luas_tanah'] }} +
+
+ +
+ +
+ {{ $item['luas_bangunan'] }} +
+
+ +
+ +
+ {{ $item['kordinat_lat'] }} , {{ $item['kordinat_lng'] }} +
+
+ +
+
+ +
+ @endforeach +
diff --git a/resources/views/penilai/components/lpj-sederhana-standard.blade.php b/resources/views/penilai/components/lpj-sederhana-standard.blade.php index 62ab78d..ea6f1f2 100644 --- a/resources/views/penilai/components/lpj-sederhana-standard.blade.php +++ b/resources/views/penilai/components/lpj-sederhana-standard.blade.php @@ -132,8 +132,7 @@ Informasi dan pembanding -
-
+ @include('lpj::penilai.components.informasi-pembanding') diff --git a/resources/views/penilai/components/resume.blade.php b/resources/views/penilai/components/resume.blade.php new file mode 100644 index 0000000..ad89007 --- /dev/null +++ b/resources/views/penilai/components/resume.blade.php @@ -0,0 +1,254 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render(request()->route()->getName()) }} + --}} + Resume +@endsection + +@section('content') + @include('lpj::assetsku.includenya') +
+
+
+

+ Data Jaminan +

+ +
+
+
+ +
+ @if (isset($permohonan->debiture)) +

{{ $permohonan->debiture->name }}

+ @endif +
+
+
+ +
+ @foreach ($permohonan->debiture->documents as $dokumen) + + {{ formatAlamat($dokumen->pemilik) }} + + @endforeach +
+
+
+ +
+

{{ $permohonan->nomor_registrasi }}

+
+
+ + + +
+ +
+ @if (isset($permohonan->branch)) +

{{ $permohonan->branch->name }}

+ @endif +
+
+ +
+ +
+

{{ $permohonan->nomor_registrasi }}

+
+
+
+ +
+ @if (isset($permohonan->user)) +

{{ $permohonan->user->name }}

+ @endif +
+
+
+
+ + +
+
+

+ faktor +

+
+
+
+ +
+ @if (!empty($forminspeksi['fakta']['fakta_positif'])) + @foreach ($forminspeksi['fakta']['fakta_positif'] as $index => $positif) +
+ + +
+ @endforeach + @else +
+ + +
+ @endif + +
+
+ + +
+ +
+ @if (!empty($forminspeksi['fakta']['fakta_negatif'])) + @foreach ($forminspeksi['fakta']['fakta_negatif'] as $index => $negatif) +
+ + +
+ @endforeach + @else +
+ + + +
+ @endif + +
+
+
+
+ + +
+
+

+ KESIMPULAN NILAI PASAR WAJAR +

+
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
SertipikatLuas TanahLuas BangunanNilai Pasar Wajar
+ + + + + +
+
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + +
SertipikatLuas TanahLuas BangunanNilai Pasar Wajar
+ + + + + + + +
+
+
+ +
+ +
+ +
+ +
+ + +
+ +
+
+
+ + +
+ +
+@endsection +@include('lpj::surveyor.js.utils') diff --git a/resources/views/penilai/show.blade.php b/resources/views/penilai/show.blade.php index 4f5a6cf..2f40adf 100644 --- a/resources/views/penilai/show.blade.php +++ b/resources/views/penilai/show.blade.php @@ -97,176 +97,176 @@ - @foreach ($permohonan->debiture->documents as $dokumen) -
-
-
- @php - $surveyor = $permohonan->penilaian->userPenilai->where('role', 'surveyor')->first(); - $penilai = $permohonan->penilaian->userPenilai->where('role', 'penilai')->first(); + @foreach ($permohonan->debiture->documents as $dokumen) +
+
+
+ @php + $surveyor = $permohonan->penilaian->userPenilai->where('role', 'surveyor')->first(); + $penilai = $permohonan->penilaian->userPenilai->where('role', 'penilai')->first(); - @endphp - -
+ @endphp + +
-

- {{ $surveyor->userPenilaiTeam->name }} -

+

+ {{ $surveyor->userPenilaiTeam->name }} +

-

{{ $permohonan->region->name }} -

-
- -
- -

- {{ $penilai->userPenilaiTeam->name }} -

- -

- {{ $permohonan->region->name }} -

-
-
-
- -

- {{ $permohonan->tujuanPenilaian->name }}

- -

- @foreach ($permohonan->debiture->documents as $document) - {{ $document->jenisjaminan->name }} - @endforeach +

{{ $permohonan->region->name }}

-
- -
-

- {{ formatTanggalIndonesia($permohonan->created_at) }}

-
-
-
- -
-

- {{ formatTanggalIndonesia($permohonan->created_at) }}

-
-
-
- -
-

-

-
-
+ +
+

+ {{ $penilai->userPenilaiTeam->name }} +

+

+ {{ $permohonan->region->name }} +

+
+
+
+ +

+ {{ $permohonan->tujuanPenilaian->name }}

+ +

+ @foreach ($permohonan->debiture->documents as $document) + {{ $document->jenisjaminan->name }} + @endforeach +

+
+
+ +
+

+ {{ formatTanggalIndonesia($permohonan->created_at) }}

+
+
+
+ +
+

+ {{ formatTanggalIndonesia($permohonan->created_at) }}

+
+
+
+ +
+

+

+
-