perbaikan form inspeksi bagian unit, dan kertas kerja

This commit is contained in:
majid
2024-12-14 04:23:14 +07:00
parent 3c5b372f7d
commit ab7150a97f
9 changed files with 889 additions and 612 deletions

View File

@@ -2,271 +2,279 @@
namespace Modules\Lpj\Exports; namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromCollection; // use Maatwebsite\Excel\Concerns\FromCollection;
// use Maatwebsite\Excel\Concerns\WithColumnFormatting; // use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; // use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use Maatwebsite\Excel\Concerns\WithHeadings; // use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStyles; // use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\WithColumnWidths; // use Maatwebsite\Excel\Concerns\WithColumnWidths;
use Maatwebsite\Excel\Concerns\WithEvents; // use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet; // use Maatwebsite\Excel\Events\AfterSheet;
use Illuminate\Contracts\View\View;
class KertasKerjaExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithEvents use Maatwebsite\Excel\Concerns\FromView;
class KertasKerjaExport implements FromView
{ {
// class KertasKerjaExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithEvents
// {
protected $data; protected $data;
protected $headerInfo; public function __construct($data)
public function __construct($data, $headerInfo)
{ {
$this->data = $data; $this->data = $data;
$this->headerInfo = $headerInfo;
} }
public function collection() public function view(): View
{ {
$rows = []; return view('lpj::component.kertas-kerja', [
'data' => $this->data,
$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);
} }
public function headings(): array // public function collection()
{ // {
return [ // $rows = [];
['KERTAS KERJA PENILAIAN'],
['Pendekatan Pasar'], // $nomor = 1;
['Metode Perbandingan Data Pasar'], // $fields = [
['Tanggal Penilaian: ' . ($this->headerInfo['tanggal_penilaian'] ?? '')], // 'jenis_aset' => 'Jenis Aset',
['Nama Pemilik Aset: ' . ($this->headerInfo['nama_pemilik'] ?? '')], // 'luas_tanah' => 'Luas Tanah (M²)',
['Nama Pemberi Tugas: ' . ($this->headerInfo['nama_pemberi_tugas'] ?? '')], // 'luas_bangunan' => 'Luas Bangunan (M²)',
['Lokasi: ' . ($this->headerInfo['lokasi_lengkap'] ?? '')], // 'harga' => 'Harga Transaksi/Penawaran',
['Nama Debitur: ' . ($this->headerInfo['nama_debitur'] ?? '')], // 'tanggal_penawaran' => 'Tanggal Penawaran/Transaksi',
[''], // 'diskon' => 'Diskon %',
['A. INFORMASI UMUM'], // 'esitmasi_harga' => 'Esitmasi Harga Transaksi (Rp)',
['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3'] // '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[] = [''];
public function registerEvents(): array // $rows[] = ['INDIKASI NILAI TANAHATAS OBJEK PENILAIAN'];
{
return [ // $indikasi=[
AfterSheet::class => function (AfterSheet $event) { // 'luas_tanah' => 'Luas Tanah ',
// Styling untuk header utama // '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 // // C. Peta Lokasi
$sectionRows = [10, 34, 56, 46, 52]; // Sesuaikan dengan posisi setiap section // $rows[] = [''];
foreach ($sectionRows as $row) { // $rows[] = [''];
$event->sheet->getStyle("A{$row}:F{$row}")->getFill() // $rows[] = ['C. Peta Lokasi'];
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) // $rows[] = [$this->data['foto_objek']['foto_objek_peta'] ?? ''];
->getStartColor()->setRGB('E2EFDA');
}
// Merge cells untuk headers // // D. Foto Objek dan Data Pembanding
$event->sheet->mergeCells('A1:E1'); // $rows[] = [''];
$event->sheet->mergeCells('A2:E2'); // $rows[] = ['D. Foto Objek dan Data Pembanding'];
$event->sheet->mergeCells('A4:E4'); // $rows[] = [
$event->sheet->mergeCells('A5:E5'); // $this->data['foto_objek1']['foto_objek'] ?? '',
$event->sheet->mergeCells('A6:E6'); // $this->data['foto_objek2']['foto_objek'] ?? '',
$event->sheet->mergeCells('A7:E7'); // '', '', ''
$event->sheet->mergeCells('A8:E8'); // ];
// Alignment // // E. Foto Objek
$event->sheet->getStyle('A1:E8')->getAlignment() // $rows[] = [''];
->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT); // $rows[] = ['E. Foto Objek'];
} // $rows[] = [
]; // $this->data['foto']['foto_objek'] ?? '',
} // $this->data['foto']['foto_objek'] ?? '',
public function columnWidths(): array // '', '', ''
{ // ];
return [
'A' => 5,
'B' => 30,
'C' => 30,
'D' => 30,
'E' => 30,
'F' => 30,
];
}
public function styles(Worksheet $sheet) // return collect($rows);
{ // }
return [
// Style for the main header
// Style for section headers // public function headings(): array
10 => ['font' => ['bold' => true]], // A. Informasi Umum // {
34 => ['font' => ['bold' => true]], // B. Estimasi Nilai Tanah // return [
35 => ['font' => ['bold' => true]], // C. Peta Lokasi // ['KERTAS KERJA PENILAIAN'],
57 => ['font' => ['bold' => true]], // D. Foto Objek dan Pembanding // ['Pendekatan Pasar'],
60 => ['font' => ['bold' => true]], // E. Foto Objek // ['Metode Perbandingan Data Pasar'],
// ['Tanggal Penilaian: ' . ($this->headerInfo['tanggal_penilaian'] ?? '')],
// Default styling for columns // ['Nama Pemilik Aset: ' . ($this->headerInfo['nama_pemilik'] ?? '')],
'A:J' => [ // ['Nama Pemberi Tugas: ' . ($this->headerInfo['nama_pemberi_tugas'] ?? '')],
'alignment' => ['horizontal' => 'left', 'vertical' => 'center'], // ['Lokasi: ' . ($this->headerInfo['lokasi_lengkap'] ?? '')],
'wrapText' => true, // ['Nama Debitur: ' . ($this->headerInfo['nama_debitur'] ?? '')],
], // [''],
// ['A. INFORMASI UMUM'],
// Style for other sections (like photo and map sections) // ['No.','Uraian', 'Objek Penilaian', 'Data Pembanding 1', 'Data Pembanding 2', 'Data Pembanding 3']
// 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']], // public function registerEvents(): array
'borders' => [ // {
'allBorders' => [ // return [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN // AfterSheet::class => function (AfterSheet $event) {
] // // Styling untuk header utama
]
],
'A35:F49' => [
'borders' => [
'allBorders' => [
'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN
]
]
],
// 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
// ];
// }
} }

View File

@@ -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(); $data = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
$headerInfo = [ // $data = null;
'tanggal_penilaian' => '', // $headerInfo = [
'nama_pemilik' => '', // 'tanggal_penilaian' => '',
'nama_pemberi_tugas' => '', // 'nama_pemilik' => '',
'lokasi_lengkap' => '', // 'nama_pemberi_tugas' => '',
'nama_debitur' => '' // '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');
} }

View File

@@ -164,7 +164,6 @@ class SurveyorController extends Controller
return response()->json([ return response()->json([
'success' => true, 'success' => true,
'message' => 'Data berhasil disimpan', 'message' => 'Data berhasil disimpan',
'data' => $processedData
], 200); ], 200);
} catch (\Exception $e) { } catch (\Exception $e) {
@@ -178,67 +177,86 @@ class SurveyorController extends Controller
private function getActionSpecificRules($data, $action, $request): array private function getActionSpecificRules($data, $action, $request): array
{ {
$pisah = explode(',', $action); $allowedActions = [
'apartemen-kantor' => 'getUnitData',
$allRules = [ 'tanah' => 'getTanahData',
'tanah' => $this->getTanahData($data, $request), 'bangunan' => 'getBangunanData',
'bangunan' => $this->getBangunanData($data, $request), 'kapal' => 'getKapalData',
'kapal' => $this->getKapalData($data, $request), 'kendaraan' => 'getKendaraanData',
'kendaraan' => $this->getKendaraanData($data, $request), 'mesin' => 'getMesinData',
'mesin' => $this->getMesinData($data, $request), 'pesawat' => 'getPesawatData',
'pesawat' => $this->getPesawatData($data, $request), 'alat-berat' => 'getAlatBeratData',
'alat-berat' => $this->getAlatBeratData($data, $request), 'lingkungan' => 'getLingkunganData',
'apartemen-kantor' => $this->getUnitData($data, $request), 'fakta' => 'getFactData'
'lingkungan' => $this->getLingkunganData($data, $request),
'fakta' => $this->getFactData($data, $request),
]; ];
$rules = []; $rules = [];
$hasAssetDescriptionRules = false; $hasAssetDescriptionRules = false;
$pisah = array_filter(
explode(',', $action),
function($act) use ($allowedActions) {
return isset($allowedActions[trim($act)]);
}
);
foreach ($pisah as $act) { foreach ($pisah as $act) {
if (isset($allRules[$act])) { $act = trim($act);
$rules = array_merge($rules, $allRules[$act]); $method = $allowedActions[$act];
if ($act == 'tanah' || $act == 'bangunan' || $act == 'apartemen-kantor') {
$hasAssetDescriptionRules = true; $actionRules = $this->$method($data, $request);
} $rules = array_merge($rules, $actionRules);
if (in_array($act, ['apartemen-kantor', 'tanah', 'bangunan'])) {
$hasAssetDescriptionRules = true;
} }
} }
if ($hasAssetDescriptionRules) { if ($hasAssetDescriptionRules) {
$rules = array_merge($rules, $this->getAssetData($data)); $rules = array_merge($rules, $this->getAssetData($data));
} }
return $rules; return $rules;
} }
public function storeDenah(Request $request) public function storeDenah(Request $request)
{ {
try { try {
$maxSize = getMaxFileSize('Foto'); $maxSize = getMaxFileSize('Foto');
$validatedData = $request->validate([ $validationRules = [
'foto_denah' => 'required|file|mimes:jpeg,jpg,png,pdf,svg|max:'. $maxSize,
'luas' => 'required|numeric', 'luas' => 'required|numeric',
'permohonan_id' => 'required', 'permohonan_id' => 'required',
'jenis_jaminan_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 = [ $formatJsonDenah = [
'foto_denah' => $validatedData['foto_denah'],
'luas' => $validatedData['luas'], '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')) $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))
->where('jenis_jaminan_id', $request->input('jenis_jaminan_id')) ->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))
->first(); ->first();
if ($inspeksi) { if ($inspeksi) {
$existingDenah = json_decode($inspeksi->denah_form, true) ?? [];
$updatedDenah = array_merge($existingDenah, $formatJsonDenah);
$inspeksi->update([ $inspeksi->update([
'denah_form' => json_encode($formatJsonDenah) 'denah_form' => json_encode($updatedDenah)
]); ]);
} else { } else {
Inspeksi::create([ Inspeksi::create([
@@ -1660,7 +1678,7 @@ class SurveyorController extends Controller
true true
), ),
'hadap_mata_angin' => [ '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( 'bentuk_tanah' => $this->getFieldData(
$data, $data,

View File

@@ -66,16 +66,16 @@ class KJPPSeeder extends Seeder
$jenisUsaha = $this->checkJenisUsaha($row[18]); $jenisUsaha = $this->checkJenisUsaha($row[18]);
$jenisAsset = $this->checkJenisAsset($row[19]); $jenisAsset = $this->checkJenisAsset($row[19]);
$detail_email_kantor = $this->checkDanJadikanJson($row[8]); $detail_email_kantor = $this->checkDanJadikanJson($row[9]);
$nama_pic_reviewer = $this->checkDanJadikanJson($row[11]); $nama_pic_reviewer = $this->checkDanJadikanJson($row[12]);
$nomor_hp_pic_reviewer = $this->checkDanJadikanJson($row[12]); $nomor_hp_pic_reviewer = $this->checkDanJadikanJson($row[13]);
$detail_nama_pic_admin = $this->checkDanJadikanJson($row[13]); $detail_nama_pic_admin = $this->checkDanJadikanJson($row[14]);
$nomor_hp_pic_admin = $this->checkDanJadikanJson($row[14]); $nomor_hp_pic_admin = $this->checkDanJadikanJson($row[15]);
$nama_pic_marketing = $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 { try {
@@ -91,23 +91,23 @@ class KJPPSeeder extends Seeder
'address' => $row[7], 'address' => $row[7],
'postal_code' => $locationData['postal_code'], 'postal_code' => $locationData['postal_code'],
'nomor_telepon_kantor' => $row[8], 'nomor_telepon_kantor' => $row[8],
'email_kantor' => $detail_email_kantor, 'email_kantor' => $detail_email_kantor[0],
'detail_email_kantor' => $detail_email_kantor, 'detail_email_kantor' => json_encode($detail_email_kantor),
'nama_pimpinan' => $row[9], 'nama_pimpinan' => $row[10],
'nomor_hp_pimpinan' => $row[10], 'nomor_hp_pimpinan' => $row[11],
'nama_pic_reviewer' => $nama_pic_reviewer, 'nama_pic_reviewer' => $nama_pic_reviewer[0],
'detail_nama_pic_reviewer' => $nama_pic_reviewer, 'detail_nama_pic_reviewer' => json_encode($nama_pic_reviewer),
'nomor_hp_pic_reviewer' => $nomor_hp_pic_reviewer, 'nomor_hp_pic_reviewer' => $nomor_hp_pic_reviewer[0],
'detail_nomor_hp_pic_reviewer' => $nomor_hp_pic_reviewer, 'detail_nomor_hp_pic_reviewer' => json_encode($nomor_hp_pic_reviewer),
'nama_pic_admin' => $detail_nama_pic_admin, 'nama_pic_admin' => $detail_nama_pic_admin[0],
'detail_nama_pic_admin' => $detail_nama_pic_admin, 'detail_nama_pic_admin' => json_encode($detail_nama_pic_admin),
'nomor_hp_pic_admin' => $nomor_hp_pic_admin, 'nomor_hp_pic_admin' => $nomor_hp_pic_admin[0],
'detail_nomor_hp_pic_admin' => $nomor_hp_pic_admin, 'detail_nomor_hp_pic_admin' => json_encode($nomor_hp_pic_admin),
'nama_pic_marketing' => $nama_pic_marketing, 'nama_pic_marketing' => $nama_pic_marketing[0],
'detail_nama_pic_marketing' => $nama_pic_marketing, 'detail_nama_pic_marketing' => json_encode($nama_pic_marketing),
'nomor_hp_pic_marketing' => $nomor_hp_pic_marketing[0], '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), 'ijin_usaha_id' => json_encode($jenisUsaha),
'jenis_aset_id' => json_encode($jenisAsset), 'jenis_aset_id' => json_encode($jenisAsset),
'attachment' => null, 'attachment' => null,
@@ -137,181 +137,186 @@ class KJPPSeeder extends Seeder
} }
private function generateKJPPCode() private function generateKJPPCode()
{ {
do { do {
$code = 'K' . str_pad(rand(1, 99999), 5, '0', STR_PAD_LEFT); $code = 'K' . str_pad(rand(1, 99999), 5, '0', STR_PAD_LEFT);
} while (KJPP::where('code', $code)->exists()); } while (KJPP::where('code', $code)->exists());
return $code; 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;
} }
}
public function checkJenisAsset($data) public function checkKota($data)
{ {
try { try {
if (!$data) return []; $city = null;
if ($data) {
// Bersihkan data dan ubah ke uppercase
$cleanData = trim(strtoupper($data));
// Bersihkan dan ubah ke lowercase $possibleNames = [
$cleanData = trim(strtolower($data)); 'KAB. ' . $cleanData,
'KOTA ' . $cleanData,
'KAB. ADM. ' . $cleanData,
'KOTA ADM. ' . $cleanData,
$cleanData
];
// Pisahkan berdasarkan koma, titik koma, dan spasi $city = City::whereIn(DB::raw('UPPER(name)'), $possibleNames)->first();
$assets = preg_split('/[;,]+|\\s+/', $cleanData);
// Daftar asset yang valid di database if ($city) {
$validAssets = JenisJaminan::pluck('code')->toArray(); // Cari district berdasarkan city_code
$assetIds = []; $district = District::where('city_code', $city->code)->first();
if (!$district) {
return null;
}
foreach ($assets as $asset) { $village = Village::where('district_code', $district->code)->first();
// Hapus spasi di awal dan akhir if (!$village) {
$asset = trim($asset);
// Cek jika ada tanda kurung return null;
if (preg_match('/\((.*?)\)/', $asset, $matches)) { }
// Ambil isi dalam tanda kurung dan pisahkan return [
$insideParentheses = explode(',', $matches[1]); 'province' => $city->province_code,
foreach ($insideParentheses as $insideAsset) { 'city' => $city->code,
$insideAsset = trim($insideAsset); 'district' => $district->code,
// Cari di database 'village' => $village->code,
$jenisAsset = JenisJaminan::whereRaw('LOWER(name) = ?', [$insideAsset])->first(); 'postal_code' => $village->postal_code
if ($jenisAsset && in_array($jenisAsset->code, $validAssets)) { ];
$assetIds[] = $jenisAsset->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) // Menghilangkan duplikat jika ada
$jenisAsset = JenisJaminan::whereRaw('LOWER(name) = ?', [$asset])->first(); $assetIds = array_unique($assetIds);
if ($jenisAsset && in_array($jenisAsset->code, $validAssets)) {
$assetIds[] = $jenisAsset->code;
} // 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) public function checkJenisUsaha($data)
{ {
try { try {
if (!$data) return []; 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;
} }
// 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 // Fungsi untuk memisahkan dan mengonversi data menjadi array JSON
function checkDanJadikanJson($input) { 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") // Membersihkan data
$separatedData = preg_split('/\s*\/\s*|\s*;\s*|\s*dan\s*|\s*\n\s*/i', $input); $cleanedData = array_map('trim', $separatedData);
// Menghapus elemen kosong
$cleanedData = array_filter($cleanedData, function ($item) {
return !empty($item);
});
$cleanedData = array_map(function($item) { // Kembalikan array yang sudah diurutkan ulang (indeks dimulai dari 0)
return trim($item); return array_values($cleanedData);
}, $separatedData); }
$cleanedData = array_filter($cleanedData, function($item) {
return !empty($item);
});
return json_encode(array_values($cleanedData));
}

View File

@@ -0,0 +1,222 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Penilaian Aset</title>
<style>
* {
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 15px;
font-size: 12px;
line-height: 1.4;
}
.header-table, .data-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 15px;
}
.header-table td {
padding: 5px 8px;
border: 1px solid #ddd;
vertical-align: top;
}
.header-table .title {
font-weight: bold;
background-color: #f1f3f5;
width: 30%;
}
.header-table .value {
background-color: #f9f9f9;
width: 70%;
}
.data-table th, .data-table td {
border: 1px solid #ddd;
padding: 5px 8px;
text-align: left;
word-wrap: break-word;
max-width: 150px;
overflow: hidden;
text-overflow: ellipsis;
}
.data-table th {
background-color: #f1f3f5;
text-align: center;
font-weight: bold;
}
.data-table tr:nth-child(even) {
background-color: #f9f9f9;
}
.text-center {
text-align: center;
}
@media print {
body {
font-size: 10px;
}
}
</style>
</head>
<body>
<table class="header-table">
<tr>
<td class="title">Pendekatan Pasar</td>
<td class="value">Metode Perbandingan Data Pasar</td>
</tr>
<tr>
<td class="title">Tanggal Penilaian</td>
<td class="value">{{ $tanggal_penilaian ?? '-' }}</td>
</tr>
<tr>
<td class="title">Nama Pemilik Aset</td>
<td class="value">PT ABC</td>
</tr>
<tr>
<td class="title">Nama Pemberi Tugas</td>
<td class="value">PT ABC</td>
</tr>
<tr>
<td class="title">Lokasi</td>
<td class="value">{{ $lokasi ?? '-' }}</td>
</tr>
<tr>
<td class="title">Nama Debitur</td>
<td class="value">Bapak Saiful</td>
</tr>
</table>
<table class="data-table">
<thead>
<tr>
<th width="5">No.</th>
<th width="20">Uraian</th>
<th width="15">Objek Penilaian</th>
<th width="20">Data Pembanding 1</th>
<th width="20">Data Pembanding 2</th>
<th width="20">Data Pembanding 3</th>
</tr>
</thead>
<tbody>
@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)
<tr>
<td class="text-center">{{ $index + 1 }}</td>
<td>{{ $item['label'] }}</td>
{{-- Objek Penilaian --}}
<td>
@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 }}
</td>
{{-- Data Pembanding --}}
@for($i = 0; $i < 3; $i++)
<td>
@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 }}
</td>
@endfor
</tr>
@endforeach
<!-- Tambahkan baris lainnya dengan cara yang sama -->
</tbody>
</table>
</body>
</html>

View File

@@ -97,176 +97,176 @@
</div> </div>
@foreach ($permohonan->debiture->documents as $dokumen) @foreach ($permohonan->debiture->documents as $dokumen)
<div class="card"> <div class="card">
<div class="card-body grid gap-5"> <div class="card-body grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
@php @php
$surveyor = $permohonan->penilaian->userPenilai->where('role', 'surveyor')->first(); $surveyor = $permohonan->penilaian->userPenilai->where('role', 'surveyor')->first();
$penilai = $permohonan->penilaian->userPenilai->where('role', 'penilai')->first(); $penilai = $permohonan->penilaian->userPenilai->where('role', 'penilai')->first();
@endphp @endphp
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Surveyor Surveyor
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm"> <p class="flex w-full text-gray-600 font-medium text-sm">
{{ $surveyor->userPenilaiTeam->name }} {{ $surveyor->userPenilaiTeam->name }}
</p> </p>
<p class="flex w-full text-gray-600 font-medium text-sm">{{ $permohonan->region->name }} <p class="flex w-full text-gray-600 font-medium text-sm">{{ $permohonan->region->name }}
</p>
</div>
<label class="form-label max-w-56">
Penilai
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ $penilai->userPenilaiTeam->name }}
</p>
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ $permohonan->region->name }}
</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tujuan Penilaian
</label>
<p class="flex text-gray-600 font-medium text-sm w-full">
{{ $permohonan->tujuanPenilaian->name }}</p>
<label class="form-label max-w-56">
Jenis Jaminan
</label>
<p class="flex text-gray-600 font-medium text-sm w-full">
@foreach ($permohonan->debiture->documents as $document)
{{ $document->jenisjaminan->name }}
@endforeach
</p> </p>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <label class="form-label max-w-56">
<label class="form-label max-w-56"> Penilai
Tanggal Survei </label>
</label> <div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ formatTanggalIndonesia($permohonan->created_at) }}</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tanggal Laporan
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ formatTanggalIndonesia($permohonan->created_at) }}</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
No. Laporan
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
</p>
</div>
</div>
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ $penilai->userPenilaiTeam->name }}
</p>
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ $permohonan->region->name }}
</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tujuan Penilaian
</label>
<p class="flex text-gray-600 font-medium text-sm w-full">
{{ $permohonan->tujuanPenilaian->name }}</p>
<label class="form-label max-w-56">
Jenis Jaminan
</label>
<p class="flex text-gray-600 font-medium text-sm w-full">
@foreach ($permohonan->debiture->documents as $document)
{{ $document->jenisjaminan->name }}
@endforeach
</p>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tanggal Survei
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ formatTanggalIndonesia($permohonan->created_at) }}</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
Tanggal Laporan
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
{{ formatTanggalIndonesia($permohonan->created_at) }}</p>
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">
No. Laporan
</label>
<div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm">
</p>
</div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full card-footer mt-2 "> </div>
<div class="flex gap-5">
<a class="btn btn-primary" href="{{ route('penilai.lampiran', $permohonan->id) }}">
LAMPIRAN FOTO DAN DOKUMEN
</a>
<a class="btn btn-primary" data-modal-toggle="#modal_2">
KERTAS KERJA
</a>
<a class="btn btn-primary" href="#">
PAPARAN
</a>
<div class="dropdown" data-dropdown="true" data-dropdown-trigger="click"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full card-footer mt-2 ">
<button class="dropdown-toggle btn btn-primary"> <div class="flex gap-5">
WORKSHEET <a class="btn btn-primary" href="{{ route('penilai.lampiran', $permohonan->id) }}">
</button> LAMPIRAN FOTO DAN DOKUMEN
<div class="dropdown-content w-full max-w-56 py-2"> </a>
<div class="menu menu-default flex flex-col w-full">
<div class="menu-item">
<a class="menu-link" href="{{ route('penilai.memo', $permohonan->id) }}">
<span class="menu-icon">
<i class="ki-outline ki-badge">
</i>
</span>
<span class="menu-title">
MEMO
</span>
</a>
</div>
<div class="menu-item">
<a class="menu-link" href="{{ route('penilai.resume', $permohonan->id) }}">
<span class="menu-icon">
<i class="ki-outline ki-profile-circle">
</i>
</span>
<span class="menu-title">
RESUME
</span>
</a>
</div>
<div class="menu-item">
<a class="menu-link" onclick="seletSederhanaStandart()">
<span class="menu-icon">
<i class="ki-outline ki-setting-2">
</i>
</span>
<span class="menu-title">
LPJ
</span>
</a> <a class="btn btn-primary" data-modal-toggle="#modal_2">
</div> KERTAS KERJA
<div class="menu-item"> </a>
<a class="menu-link" href="#"> <a class="btn btn-primary" href="#">
<span class="menu-icon"> PAPARAN
<i class="ki-outline ki-message-programming"> </a>
</i>
</span> <div class="dropdown" data-dropdown="true" data-dropdown-trigger="click">
<span class="menu-title"> <button class="dropdown-toggle btn btn-primary">
RAP WORKSHEET
</span> </button>
</a> <div class="dropdown-content w-full max-w-56 py-2">
</div> <div class="menu menu-default flex flex-col w-full">
<div class="menu-item">
<a class="menu-link" href="{{ route('penilai.memo', $permohonan->id) }}">
<span class="menu-icon">
<i class="ki-outline ki-badge">
</i>
</span>
<span class="menu-title">
MEMO
</span>
</a>
</div>
<div class="menu-item">
<a class="menu-link" href="{{ route('penilai.resume', $permohonan->id) }}">
<span class="menu-icon">
<i class="ki-outline ki-profile-circle">
</i>
</span>
<span class="menu-title">
RESUME
</span>
</a>
</div>
<div class="menu-item">
<a class="menu-link" onclick="seletSederhanaStandart()">
<span class="menu-icon">
<i class="ki-outline ki-setting-2">
</i>
</span>
<span class="menu-title">
LPJ
</span>
</a>
</div>
<div class="menu-item">
<a class="menu-link" href="#">
<span class="menu-icon">
<i class="ki-outline ki-message-programming">
</i>
</span>
<span class="menu-title">
RAP
</span>
</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="flex justify-end gap-5"> <div class="flex justify-end gap-5">
<a class="btn btn-success" href="#"> <a class="btn btn-success" href="#">
SAVE SAVE
</a> </a>
<a class="btn btn-success" href="#"> <a class="btn btn-success" href="#">
REPORT REPORT
</a> </a>
<a class="btn btn-success" href="#"> <a class="btn btn-success" href="#">
PRINT OUT PRINT OUT
</a> </a>
</div>
</div> </div>
</div> </div>
@endforeach
</div>
@endforeach
</div> </div>
@@ -294,10 +294,26 @@
</div> </div>
</div> </div>
<div class="form-group flex items-baseline flex-wrap"> <div class="form-group flex items-baseline flex-wrap">
@php
<a class="btn btn-outline btn-primary w-full" $jenisJaminanId = null;
href="{{ route('penilai.export.kertas-kerja', $permohonan->id) }}">Export Kertas Kerja</a> @endphp
@foreach ($permohonan->debiture->documents as $document)
@if ($document->jenisjaminan)
@php
$jenisJaminanId = $document->jenisjaminan->id;
@endphp
@endif
@endforeach
@if ($jenisJaminanId)
<a class="btn btn-outline btn-primary w-full"
href="{{ route('penilai.export.kertas-kerja', ['id' => $permohonan->id, 'jaminanId' => $jenisJaminanId]) }}">
Export Kertas Kerja
</a>
@else
<p class="text-red-500">Tidak ada dokumen yang memiliki jenis jaminan.</p>
@endif
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">

