From ab7150a97fbebbfd823efda0267df39309b4f805 Mon Sep 17 00:00:00 2001 From: majid Date: Sat, 14 Dec 2024 04:23:14 +0700 Subject: [PATCH 1/4] perbaikan form inspeksi bagian unit, dan kertas kerja --- app/Exports/KertasKerjaExport.php | 496 +++++++++--------- app/Http/Controllers/PenilaiController.php | 23 +- app/Http/Controllers/SurveyorController.php | 80 +-- database/seeders/KJPPSeeder.php | 345 ++++++------ .../views/component/kertas-kerja.blade.php | 222 ++++++++ resources/views/penilai/show.blade.php | 314 +++++------ .../views/surveyor/components/denah.blade.php | 11 +- .../surveyor/components/inspeksi.blade.php | 6 +- routes/web.php | 4 +- 9 files changed, 889 insertions(+), 612 deletions(-) create mode 100644 resources/views/component/kertas-kerja.blade.php 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/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index 11f5b8c..4583dcd 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -192,19 +192,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'); + // 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..200e871 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,67 +177,86 @@ 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; } } - + if ($hasAssetDescriptionRules) { $rules = array_merge($rules, $this->getAssetData($data)); } - + return $rules; } - + public function storeDenah(Request $request) { 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([ @@ -1660,7 +1678,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, 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..f87fc45 --- /dev/null +++ b/resources/views/component/kertas-kerja.blade.php @@ -0,0 +1,222 @@ + + + + + + Penilaian Aset + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pendekatan PasarMetode Perbandingan Data Pasar
Tanggal Penilaian{{ $tanggal_penilaian ?? '-' }}
Nama Pemilik AsetPT ABC
Nama Pemberi TugasPT ABC
Lokasi{{ $lokasi ?? '-' }}
Nama DebiturBapak Saiful
+ + + + + + + + + + + + + + @php + $dataform = json_decode($data->data_form) ?? []; + $dataPembanding = json_decode($data->data_pembanding) ?? []; + @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' => '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' + ] + ] +]; +@endphp + +@foreach($rows as $index => $item) + + + + + {{-- Objek Penilaian --}} + + + {{-- Data Pembanding --}} + @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 + // Coba berbagai varian kunci untuk data pembanding + $pembandingValue = '-'; + foreach (['sesuai', 'tidak sesuai'] as $variant) { + $fullKey = $item['key'] . '.' . $variant; + $pembandingValue = getNestedValue($dataPembanding[$i] ?? [], $fullKey, '-'); + + // Jika nilai ditemukan, hentikan pencarian + if ($pembandingValue !== '-') { + break; + } + } + @endphp + {{ $pembandingValue }} +
+ + diff --git a/resources/views/penilai/show.blade.php b/resources/views/penilai/show.blade.php index 4f5a6cf..8f5c6a5 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) }}

+
+
+
+ +
+

+

+
-
- - Export Kertas Kerja + @php + $jenisJaminanId = null; + @endphp + @foreach ($permohonan->debiture->documents as $document) + @if ($document->jenisjaminan) + @php + $jenisJaminanId = $document->jenisjaminan->id; + @endphp + @endif + @endforeach + @if ($jenisJaminanId) + + Export Kertas Kerja + + @else +

Tidak ada dokumen yang memiliki jenis jaminan.

