## Ringkasan Melakukan perbaikan pada helper format Rupiah, akses role user, validasi data MIG, serta penyesuaian tampilan laporan dan dokumentasi. ## Perubahan Detail ### 🔧 Helper Function **app/Helpers/Lpj.php**: - Menambahkan parameter opsional `withSymbol` pada fungsi `formatRupiah()` untuk kontrol simbol Rp - Menambahkan handling untuk menghapus titik (.) dari input number sebelum proses - Memperbaiki return value untuk null/empty string sesuai parameter `withSymbol` - Mengganti `str_pad()` dengan `sprintf()` untuk generate random number (lebih efisien) ### 🛠️ Service Layer **app/Services/PreviewLaporanService.php**: - Memperbaiki validasi data MIG dengan menambahkan pengecekan `is_mig` flag - Menambahkan null safety pada property `mig_mst_lpj_tot_nilai_pasar` - Memperbaiki kondisi logic untuk memo dan validasi nilai pasar ### 🎨 View Components **resources/views/component/print-out-dokument.blade.php**: - Memperbaiki syntax Blade dari `@isset` menjadi `isset()` yang lebih proper **resources/views/debitur/components/debitur.blade.php**: - Memperbaiki role checking dari `hasRole()` menjadi `hasAnyRole()` untuk multiple roles **resources/views/debitur/index.blade.php**: - Menambahkan role 'admin' pada kondisi edit dan delete actions - Memperbaiki permission checking untuk administrator dan admin **resources/views/laporan/index.blade.php**: - Menyederhanakan logic tombol laporan dan resume - Menghapus logic role-based yang kompleks untuk tombol laporan - Memperbaiki route URL untuk print-out laporan - Menghapus function `generateLaporanButton()` yang tidak digunakan **resources/views/penilai/components/lpj-sederhana-standar.blade.php**: - Menambahkan role 'penilai' pada permission tombol simpan **resources/views/penilai/components/print-out-sederhana.blade.php**: - Memperbaiki tampilan data dokumen dengan menambahkan kolom nomor dokumen - Mengganti `number_format()` dengan `formatRupiah()` untuk konsistensi format - Menambahkan fallback untuk data tanah dan bangunan ketika `npw_tambahan` tidak tersedia - Memperbaiki perhitungan total nilai pasar wajar dengan proper parsing - Memperbaiki format tampilan nilai likuidasi - Memperbaiki struktur HTML tabel untuk dokumentasi **resources/views/penilai/components/signature-approval.blade.php**: - Memperbaiki route dan parameter untuk approval signature **resources/views/permohonan/index.blade.php**: - Menambahkan role 'admin' pada permission actions
736 lines
28 KiB
PHP
736 lines
28 KiB
PHP
<?php
|
|
|
|
namespace Modules\Lpj\Services;
|
|
|
|
|
|
use Carbon\Carbon;
|
|
use App\Helpers\Lpj;
|
|
use Modules\Lpj\Models\Denah;
|
|
use Modules\Lpj\Models\Teams;
|
|
use Modules\Lpj\Models\Branch;
|
|
use Modules\Lpj\Models\Lantai;
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
use Modules\Lpj\Models\Analisa;
|
|
use Modules\Lpj\Models\Penilai;
|
|
use Modules\Lpj\Models\Debiture;
|
|
use Modules\Lpj\Models\Inspeksi;
|
|
use Modules\Lpj\Models\Surveyor;
|
|
use Modules\Lpj\Models\ViewUnit;
|
|
use Modules\Location\Models\City;
|
|
use Modules\Lpj\Models\JenisUnit;
|
|
use Modules\Lpj\Models\Penilaian;
|
|
use Modules\Lpj\Models\Perizinan;
|
|
use Modules\Lpj\Models\BentukUnit;
|
|
use Modules\Lpj\Models\JenisKapal;
|
|
use Modules\Lpj\Models\LantaiUnit;
|
|
use Modules\Lpj\Models\Lingkungan;
|
|
use Modules\Lpj\Models\Permohonan;
|
|
use Modules\Lpj\Models\PosisiUnit;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Modules\Lpj\Models\AnalisaUnit;
|
|
use Modules\Lpj\Models\BentukTanah;
|
|
use Modules\Lpj\Models\FotoJaminan;
|
|
use Modules\Lpj\Models\KonturTanah;
|
|
use Modules\Lpj\Models\RuteJaminan;
|
|
use Modules\Location\Models\Village;
|
|
use Modules\Lpj\Models\AnalisaFakta;
|
|
use Modules\Lpj\Models\JenisJaminan;
|
|
use Modules\Lpj\Models\JenisPesawat;
|
|
use Modules\Lpj\Models\ObjekJaminan;
|
|
use Modules\Lpj\Models\SpekBangunan;
|
|
use Modules\Lpj\Models\TerletakArea;
|
|
use Modules\Location\Models\District;
|
|
use Modules\Location\Models\Province;
|
|
use Modules\Lpj\Models\ArahMataAngin;
|
|
use Modules\Lpj\Models\JenisBangunan;
|
|
use Modules\Lpj\Models\PosisiKavling;
|
|
use Modules\Lpj\Models\SifatBangunan;
|
|
use Modules\Lpj\Models\DokumenJaminan;
|
|
use Modules\Lpj\Models\FasilitasObjek;
|
|
use Modules\Lpj\Models\JenisKendaraan;
|
|
use Modules\Lpj\Models\ModelAlatBerat;
|
|
use Modules\Lpj\Models\KetinggianTanah;
|
|
use Modules\Lpj\Models\KondisiBangunan;
|
|
use Modules\Lpj\Models\LaporanExternal;
|
|
use Modules\Lpj\Models\MerupakanDaerah;
|
|
use Modules\Lpj\Models\PerkerasanJalan;
|
|
use Modules\Lpj\Models\SaranaPelengkap;
|
|
use Modules\Lpj\Models\TujuanPenilaian;
|
|
use Modules\Lpj\Models\FotoObjekJaminan;
|
|
use Modules\Lpj\Models\LaluLintasLokasi;
|
|
use Modules\Lpj\Models\TingkatKeramaian;
|
|
use Modules\Lpj\Models\AnalisaLingkungan;
|
|
use Modules\Lpj\Models\KondisiFisikTanah;
|
|
use Modules\Lpj\Models\AnalisaTanahBagunan;
|
|
use Modules\Lpj\Models\GolonganMasySekitar;
|
|
use Modules\Lpj\Models\SpekBangunanAnalisa;
|
|
use Modules\Lpj\Models\DetailDokumenJaminan;
|
|
use Modules\Lpj\Models\SpekKategoritBangunan;
|
|
use Modules\Lpj\Http\Requests\SurveyorRequest;
|
|
use Modules\Lpj\Models\HubunganPemilikJaminan;
|
|
use Modules\Lpj\Models\HubunganPenghuniJaminan;
|
|
use Modules\Lpj\Models\SpekBagunanAnalisaDetail;
|
|
use Modules\Lpj\Jobs\SendJadwalKunjunganEmailJob;
|
|
use Modules\Lpj\Http\Requests\FormSurveyorRequest;
|
|
|
|
class PreviewLaporanService
|
|
{
|
|
/**
|
|
* Preview Laporan dan unduh foto terkait dengan logika fallback path.
|
|
*
|
|
* Menghasilkan PDF atau paket unduhan foto berdasarkan status laporan.
|
|
* Jika file foto asli tidak ditemukan dan status LPJ adalah 1, maka
|
|
* sistem akan mencoba menggunakan fallback path dengan pola
|
|
* `surveyor/001/{lastTwoParts}` untuk meminimalisir gambar hilang.
|
|
*
|
|
* @param int $permohonan_id ID Permohonan
|
|
* @param int $dokumen_id ID Dokumen
|
|
* @param int $jaminan_id ID Jaminan
|
|
* @param string $back URL atau rute kembali
|
|
* @return \Symfony\Component\HttpFoundation\Response
|
|
*/
|
|
public function previewLaporan($permohonan_id, $dokumen_id, $jaminan_id, $back)
|
|
{
|
|
$permohonan = $this->getPermohonanJaminanId(
|
|
$permohonan_id,
|
|
$dokumen_id,
|
|
$jaminan_id
|
|
);
|
|
// $tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id);
|
|
// $tipeLaporan = $tipeLaporanResponse->getData();
|
|
|
|
// if (!$tipeLaporan->status) {
|
|
// return redirect()->back()->with('error', 'Laporan tidak valid');
|
|
// }
|
|
$basicData = $this->getCommonData();
|
|
|
|
$inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first();
|
|
$lpj = Penilai::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first();
|
|
|
|
$mig_permohonan = json_decode($permohonan->mig_permohonan);
|
|
|
|
$nomorLaporan = getNomorLaporan($permohonan_id, $dokumen_id);
|
|
$tanggalLaporan = $permohonan->is_mig
|
|
? ($mig_permohonan->mig_mst_jaminan_tgl_laporan ?? $mig_permohonan->mig_mst_jaminan_tgl_create ?? null)
|
|
: ($lpj->created_at ?? null);
|
|
$forminspeksi = null;
|
|
$lpjData = null;
|
|
$formFoto = null;
|
|
|
|
// if ($inspeksi) {
|
|
$forminspeksi = json_decode($inspeksi?->data_form, true) ?? null;
|
|
|
|
$formFoto = json_decode($inspeksi?->foto_form, true) ?? null;
|
|
// $denahForm = json_decode($data->denah_form, true);
|
|
$dataPembanding = json_decode($inspeksi?->data_pembanding, true) ?? null;
|
|
// }
|
|
|
|
// if ($lpj) {
|
|
$lpjData = json_decode($lpj?->lpj, true) ?? null;
|
|
$memo = json_decode($lpj?->memo, true) ?? null;
|
|
$resumeData = json_decode($lpj?->resume, true) ?? null;
|
|
$rap = json_decode($lpj?->rap, true);
|
|
$report = json_decode($lpj?->call_report, true) ?? null;
|
|
// }
|
|
|
|
$inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];
|
|
|
|
$alamat = [
|
|
'address' => $inputAddress['address'] ?? null,
|
|
'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'),
|
|
'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'),
|
|
'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'),
|
|
'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province')
|
|
];
|
|
|
|
$statusLpj = 0;
|
|
|
|
// $viewLaporan = $this->getViewLaporan($tipeLaporan);
|
|
return view('lpj::component.show-laporan-inspeksi', compact('permohonan', 'basicData', 'forminspeksi', 'alamat', 'lpjData', 'memo', 'resumeData', 'rap', 'report', 'lpj', 'formFoto', 'nomorLaporan', 'tanggalLaporan', 'dataPembanding', 'inspeksi', 'statusLpj', 'permohonan_id', 'back', ));
|
|
}
|
|
|
|
public function printOutLaporan($permohonan_id, $document_id, $jaminan_id)
|
|
{
|
|
$tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id);
|
|
$tipeLaporan = $tipeLaporanResponse->getData();
|
|
|
|
//dd($permohonan_id, $document_id, $tipeLaporan);
|
|
|
|
if (!$tipeLaporan->status) {
|
|
//return redirect()->back()->with('error', 'Laporan tidak valid');
|
|
}
|
|
$permohonan = $this->getPermohonanJaminanId(
|
|
$permohonan_id,
|
|
$document_id,
|
|
$jaminan_id
|
|
);
|
|
|
|
$basicData = $this->getCommonData();
|
|
|
|
$inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $document_id)->first();
|
|
$lpj = Penilai::where('permohonan_id', $permohonan_id)->first(); //->where('dokument_id', $document_id)->first();
|
|
|
|
$mig_permohonan = json_decode($permohonan->mig_permohonan);
|
|
$nomorLaporan = getNomorLaporan($permohonan_id, $document_id);
|
|
|
|
//Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s');
|
|
|
|
$tanggalLaporan = $permohonan->is_mig
|
|
? ($mig_permohonan->mig_mst_jaminan_tgl_laporan
|
|
? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s')
|
|
: ($mig_permohonan->mig_mst_jaminan_tgl_oto
|
|
? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_oto)->format('Y-m-d H:i:s')
|
|
: null))
|
|
: ($lpj->created_at ?? null);
|
|
|
|
|
|
$forminspeksi = null;
|
|
$lpjData = null;
|
|
$formFoto = null;
|
|
|
|
$dataPembanding ='';
|
|
if ($inspeksi) {
|
|
$forminspeksi = json_decode($inspeksi->data_form, true);
|
|
$formFoto = json_decode($inspeksi->foto_form, true);
|
|
// $denahForm = json_decode($data->denah_form, true);
|
|
$dataPembanding = json_decode($inspeksi->data_pembanding, true);
|
|
}
|
|
|
|
|
|
if ($lpj) {
|
|
$lpjData = json_decode($lpj->lpj, true);
|
|
$memo = json_decode($lpj->memo, true);
|
|
$resumeData = json_decode($lpj->resume, true);
|
|
$rap = json_decode($lpj->rap, true);
|
|
$report = json_decode($lpj->call_report, true);
|
|
}
|
|
|
|
$inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];
|
|
|
|
$inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];
|
|
$alamat = [
|
|
'address' => $inputAddress['address'] ?? null,
|
|
'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'),
|
|
'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'),
|
|
'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'),
|
|
'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province')
|
|
];
|
|
|
|
$viewLaporan = $this->getViewLaporan($tipeLaporan->status);
|
|
|
|
$statusLpj = 1;
|
|
|
|
$mig_permohonan = json_decode($permohonan->mig_permohonan);
|
|
$nilaiPasar = $mig_permohonan->mig_mst_lpj_tot_nilai_pasar ?? null;
|
|
|
|
if(($tipeLaporan->status === 'memo' && $permohonan->mig_permohonan && $permohonan->is_mig) || ($nilaiPasar !== null && $nilaiPasar < 1 && $permohonan->is_mig)){
|
|
$paths = $formFoto['upload_foto'] ?? null;
|
|
|
|
if (!is_array($paths) || empty($paths)) {
|
|
return response()->json(['error' => 'No files to download'], 404);
|
|
}
|
|
|
|
$files = [];
|
|
foreach ($paths as $path) {
|
|
if (!$path['path']) {
|
|
Log::warning('PreviewLaporanService: Path kosong terdeteksi dalam daftar paths.');
|
|
continue;
|
|
}
|
|
|
|
// Logika fallback untuk path file
|
|
$originalPath = $path['path'];
|
|
$fallbackPath = null;
|
|
|
|
// Jika file asli tidak ditemukan, buat fallback path
|
|
if ($statusLpj == 1) {
|
|
$fullOriginalPath = storage_path('app/public/' . $originalPath);
|
|
|
|
if (!file_exists($fullOriginalPath)) {
|
|
// Ekstrak bagian akhir path (contoh: 251051/251051_2_2.png)
|
|
$pathParts = explode('/', $originalPath);
|
|
if (count($pathParts) >= 2) {
|
|
$lastTwoParts = array_slice($pathParts, -2);
|
|
$fallbackPath = 'surveyor/001/' . implode('/', $lastTwoParts);
|
|
Log::info('PreviewLaporanService: Menggunakan fallback path kandidat.', [
|
|
'original' => $originalPath,
|
|
'fallback' => $fallbackPath,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Tentukan path yang akan digunakan
|
|
$pathToUse = ($fallbackPath && $statusLpj == 1 && file_exists(storage_path('app/public/' . $fallbackPath)))
|
|
? $fallbackPath
|
|
: $originalPath;
|
|
|
|
$fullPath = storage_path('app/public/' . $pathToUse);
|
|
if (!file_exists($fullPath)) {
|
|
Log::warning('PreviewLaporanService: File tidak ditemukan untuk original maupun fallback.', [
|
|
'original' => $originalPath,
|
|
'fallback' => $fallbackPath,
|
|
'resolved' => $pathToUse,
|
|
]);
|
|
continue;
|
|
}
|
|
|
|
Log::info('PreviewLaporanService: Menambahkan file untuk diunduh.', [
|
|
'resolved' => $pathToUse,
|
|
'fullPath' => $fullPath,
|
|
]);
|
|
$files[] = $fullPath;
|
|
}
|
|
|
|
if (empty($files)) {
|
|
Log::warning('PreviewLaporanService: Tidak ada file valid ditemukan setelah resolusi path.');
|
|
return response()->json(['error' => 'No valid files found'], 404);
|
|
}
|
|
|
|
// For single file, download directly
|
|
if (count($files) === 1) {
|
|
Log::info('PreviewLaporanService: Mengunduh single file.', ['file' => $files[0]]);
|
|
return response()->download($files[0]);
|
|
}
|
|
|
|
// For multiple files, create zip and download
|
|
$zipName = 'photos_' . time() . '.zip';
|
|
$zipPath = storage_path('app/public/' . $zipName);
|
|
|
|
$zip = new \ZipArchive();
|
|
if ($zip->open($zipPath, \ZipArchive::CREATE) === true) {
|
|
foreach ($files as $file) {
|
|
$zip->addFile($file, basename($file));
|
|
}
|
|
$zip->close();
|
|
Log::info('PreviewLaporanService: Zip file berhasil dibuat.', ['zip' => $zipPath, 'count' => count($files)]);
|
|
return response()->download($zipPath)->deleteFileAfterSend(true);
|
|
}
|
|
|
|
Log::error('PreviewLaporanService: Gagal membuat zip file.');
|
|
return response()->json(['error' => 'Failed to create zip file'], 500);
|
|
}
|
|
try {
|
|
$pdf = $this->generatePDF($viewLaporan, compact(
|
|
'permohonan',
|
|
'forminspeksi',
|
|
'lpjData',
|
|
'formFoto',
|
|
'basicData',
|
|
'inspeksi',
|
|
'lpj',
|
|
'statusLpj',
|
|
'alamat',
|
|
'dataPembanding',
|
|
'nomorLaporan',
|
|
'memo',
|
|
'resumeData',
|
|
'tanggalLaporan',
|
|
'rap',
|
|
'report'
|
|
));
|
|
|
|
$cleanNomorLaporan = str_replace(['/', '\\'], '-', $nomorLaporan);
|
|
$filename = 'Laporan_' . $tipeLaporan->status . '_' . $permohonan->debiture->name . '_' . $cleanNomorLaporan;
|
|
|
|
return $pdf->download($filename . '_data.pdf');
|
|
} catch (\Exception $e) {
|
|
Log::error('PDF generation failed: ' . $e->getMessage());
|
|
return response()->json(['error' => 'Failed to generate PDF. Please check the log for details.'], 500);
|
|
}
|
|
}
|
|
|
|
private function generatePDF(string $viewLaporan, array $data)
|
|
{
|
|
//return view('lpj::' . $viewLaporan, $data);
|
|
|
|
$pdf = PDF::loadView('lpj::' . $viewLaporan, $data);
|
|
$pdf->setPaper('A4', 'portrait');
|
|
$pdf->set_option('isHtml5ParserEnabled', true);
|
|
$pdf->set_option('isPhpEnabled', true);
|
|
|
|
return $pdf;
|
|
}
|
|
|
|
|
|
private function getViewLaporan($tipe)
|
|
{
|
|
$viewMap = [
|
|
'sederhana' => 'penilai.components.print-out-sederhana',
|
|
'standar' => 'penilai.components.print-out-standar',
|
|
'resume' => 'penilai.components.print-resume',
|
|
'memo' => 'penilai.components.print-memo',
|
|
'rap' => 'penilai.components.print-out-rap',
|
|
'call-report' => 'penilai.components.print-out-call-report'
|
|
];
|
|
return $viewMap[$tipe] ?? 'penilai.components.print-resume';
|
|
}
|
|
|
|
public function checkPrintOutLaporan($permohonan_id, $dokumen_id)
|
|
{
|
|
|
|
// Ambil data berdasarkan ID
|
|
$statusLpj = Penilai::where('permohonan_id', $permohonan_id)
|
|
//->where('dokument_id', $dokumen_id)
|
|
->first();
|
|
|
|
|
|
$permohonan = Permohonan::where('id', $permohonan_id)->first();
|
|
|
|
// Jika data tidak ditemukan, kembalikan status null
|
|
if (!$statusLpj) {
|
|
return response()->json(['status' => null]);
|
|
}
|
|
|
|
// Tentukan tipe berdasarkan kondisi
|
|
$type = $statusLpj->type_penilai ?? null;
|
|
|
|
if ($type === 'memo' && $permohonan->is_mig!=1) {
|
|
return $this->checkDataMemo($type, $statusLpj);
|
|
}
|
|
|
|
if ($type === 'resume') {
|
|
return $this->checkDataResume($type, $statusLpj);
|
|
}
|
|
|
|
|
|
if ($type === 'standar' || $type === 'sederhana') {
|
|
return $this->checkDataLpj($type, $statusLpj);
|
|
}
|
|
|
|
if ($type === 'rap') {
|
|
return $this->checkDataRap($type, $statusLpj);
|
|
}
|
|
|
|
|
|
|
|
// Kembalikan respons dengan tipe yang sesuai
|
|
return response()->json(['status' => $type]);
|
|
}
|
|
|
|
public function checkDataMemo($type, $statusLpj)
|
|
{
|
|
// Ambil data JSON dari statusLpj
|
|
$data = json_decode($statusLpj->memo, true) ?? [];
|
|
|
|
|
|
$validationRules = [
|
|
'memo' => [
|
|
'kepada',
|
|
'dari',
|
|
'nomor_memo',
|
|
'tanggal',
|
|
'perihal',
|
|
'jenis_asset_tidak_sesuai',
|
|
'lokasi.lokasi',
|
|
'lokasi.province_code',
|
|
'lokasi.city_code',
|
|
'lokasi.district_code',
|
|
'lokasi.village_code',
|
|
'lokasi.penilai',
|
|
'terlampir',
|
|
'hasil_survey',
|
|
'kesimpulan_saran',
|
|
],
|
|
];
|
|
|
|
// Validasi data JSON
|
|
if (isset($validationRules[$type])) {
|
|
$missingFields = [];
|
|
|
|
foreach ($validationRules[$type] as $field) {
|
|
$keys = explode('.', $field);
|
|
$value = $data;
|
|
|
|
foreach ($keys as $key) {
|
|
if (!isset($value[$key])) {
|
|
$missingFields[] = $field;
|
|
break;
|
|
}
|
|
$value = $value[$key];
|
|
}
|
|
}
|
|
|
|
// Jika ada field yang kosong, kembalikan error
|
|
if (!empty($missingFields)) {
|
|
return response()->json([
|
|
'status' => null,
|
|
'message' => "Silahkan lengkapi data memo terlebih dahulu.",
|
|
'missing_fields' => $missingFields,
|
|
], 400);
|
|
}
|
|
}
|
|
|
|
// Jika data valid
|
|
return response()->json([
|
|
'status' => $type,
|
|
'message' => "Data memo valid.",
|
|
]);
|
|
}
|
|
|
|
|
|
|
|
|
|
public function checkDataResume($type, $statusLpj)
|
|
{
|
|
// Ambil data JSON dari statusLpj
|
|
$data = json_decode($statusLpj->resume, true) ?? [];
|
|
|
|
$validationRules = [
|
|
'resume' => [
|
|
'fisik'
|
|
],
|
|
];
|
|
|
|
// Validasi data JSON
|
|
if (isset($validationRules[$type])) {
|
|
$missingFields = [];
|
|
|
|
foreach ($validationRules[$type] as $field) {
|
|
$keys = explode('.', $field);
|
|
$value = $data;
|
|
|
|
foreach ($keys as $key) {
|
|
if (!isset($value[$key])) {
|
|
$missingFields[] = $field;
|
|
break;
|
|
}
|
|
$value = $value[$key];
|
|
}
|
|
|
|
// Validasi khusus untuk array fisik dan sesuai_imb
|
|
if ($field === 'fisik' || $field === 'sesuai_imb') {
|
|
if (empty($value) || !is_array($value)) {
|
|
$missingFields[] = $field;
|
|
continue;
|
|
}
|
|
|
|
// Validasi struktur data di dalam array
|
|
foreach ($value as $item) {
|
|
$requiredKeys = ['sertifikat', 'luas_tanah', 'nilai'];
|
|
foreach ($requiredKeys as $requiredKey) {
|
|
if (!isset($item[$requiredKey])) {
|
|
$missingFields[] = $field . '.' . $requiredKey;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Jika ada field yang kosong, kembalikan error
|
|
if (!empty($missingFields)) {
|
|
return response()->json([
|
|
'status' => null,
|
|
'message' => "Silahkan lengkapi data resume terlebih dahulu.",
|
|
'missing_fields' => $missingFields,
|
|
], 400);
|
|
}
|
|
}
|
|
|
|
// Jika data valid
|
|
return response()->json([
|
|
'status' => $type,
|
|
'message' => "Data resume valid.",
|
|
]);
|
|
}
|
|
|
|
public function checkDataLpj($type, $statusLpj)
|
|
{
|
|
// Ambil data JSON dari statusLpj
|
|
$data = json_decode($statusLpj->lpj, true) ?? [];
|
|
|
|
$validationRules = [
|
|
'lpj' => [
|
|
'luas_tanah',
|
|
'nilai_tanah_1',
|
|
'nilai_tanah_2',
|
|
'luas_bangunan',
|
|
'nilai_bangunan_1',
|
|
'nilai_bangunan_2',
|
|
'total_nilai_pasar_wajar',
|
|
'likuidasi',
|
|
'likuidasi_nilai_1',
|
|
'likuidasi_nilai_2',
|
|
'asuransi_luas_bangunan',
|
|
'asuransi_nilai_1',
|
|
'asuransi_nilai_2',
|
|
'npw_tambahan'
|
|
],
|
|
];
|
|
|
|
// Validasi data JSON
|
|
if (isset($validationRules[$type])) {
|
|
$missingFields = [];
|
|
|
|
foreach ($validationRules[$type] as $field) {
|
|
// Penanganan khusus untuk field yang boleh null
|
|
if (in_array($field, ['sarana_pelengkap_penilai', 'nilai_sarana_pelengkap_1', 'nilai_sarana_pelengkap_2'])) {
|
|
continue;
|
|
}
|
|
|
|
if (!isset($data[$field])) {
|
|
$missingFields[] = $field;
|
|
continue;
|
|
}
|
|
|
|
// Validasi khusus untuk npw_tambahan
|
|
if ($field === 'npw_tambahan' && is_array($data[$field])) {
|
|
foreach ($data[$field] as $index => $item) {
|
|
$requiredKeys = ['name', 'luas', 'nilai_1', 'nilai_2'];
|
|
foreach ($requiredKeys as $key) {
|
|
if (!isset($item[$key])) {
|
|
$missingFields[] = "npw_tambahan[$index].$key";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Jika ada field yang kosong, kembalikan error
|
|
if (!empty($missingFields)) {
|
|
return response()->json([
|
|
'status' => null,
|
|
'message' => "Silahkan lengkapi data LPJ terlebih dahulu.",
|
|
'missing_fields' => $missingFields,
|
|
], 400);
|
|
}
|
|
}
|
|
|
|
// Jika data valid
|
|
return response()->json([
|
|
'status' => $type,
|
|
'message' => "Data LPJ valid.",
|
|
]);
|
|
}
|
|
|
|
public function checkDataRap($type, $statusLpj)
|
|
{
|
|
// Ambil data JSON dari statusLpj
|
|
$data = json_decode($statusLpj->rap, true) ?? [];
|
|
|
|
$requiredFields = [
|
|
'dari',
|
|
'kepada',
|
|
'perihal',
|
|
'tanggal',
|
|
'nomor_rap'
|
|
];
|
|
|
|
// Cek apakah ada field yang kosong
|
|
$missingFields = [];
|
|
foreach ($requiredFields as $field) {
|
|
if (!isset($data[$field]) || empty($data[$field])) {
|
|
$missingFields[] = $field;
|
|
}
|
|
}
|
|
|
|
// Jika ada field yang kosong, kembalikan error
|
|
if (!empty($missingFields)) {
|
|
return response()->json([
|
|
'status' => null,
|
|
'message' => "Silahkan lengkapi data RAP terlebih dahulu.",
|
|
'missing_fields' => $missingFields
|
|
], 400);
|
|
}
|
|
|
|
// Jika semua data terisi
|
|
return response()->json([
|
|
'status' => $type,
|
|
'message' => "Data RAP valid."
|
|
]);
|
|
}
|
|
private function getPermohonanJaminanId($id, $dokumentId, $jaminanId)
|
|
{
|
|
return Permohonan::with([
|
|
'user',
|
|
'debiture.province',
|
|
'debiture.city',
|
|
'debiture.district',
|
|
'debiture.village',
|
|
'branch',
|
|
'tujuanPenilaian',
|
|
'penilaian',
|
|
'penawaran',
|
|
'debiture.documents' => function ($query) use ($dokumentId, $jaminanId) {
|
|
$query->where('id', $dokumentId)
|
|
->where('jenis_jaminan_id', $jaminanId);
|
|
}
|
|
])->findOrFail($id);
|
|
}
|
|
|
|
public function getCommonData()
|
|
{
|
|
return [
|
|
'branches' => Branch::all(),
|
|
'bentukTanah' => BentukTanah::all(),
|
|
'konturTanah' => KonturTanah::all(),
|
|
'posisiKavling' => PosisiKavling::all(),
|
|
'ketinggianTanah' => KetinggianTanah::all(),
|
|
'kondisiFisikTanah' => KondisiFisikTanah::all(),
|
|
'jenisBangunan' => JenisBangunan::all(),
|
|
'kondisiBangunan' => KondisiBangunan::all(),
|
|
'sifatBangunan' => SifatBangunan::all(),
|
|
'spekKategoriBangunan' => SpekKategoritBangunan::all(),
|
|
'spekBangunan' => SpekBangunan::all(),
|
|
'saranaPelengkap' => SaranaPelengkap::all(),
|
|
'arahMataAngin' => ArahMataAngin::all(),
|
|
'lantai' => Lantai::all(),
|
|
'viewUnit' => ViewUnit::all(),
|
|
'golMasySekitar' => GolonganMasySekitar::all(),
|
|
'tingkatKeramaian' => TingkatKeramaian::all(),
|
|
'laluLintasLokasi' => LaluLintasLokasi::all(),
|
|
'jenisPesawat' => JenisPesawat::all(),
|
|
'modelAlatBerat' => ModelAlatBerat::all(),
|
|
'jenisKapal' => JenisKapal::all(),
|
|
'jenisKendaraan' => JenisKendaraan::all(),
|
|
'terletakArea' => TerletakArea::all(),
|
|
'posisiUnit' => PosisiUnit::all(),
|
|
'bentukUnit' => BentukUnit::all(),
|
|
'fasilitasObjek' => FasilitasObjek::all(),
|
|
'merupakanDaerah' => MerupakanDaerah::all(),
|
|
'jenisUnit' => JenisUnit::all(),
|
|
'jenisJaminan' => JenisJaminan::all(),
|
|
'hubCadeb' => HubunganPemilikJaminan::all(),
|
|
'hubPenghuni' => HubunganPenghuniJaminan::all(),
|
|
'perkerasanJalan' => PerkerasanJalan::all(),
|
|
'terletakDiArea' => TerletakArea::all(),
|
|
'tujuanPenilaian' => TujuanPenilaian::all(),
|
|
'perizinan' => Perizinan::all(),
|
|
'foto' => FotoObjekJaminan::all()
|
|
];
|
|
}
|
|
|
|
private const HEADERS = [
|
|
'bentuk-tanah' => ['Bentuk Tanah', 'bentuk-tanah'],
|
|
'kontur-tanah' => ['Kontur Tanah', 'kontur-tanah'],
|
|
'posisi-kavling' => ['Posisi Kavling', 'posisi-kavling'],
|
|
'ketinggian-tanah' => ['Ketinggian Tanah', 'ketinggian-tanah'],
|
|
'kondisi-fisik-tanah' => ['Kondisi Fisik Tanah', 'kondisi-fisik-tanah'],
|
|
'jenis-bangunan' => ['Jenis Bangunan', 'jenis-bangunan'],
|
|
'kondisi-bangunan' => ['Kondisi Bangunan', 'kondisi-bangunan'],
|
|
'sifat-bangunan' => ['Sifat Bangunan', 'sifat-bangunan'],
|
|
'sarana-pelengkap' => ['Sarana Pelengkap', 'sarana-pelengkap'],
|
|
'lalu-lintas-lokasi' => ['Lalu Lintas Depan Lokasi', 'lalu-lintas-lokasi'],
|
|
'tingkat-keramaian' => ['Tingkat Keramaian', 'tingkat-keramaian'],
|
|
'gol-mas-sekitar' => ['Golongan Masyarakat Sekitar', 'gol-mas-sekitar'],
|
|
'spek-kategori-bangunan' => ['Spek Kategori Bangunan', 'spek-kategori-bangunan'],
|
|
'spek-bangunan' => ['Spek Bangunan', 'spek-bangunan'],
|
|
'lantai-unit' => ['Lantai Unit', 'lantai-unit'],
|
|
'view-unit' => ['View Unit', 'view-unit'],
|
|
'perkerasan-jalan' => ['Perkerasan jalan', 'perkerasan-jalan'],
|
|
'jenis-pesawat' => ['Jenis pesawat', 'jenis-pesawat'],
|
|
'model-alat-berat' => ['Model alat berat', 'model-alat-berat'],
|
|
'jenis-kapal' => ['Jenis kapal', 'jenis-kapal'],
|
|
'jenis-kendaraan' => ['Jenis kendaraan', 'jenis-kendaraan'],
|
|
'jenis-unit' => ['Jenis unit', 'jenis-unit'],
|
|
'terletak-area' => ['Terletak di Area', 'terletak-area'],
|
|
'merupakan-daerah' => ['Merupakan Daerah', 'merupakan-daerah'],
|
|
'posisi-unit' => ['Posisi unit', 'posisi-unit'],
|
|
'bentuk-unit' => ['Bentuk unit', 'bentuk-unit'],
|
|
'fasilitas-objek' => ['Fasilitas Umum Dekat Objek', 'fasilitas-objek'],
|
|
'foto-objek-jaminan' => ['Foto Objek Jaminan', 'foto-objek-jaminan'],
|
|
'perizinan' => ['Perizinan', 'perizinan'],
|
|
];
|
|
|
|
}
|