View File

@@ -165,7 +165,6 @@
<div class="input-group w-full flex gap-2"> <div class="input-group w-full flex gap-2">
<input type="file" <input type="file"
value="{{ old('foto_denah', isset($formDenah['foto_denah']) ? $formDenah['foto_denah'] : '') }}"
name="foto_denah" class="file-input file-input-bordered w-full" name="foto_denah" class="file-input file-input-bordered w-full"
accept=".jpg,.jpeg,.png,.pdf" onchange="previewFile(this)"> accept=".jpg,.jpeg,.png,.pdf" onchange="previewFile(this)">
</div> </div>
@@ -186,7 +185,7 @@
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Masukkan total luas tanah</span> <span class="form-label">Masukkan total luas tanah</span>
</label> </label>
<input type="text" name="luas" class="input w-full " <input type="text" name="luas" class="input w-full number-format"
value="{{ old('luas', isset($formDenah['luas']) ? $formDenah['luas'] : '') }}"> value="{{ old('luas', isset($formDenah['luas']) ? $formDenah['luas'] : '') }}">
</div> </div>
@@ -216,7 +215,15 @@
@push('scripts') @push('scripts')
@include('lpj::surveyor.js.utils')
<script> <script>
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.number-format').forEach(input => {
input.addEventListener('input', function() {
formatNumber(this);
});
});
});
function previewFile(input) { function previewFile(input) {
const previewContainer = document.getElementById('preview-container'); const previewContainer = document.getElementById('preview-container');
const imagePreview = document.getElementById('foto_denah-preview'); const imagePreview = document.getElementById('foto_denah-preview');

View File

@@ -215,14 +215,12 @@
if (errors) { if (errors) {
$.each(errors, function(key, value) { $.each(errors, function(key, value) {
$(`#error-${key}`).text(value[0]); $(`#error-${key}`).text(value[0]);
toastrErrorBuild(value[0]);
}); });
// toastrErrorBuild(error);
} }
hideLoadingSwal(); hideLoadingSwal();
console.error('Terjadi error:', error); // Menampilkan pesan error di konsol
console.log('Status:', status);
console.log('Response:', xhr.responseText);
console.log(errors); console.log(errors);
toastrErrorBuild(error);
} }
}); });
} }