+ @endif
+
@@ -216,7 +215,15 @@ @push('scripts') +@include('lpj::surveyor.js.utils') diff --git a/resources/views/surveyor/components/inspeksi.blade.php b/resources/views/surveyor/components/inspeksi.blade.php index d97eb1a..a8f4263 100644 --- a/resources/views/surveyor/components/inspeksi.blade.php +++ b/resources/views/surveyor/components/inspeksi.blade.php @@ -17,21 +17,27 @@ $formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true); @endphp @if (isset($formKategori) && $formKategori) - - - @if (is_array($formKategori)) - @foreach ($formKategori as $kategori) - @include('lpj::surveyor.components.' . str_replace('-', '-', $kategori), [ - 'dokumen' => $dokumen, - ]) - @endforeach + @php + $kategoriArray = is_array($formKategori) ? $formKategori : [$formKategori]; + $kategoriUnik = array_unique($kategoriArray); + @endphp + + + @if (array_intersect($kategoriUnik, ['tanah', 'bangunan', 'apartemen-kantor'])) + @include('lpj::surveyor.components.header') @endif + + @foreach ($kategoriUnik as $kategori) + {{-- Tampilkan komponen sesuai kategori --}} + @include('lpj::surveyor.components.' . str_replace('-', '-', $kategori), [ + 'dokumen' => $dokumen, + ]) + @endforeach @endif @endif @endforeach +
+
-
+
@if (isset($basicData['saranaPelengkap'])) @foreach ($basicData['saranaPelengkap'] as $item) diff --git a/resources/views/surveyor/components/data-pembanding.blade.php b/resources/views/surveyor/components/data-pembanding.blade.php index c327c3f..dae8677 100644 --- a/resources/views/surveyor/components/data-pembanding.blade.php +++ b/resources/views/surveyor/components/data-pembanding.blade.php @@ -110,34 +110,63 @@ - - Luas Tanah (m²) - @php - $cekLuas = $inspectionData['tanah']['luas_tanah'] == 'sesuai' ? 'sesuai' :'tidak sesuai'; - @endphp - - - - + @php + $apartemenKantorData = explode(',', $inspeksi->name); + $isApartemenKantor = array_intersect($apartemenKantorData, [ + 'tanah', + 'bangunan', + ]); - - - - - Luas Bangunan (m²) - + @endphp + + @if ($isApartemenKantor) + + Luas Tanah (m²) + @php + $cekLuas = + isset($inspectionData['tanah']['luas_tanah']) == 'sesuai' + ? 'sesuai' + : 'tidak sesuai'; + + @endphp + + + + + + + + + + Luas Bangunan (m²) + + + + + + + + + @else + + Luas Unit (m²) + + + + + + + + @endif - - - - - - @@ -374,15 +403,28 @@ Diskon - +
+ + + + +
+ - - + +
+ + + + + +
+ - + Total { - input.addEventListener('input', function() { - const inputs = document.getElementsByName(this.name); - const index = Array.from(inputs).indexOf(this); - calculatePrices(index); - }); + // Event listener untuk input utama + const mainHargaInput = document.querySelector('input[name="harga"]'); + const mainDiskonInput = document.querySelector('input[name="diskon"]'); + + if (mainHargaInput) { + mainHargaInput.addEventListener('input', () => calculatePrices('main')); + } + + if (mainDiskonInput) { + mainDiskonInput.addEventListener('input', () => calculatePrices('main')); + } + + // Event listener untuk input pembanding + const pembandingHargaInputs = document.getElementsByName('harga_pembanding[]'); + const pembandingDiskonInputs = document.getElementsByName('diskon_pembanding[]'); + + pembandingHargaInputs.forEach((input, index) => { + input.addEventListener('input', () => calculatePrices('pembanding', index)); + }); + + pembandingDiskonInputs.forEach((input, index) => { + input.addEventListener('input', () => calculatePrices('pembanding', index)); }); } @@ -657,18 +744,30 @@ if (input.classList.contains('currency-format')) { input.addEventListener('input', function() { formatCurrency(this); + + // Special handling for price-related inputs + if (input.name.includes('harga_pembanding') || + input.name.includes('diskon_pembanding')) { + const inputs = document.getElementsByName(input.name); + const index = Array.from(inputs).indexOf(this); + calculatePrices(index); + } }); } - if (input.classList.contains('number-format')) { + + // Specific handling for discount to limit to 100% + if (input.name.includes('diskon_pembanding')) { input.addEventListener('input', function() { - formatNumber(this); + let value = parseFloat(this.value.replace(/[^\d]/g, '') || '0'); + value = Math.min(value, 100); + this.value = formatCurrency(value.toString()); }); } }); } row.appendChild(newCell); }); - + initializePriceCalculation(); updateRemoveButtonVisibility(); } @@ -913,8 +1012,6 @@ window.location.href = '{{ route('surveyor.show', ['id' => $permohonan->id]) }}'; } - - }); } else { @@ -925,6 +1022,7 @@ confirmButtonText: 'OK' }); } + }, error: function(xhr, status, error) { hideLoadingSwal(); diff --git a/resources/views/surveyor/components/fakta.blade.php b/resources/views/surveyor/components/fakta.blade.php index 7f054fb..eff1fc9 100644 --- a/resources/views/surveyor/components/fakta.blade.php +++ b/resources/views/surveyor/components/fakta.blade.php @@ -15,9 +15,10 @@ @foreach ($forminspeksi['fakta']['fakta_positif'] as $index => $positif)
- +
@endforeach @else diff --git a/resources/views/surveyor/components/header.blade.php b/resources/views/surveyor/components/header.blade.php index d0a6890..b989fb9 100644 --- a/resources/views/surveyor/components/header.blade.php +++ b/resources/views/surveyor/components/header.blade.php @@ -190,7 +190,8 @@ Tidak
- + +
@php @@ -217,7 +218,7 @@
- +
Ambil - Kordinat + Koordinat
@@ -340,9 +341,13 @@
@foreach ($permohonan->debiture->documents as $dokumen) - {{ $dokumen->pemilik->hubungan_pemilik->name ?? '' }} - + @php + $hubCadebPemilik = $dokumen->pemilik->hubungan_pemilik->name ?? 'N/A'; + @endphp + {{ $hubCadebPemilik }} + + @endforeach
@@ -375,10 +380,12 @@ @if (isset($basicData['hubCadeb'])) @foreach ($basicData['hubCadeb'] as $item) - + @if ($item->name != $hubCadebPemilik) + + @endif @endforeach @endif @@ -400,10 +407,12 @@
@foreach ($permohonan->debiture->documents as $dokumen) - {{ $dokumen->penghuni->hubungan_penghuni->name ?? 'N/A' }} + @php + $hubCadebPenghuni = $dokumen->penghuni->hubungan_penghuni->name ?? 'N/A'; + @endphp + {{ $hubCadebPenghuni }} + value="{{ isset($hubCadebPenghuni) ?? '' }}" id=""> @endforeach
@@ -438,15 +447,17 @@ @if (isset($basicData['hubPenghuni'])) @foreach ($basicData['hubPenghuni'] as $item) - + @if ($item->name != $hubCadebPenghuni) + + @endif @endforeach @endif
- +
@@ -482,102 +493,238 @@
-
-
-
-
- -
-
- +
+
- -
-
- +
+
- -
-
+
+ `; } - if (data == 'tidak sesuai') { + if (data === 'tidak sesuai') { createElementAlamat.innerHTML = ` -
-
- -
- +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
-
`; + loadSavedLocationData(); + } + } + + document.addEventListener('DOMContentLoaded', () => { + loadSavedLocationData(); + }); + // Fungsi untuk memuat data lokasi yang tersimpan + async function loadSavedLocationData() { + const provinceCode = '{{ $cekAlamat['province_code'] ?? '' }}'; + const cityCode = '{{ $cekAlamat['city_code'] ?? '' }}'; + const districtCode = '{{ $cekAlamat['district_code'] ?? '' }}'; + const villageCode = '{{ $cekAlamat['village_code'] ?? '' }}'; + + // Set province + const provinceSelect = document.getElementById('province_code'); + if (provinceCode && provinceSelect) { + provinceSelect.value = provinceCode; + await getCity(provinceCode); + } + + // Set city + const citySelect = document.getElementById('city_code'); + if (cityCode && citySelect) { + citySelect.value = cityCode; + await getDistrict(cityCode); + } + + // Set district + const districtSelect = document.getElementById('district_code'); + if (districtCode && districtSelect) { + districtSelect.value = districtCode; + await getVillage(districtCode); + } + + // Set village + const villageSelect = document.getElementById('village_code'); + if (villageCode && villageSelect) { + villageSelect.value = villageCode; + } + } + + // Modifikasi fungsi existing + async function getCity(provinceId) { + try { + const response = await fetch(`/locations/cities/province/${provinceId}`); + const data = await response.json(); + + const cityDropdown = document.getElementById('city_code'); + if (cityDropdown) { + cityDropdown.innerHTML = ''; + data.forEach(city => { + const option = document.createElement('option'); + option.value = city.code; + option.textContent = city.name; + @if (isset($debitur->city_code)) + if (city.code === '{{ $debitur->city_code }}') { + option.selected = true; + } + @endif + + cityDropdown.appendChild(option); + }); + + // Reset dropdown kecamatan dan desa + document.getElementById('district_code').innerHTML = ''; + document.getElementById('village_code').innerHTML = ''; + } + } catch (error) { + console.error('Error fetching cities:', error); + } + } + + // Lakukan hal serupa untuk getDistrict dan getVillage + async function getDistrict(cityId) { + try { + const response = await fetch(`/locations/districts/city/${cityId}`); + const data = await response.json(); + + const districtDropdown = document.getElementById('district_code'); + if (districtDropdown) { + districtDropdown.innerHTML = ''; + data.forEach(district => { + const option = document.createElement('option'); + option.value = district.code; + option.textContent = district.name; + + // Cek apakah ini adalah kecamatan yang sebelumnya dipilih + @if (isset($debitur->district_code)) + if (district.code === '{{ $debitur->district_code }}') { + option.selected = true; + } + @endif + + districtDropdown.appendChild(option); + }); + + // Reset dropdown desa + document.getElementById('village_code').innerHTML = ''; + } + } catch (error) { + console.error('Error fetching districts:', error); + } + } + + async function getVillage(districtId) { + try { + const response = await fetch(`/locations/villages/district/${districtId}`); + const data = await response.json(); + + const villageDropdown = document.getElementById('village_code'); + if (villageDropdown) { + villageDropdown.innerHTML = ''; + data.forEach(village => { + const option = document.createElement('option'); + option.value = village.code; + option.textContent = village.name; + + // Cek apakah ini adalah desa yang sebelumnya dipilih + @if (isset($debitur->village_code)) + if (village.code === '{{ $debitur->village_code }}') { + option.selected = true; + } + @endif + + villageDropdown.appendChild(option); + }); + } + } catch (error) { + console.error('Error fetching villages:', error); } } diff --git a/resources/views/surveyor/components/informasi.blade.php b/resources/views/surveyor/components/informasi.blade.php index 844c865..611e844 100644 --- a/resources/views/surveyor/components/informasi.blade.php +++ b/resources/views/surveyor/components/informasi.blade.php @@ -1,208 +1,228 @@
-
-

- Informasi Dinas Tata Ruang -

-
-
- -
- @php - $inputDinasTata = [ - [ - 'label' => 'Peruntukan', - 'name' => 'peruntukan', - 'index' => 0, - 'value' => old( - 'peruntukan', - isset($forminspeksi['fakta']['peruntukan']) ? $forminspeksi['fakta']['peruntukan'] : '', - ), - ], - [ - 'label' => 'KDB', - 'name' => 'kdb', - 'index' => 1, - 'value' => old('kdb', isset($forminspeksi['fakta']['kdb']) ? $forminspeksi['fakta']['kdb'] : ''), - ], - [ - 'label' => 'KDH', - 'name' => 'kdh', - 'index' => 2, - 'value' => old('kdh', isset($forminspeksi['fakta']['kdh']) ? $forminspeksi['fakta']['kdh'] : ''), - ], - [ - 'label' => 'GSB', - 'name' => 'gsb', - 'index' => 3, - 'value' => old('gsb', isset($forminspeksi['fakta']['gsb']) ? $forminspeksi['fakta']['gsb'] : ''), - ], - [ - 'label' => 'Max Lantai', - 'name' => 'max_lantai', - 'index' => 4, - 'value' => old( - 'max_lantai', - isset($forminspeksi['fakta']['max_lantai']) ? $forminspeksi['fakta']['max_lantai'] : '', - ), - ], - [ - 'label' => 'KLB', - 'name' => 'klb', - 'index' => 5, - 'value' => old('klb', isset($forminspeksi['fakta']['klb']) ? $forminspeksi['fakta']['klb'] : ''), - ], - [ - 'label' => 'GSS', - 'name' => 'gss', - 'index' => 6, - 'value' => old('gss', isset($forminspeksi['fakta']['gss']) ? $forminspeksi['fakta']['gss'] : ''), - ], - [ - 'label' => 'Pelebaran Jalan', - 'name' => 'pelebaran_jalan', - 'index' => 7, - 'value' => old( - 'pelebaran_jalan', - isset($forminspeksi['fakta']['pelebaran_jalan']) ? $forminspeksi['fakta']['pelebaran_jalan'] : '', - ), - ], - [ - 'label' => 'Nama Petugas TK', - 'name' => 'nama_petugas', - 'index' => 8, - 'value' => old( - 'nama_petugas', - isset($forminspeksi['fakta']['nama_petugas']) ? $forminspeksi['fakta']['nama_petugas'] : '', - ), - ], - ]; - @endphp +
+

+ Informasi Dinas Tata Ruang +

+
+
+ +
+ @php + $inputDinasTata = [ + [ + 'label' => 'Peruntukan', + 'name' => 'peruntukan', + 'index' => 0, + 'value' => old( + 'peruntukan', + isset($forminspeksi['fakta']['peruntukan']) ? $forminspeksi['fakta']['peruntukan'] : '', + ), + ], + [ + 'label' => 'KDB', + 'name' => 'kdb', + 'index' => 1, + 'value' => old( + 'kdb', + isset($forminspeksi['fakta']['kdb']) ? $forminspeksi['fakta']['kdb'] : '', + ), + ], + [ + 'label' => 'KDH', + 'name' => 'kdh', + 'index' => 2, + 'value' => old( + 'kdh', + isset($forminspeksi['fakta']['kdh']) ? $forminspeksi['fakta']['kdh'] : '', + ), + ], + [ + 'label' => 'GSB', + 'name' => 'gsb', + 'index' => 3, + 'value' => old( + 'gsb', + isset($forminspeksi['fakta']['gsb']) ? $forminspeksi['fakta']['gsb'] : '', + ), + ], + [ + 'label' => 'Max Lantai', + 'name' => 'max_lantai', + 'index' => 4, + 'value' => old( + 'max_lantai', + isset($forminspeksi['fakta']['max_lantai']) ? $forminspeksi['fakta']['max_lantai'] : '', + ), + ], + [ + 'label' => 'KLB', + 'name' => 'klb', + 'index' => 5, + 'value' => old( + 'klb', + isset($forminspeksi['fakta']['klb']) ? $forminspeksi['fakta']['klb'] : '', + ), + ], + [ + 'label' => 'GSS', + 'name' => 'gss', + 'index' => 6, + 'value' => old( + 'gss', + isset($forminspeksi['fakta']['gss']) ? $forminspeksi['fakta']['gss'] : '', + ), + ], + [ + 'label' => 'Pelebaran Jalan', + 'name' => 'pelebaran_jalan', + 'index' => 7, + 'value' => old( + 'pelebaran_jalan', + isset($forminspeksi['fakta']['pelebaran_jalan']) + ? $forminspeksi['fakta']['pelebaran_jalan'] + : '', + ), + ], + [ + 'label' => 'Nama Petugas TK', + 'name' => 'nama_petugas', + 'index' => 8, + 'value' => old( + 'nama_petugas', + isset($forminspeksi['fakta']['nama_petugas']) + ? $forminspeksi['fakta']['nama_petugas'] + : '', + ), + ], + ]; + @endphp - @if (count($inputDinasTata) > 0) - @foreach ($inputDinasTata as $item) -
- -
- - @error($item['name']) - - @enderror -
-
- @endforeach - @endif + @if (count($inputDinasTata) > 0) + @foreach ($inputDinasTata as $item) +
+ +
+ + @error($item['name']) + + @enderror +
+
+ @endforeach + @endif -
- -
- -
- - Foto Gistaru -
- - Gistaru - -
-
+
+ +
+ +
+ -
- -
- -
- - Foto Bhumi -
- - Bhumi - -
-
+ Foto Bhumi - @if (isset($link_url_region->regions->url)) -
- - -
- @endif -
- - -
- + +
+ + Gistaru + +
+
-
-
- + +
+ +
- class="file-input file-input-bordered w-full" accept="image/*" - onchange="previewImage(this, 'foto_tempat-preview')"> - -
- Foto Argis Region -
-
- - -
- - -
- -
-
-
-
+ + Foto Bhumi +
+ + Bhumi + +
+
-@include('lpj::surveyor.components.modal-kamera') + @if (isset($link_url_region->regions->url)) +
+ + +
+ @endif +
+ -@push('scripts') -@include('lpj::surveyor.js.camera-editor') -@endpush +
+ +
+
+ + +
+ + Foto Argis Region +
+
+ + +
+ + +
+ +
+
+
+
+ + @include('lpj::surveyor.components.modal-kamera') + + @push('scripts') + @include('lpj::surveyor.js.camera-editor') + @endpush diff --git a/resources/views/surveyor/components/inspeksi.blade.php b/resources/views/surveyor/components/inspeksi.blade.php index a8f4263..7eb2fa2 100644 --- a/resources/views/surveyor/components/inspeksi.blade.php +++ b/resources/views/surveyor/components/inspeksi.blade.php @@ -200,8 +200,8 @@ confirmButtonText: 'OK' }).then((response) => { if (response.isConfirmed) { - // window.location.href = - // '{{ route('surveyor.show', ['id' => $permohonan->id]) }}'; + window.location.href = + '{{ route('surveyor.show', ['id' => $permohonan->id]) }}'; } }); } else { @@ -231,52 +231,7 @@ }); } - function previewImage(input, previewId) { - if (input.files && input.files[0]) { - var reader = new FileReader(); - reader.onload = function(e) { - $('#' + previewId).attr('src', e.target.result).show(); - } - reader.readAsDataURL(input.files[0]); - } else { - $('#' + previewId).hide(); - } - } - function addClonableItem(containerId, itemClass) { - const container = document.getElementById(containerId); - if (!container) { - console.error(`Container with ID "${containerId}" not found.`); - return; - } - - const template = container.querySelector(`.${itemClass}`); - if (!template) { - console.error(`Template with class "${itemClass}" not found in container "${containerId}".`); - return; - } - - // Clone the template element - const newElement = template.cloneNode(true); - - // Reset input fields - const inputs = newElement.querySelectorAll('input'); - inputs.forEach(input => { - input.value = ''; - }); - - // Make the delete button visible and bind the click event - const deleteButton = newElement.querySelector('.remove-btn'); - if (deleteButton) { - deleteButton.style.display = 'inline-block'; - deleteButton.addEventListener('click', () => { - newElement.remove(); - }); - } - - // Append the cloned element to the container - container.appendChild(newElement); - } // Ensure existing remove buttons are functional document.addEventListener('DOMContentLoaded', () => { diff --git a/resources/views/surveyor/components/lingkungan.blade.php b/resources/views/surveyor/components/lingkungan.blade.php index a98cf65..e320a50 100644 --- a/resources/views/surveyor/components/lingkungan.blade.php +++ b/resources/views/surveyor/components/lingkungan.blade.php @@ -35,7 +35,10 @@
@php - $lebarPerkerasanJalan = old('lebar_perkerasan_jalan', $forminspeksi['lingkungan']['lebar_perkerasan_jalan'] ?? ''); + $lebarPerkerasanJalan = old( + 'lebar_perkerasan_jalan', + $forminspeksi['lingkungan']['lebar_perkerasan_jalan'] ?? '', + ); @endphp @@ -50,28 +53,35 @@ @if (isset($basicData['perkerasanJalan'])) @foreach ($basicData['perkerasanJalan'] as $item) @php - $isChecked = in_array($item->name, isset($forminspeksi['lingkungan']['perkerasan_jalan']['perkerasan_jalan']) ? $forminspeksi['lingkungan']['perkerasan_jalan']['perkerasan_jalan'] : []); + $isChecked = in_array( + $item->name, + isset($forminspeksi['lingkungan']['perkerasan_jalan']['perkerasan_jalan']) + ? $forminspeksi['lingkungan']['perkerasan_jalan']['perkerasan_jalan'] + : [], + ); @endphp @if (strcasecmp($item->name, 'Lainnya') == 0) - @php - - $lainnyaValue = old('perkerasan_jalan_lainnya', isset($forminspeksi['lingkungan']['perkerasan_jalan']['lainnya']) ? $forminspeksi['lingkungan']['perkerasan_jalan']['lainnya'] : ''); - @endphp - - @endif + @php + $lainnyaValue = old( + 'perkerasan_jalan_lainnya', + isset($forminspeksi['lingkungan']['perkerasan_jalan']['lainnya']) + ? $forminspeksi['lingkungan']['perkerasan_jalan']['lainnya'] + : '', + ); + @endphp + + @endif @endforeach @endif
@@ -103,7 +113,7 @@
- +
@if (isset($basicData['golMasySekitar'])) @@ -159,16 +169,19 @@ {{ $item->name }} @if (strcasecmp($item->name, 'Lainnya') == 0) - @php - $lainnyaValue = old('terletak_diarea_lainnya', isset($forminspeksi['lingkungan']['terletak_diarea']['lainnya']) ? $forminspeksi['lingkungan']['terletak_diarea']['lainnya'] : ''); - @endphp - - @endif - + @php + $lainnyaValue = old( + 'terletak_diarea_lainnya', + isset($forminspeksi['lingkungan']['terletak_diarea']['lainnya']) + ? $forminspeksi['lingkungan']['terletak_diarea']['lainnya'] + : '', + ); + @endphp + + @endif @endforeach @endif
@@ -356,48 +369,37 @@ @if (isset($basicData['fasilitasObjek'])) @foreach ($basicData['fasilitasObjek'] as $item) @php + $isChecked = false; + $inputValue = ''; - $selectedFasilitas = is_array( - old( - 'fasilitas_dekat_object', - $forminspeksi['lingkungan']['fasilitas_dekat_object']['fasilitas_dekat_object'] ?? [], - ), - ) - ? old( - 'fasilitas_dekat_object', - $forminspeksi['lingkungan']['fasilitas_dekat_object']['fasilitas_dekat_object'] ?? [], - ) - : explode( - ',', - old( - 'fasilitas_dekat_object', - $forminspeksi['lingkungan']['fasilitas_dekat_object']['fasilitas_dekat_object'] ?? '', - ), - ); + // Cek old input terlebih dahulu + if (old('fasilitas_dekat_object') && in_array($item->name, old('fasilitas_dekat_object'))) { + $isChecked = true; + $oldInputIndex = array_search($item->name, old('fasilitas_dekat_object')); + $inputValue = old('fasilitas_dekat_object_input')[$oldInputIndex] ?? ''; + } + elseif (isset($forminspeksi['lingkungan']['fasilitas_dekat_object'])) { + foreach ($forminspeksi['lingkungan']['fasilitas_dekat_object'] as $key => $value) { + if ($key === $item->name) { + $isChecked = true; + $inputValue = $value; + break; + } + } + } @endphp - - - @if (strcasecmp($item->name, 'Lainnya') == 0) - - @endif +
+ + +
@endforeach @endif
@@ -405,6 +407,9 @@
+ + + diff --git a/resources/views/surveyor/components/tanah.blade.php b/resources/views/surveyor/components/tanah.blade.php index 751578e..03b2512 100644 --- a/resources/views/surveyor/components/tanah.blade.php +++ b/resources/views/surveyor/components/tanah.blade.php @@ -24,7 +24,7 @@ @endforeach @endif
-
+
-
+
diff --git a/resources/views/surveyor/js/utils.blade.php b/resources/views/surveyor/js/utils.blade.php index 61fbe17..3bffc19 100644 --- a/resources/views/surveyor/js/utils.blade.php +++ b/resources/views/surveyor/js/utils.blade.php @@ -32,7 +32,7 @@ input.value = value; } - + function formatCurrency(value) { if (!value) return ''; @@ -52,4 +52,119 @@ return formattedValue; } + + function previewImage(input, previewId) { + if (input.files && input.files[0]) { + var reader = new FileReader(); + reader.onload = function(e) { + $('#' + previewId).attr('src', e.target.result).show(); + } + reader.readAsDataURL(input.files[0]); + } else { + $('#' + previewId).hide(); + } + } + + function addClonableItem(containerId, itemClass) { + const container = document.getElementById(containerId); + if (!container) { + console.error(`Container with ID "${containerId}" not found.`); + return; + } + + const template = container.querySelector(`.${itemClass}`); + if (!template) { + console.error(`Template with class "${itemClass}" not found in container "${containerId}".`); + return; + } + + // Clone the template element + const newElement = template.cloneNode(true); + + // Reset all input fields comprehensively + const inputs = newElement.querySelectorAll('input, select, textarea'); + inputs.forEach(input => { + // Reset based on input type + switch (input.type) { + case 'text': + case 'number': + case 'email': + case 'tel': + case 'password': + case 'search': + case 'url': + case 'textarea': + input.value = ''; + break; + case 'checkbox': + case 'radio': + input.checked = false; + break; + case 'select-one': + case 'select-multiple': + input.selectedIndex = 0; + break; + case 'file': + input.value = ''; + break; + } + + // Remove any error classes or validation states + input.classList.remove('is-invalid', 'error'); + + // Reset any custom attributes if needed + input.removeAttribute('data-previous-value'); + }); + + // Reset select elements to their default state + const selects = newElement.querySelectorAll('select'); + selects.forEach(select => { + select.selectedIndex = 0; + }); + + // Make the delete button visible and bind the click event + const deleteButton = newElement.querySelector('.remove-btn'); + if (deleteButton) { + deleteButton.style.display = 'inline-block'; + deleteButton.addEventListener('click', () => { + newElement.remove(); + }); + } + + // Reset any custom data attributes + newElement.querySelectorAll('[data-clone-reset]').forEach(element => { + const resetValue = element.getAttribute('data-clone-reset'); + if (resetValue) { + if (element.tagName === 'INPUT' || element.tagName === 'SELECT' || element.tagName === + 'TEXTAREA') { + element.value = resetValue; + } else { + element.textContent = resetValue; + } + } + }); + + // Optional: Regenerate unique IDs if needed + const elementsWithId = newElement.querySelectorAll('[id]'); + elementsWithId.forEach(element => { + const originalId = element.id; + const newId = `${originalId}_${Date.now()}`; + element.id = newId; + + // Update any labels or references + const labels = newElement.querySelectorAll(`label[for="${originalId}"]`); + labels.forEach(label => { + label.setAttribute('for', newId); + }); + }); + + // Append the cloned element to the container + container.appendChild(newElement); + + // Optional: Trigger any custom events or reinitialize plugins + const event = new Event('cloneAdded', { + bubbles: true + }); + newElement.dispatchEvent(event); + } From 562f1fb846a904c0b81b7317c3935bc156545242 Mon Sep 17 00:00:00 2001 From: majid Date: Tue, 17 Dec 2024 07:39:20 +0700 Subject: [PATCH 4/4] update kertas kerja, resume, dan lpj --- app/Http/Controllers/PenilaiController.php | 25 +- .../views/component/kertas-kerja.blade.php | 532 ++++++++++++++---- .../components/informasi-pembanding.blade.php | 71 +++ .../lpj-sederhana-standard.blade.php | 3 +- .../views/penilai/components/resume.blade.php | 254 +++++++++ resources/views/penilai/show.blade.php | 29 +- routes/web.php | 2 +- 7 files changed, 796 insertions(+), 120 deletions(-) create mode 100644 resources/views/penilai/components/informasi-pembanding.blade.php create mode 100644 resources/views/penilai/components/resume.blade.php diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index f6e7588..e6a578e 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -63,12 +63,12 @@ class PenilaiController extends Controller $permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id); $jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id; - $inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); + $inspeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); $forminspeksi = null; - if ($inpeksi) { - $forminspeksi = json_decode($inpeksi->data_form, true); + if ($inspeksi) { + $forminspeksi = json_decode($inspeksi->data_form, true); } - return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'basicData', 'forminspeksi')); + return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'basicData', 'forminspeksi', 'inspeksi')); } public function standard($id) @@ -77,21 +77,22 @@ class PenilaiController extends Controller $jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id; - $inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); + $inspeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); $forminspeksi = null; - if ($inpeksi) { - $forminspeksi = json_decode($inpeksi->data_form, true); + 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')); + return view('lpj::penilai.components.lpj-sederhana-standard', compact('permohonan', 'forminspeksi', 'basicData', 'inspeksi')); } - public function resume() + public function resume($id) { - return view('lpj::resume.index'); + $permohonan = Permohonan::with(['debiture.documents.jenisjaminan', 'region.teams.teamsUsers.user', 'penilaian'])->find($id); + return view('lpj::penilai.components.resume', compact('permohonan')); } public function memo() @@ -228,8 +229,8 @@ class PenilaiController extends Controller // $datas = json_decode($data->data_pembanding); // return response()->json(['data' =>$datas ]); - return view('lpj::component.kertas-kerja'); - // return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx'); + // return view('lpj::component.kertas-kerja', compact('data')); + return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx'); } diff --git a/resources/views/component/kertas-kerja.blade.php b/resources/views/component/kertas-kerja.blade.php index f87fc45..8e197cf 100644 --- a/resources/views/component/kertas-kerja.blade.php +++ b/resources/views/component/kertas-kerja.blade.php @@ -1,5 +1,6 @@ + @@ -8,6 +9,7 @@ * { box-sizing: border-box; } + body { font-family: Arial, sans-serif; margin: 0; @@ -16,7 +18,8 @@ line-height: 1.4; } - .header-table, .data-table { + .header-table, + .data-table { width: 100%; border-collapse: collapse; margin-bottom: 15px; @@ -39,7 +42,8 @@ width: 70%; } - .data-table th, .data-table td { + .data-table th, + .data-table td { border: 1px solid #ddd; padding: 5px 8px; text-align: left; @@ -70,7 +74,10 @@ } + + + @@ -82,11 +89,11 @@ - + - + @@ -94,10 +101,12 @@ - +
Pendekatan Pasar
Nama Pemilik AsetPT ABC-
Nama Pemberi TugasPT ABC-
Lokasi
Nama DebiturBapak Saiful-
+

A Informasi Umum +

@@ -111,112 +120,431 @@ @php - $dataform = json_decode($data->data_form) ?? []; - $dataPembanding = json_decode($data->data_pembanding) ?? []; + $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' => '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' - ] - ] -]; -@endphp - -@foreach($rows as $index => $item) - - - - - {{-- Objek Penilaian --}} - + function getNestedValue($data, $keyPath, $default = '-') + { + // Pecah path kunci menjadi array + $keys = explode('.', $keyPath); - {{-- Data Pembanding --}} - @for($i = 0; $i < 3; $i++) - - @endfor - -@endforeach + + // 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
{{ $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 - // Coba berbagai varian kunci untuk data pembanding - $pembandingValue = '-'; - foreach (['sesuai', 'tidak sesuai'] as $variant) { - $fullKey = $item['key'] . '.' . $variant; - $pembandingValue = getNestedValue($dataPembanding[$i] ?? [], $fullKey, '-'); - - // Jika nilai ditemukan, hentikan pencarian - if ($pembandingValue !== '-') { - break; + // 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; } } - @endphp - {{ $pembandingValue }} -
{{ $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/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 8f5c6a5..2f40adf 100644 --- a/resources/views/penilai/show.blade.php +++ b/resources/views/penilai/show.blade.php @@ -290,7 +290,8 @@
- +
@@ -306,8 +307,8 @@ @endforeach @if ($jenisJaminanId) - Export Kertas Kerja + href="{{ route('penilai.export.kertas-kerja', ['id' => $permohonan->id, 'jaminanId' => $jenisJaminanId]) }}"> + Export Kertas Kerja @else

Tidak ada dokumen yang memiliki jenis jaminan.

@@ -340,4 +341,26 @@ } }) } + + + function uploadKertasKerja() { + showLoadingSwal('Mengirim data ke server...'); + + Swal.fire({ + title: 'Berhasil!', + text: response.message, + icon: 'success', + timer: 2000, + timerProgressBar: true, + didOpen: () => { + Swal.showLoading() + }, + willClose: () => { + hideLoadingSwal(); + } + }); +} + + +@include('lpj::surveyor.js.utils') diff --git a/routes/web.php b/routes/web.php index 919b682..971e6df 100644 --- a/routes/web.php +++ b/routes/web.php @@ -544,7 +544,7 @@ Route::middleware(['auth'])->group(function () { Route::get('sederhana/{id}', [PenilaiController::class, 'sederhana'])->name('sederhana'); Route::get('standard/{id}', [PenilaiController::class, 'standard'])->name('standard'); - Route::get('resume/{id}', [PenilaiController::class, 'standard'])->name('resume'); + Route::get('resume/{id}', [PenilaiController::class, 'resume'])->name('resume'); Route::get('memo/{id}', [PenilaiController::class, 'standard'])->name('memo'); });