View File

@@ -540,9 +540,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('datatables', [PenilaiController::class, 'dataForDatatables'])->name('dataForTables'); Route::get('datatables', [PenilaiController::class, 'dataForDatatables'])->name('dataForTables');
Route::get('lampiran/{id}', [PenilaiController::class, 'lampiran'])->name('lampiran'); Route::get('lampiran/{id}', [PenilaiController::class, 'lampiran'])->name('lampiran');
Route::get('export/kertas-kerja', [PenilaiController::class, 'kertas_kerja'])->name('export.kertas-kerja'); Route::get('export/kertas-kerja/{id}/{jaminanId}', [PenilaiController::class, 'kertas_kerja'])->name('export.kertas-kerja');
Route::get('export/kertas-kerja', [PenilaiController::class, 'kertas_kerja'])->name('export.kertas-kerja');
Route::get('export/kertas-kerja', [PenilaiController::class, 'kertas_kerja'])->name('export.kertas-kerja');
Route::get('sederhana/{id}', [PenilaiController::class, 'sederhana'])->name('sederhana'); Route::get('sederhana/{id}', [PenilaiController::class, 'sederhana'])->name('sederhana');
Route::get('standard/{id}', [PenilaiController::class, 'standard'])->name('standard'); Route::get('standard/{id}', [PenilaiController::class, 'standard'])->name('standard');