From 7ddcc14167623723615acc1b919aec6939d09a97 Mon Sep 17 00:00:00 2001 From: majid Date: Wed, 11 Jun 2025 09:55:37 +0700 Subject: [PATCH] update migration file, dan laporan --- .../LaporanPenilaiJaminanController.php | 63 +- app/Http/Controllers/PenilaiController.php | 6 +- ..._24_090044_mig_update_permohonan_table.php | 4 +- database/seeders/LpjDatabaseSeeder.php | 13 +- .../seeders/MigExternalPenawaranSeeder.php | 306 +++++ database/seeders/MigInspeksiHelper.php | 1036 +++++++++++++++++ .../MigPenilaianAndPenilainTeamSeeder.php | 332 +++--- database/seeders/MigrationDebitureSeeder.php | 12 +- .../MigrationDetailDokumenJaminanSeeder.php | 238 ++-- .../MigrationDokumentJaminanSeeder.php | 144 +-- .../seeders/MigrationGambarInspeksiSeeder.php | 162 ++- database/seeders/MigrationInpseksiSeeder.php | 526 ++++----- .../seeders/MigrationPembandingSeeder.php | 103 +- database/seeders/MigrationPenilaiSeeder.php | 6 +- .../seeders/MigrationPermohonanSeeder.php | 105 +- .../seeders/TujuanPenilaianKJPPSeeder.php | 31 +- .../laporan-penilai-jaminan/index.blade.php | 113 +- .../laporan-penilai-jaminan/show.blade.php | 39 + .../laporan_penilaian_jaminan/index.blade.php | 4 +- .../components/analisa/fakta.blade.php | 5 +- .../components/analisa/lingkungan.blade.php | 2 +- .../views/penilai/components/footer.blade.php | 12 +- .../penilai/components/foto-jaminan.blade.php | 43 +- .../views/penilai/components/header.blade.php | 12 +- routes/web.php | 17 +- 25 files changed, 2513 insertions(+), 821 deletions(-) create mode 100644 database/seeders/MigExternalPenawaranSeeder.php create mode 100644 database/seeders/MigInspeksiHelper.php create mode 100644 resources/views/laporan-penilai-jaminan/show.blade.php diff --git a/app/Http/Controllers/LaporanPenilaiJaminanController.php b/app/Http/Controllers/LaporanPenilaiJaminanController.php index 5e83790..73a4fcb 100644 --- a/app/Http/Controllers/LaporanPenilaiJaminanController.php +++ b/app/Http/Controllers/LaporanPenilaiJaminanController.php @@ -10,6 +10,9 @@ use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Exports\LaporanPenilaiJaminanExport; use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Models\Branch; +use Modules\Lpj\Http\Controllers\SurveyorController; +use Modules\Lpj\Models\Inspeksi; +use Modules\Lpj\Models\Penilai; class LaporanPenilaiJaminanController extends Controller { @@ -17,6 +20,14 @@ class LaporanPenilaiJaminanController extends Controller /** * Display a listing of the resource. */ + + protected $surveyorController; + + public function __construct(SurveyorController $surveyorController) + { + $this->surveyorController = $surveyorController; + } + public function index() { $status_permohonan = StatusPermohonan::all(); @@ -27,12 +38,60 @@ class LaporanPenilaiJaminanController extends Controller /** * Show the specified resource. */ - public function show($id) + public function show($permohonan_id, $dokumen_id, $jaminan_id) { - return view('lpj::laporan-penilai-jaminan.show'); + $permohonan = $this->surveyorController->getPermohonanJaminanId( + $permohonan_id, + $dokumen_id, + $jaminan_id + ); + + + + $basicData = $this->surveyorController->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(); + + $nomorLaporan = getNomorLaporan($permohonan_id, $dokumen_id); + $tanggalLaporan = $lpj->created_at ?? null; + $forminspeksi = null; + $lpjData = null; + $formFoto = null; + + 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'] ?? []; + + $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::laporan-penilai-jaminan.show', compact('permohonan', 'basicData', 'forminspeksi', 'alamat', 'lpjData', 'memo', 'resumeData', 'rap', 'report', 'lpj', 'formFoto', 'nomorLaporan', 'tanggalLaporan', 'dataPembanding', 'inspeksi', 'statusLpj')); } + public function dataForDatatables(Request $request) { diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index fe20028..cc818c3 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -1420,9 +1420,11 @@ class PenilaiController extends Controller ]; } - public function checkPrintOutLaporan(Request $request) + public function checkPrintOutLaporan($permohonan_id, $dokumen_id) { - $permohonanId = $request->query('permohonanId'); + // $permohonanId = $request->query('permohonanId'); + // $documentId = $request->query('documentId'); + $permohonanId = $permohonan_id; $documentId = $request->query('documentId'); // Ambil data berdasarkan ID diff --git a/database/migrations/2025_04_24_090044_mig_update_permohonan_table.php b/database/migrations/2025_04_24_090044_mig_update_permohonan_table.php index 2e313fa..9521caa 100644 --- a/database/migrations/2025_04_24_090044_mig_update_permohonan_table.php +++ b/database/migrations/2025_04_24_090044_mig_update_permohonan_table.php @@ -18,7 +18,7 @@ return new class () extends Migration { $table->unsignedBigInteger('mig_kd_debitur_seq')->nullable()->comment('asal data LPJ.PRM_DEBITUR.KD_DEBITUR_SEQ. Berguna untuk update debitur_id menggunakan KD_DEBITUR_SEQ nya'); $table->unsignedBigInteger('nomor_lpj')->nullable(); - $table->timestamp('processed_at')->nullable(); + $table->string('mig_nama_ao')->nullable(); $table->char('is_mig', 1)->nullable()->comment('untuk menandakan row ini dari LPJ OLD'); }); } @@ -39,7 +39,7 @@ return new class () extends Migration { $table->dropColumn([ 'mig_kd_debitur_seq', 'nomor_lpj', - 'processed_at', + 'mig_nama_ao', 'is_mig' ]); }); diff --git a/database/seeders/LpjDatabaseSeeder.php b/database/seeders/LpjDatabaseSeeder.php index 6b097fd..b63f542 100644 --- a/database/seeders/LpjDatabaseSeeder.php +++ b/database/seeders/LpjDatabaseSeeder.php @@ -47,12 +47,15 @@ class LpjDatabaseSeeder extends Seeder // MigrationDebitureSeeder::class, // MigrationPermohonanSeeder::class, // MigrationDokumentJaminanSeeder::class, - // MigrationDetailDokumenJaminanSeeder::class - // MigPenilaianAndPenilainTeamSeeder::class - // MigrationInpseksiSeeder::class - // MigrationGambarInspeksiSeeder::class - MigrationPembandingSeeder::class + // MigrationDetailDokumenJaminanSeeder::class, + // MigPenilaianAndPenilainTeamSeeder::class, + // MigrationInpseksiSeeder::class, + MigrationGambarInspeksiSeeder::class, + // MigrationPembandingSeeder::class, // MigrationPenilaiSeeder::class + + // ini untuk penilaian external + // MigExternalPenawaranSeeder::class, ]); } } diff --git a/database/seeders/MigExternalPenawaranSeeder.php b/database/seeders/MigExternalPenawaranSeeder.php new file mode 100644 index 0000000..7b8fdeb --- /dev/null +++ b/database/seeders/MigExternalPenawaranSeeder.php @@ -0,0 +1,306 @@ +initializeErrorLog(); + // Path ke file csv + $filePath = realpath(__DIR__ . '/csv/penawaran/mig_penawaran_external.csv'); + + if (!$filePath) { + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/permohonan/mig_penawaran_external.csv'); + $this->command->error('File csv tidak ditemukan.'); + return; + + } + + if (($handle = fopen($filePath, 'r')) === false) { + Log::error('Gagal membuka file CSV: ' . $filePath); + $this->command->error('Gagal membuka file CSV.'); + return; + } + + $header = fgetcsv($handle, 0, '~'); + $rows = []; + $batchSize = 500; // Ukuran batch + $userDataChace = []; + $nomorRegisCahce = []; + $errorCount = 0; // Inisialisasi variabel errorCount + $errorDebitureIds = []; // Inisialisasi array errorDebitureIds + $totalData = 0; + + // Menghitung total data di file CSV + while (($data = fgetcsv($handle, 0, '~')) !== false) { + $totalData++; + } + + rewind($handle); // Reset pointer ke awal file + fgetcsv($handle, 0, '~'); // Skip header + + $batchCount = 0; + $currentRow = 0; + + while (($data = fgetcsv($handle, 0, '~')) !== false) { + if (count($data) != count($header)) { + Log::warning('Baris CSV memiliki jumlah kolom yang tidak sesuai: ' . json_encode($data)); + continue; + } + + $rows[] = array_combine($header, $data); + $currentRow++; + + // Jika sudah mencapai batch size, proses batch + if (count($rows) >= $batchSize) { + $batchCount++; + $this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); + $this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow); + $rows = []; + } + } + + // Proses sisa data jika ada + // print_r($rows[0]); + if (!empty($rows)) { + $batchCount++; + $this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); + $this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow); + } + + fclose($handle); + + $this->command->info("Data debiture berhasil dimigrasikan. Total data: {$totalData}, Total batch: {$batchCount}, Total error: {$errorCount}"); + } + + + private function processBatch( + array $rows, + array &$userDataChace, + array &$nomorRegisCahce, + int &$errorCount, + array &$errorDebitureIds, + int $totalData, + int $batchCount, + int $currentRow + ) { + $userData = []; + foreach ($rows as $index => $row) { + try { + // Jalankan setiap baris dengan transaksi sendiri + DB::beginTransaction(); + + // Cek apakah sudah diproses + $existingRecord = PenawaranTender::where('nomor_registrasi', $row['mig_nomor_jaminan'])->first(); + if ($existingRecord && $existingRecord->created_at) { + $this->command->info('Data sudah diproses sebelumnya: ' . $row['mig_nomor_jaminan']); + continue; + } + + // Ambil nomor registrasi + $nomor_registrasi = $this->getNomorRegistrasiPermohonan($row['mig_nomor_jaminan'], $nomorRegisCahce); + if (!$nomor_registrasi) { + throw new \Exception("Nomor registrasi tidak valid"); + } + + + $userIdUpdate = $this->getUserIdData($row['mig_created_by'] ?? null, $userData)['id']; + $userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id']; + + if (!$userIdUpdate || !$userIdOtorisasi) { + // $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan'); + continue; + } + + // Mapping field user + $mapUser = [ + 'created_by' => $userIdUpdate, + 'updated_by' => $userIdUpdate, + 'authorized_by' => $userIdOtorisasi, + ]; + + // create random code + + $tgl = $this->parseTimestamp($row['mig_tgl_penyerahan']); + + // ambil nilai tahun terakhir contoh 2023 maka ambil 23 + $year = date('y', strtotime($tgl)); + + // random code berdasarkan tgl contoh NP2300001 + + $code = 'NP' . $year . str_pad(rand(1, 99999), 5, '0', STR_PAD_LEFT); // outputnya NP2300001: + // Cek apakah kode sudah ada + $existingCode = PenawaranTender::where('code', $code)->first(); + if ($existingCode) { + $code = 'NP' . $year . str_pad(rand(1, 99999), 5, '0', STR_PAD_LEFT); + } + + + // Buat penilaian + $penilaian = PenawaranTender::create([ + 'code' => $code, + 'nama_kjpp_sebelumnya' => $row['mig_nama_kjpp'], + 'biaya_kjpp_sebelumnya' => $row['mig_tot_jasa'], + 'tanggal_penilaian_sebelumnya' => $this->parseTimestamp($row['mig_tgl_penyerahan']), + 'nomor_registrasi' => $nomor_registrasi, + 'tujuan_penilaian_kjpp_id' => $this->checkTujuanPenilaian($row['mig_mst_jaminan_kd_tujuan_seq']), + 'jenis_laporan_id' => 1, + 'start_date' => $this->parseTimestamp($row['mig_tgl_penyerahan']), + 'end_date' => $this->parseTimestamp($row['mig_terima_laporan']), + 'catatan' => $row['mig_catatan'], + 'status' => 'spk', + 'created_at' => $this->parseTimestamp($row['mig_created_at']), + 'updated_at' => $this->parseTimestamp($row['mig_updated_at']), + 'authorized_by' => $mapUser['authorized_by'], + 'created_by' => $mapUser['created_by'], + 'updated_by' => $mapUser['updated_by'], + ]); + + + + // Commit transaksi + DB::commit(); + $this->command->info('Proses data penilaian ' . $row['mig_nomor_jaminan'] . ' (' . ($index + 1) . '/' . count($rows) . ')'); + + } catch (\Exception $e) { + // Rollback jika ada error + DB::rollBack(); + + Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage()); + $errorCount++; + $errorDebitureIds[] = $row['mig_team_id'] ?? '-'; + $this->logError($row['mig_team_id'] ?? '-', $e->getMessage()); + + continue; + } + } + + $this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds)); + } + + + private function getNomorRegistrasiPermohonan($nomor_registrasi_id, $nomorRegisCahce) + { + if (isset($nomorRegisCahce[$nomor_registrasi_id])) { + return $nomorRegisCahce[$nomor_registrasi_id]; + } + + $nomorRegis = Permohonan::where('nomor_registrasi', $nomor_registrasi_id)->first(); + + if (!$nomorRegis) { + return null; + } + + $nomorRegisCahce[$nomor_registrasi_id] = $nomorRegis->nomor_registrasi; + return $nomorRegis->nomor_registrasi; + } + + private function getUserIdData(?string $code, array &$cache): array + { + if (!$code) { + return ['id' => null, 'branch_id' => null]; + } + + if (isset($cache[$code])) { + return $cache[$code]; + } + + $user = User::where('nik', $code)->first(); + + if ($user) { + $cache[$code] = ['id' => $user->id, 'branch_id' => $user->branch_id]; + return $cache[$code]; + } + + return ['id' => null, 'branch_id' => null]; + } + + private function getUserId($mig_user_id, $userDataChace) + { + if (isset($userDataChace[$mig_user_id])) { + return $userDataChace[$mig_user_id]; + } + + $userId = User::where('nik', $mig_user_id)->first(); + + if (!$userId) { + return null; + } + + $userDataChace[$mig_user_id] = $userId->id; + return $userId->id; + } + + private function parseTimestamp(?string $timestamp): ?string + { + try { + if ($timestamp) { + // Cek jika format hanya tanggal (Y-m-d) + if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $timestamp)) { + return \Carbon\Carbon::createFromFormat('Y-m-d', $timestamp) + ->startOfDay() + ->toDateTimeString(); + } + // Format lengkap (Y-m-d H:i:s) + return \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $timestamp)->toDateTimeString(); + } + return null; + } catch (\Exception $e) { + Log::error('Gagal memparsing timestamp: ' . $timestamp . '. Pesan: ' . $e->getMessage()); + return null; + } + } + + + private function initializeErrorLog() + { + // Jika file lama ada, hapus + if (file_exists($this->errorLogFile)) { + unlink($this->errorLogFile); + } + + // Buat file baru dengan header + $handle = fopen($this->errorLogFile, 'w'); + fputcsv($handle, ['mig_kd_debitur_seq', 'Error']); + fclose($handle); + } + + private function logError(string $kode, string $message) + { + // Catat ke log + Log::error("Error migrasi debiture [$kode]: $message"); + + // Tulis ke file error + $handle = fopen($this->errorLogFile, 'a'); + fputcsv($handle, [$kode, $message]); + fclose($handle); + } + + private function checkTujuanPenilaian($code): int + { + $mapping = [ + 1 => 7, + 2 => 5, + 3 => 8, + 6 => 6, + ]; + + return $mapping[$code] ?? 7; + } +} diff --git a/database/seeders/MigInspeksiHelper.php b/database/seeders/MigInspeksiHelper.php new file mode 100644 index 0000000..5d181cc --- /dev/null +++ b/database/seeders/MigInspeksiHelper.php @@ -0,0 +1,1036 @@ + ['sesuai' => null], + 'hadap_mata_angin' => ['sesuai' => null], + 'bentuk_tanah' => ['bentuk_tanah' => [], 'lainnya' => null], + 'kontur_tanah' => [], + 'ketinggian_tanah' => ['ketinggian' => [], 'lebih_tinggi' => null, 'lebih_rendah' => null], + 'kontur_jalan' => null, + 'ketinggian_jalan' => [], + 'posisi_kavling' => ['posisi_kavling' => [], 'lainnya' => null], + 'tusuk_sate' => 'no', + 'lockland' => 'no', + 'kondisi_fisik_tanah' => ['kondisi_fisik_tanah' => [], 'lainnya' => null] + ]; + + foreach ($rows as $row) { + $name = trim($row['name']); + $keySesuaiORTidak = !empty($row['mig_name_keterangan_lain']) ? 'sesuai' : 'tidak sesuai'; + $value = !empty($row['mig_name_keterangan_lain']) ? $row['mig_name_keterangan_lain'] : $row['mig_name_keterangan']; + + switch ($name) { + case 'Luas Tanah': + $tanah['luas_tanah'][$keySesuaiORTidak] = $value; + break; + + case 'Permukaan dengan Jalan': + $tanah['hadap_mata_angin'][$keySesuaiORTidak] = $value; + break; + + case 'Bentuk Tanah': + if ($value === 'Lainnya') { + $tanah['bentuk_tanah']['bentuk_tanah'][] = $value; + $tanah['bentuk_tanah']['lainnya'] = $row['mig_name_keterangan_lain']; + } else { + $tanah['bentuk_tanah']['bentuk_tanah'][] = $value; + } + break; + + case 'Kontur Tanah': + $tanah['kontur_tanah'][] = $value; + break; + + case 'Peruntukan Tanah': + $tanah['ketinggian_tanah']['ketinggian'][] = $value; + break; + + case 'Fisik Tanah': + $tanah['kondisi_fisik_tanah']['kondisi_fisik_tanah'][] = $value; + break; + } + } + + // Isi default jika kosong + if (empty($tanah['luas_tanah']['sesuai'])) { + $tanah['luas_tanah'] = ['sesuai' => null]; + } + if (empty($tanah['hadap_mata_angin']['sesuai'])) { + $tanah['hadap_mata_angin'] = ['sesuai' => null]; + } + + // Masukkan ke array JSON + $dataToInsertJson[] = json_encode([ + 'tanah' => $tanah + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + return $dataToInsertJson; +} + + +function buildInspeksiBangunan($rows) +{ + $dataToInsertJson = []; + + // Inisialisasi struktur bangunan + $bangunan = [ + 'luas_tanah_bagunan' => ['sesuai' => null], + 'jenis_bangunan' => [], + 'kondisi_bangunan' => [], + 'sifat_bangunan' => [], + 'sifat_bangunan_input' => [null, null, null], + 'spesifikasi_bangunan' => [ + [ + 'bagunan' => 'Bangunan 1', + 'spek_kategori_bangunan' => [ + 'Pondasi' => ['0' => null, '1' => null, 'lainnya' => null], + 'Struktur' => ['0' => null, '1' => null, 'lainnya' => null], + 'Rangka Atap' => ['0' => null, 'lainnya' => null], + 'Tutup Atap' => ['0' => null, 'lainnya' => null], + 'Plafond' => ['lainnya' => null], + 'Dinding' => ['0' => null, '1' => null, 'lainnya' => null], + 'Pelapis Dinding' => ['0' => null, 'lainnya' => null], + 'Pintu Jendela' => ['0' => null, '1' => null, '2' => null, '3' => null, 'lainnya' => null], + 'Lantai' => ['0' => null, '1' => null, 'lainnya' => null], + ] + ] + ], + 'sarana_pelengkap' => [], + 'sarana_pelengkap_input' => [null, null, null, null, null, null, null, null, null] + ]; + + foreach ($rows as $row) { + $name = trim($row['name']); + $keySesuaiORTidak = !empty($row['mig_name_keterangan_lain']) ? 'sesuai' : 'tidak sesuai'; + $value = !empty($row['mig_name_keterangan_lain']) ? $row['mig_name_keterangan_lain'] : $row['mig_name_keterangan']; + + switch ($name) { + case 'Luas Bangunan': + $bangunan['luas_tanah_bagunan'][$keySesuaiORTidak] = $value; + break; + + case 'Jenis Bangunan': + if ($value === 'Lainnya') { + $bangunan['jenis_bangunan'][] = $value; + } else { + $bangunan['jenis_bangunan'][] = $value; + } + break; + + case 'Kondisi Bangunan': + $bangunan['kondisi_bangunan'][] = $value; + break; + + case 'Sifat Bangunan': + $bangunan['sifat_bangunan'][] = $value; + break; + + case 'Lantai': + $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Lantai']['0'] = $value; + break; + + case 'Dinding': + $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Dinding']['0'] = $value; + break; + + case 'Langit-langit / Plafon': + $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Plafond']['lainnya'] = $value; + break; + + case 'Kusen-kusen': + $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Pintu Jendela']['0'] = $value; + break; + + case 'Penutup Atap': + $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Tutup Atap']['0'] = $value; + break; + + case 'Partisi': + $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Dinding']['1'] = $value; + break; + } + } + + // Isi default jika kosong + if (empty($bangunan['luas_tanah_bagunan']['sesuai'])) { + $bangunan['luas_tanah_bagunan'] = ['sesuai' => null]; + } + + // Masukkan ke array JSON + $dataToInsertJson[] = json_encode([ + 'bangunan' => $bangunan + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + return $dataToInsertJson; +} + +function buildRapJsonData($rows) +{ + $dataToInsertJson = []; + + $rapData = [ + "perizinan" => [], + "brosur_price_list" => [], + "pengalaman_developer" => null, + "developer_anggota" => null, + "lainnya_developer" => [], + "kapan_mulai_dibangun" => null, + "kondisi_perumahan" => null, + "progres_pembangunan" => null, + "kontraktor" => null, + "lingkungan_sekitar" => null, + "komplek_disekitar" => null, + "pusat_keramaian" => null, + "transportasi_umum" => null, + "lainnya_kondisi" => [], + "partisi" => new \stdClass(), // Objek partisi + "jumlah_unit" => [], + "batas_batas_perumahan" => [], + "fasus_fasum" => [], + "progres_penjualan" => [], + "harga_unit" => [], + "target_market" => [], + "kerjasama_dengan_bank" => [], + "rute_menuju_lokasi" => null, + "asset" => new \stdClass(), // Struktur asset + "fakta" => new \stdClass(), // Struktur fakta + "foto_gistaru" => null, + "foto_bhumi" => null, + "foto_argis_region" => null, + "foto_tempat" => null + ]; + + foreach ($rows as $row) { + if (!isset($row['mig_key_keterangan'], $row['mig_nilai'])) { + continue; + } + + $key = $row['mig_key_keterangan']; + $value = $row['mig_nilai']; + + switch ($key) { + case 'pengalaman_developer': + $rapData['pengalaman_developer'] = $value; + break; + + case 'developer_anggota': + $rapData['developer_anggota'] = $value; + break; + + case 'kapan_mulai_dibangun': + $rapData['kapan_mulai_dibangun'] = $value; + break; + + case 'kondisi_perumahan': + $rapData['kondisi_perumahan'] = $value; + break; + + case 'progres_pembangunan': + $rapData['progres_pembangunan'] = $value; + break; + + case 'kontraktor': + $rapData['kontraktor'] = $value; + break; + + case 'lingkungan_sekitar': + $rapData['lingkungan_sekitar'] = $value; + break; + + case 'komplek_disekitar': + $rapData['komplek_disekitar'] = $value; + break; + + case 'pusat_keramaian': + $rapData['pusat_keramaian'] = $value; + break; + + case 'transportasi_umum': + $rapData['transportasi_umum'] = $value; + break; + + case 'jumlah_unit': + $rapData['jumlah_unit'][] = $value; + break; + + case 'batas_batas_perumahan': + $rapData['batas_batas_perumahan'][] = $value; + break; + + case 'fasus_fasum': + $rapData['fasus_fasum'][] = $value; + break; + + case 'progres_penjualan': + $rapData['progres_penjualan'][] = $value; + break; + + case 'harga_unit': + $rapData['harga_unit'][] = $value; + break; + + case 'target_market': + $rapData['target_market'][] = $value; + break; + + case 'kerjasama_dengan_bank': + $rapData['kerjasama_dengan_bank'][] = $value; + break; + + case 'rute_menuju_lokasi': + $rapData['rute_menuju_lokasi'] = $value; + break; + + case 'lainnya_developer': + $rapData['lainnya_developer'][] = $value; + break; + + case 'lainnya_kondisi': + $rapData['lainnya_kondisi'][] = $value; + break; + + case 'keterangan': + if (!isset($rapData['fakta']->keterangan)) { + $rapData['fakta']->keterangan = []; + } + $rapData['fakta']->keterangan[] = $value; + break; + case 'Pondasi': + case 'Struktur': + case 'Rangka Atap': + case 'Tutup Atap': + case 'Plafond': + case 'Dinding': + case 'Pelapis Dinding': + case 'Pintu Jendela': + case 'Lantai': + if (!isset($rapData['partisi']->$key)) { + $rapData['partisi']->$key = new \stdClass(); + } + $rapData['partisi']->$key->nama = $key; + $rapData['partisi']->$key->value = $value; + break; + + // Asset + case 'debitur_perwakilan': + if (!isset($rapData['asset']->debitur_perwakilan)) { + $rapData['asset']->debitur_perwakilan = []; + } + $rapData['asset']->debitur_perwakilan[] = $value; + break; + + case 'jenis_asset_sesuai': + if (!isset($rapData['asset']->jenis_asset)) { + $rapData['asset']->jenis_asset = new \stdClass(); + } + $rapData['asset']->jenis_asset->sesuai = $value; + break; + + case 'alamat_sesuai': + if (!isset($rapData['asset']->alamat)) { + $rapData['asset']->alamat = new \stdClass(); + $rapData['asset']->alamat->sesuai = new \stdClass(); + } + $rapData['asset']->alamat->sesuai->address = $value; + break; + + case 'hub_cadeb_sesuai': + if (!isset($rapData['asset']->hub_cadeb)) { + $rapData['asset']->hub_cadeb = new \stdClass(); + } + $rapData['asset']->hub_cadeb->sesuai = $value; + break; + + case 'hub_cadeb_penghuni_sesuai': + if (!isset($rapData['asset']->hub_cadeb_penghuni)) { + $rapData['asset']->hub_cadeb_penghuni = new \stdClass(); + } + $rapData['asset']->hub_cadeb_penghuni->sesuai = $value; + break; + + case 'pihak_bank': + $rapData['asset']->pihak_bank = $value; + break; + + case 'nomor_nib': + $rapData['asset']->nomor_nib = $value; + break; + + case 'kordinat_lng': + $rapData['asset']->kordinat_lng = $value; + break; + + case 'kordinat_lat': + $rapData['asset']->kordinat_lat = $value; + break; + + // Fakta + case 'fakta_positif': + if (!isset($rapData['fakta']->fakta_positif)) { + $rapData['fakta']->fakta_positif = []; + } + $rapData['fakta']->fakta_positif[] = $value; + break; + + case 'fakta_negatif': + if (!isset($rapData['fakta']->fakta_negatif)) { + $rapData['fakta']->fakta_negatif = []; + } + $rapData['fakta']->fakta_negatif[] = $value; + break; + + case 'rute_menuju': + if (!isset($rapData['fakta']->rute_menuju)) { + $rapData['fakta']->rute_menuju = []; + } + $rapData['fakta']->rute_menuju[] = $value; + break; + + case 'batas_batas': + if (!isset($rapData['fakta']->batas_batas)) { + $rapData['fakta']->batas_batas = []; + } + $rapData['fakta']->batas_batas[] = $value; + break; + + case 'kondisi_lingkungan': + if (!isset($rapData['fakta']->kondisi_lingkungan)) { + $rapData['fakta']->kondisi_lingkungan = []; + } + $rapData['fakta']->kondisi_lingkungan[] = $value; + break; + + case 'peruntukan': + $rapData['fakta']->peruntukan = $value; + break; + + case 'kdb': + $rapData['fakta']->kdb = $value; + break; + + case 'kdh': + $rapData['fakta']->kdh = $value; + break; + + case 'gsb': + $rapData['fakta']->gsb = $value; + break; + + case 'max_lantai': + $rapData['fakta']->max_lantai = $value; + break; + + case 'klb': + $rapData['fakta']->klb = $value; + break; + + case 'gss': + $rapData['fakta']->gss = $value; + break; + + case 'pelebaran_jalan': + $rapData['fakta']->pelebaran_jalan = $value; + break; + + case 'nama_petugas': + $rapData['fakta']->nama_petugas = $value; + break; + + default: + break; + } + } + $dataToInsertJson = json_encode($rapData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + return $dataToInsertJson; + +} + + + +function createInspeksiKendaraan($rows) +{ + $buildDataJsonKendaraan = []; + + // Struktur kendaraan sesuai dengan data JSON target + $kendaraan = [ + 'action' => $rows['action'] ?? null, + 'tanggal_survey' => $rows['tanggal_survey'] ?? null, + 'nama_wakil' => $rows['nama_wakil'] ?? null, + 'hub_calon_debitur' => $rows['hub_calon_debitur'] ?? null, + 'nama_jalan' => $rows['nama_jalan'] ?? null, + 'perumahan_gang' => $rows['perumahan_gang'] ?? null, + 'blok_nomor' => $rows['blok_nomor'] ?? null, + 'alamat' => [ + 'sesuai' => $rows['alamat']['sesuai'] ?? [ + "village_code" => null, + "district_code" => null, + "city_code" => null, + "province_code" => null + ], + 'tidak_sesuai' => $rows['alamat']['tidak_sesuai'] ?? null + ], + 'masa_stnk' => $rows['masa_stnk'] ?? null, + 'masa_pajak' => $rows['masa_pajak'] ?? null, + 'kendaraan' => $rows['kendaraan'] ?? [], + 'kendaraan_input' => $rows['kendaraan_input'] ?? [], + 'kondisi' => $rows['kondisi'] ?? null, + 'nomor_polisi' => $rows['nomor_polisi'] ?? null, + 'nomor_polis_tidak_sesuai' => $rows['nomor_polis_tidak_sesuai'] ?? null, + 'merek' => $rows['merek'] ?? null, + 'merek_tidak_sesuai' => $rows['merek_tidak_sesuai'] ?? null, + 'warna' => $rows['warna'] ?? null, + 'warna_tidak_sesuai' => $rows['warna_tidak_sesuai'] ?? null, + 'nomor_rangka' => $rows['nomor_rangka'] ?? null, + 'nomor_rangka_tidak_sesuai' => $rows['nomor_rangka_tidak_sesuai'] ?? null, + 'nomor_mesin' => $rows['nomor_mesin'] ?? null, + 'nomor_mesin_tidak_sesuai' => $rows['nomor_mesin_tidak_sesuai'] ?? null, + 'posisi_kilometer' => $rows['posisi_kilometer'] ?? null, + 'transmisi' => $rows['transmisi'] ?? [], + 'transmisi_input' => $rows['transmisi_input'] ?? [], + 'mesin_panel_instrument' => $rows['mesin_panel_instrument'] ?? [], + 'mesin_panel_instrument_input' => $rows['mesin_panel_instrument_input'] ?? [], + 'fungsi_mesin_panel_instrument' => $rows['fungsi_mesin_panel_instrument'] ?? [], + 'fungsi_mesin_panel_instrument_input' => $rows['fungsi_mesin_panel_instrument_input'] ?? [], + 'interior' => $rows['interior'] ?? [], + 'interior_input' => $rows['interior_input'] ?? [], + 'jumlah_pintu' => $rows['jumlah_pintu'] ?? [], + 'jumlah_pintu_input' => $rows['jumlah_pintu_input'] ?? [], + 'rangka_karoseri' => $rows['rangka_karoseri'] ?? [], + 'rangka_karoseri_input' => $rows['rangka_karoseri_input'] ?? [], + 'ban' => $rows['ban'] ?? [], + 'ban_input' => $rows['ban_input'] ?? [], + 'velg' => $rows['velg'] ?? [], + 'velg_input' => $rows['velg_input'] ?? [], + 'bamper_depan' => $rows['bamper_depan'] ?? [], + 'bamper_depan_input' => $rows['bamper_depan_input'] ?? [], + 'bamper_belakang' => $rows['bamper_belakang'] ?? [], + 'bamper_belakang_input' => $rows['bamper_belakang_input'] ?? [], + 'lampu_depan' => $rows['lampu_depan'] ?? [], + 'lampu_depan_input' => $rows['lampu_depan_input'] ?? [], + 'lampu_belakang' => $rows['lampu_belakang'] ?? [], + 'lampu_belakang_input' => $rows['lampu_belakang_input'] ?? [], + 'kaca_kendaraan' => $rows['kaca_kendaraan'] ?? [], + 'kaca_kendaraan_input' => $rows['kaca_kendaraan_input'] ?? [], + 'air_conditioner' => $rows['air_conditioner'] ?? [], + 'air_conditioner_input' => $rows['air_conditioner_input'] ?? [], + 'tape_radio_cd' => $rows['tape_radio_cd'] ?? [], + 'tape_radio_cd_input' => $rows['tape_radio_cd_input'] ?? [], + 'sensor_parkir' => $rows['sensor_parkir'] ?? [], + 'sensor_parkir_input' => $rows['sensor_parkir_input'] ?? [], + 'sensor_camera_recorder' => $rows['sensor_camera_recorder'] ?? [], + 'sensor_camera_recorder_input' => $rows['sensor_camera_recorder_input'] ?? [], + 'lcd' => $rows['lcd'] ?? [], + 'lcd_input' => $rows['lcd_input'] ?? [], + 'sabuk_keselamatan' => $rows['sabuk_keselamatan'] ?? [], + 'sabuk_keselamatan_input' => $rows['sabuk_keselamatan_input'] ?? [], + 'airbag' => $rows['airbag'] ?? [], + 'airbag_input' => $rows['airbag_input'] ?? [], + 'asuransi' => $rows['asuransi'] ?? [], + 'asuransi_input' => $rows['asuransi_input'] ?? [], + 'perusahaan_asuransi' => $rows['perusahaan_asuransi'] ?? null, + 'tahun_berakhir' => $rows['tahun_berakhir'] ?? null, + 'fakta_positif' => $rows['fakta_positif'] ?? [], + 'fakta_negatif' => $rows['fakta_negatif'] ?? [], + 'analisa_makro' => $rows['analisa_makro'] ?? [], + 'kesimpulan' => $rows['kesimpulan'] ?? [], + 'catatan' => $rows['catatan'] ?? [] + ]; + + // Tambahkan ke array build + $buildDataJsonKendaraan = json_encode($kendaraan, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + + + return $buildDataJsonKendaraan; +} + +function createInspeksiAlatBerat($rows) +{ + $buildDataJson = []; + + // Pastikan rows selalu dalam bentuk array + if (!isset($rows[0])) { + $rows = [$rows]; + } + + foreach ($rows as $row) { + $data = [ + 'action' => $row['action'] ?? null, + + // Informasi Survey + 'tanggal_survey' => $row['tanggal_survey'] ?? null, + 'nama_wakil' => $row['nama_wakil'] ?? null, + 'hub_calon_debitur' => $row['hub_calon_debitur'] ?? null, + 'dengan_wadeb' => $row['dengan_wadeb'] ?? null, + + // Alamat + 'nama_jalan' => $row['nama_jalan'] ?? null, + 'perumahan_gang' => $row['perumahan_gang'] ?? null, + 'blok_nomor' => $row['blok_nomor'] ?? null, + 'alamat' => [ + 'sesuai' => isset($row['alamat']['sesuai']) ? (array)$row['alamat']['sesuai'] : [ + "village_code" => null, + "district_code" => null, + "city_code" => null, + "province_code" => null + ], + 'tidak_sesuai' => $row['alamat']['tidak_sesuai'] ?? null + ], + + // Data Unit + 'jenis_model' => $row['jenis_model'] ?? [], + 'nomor_lambung' => $row['nomor_lambung'] ?? null, + 'model_unit' => $row['model_unit'] ?? null, + 'tahun_pembuatan' => $row['tahun_pembuatan'] ?? null, + 'merk' => $row['merk'] ?? null, + 'negara_pembuat' => $row['negara_pembuat'] ?? null, + 'tahun_pembelian' => $row['tahun_pembelian'] ?? null, + 'nomor_faktur' => $row['nomor_faktur'] ?? null, + 'nomor_kontrak' => $row['nomor_kontrak'] ?? null, + 'nama_pemilik' => $row['nama_pemilik'] ?? null, + 'alamat_pemilik' => $row['alamat_pemilik'] ?? null, + 'nomor_asuransi' => $row['nomor_asuransi'] ?? null, + 'nomor_rangka' => $row['nomor_rangka'] ?? null, + 'nomor_mesin' => $row['nomor_mesin'] ?? null, + 'hour_meters' => $row['hour_mesters'] ?? null, + 'overhaul_mesin' => $row['overhaul_mesin'] ?? null, + + // Kondisi Unit + 'mesin_panel' => $row['mesin_panel'] ?? [], + 'mesin_panel_input' => $row['mesin_panel_input'] ?? [], + 'fungsi_panel' => $row['fungsi_panel'] ?? [], + 'fungsi_panel_input' => $row['fungsi_panel_input'] ?? [], + 'interior' => $row['interior'] ?? [], + 'interior_input' => $row['interior_input'] ?? [], + 'rangka_Karoseri' => $row['rangka_Karoseri'] ?? [], + 'rangka_Karoseri_input' => $row['rangka_Karoseri_input'] ?? [], + 'ban' => $row['ban'] ?? [], + 'ban_input' => $row['ban_input'] ?? null, + 'velg' => $row['velg'] ?? [], + 'velg_input' => $row['velg_input'] ?? [], + 'air_conditioner' => $row['air_conditioner'] ?? [], + 'air_conditioner_input' => $row['air_conditioner_input'] ?? [], + 'aksesoris' => $row['aksesoris'] ?? [], + 'aksesoris_input' => $row['aksesoris_input'] ?? [], + 'lcd' => $row['lcd'] ?? [], + 'lcd_input' => $row['lcd_input'] ?? null, + 'perlengkapan' => $row['perlengkapan'] ?? [], + 'perlengkapan_input' => $row['perlengkapan_input'] ?? [], + 'asuransi' => $row['asuransi'] ?? [], + 'asuransi_input' => $row['asuransi_input'] ?? [], + 'perusahaan_asuransi' => $row['perusahaan_asuransi'] ?? null, + 'tahun_berakhir' => $row['tahun_berakhir'] ?? null, + + // Keselamatan & Fasilitas + 'sensor_kamera' => $row['sensor_kamera'] ?? null, + 'sabuk_keselamatan' => $row['sabuk_keselamatan'] ?? null, + 'air_bag' => $row['air_bag'] ?? null, + + // Analisa + 'fakta_positif' => $row['fakta_positif'] ?? [], + 'fakta_negatif' => $row['fakta_negatif'] ?? [], + 'kesimpulan' => $row['kesimpulan'] ?? null, + 'catatan' => $row['catatan'] ?? null, + + // Info Tambahan + 'bangunan' => $row['bangunan'] ?? [], + 'tanah' => $row['tanah'] ?? [], + 'nama' => $row['nama'] ?? null, + 'type' => $row['type'] ?? null, + 'warna' => $row['warna'] ?? null, + 'lokasi' => $row['lokasi'] ?? null, + 'total' => $row['total'] ?? null, + 'diskon' => $row['diskon'] ?? null, + 'harga_diskon' => $row['harga_diskon'] ?? null, + 'sumber_data' => $row['sumber_data'] ?? null, + 'harga' => $row['harga'] ?? null, + 'tahun' => $row['tahun'] ?? null, + 'transmisi' => $row['transmisi'] ?? null, + 'kordinat_lat' => $row['kordinat_lat'] ?? null, + 'kordinat_lng' => $row['kordinat_lng'] ?? null, + 'merek_buatan' => $row['merek_buatan'] ?? null, + 'kapasitas' => $row['kapasitas'] ?? null, + 'power' => $row['power'] ?? null, + 'kondisi' => $row['kondisi'] ?? null, + ]; + + $buildDataJson[] = $data; + } + + $buildDataJson = json_encode($buildDataJson, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + return $buildDataJson; +} + +function createInspeksiKapal($rows) +{ + $buildDataJson = []; + + // Jika input hanya satu baris, ubah jadi array agar bisa di-loop + if (!isset($rows[0])) { + $rows = [$rows]; + } + + foreach ($rows as $row) { + $data = [ + 'action' => $row['action'] ?? null, + + // Identitas Wakil + 'nama_wakil_debitur' => $row['nama_wakil_debitur'] ?? null, + 'hub_calon_debitur' => $row['hub_calon_debitur'] ?? null, + + // Alamat + 'dermaga' => $row['dermaga'] ?? null, + 'nama_jalan' => $row['nama_jalan'] ?? null, + 'perumahan_gang' => $row['perumahan_gang'] ?? null, + 'blok_nomor' => $row['blok_nomor'] ?? null, + 'bandara' => $row['bandara'] ?? null, + 'alamat' => [ + 'sesuai' => isset($row['alamat']['sesuai']) ? (array)$row['alamat']['sesuai'] : [ + 'village_code' => null, + 'district_code' => null, + 'city_code' => null, + 'province_code' => null + ], + 'tidak_sesuai' => $row['alamat']['tidak_sesuai'] ?? null + ], + + // Data Kapal + 'jenis_kapal' => $row['jenis_kapal'] ?? [], + 'jenis_kapal_lainnya' => $row['jenis_kapal_lainnya'] ?? null, + 'size' => $row['size'] ?? [], + 'kondisi' => $row['kondisi'] ?? null, + 'klasifikasi' => $row['klasifikasi'] ?? [], + 'nama_kapal' => $row['nama_kapal'] ?? null, + 'pemilik_kapal' => $row['pemilik_kapal'] ?? null, + 'bendera' => $row['bendera'] ?? null, + 'nomor_selar' => $row['nomor_selar'] ?? null, + 'kapal' => $row['kapal'] ?? null, + 'galangan_kapal' => $row['galangan_kapal'] ?? null, + 'kapal_shipyard' => $row['kapal_shipyard'] ?? null, + 'tahun_pembuatan' => $row['tahun_pembuatan'] ?? null, + 'tahun_launcing' => $row['tahun_launcing'] ?? null, + 'dwt' => $row['dwt'] ?? null, + 'lwt' => $row['lwt'] ?? null, + 'gross_tonnage' => $row['gross_tonnage'] ?? null, + 'net_tonnage' => $row['net_tonnage'] ?? null, + 'tenaga_mesin' => $row['tenaga_mesin'] ?? null, + 'loa' => $row['loa'] ?? null, + 'lbp' => $row['lbp'] ?? null, + 'beam' => $row['beam'] ?? null, + 'depth' => $row['depth'] ?? null, + 'draft' => $row['draft'] ?? null, + + // Struktur + 'lambung_kapal' => $row['lambung_kapal'] ?? null, + 'dek' => $row['dek'] ?? null, + 'struktur_rangka' => $row['struktur_rangka'] ?? null, + 'palka' => $row['palka'] ?? null, + 'pondasi_mesin' => $row['pondasi_mesin'] ?? null, + 'area_mesin' => $row['area_mesin'] ?? null, + 'cat_dan_korosi' => $row['cat_dan_korosi'] ?? null, + 'sistem_pengelasan' => $row['sistem_pengelasan'] ?? null, + 'deskripsi_struktur' => $row['deskripsi_struktur'] ?? null, + + // Peralatan Keselamatan + 'sekoci' => $row['sekoci'] ?? null, + 'jaket_pelampung' => $row['jaket_pelampung'] ?? null, + 'alat_pemadaman' => $row['alat_pemadaman'] ?? null, + 'rambu_darurat' => $row['rambu_darurat'] ?? null, + 'sistem_alarm' => $row['sistem_alarm'] ?? null, + 'sistem_pencegah' => $row['sistem_pencegah'] ?? null, + 'kebakaran' => $row['kebakaran'] ?? null, + 'lampu_darurat' => $row['lampu_darurat'] ?? null, + 'deskripsi_peralatan' => $row['deskripsi_peralatan'] ?? null, + + // Navigasi + 'gps' => $row['gps'] ?? null, + 'radar' => $row['radar'] ?? null, + 'radio_komunikasi' => $row['radio_komunikasi'] ?? null, + 'lampu_navigasi' => $row['lampu_navigasi'] ?? null, + 'sistem_kendali_otomatis' => $row['sistem_kendali_otomatis'] ?? null, + 'kompas' => $row['kompas'] ?? null, + 'deskripsi_navigasi' => $row['deskripsi_navigasi'] ?? null, + + // Mesin Penggerak + 'mesin_utama' => $row['mesin_utama'] ?? null, + 'mesin_bantu' => $row['mesin_bantu'] ?? null, + 'pompa_pendingin' => $row['pompa_pendingin'] ?? null, + 'sistem_pelumasan' => $row['sistem_pelumasan'] ?? null, + 'propeller' => $row['propeller'] ?? null, + 'sistem_kelistrikan' => $row['sistem_kelistrikan'] ?? null, + 'deskripsi_mesin_penggerak' => $row['deskripsi_mesin_penggerak'] ?? null, + + // Kelistrikan + 'sistem_penerangan' => $row['sistem_penerangan'] ?? null, + 'sistem_panel_distribusi' => $row['sistem_panel_distribusi'] ?? null, + 'kabel_perangkat' => $row['kabel_perangkat'] ?? null, + 'deskripsi_kelistrikan' => $row['deskripsi_kelistrikan'] ?? null, + + // Kebersihan & Lingkungan + 'kebersihan_dek_luar' => $row['kebersihan_dek_luar'] ?? null, + 'tangki_limbah' => $row['tangki_limbah'] ?? null, + 'sistem_pengelolaan_limbah' => $row['sistem_pengelolaan_limbah'] ?? null, + 'pengelolaan_air_ballast' => $row['pengelolaan_air_ballast'] ?? null, + 'deskripsi_kebersihan' => $row['deskripsi_kebersihan'] ?? null, + + // Analisa + 'fakta_positif' => $row['fakta_positif'] ?? [], + 'fakta_negatif' => $row['fakta_negatif'] ?? [], + 'analisa_makro' => $row['analisa_makro'] ?? null, + 'kesimpulan' => $row['kesimpulan'] ?? null, + 'catatan' => $row['catatan'] ?? [], + + // Asset + 'bangunan' => $row['bangunan'] ?? [], + 'tanah' => $row['tanah'] ?? [], + 'asset' => $row['asset'] ?? null, + + // Info Tambahan + 'nama' => $row['nama'] ?? null, + 'type' => $row['type'] ?? null, + 'warna' => $row['warna'] ?? null, + 'lokasi' => $row['lokasi'] ?? null, + 'total' => $row['total'] ?? null, + 'diskon' => $row['diskon'] ?? null, + 'harga_diskon' => $row['harga_diskon'] ?? null, + 'sumber_data' => $row['sumber_data'] ?? null, + 'harga' => $row['harga'] ?? null, + 'tahun' => $row['tahun'] ?? null, + 'transmisi' => $row['transmisi'] ?? null, + 'kordinat_lat' => $row['kordinat_lat'] ?? null, + 'kordinat_lng' => $row['kordinat_lng'] ?? null, + 'merek_buatan' => $row['merek_buatan'] ?? null, + 'kapasitas' => $row['kapasitas'] ?? null, + 'power' => $row['power'] ?? null, + ]; + + $buildDataJson[] = $data; + } + + $buildDataJson = json_encode($buildDataJson, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + return $buildDataJson; +} +function createInspeksiPesawat($rows) +{ + $buildDataJson = []; + + // Pastikan rows selalu dalam bentuk array + if (!isset($rows[0])) { + $rows = [$rows]; + } + + foreach ($rows as $row) { + $data = [ + 'action' => $row['action'] ?? null, + + // Informasi Survey + 'tanggal_survey' => $row['tanggal_survey'] ?? null, + 'nama_wakil' => $row['nama_wakil'] ?? null, + 'hub_calon_debitur' => $row['hub_calon_debitur'] ?? null, + + // Alamat + 'nama_jalan' => $row['nama_jalan'] ?? null, + 'perumahan_gang' => $row['perumahan_gang'] ?? null, + 'blok_nomor' => $row['blok_nomor'] ?? null, + 'bandara' => $row['bandara'] ?? null, + 'alamat' => [ + 'sesuai' => isset($row['alamat']['sesuai']) ? (array)$row['alamat']['sesuai'] : [ + 'village_code' => null, + 'district_code' => null, + 'city_code' => null, + 'province_code' => null + ], + 'tidak_sesuai' => $row['alamat']['tidak_sesuai'] ?? null + ], + + // Data Pesawat + 'jenis_pesawat' => $row['jenis_pesawat'] ?? [], + 'jenis_pesawat_lainnya' => $row['jenis_pesawat_lainnya'] ?? null, + 'size' => $row['size'] ?? [], + 'kondisi' => $row['kondisi'] ?? [], + 'nama_pesawat' => $row['nama_pesawat'] ?? null, + 'model' => $row['model'] ?? null, + 'nomor_registrasi' => $row['nomor_registrasi'] ?? null, + 'tahun_pembuatan' => $row['tahun_pembuatan'] ?? null, + 'certificate_of_airworthines' => $row['certificate_of_airworthines'] ?? null, + 'certificate_of_registration' => $row['certificate_of_registration'] ?? null, + 'total_service_hours' => $row['total_service_hours'] ?? null, + 'total_service_cycles' => $row['total_service_cycles'] ?? null, + + // Maintenance Schedule + 'last_a_check' => $row['last_a_check'] ?? null, + 'next_a_check' => $row['next_a_check'] ?? null, + 'last_b_check' => $row['last_b_check'] ?? null, + 'next_b_check' => $row['next_b_check'] ?? null, + 'last_c_check' => $row['last_c_check'] ?? null, + 'next_c_check' => $row['next_c_check'] ?? null, + 'last_d_check' => $row['last_d_check'] ?? null, + 'next_d_check' => $row['next_d_check'] ?? null, + 'deskripsi_maintenence' => $row['deskripsi_maintenence'] ?? null, + + // Sistem Navigasi & Konfigurasi + 'instrument_landing_system' => $row['instrument_landing_system'] ?? null, + 'traffic_collision_avoidance_system' => $row['traffic_collision_avoidance_system'] ?? null, + 'windshear' => $row['windshear'] ?? null, + 'electronic_flight' => $row['electronic_flight'] ?? null, + 'winglets' => $row['winglets'] ?? null, + 'deskripsi_konfigurasi' => $row['deskripsi_konfigurasi'] ?? null, + + // Interior Kabin + 'maksimal_penumpang' => $row['maksimal_penumpang'] ?? null, + 'jumlah_kursi' => $row['jumlah_kursi'] ?? null, + 'kursi_pramugari_pramugara' => $row['kursi_pramugari_pramugara'] ?? null, + 'kartu_fitur_keselamatan' => $row['kartu_fitur_keselamatan'] ?? null, + 'sabuk_pengaman' => $row['sabuk_pengaman'] ?? null, + 'lampu_kabin' => $row['lampu_kabin'] ?? null, + 'lampu_pintu_keluar' => $row['lampu_pintu_keluar'] ?? null, + 'intercom_kabin' => $row['intercom_kabin'] ?? null, + 'deskripsi_kabin' => $row['deskripsi_kabin'] ?? null, + + // Struktur Pesawat + 'badan_pesawat' => $row['badan_pesawat'] ?? null, + 'sayap_pesawat' => $row['sayap_pesawat'] ?? null, + 'ekor_pesawat' => $row['ekor_pesawat'] ?? null, + 'landing_gear' => $row['landing_gear'] ?? null, + 'sistem_pengelasan' => $row['sistem_pengelasan'] ?? null, + 'deskripsi_struktur' => $row['deskripsi_struktur'] ?? null, + + // Navigasi + 'gps' => $row['gps'] ?? null, + 'radar' => $row['radar'] ?? null, + 'radio_komunikasi' => $row['radio_komunikasi'] ?? null, + 'lampu_navigasi' => $row['lampu_navigasi'] ?? null, + 'sistem_autopilot' => $row['sistem_autopilot'] ?? null, + 'deskripsi_navigasi' => $row['deskripsi_navigasi'] ?? null, + + // Bahan Bakar & Hidrolik + 'tangki_bahan_bakar' => $row['tangki_bahan_bakar'] ?? null, + 'saluran_pipa_bahan_bakar' => $row['saluran_pipa_bahan_bakar'] ?? null, + 'pompa_bahan_bakar' => $row['pompa_bahan_bakar'] ?? null, + 'sistem_hidrolik_utama' => $row['sistem_hidrolik_utama'] ?? null, + 'sistem_pendigin_hidrolik' => $row['sistem_pendigin_hidrolik'] ?? null, + 'deskripsi_hidrolik' => $row['deskripsi_hidrolik'] ?? null, + + // Mesin Penggerak + 'mesin_utama' => $row['mesin_utama'] ?? null, + 'sistem_pendorong' => $row['sistem_pendorong'] ?? null, + 'sistem_pendigin_mesin' => $row['sistem_pendigin_mesin'] ?? null, + 'sistem_pelumasan' => $row['sistem_pelumasan'] ?? null, + 'filter_dan_perangkat_pendukung' => $row['filter_dan_perangkat_pendukung'] ?? null, + 'deskripsi_kondisi_mesin' => $row['deskripsi_kondisi_mesin'] ?? null, + + // Keselamatan Darurat + 'jaket_pelampung' => $row['jaket_pelampung'] ?? null, + 'pintu_darurat' => $row['pintu_darurat'] ?? null, + 'alat_pemadaman_kebakaran' => $row['alat_pemadaman_kebakaran'] ?? null, + 'sistem_alaram_darurat' => $row['sistem_alaram_darurat'] ?? null, + 'sekoci' => $row['sekoci'] ?? null, + 'masker_oxigen' => $row['masker_oxigen'] ?? null, + 'deskripsi_fungsi_keselamatan' => $row['deskripsi_fungsi_keselamatan'] ?? null, + + // Interior Tambahan + 'sistem_ventilasi_ac' => $row['sistem_ventilasi_ac'] ?? null, + 'sistem_penerangan_kabin' => $row['sistem_penerangan_kabin'] ?? null, + 'panel_informasi_penumpang' => $row['panel_informasi_penumpang'] ?? null, + 'sistem_hiburan_kabin' => $row['sistem_hiburan_kabin'] ?? null, + 'deskripsi_Interior' => $row['deskripsi_Interior'] ?? null, + + // Analisa + 'fakta_positif' => $row['fakta_positif'] ?? [], + 'fakta_negatif' => $row['fakta_negatif'] ?? [], + 'kesimpulan' => $row['kesimpulan'] ?? null, + 'catatan' => $row['catatan'] ?? [] + ]; + + $buildDataJson[] = $data; + } + $buildDataJson = json_encode($buildDataJson, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + return $buildDataJson; +} + +function createInspeksiMesin($rows) +{ + $buildDataJson = []; + + // Pastikan input selalu array + if (!isset($rows[0])) { + $rows = [$rows]; + } + + foreach ($rows as $row) { + $data = [ + 'action' => $row['action'] ?? null, + 'nama_wakil' => $row['nama_wakil'] ?? null, + 'nama_jalan' => $row['nama_jalan'] ?? null, + 'perumahan_gang' => $row['perumahan_gang'] ?? null, + 'blok' => $row['blok'] ?? null, + 'desa_kelurahan' => $row['desa_kelurahan'] ?? null, + 'kecamatan' => $row['kecamatan'] ?? null, + 'kota_madya' => $row['kota_madya'] ?? null, + 'provinsi' => $row['provinsi'] ?? null, + 'hub_calon_debitur' => $row['hub_calon_debitur'] ?? null, + 'tipe_model' => $row['tipe_model'] ?? null, + 'merek' => $row['merek'] ?? null, + 'tahun_pembuatan' => $row['tahun_pembuatan'] ?? null, + 'negara_pembuat' => $row['negara_pembuat'] ?? null, + 'kondisi_mesin' => $row['kondisi_mesin'] ?? null, + 'faktor_positif' => is_array($row['faktor_positif']) ? $row['faktor_positif'] : [], + 'faktor_negatif' => is_array($row['faktor_negatif']) ? $row['faktor_negatif'] : [], + 'kesimpulan' => $row['kesimpulan'] ?? null, + 'catatan' => is_array($row['catatan']) ? $row['catatan'] : [] + ]; + + $buildDataJson[] = $data; + } + $buildDataJson = json_encode($buildDataJson, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + return $buildDataJson; +} + + +function createInspeksiRap($rows) +{ + $buildDataJson = []; + + // Pastikan input selalu dalam bentuk array + if (!isset($rows[0])) { + $rows = [$rows]; + } + + foreach ($rows as $row) { + $data = [ + 'perizinan' => isset($row['perizinan']) && is_array($row['perizinan']) ? $row['perizinan'] : [], + 'brosur_price_list' => isset($row['brosur_price_list']) && is_array($row['brosur_price_list']) ? $row['brosur_price_list'] : [], + 'pengalaman_developer' => $row['pengalaman_developer'] ?? null, + 'developer_anggota' => $row['developer_anggota'] ?? null, + 'lainnya_developer' => $row['lainnya_developer'] ?? null, + 'kapan_mulai_dibangun' => $row['kapan_mulai_dibangun'] ?? null, + 'kondisi_perumahan' => $row['kondisi_perumahan'] ?? null, + 'progres_pembangunan' => $row['progres_pembangunan'] ?? null, + 'kontraktor' => $row['kontraktor'] ?? null, + 'lingkungan_sekitar' => $row['lingkungan_sekitar'] ?? null, + 'komplek_disekitar' => $row['komplek_disekitar'] ?? null, + 'pusat_keramaian' => $row['pusat_keramaian'] ?? null, + 'transportasi_umum' => $row['transportasi_umum'] ?? null, + 'lainnya_kondisi' => $row['lainnya_kondisi'] ?? null, + 'partisi' => is_array($row['partisi']) ? $row['partisi'] : [], + 'jumlah_unit' => $row['jumlah_unit'] ?? null, + 'batas_batas_perumahan' => $row['batas_batas_perumahan'] ?? null, + 'fasus_fasum' => $row['fasus_fasum'] ?? null, + 'progres_penjualan' => $row['progres_penjualan'] ?? null, + 'harga_unit' => $row['harga_unit'] ?? null, + 'target_market' => $row['target_market'] ?? null, + 'kerjasama_dengan_bank' => $row['kerjasama_dengan_bank'] ?? null, + 'rute_menuju_lokasi' => $row['rute_menuju_lokasi'] ?? null, + 'properti_sejenis' => $row['properti_sejenis'] ?? null + ]; + + $buildDataJson[] = $data; + } + + return $buildDataJson; +} diff --git a/database/seeders/MigPenilaianAndPenilainTeamSeeder.php b/database/seeders/MigPenilaianAndPenilainTeamSeeder.php index a8cf0e8..91daec3 100644 --- a/database/seeders/MigPenilaianAndPenilainTeamSeeder.php +++ b/database/seeders/MigPenilaianAndPenilainTeamSeeder.php @@ -11,10 +11,9 @@ use Modules\Usermanagement\Models\User; use Modules\Lpj\Models\PenilaianTeam; use Modules\Lpj\Models\Permohonan; - class MigPenilaianAndPenilainTeamSeeder extends Seeder { - protected $errorLogFile = __DIR__ . '/csv/penilaian/error_migration_penilaian_and_team.csv'; + protected $errorLogFile = __DIR__ . '/csv/penilaian/mig_penilaian_and_team_error.csv'; /** * Run the database seeds. @@ -23,182 +22,187 @@ class MigPenilaianAndPenilainTeamSeeder extends Seeder { // Bersihkan/Inisialisasi file error log $this->initializeErrorLog(); - // Path ke file csv - $filePath = realpath(__DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv'); + // Path ke file csv + $filePath = realpath(__DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv'); - if (!$filePath) { - Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv'); - $this->command->error('File csv tidak ditemukan.'); - return; - } + if (!$filePath) { + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv'); + $this->command->error('File csv tidak ditemukan.'); + return; - if (($handle = fopen($filePath, 'r')) === false) { - Log::error('Gagal membuka file CSV: ' . $filePath); - $this->command->error('Gagal membuka file CSV.'); - return; - } - $header = fgetcsv($handle, 0, '~'); - $rows = []; - $batchSize = 500; // Ukuran batch - $userDataChace = []; - $nomorRegisCahce = []; - $errorCount = 0; // Inisialisasi variabel errorCount - $errorDebitureIds = []; // Inisialisasi array errorDebitureIds - $totalData = 0; - // Menghitung total data di file CSV - while (($data = fgetcsv($handle, 0, '~')) !== false) { - $totalData++; - } - - rewind($handle); // Reset pointer ke awal file - fgetcsv($handle, 0, '~'); // Skip header - - $batchCount = 0; - $currentRow = 0; - - while (($data = fgetcsv($handle, 0, '~')) !== false) { - if (count($data) != count($header)) { - Log::warning('Baris CSV memiliki jumlah kolom yang tidak sesuai: ' . json_encode($data)); - continue; } - $rows[] = array_combine($header, $data); - $currentRow++; + if (($handle = fopen($filePath, 'r')) === false) { + Log::error('Gagal membuka file CSV: ' . $filePath); + $this->command->error('Gagal membuka file CSV.'); + return; + } - // Jika sudah mencapai batch size, proses batch - if (count($rows) >= $batchSize) { + $header = fgetcsv($handle, 0, '~'); + $rows = []; + $batchSize = 500; // Ukuran batch + $userDataChace = []; + $nomorRegisCahce = []; + $errorCount = 0; // Inisialisasi variabel errorCount + $errorDebitureIds = []; // Inisialisasi array errorDebitureIds + $totalData = 0; + + // Menghitung total data di file CSV + while (($data = fgetcsv($handle, 0, '~')) !== false) { + $totalData++; + } + + rewind($handle); // Reset pointer ke awal file + fgetcsv($handle, 0, '~'); // Skip header + + $batchCount = 0; + $currentRow = 0; + + while (($data = fgetcsv($handle, 0, '~')) !== false) { + if (count($data) != count($header)) { + Log::warning('Baris CSV memiliki jumlah kolom yang tidak sesuai: ' . json_encode($data)); + continue; + } + + $rows[] = array_combine($header, $data); + $currentRow++; + + // Jika sudah mencapai batch size, proses batch + if (count($rows) >= $batchSize) { + $batchCount++; + $this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); + $this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow); + $rows = []; + } + } + + // Proses sisa data jika ada + // print_r($rows[0]); + if (!empty($rows)) { $batchCount++; $this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); $this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow); - $rows = []; } + + fclose($handle); + + $this->command->info("Data debiture berhasil dimigrasikan. Total data: {$totalData}, Total batch: {$batchCount}, Total error: {$errorCount}"); } - // Proses sisa data jika ada - // print_r($rows[0]); - if (!empty($rows)) { - $batchCount++; - $this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); - $this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow); - } - - fclose($handle); - - $this->command->info("Data debiture berhasil dimigrasikan. Total data: {$totalData}, Total batch: {$batchCount}, Total error: {$errorCount}"); -} + private function processBatch( + array $rows, + array &$userDataChace, + array &$nomorRegisCahce, + int &$errorCount, + array &$errorDebitureIds, + int $totalData, + int $batchCount, + int $currentRow + ) { + $userData = []; + foreach ($rows as $index => $row) { + try { + // Jalankan setiap baris dengan transaksi sendiri + DB::beginTransaction(); -private function processBatch( - array $rows, - array &$userDataChace, - array &$nomorRegisCahce, - int &$errorCount, - array &$errorDebitureIds, - int $totalData, - int $batchCount, - int $currentRow -) { - $userData = []; - foreach ($rows as $index => $row) { - try { - // Jalankan setiap baris dengan transaksi sendiri - DB::beginTransaction(); + // Cek apakah sudah diproses + $existingRecord = Penilaian::where('nomor_registrasi', $row['mig_nomor_registrasi'])->first(); + if ($existingRecord && $existingRecord->created_at) { + $this->command->info('Data sudah diproses sebelumnya: ' . $row['mig_nomor_registrasi']); + continue; + } - // Cek apakah sudah diproses - $existingRecord = Penilaian::where('nomor_registrasi', $row['mig_nomor_registrasi'])->first(); - if ($existingRecord && $existingRecord->created_at) { - $this->command->info('Data sudah diproses sebelumnya: ' . $row['mig_nomor_registrasi']); - continue; - } + // Ambil nomor registrasi + $nomor_registrasi = $this->getNomorRegistrasiPermohonan($row['mig_nomor_registrasi'], $nomorRegisCahce); + if (!$nomor_registrasi) { + throw new \Exception("Nomor registrasi tidak valid"); + } - // Ambil nomor registrasi - $nomor_registrasi = $this->getNomorRegistrasiPermohonan($row['mig_nomor_registrasi'], $nomorRegisCahce); - if (!$nomor_registrasi) { - throw new \Exception("Nomor registrasi tidak valid"); - } + // Ambil user ID + $userId = $this->getUserId($row['mig_user_id'], $userDataChace); + if (!$userId) { + // $this->logError($row['mig_user_id'], 'Salah satu user tidak ditemukan'); + throw new \Exception($row['mig_user_id'] . " User tidak ditemukan"); + continue; + } - // Ambil user ID - $userId = $this->getUserId($row['mig_user_id'], $userDataChace); - if (!$userId ) { - throw new \Exception("User tidak ditemukan"); - continue; - } + $userIdUpdate = $this->getUserIdData($row['mig_created_by'] ?? null, $userData)['id']; + $userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id']; - $userIdUpdate = $this->getUserIdData($row['mig_created_by'] ?? null, $userData)['id']; - $userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id']; + if (!$userIdUpdate || !$userIdOtorisasi) { + // $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan'); + continue; + } - if (!$userIdUpdate || !$userIdOtorisasi) { - $this->logError($kode, 'Salah satu user tidak ditemukan'); - continue; - } + // Mapping field user + $mapUser = [ + 'created_by' => $userIdUpdate, + 'updated_by' => $userIdUpdate, + 'authorized_by' => $userIdOtorisasi, + ]; - // Mapping field user - $mapUser = [ - 'created_by' => $userIdUpdate, - 'updated_by' => $userIdUpdate, - 'authorized_by' => $userIdOtorisasi, - ]; + // Ambil team ID + $teamId = $this->checkTeams($row['mig_team_id']); + if (!$teamId) { + throw new \Exception("Team tidak ditemukan"); + } - // Ambil team ID - $teamId = $this->checkTeams($row['mig_team_id']); - if (!$teamId) { - throw new \Exception("Team tidak ditemukan"); - } - - // Buat penilaian - $penilaian = Penilaian::create([ - 'nomor_registrasi' => $nomor_registrasi, - 'jenis_penilaian_id' => 1, - 'tanggal_kunjungan' => $this->parseTimestamp($row['mig_tanggal_kunjungan']) ?? now(), - 'waktu_penilaian' => $this->parseTimestamp($row['mig_waktu_penilaian']), - 'status' => 'done', - 'keterangan' => null, - 'created_at' => $this->parseTimestamp($row['mig_created_at']), - 'updated_at' => $this->parseTimestamp($row['mig_updated_at']), - 'authorized_by' => $mapUser['authorized_by'], - 'created_by' => $mapUser['created_by'], - 'updated_by' => $mapUser['updated_by'], - ]); - - // Buat tim penilaian - $roles = ['surveyor', 'penilai']; - foreach ($roles as $role) { - PenilaianTeam::create([ - 'penilaian_id' => $penilaian->id, - 'user_id' => $userId, - 'role' => $role, - 'team_id' => $teamId, + // Buat penilaian + $penilaian = Penilaian::create([ + 'nomor_registrasi' => $nomor_registrasi, + 'jenis_penilaian_id' => 1, + 'tanggal_kunjungan' => $this->parseTimestamp($row['mig_tanggal_kunjungan']) ?? now(), + 'waktu_penilaian' => $this->parseTimestamp($row['mig_waktu_penilaian']), + 'status' => 'done', + 'keterangan' => null, 'created_at' => $this->parseTimestamp($row['mig_created_at']), 'updated_at' => $this->parseTimestamp($row['mig_updated_at']), + 'authorized_by' => $mapUser['authorized_by'], + 'created_by' => $mapUser['created_by'], + 'updated_by' => $mapUser['updated_by'], ]); + + // Buat tim penilaian + $roles = ['surveyor', 'penilai']; + foreach ($roles as $role) { + PenilaianTeam::create([ + 'penilaian_id' => $penilaian->id, + 'user_id' => $userId, + 'role' => $role, + 'team_id' => $teamId, + 'created_at' => $this->parseTimestamp($row['mig_created_at']), + 'updated_at' => $this->parseTimestamp($row['mig_updated_at']), + ]); + } + + // Commit transaksi + DB::commit(); + $this->command->info('Proses data penilaian ' . $row['mig_nomor_lpj'] . ' (' . ($index + 1) . '/' . count($rows) . ')'); + + } catch (\Exception $e) { + // Rollback jika ada error + DB::rollBack(); + + Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage()); + $errorCount++; + $errorDebitureIds[] = $row['mig_team_id'] ?? '-'; + $this->logError($row['mig_team_id'] ?? '-', $e->getMessage()); + + continue; } - - // Commit transaksi - DB::commit(); - $this->command->info('Proses data penilaian ' . $row['mig_nama_user'] . ' (' . ($index + 1) . '/' . count($rows) . ')'); - - } catch (\Exception $e) { - // Rollback jika ada error - DB::rollBack(); - - Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage()); - $errorCount++; - $errorDebitureIds[] = $row['mig_team_id'] ?? '-'; - $this->logError($row['mig_team_id'] ?? '-', $e->getMessage()); - - continue; } + + $this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds)); } - $this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds)); -} - - private function getNomorRegistrasiPermohonan($nomor_registrasi_id, $nomorRegisCahce){ + private function getNomorRegistrasiPermohonan($nomor_registrasi_id, $nomorRegisCahce) + { if (isset($nomorRegisCahce[$nomor_registrasi_id])) { return $nomorRegisCahce[$nomor_registrasi_id]; } @@ -214,7 +218,9 @@ private function processBatch( } private function getUserIdData(?string $code, array &$cache): array { - if (!$code) return ['id' => null, 'branch_id' => null]; + if (!$code) { + return ['id' => null, 'branch_id' => null]; + } if (isset($cache[$code])) { return $cache[$code]; @@ -260,27 +266,27 @@ private function processBatch( private function parseTimestamp(?string $timestamp): ?string -{ - try { - if ($timestamp) { - // Cek jika format hanya tanggal (Y-m-d) - if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $timestamp)) { - return \Carbon\Carbon::createFromFormat('Y-m-d', $timestamp) - ->startOfDay() - ->toDateTimeString(); + { + try { + if ($timestamp) { + // Cek jika format hanya tanggal (Y-m-d) + if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $timestamp)) { + return \Carbon\Carbon::createFromFormat('Y-m-d', $timestamp) + ->startOfDay() + ->toDateTimeString(); + } + // Format lengkap (Y-m-d H:i:s) + return \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $timestamp)->toDateTimeString(); } - // Format lengkap (Y-m-d H:i:s) - return \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $timestamp)->toDateTimeString(); + return null; + } catch (\Exception $e) { + Log::error('Gagal memparsing timestamp: ' . $timestamp . '. Pesan: ' . $e->getMessage()); + return null; } - return null; - } catch (\Exception $e) { - Log::error('Gagal memparsing timestamp: ' . $timestamp . '. Pesan: ' . $e->getMessage()); - return null; } -} -private function initializeErrorLog() + private function initializeErrorLog() { // Jika file lama ada, hapus if (file_exists($this->errorLogFile)) { diff --git a/database/seeders/MigrationDebitureSeeder.php b/database/seeders/MigrationDebitureSeeder.php index daeafa1..56da723 100644 --- a/database/seeders/MigrationDebitureSeeder.php +++ b/database/seeders/MigrationDebitureSeeder.php @@ -108,10 +108,10 @@ class MigrationDebitureSeeder extends Seeder $userIdUpdate = $this->getUserId($row['mig_user_update'] ?? null, $userData)['id']; $userIdOtorisasi = $this->getUserId($row['mig_user_oto'] ?? null, $userData)['id']; - if (!$userIdUpdate || !$userIdOtorisasi) { - $this->logError($kode, 'Salah satu user tidak ditemukan'); - continue; - } + // if (!$userIdUpdate || !$userIdOtorisasi) { + // $this->logError($kode, 'Salah satu user tidak ditemukan'); + // continue; + // } // Mapping field user $mapUser = [ @@ -147,8 +147,8 @@ class MigrationDebitureSeeder extends Seeder 'address' => $row['address'] ?? null, 'authorized_at' => $authorizedAt, 'authorized_by' => $mapUser['authorized_by'], - 'created_by' => $mapUser['created_by'], - 'updated_by' => $mapUser['updated_by'], + 'created_by' => $mapUser['created_by'] ?? null, + 'updated_by' => $mapUser['updated_by'] ?? null, 'created_at' => $createdAt, 'updated_at' => $updatedAt, 'mig_kd_debitur_seq' => $row['mig_kd_debitur_seq'], diff --git a/database/seeders/MigrationDetailDokumenJaminanSeeder.php b/database/seeders/MigrationDetailDokumenJaminanSeeder.php index aafbc27..a322eef 100644 --- a/database/seeders/MigrationDetailDokumenJaminanSeeder.php +++ b/database/seeders/MigrationDetailDokumenJaminanSeeder.php @@ -19,7 +19,7 @@ use Illuminate\Support\Facades\Log; class MigrationDetailDokumenJaminanSeeder extends Seeder { - protected $errorLogFile = __DIR__ . '/csv/mig_pemilik_dan_dokument_error.csv'; + protected $errorLogFile = __DIR__ . '/csv/detail-dokumen/mig_detail_dokument_external_error.csv'; /** * Run the database seeds. */ @@ -28,10 +28,10 @@ class MigrationDetailDokumenJaminanSeeder extends Seeder { $this->initializeErrorLog(); // Path ke file csv - $filePath = realpath(__DIR__ . '/csv/detail-dokumen/mig_detail_dokumen.csv'); + $filePath = realpath(__DIR__ . '/csv/detail-dokumen/mig_detail_dokument_external.csv'); if (!$filePath) { - Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/detail-dokumen/mig_detail_dokumen.csv'); + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/detail-dokumen/mig_detail_dokument_external.csv'); $this->command->error('File csv tidak ditemukan.'); return; } @@ -112,97 +112,183 @@ class MigrationDetailDokumenJaminanSeeder extends Seeder int &$errorCount, array &$errorDebitureIds ) { - foreach ($rows as $index => $row) { + $groupedRows = $this->groupRowsByNomorLaporanAndKeterangan($rows); + + // print_r($groupedRows); + + foreach ($groupedRows as $nomorLaporan => $dataPerGrup) { + + // print_r($dataPerGrup); try { - // Pastikan field penting tersedia - if (!isset($row['mig_grp_keterangan'], $row['mig_key_keterangan'], $row['mig_nilai'])) { - throw new \Exception('Field wajib tidak ditemukan'); - } + // Ambil salah satu baris untuk referensi (misal baris pertama dari grup) + $firstRow = reset($dataPerGrup)['details'] ? reset($dataPerGrup) : reset($dataPerGrup); + $debiturId = null; - $debiturId = $row['mig_kd_debitur_seq'] ?? null; - $jaminanGroup = $row['mig_grp_keterangan']; - $keyName = $row['mig_key_keterangan']; - $value = $row['mig_nilai']; - $urlFile = $row['mig_url_file'] ?? null; - - // Inisialisasi struktur jika belum ada - if (!isset($this->result[$jaminanGroup])) { - $this->result[$jaminanGroup] = [ - 'group' => $jaminanGroup, - 'details' => [], - 'documents' => [] - ]; - } - - // Gabungkan detail - $detailItem = [$keyName => $value]; - if (!empty($this->result[$jaminanGroup]['details'])) { - $existingDetails = $this->result[$jaminanGroup]['details'][0]; - $detailItem = array_merge($existingDetails, $detailItem); - } - $this->result[$jaminanGroup]['details'] = [$detailItem]; - - // Tambahkan dokumen jika ada - if ($urlFile && !in_array($urlFile, $this->result[$jaminanGroup]['documents'])) { - $this->result[$jaminanGroup]['documents'][] = $urlFile; - } - - // Jika sudah akhir group atau baris terakhir, simpan ke DB - if ($index === count($rows) - 1 || $row['mig_grp_keterangan'] !== $rows[$index + 1]['mig_grp_keterangan']) { - - // Ambil ID dokumen jaminan - $dokumenJaminanId = $this->getDokumenJaminanId($debiturId, $dokumenJaminanCache); - if (!$dokumenJaminanId) { - throw new \Exception('Dokumen jaminan tidak ditemukan'); + // Cari debitur ID dari salah satu field + foreach ($rows as $row) { + if ($row['mig_nomor_laporan'] == $nomorLaporan) { + $debiturId = $row['mig_kd_debitur_seq'] ?? null; + break; } + } - // Ambil ID legalitas jaminan - $legalitasJaminanId = $this->getLegalitasJaminanId($jaminanGroup, $jenisJaminanCache); + if (!$debiturId) { + throw new \Exception('Debitur ID tidak ditemukan'); + } + + // Ambil ID dokumen jaminan + $dokumenJaminanId = $this->getDokumenJaminanId($debiturId, $dokumenJaminanCache); + if (!$dokumenJaminanId) { + throw new \Exception('Dokumen jaminan tidak ditemukan'); + } + + foreach ($dataPerGrup as $groupKey => $rowData) { + // Ambil legalitas jaminan ID berdasarkan grup keterangan + $legalitasJaminanId = $this->getLegalitasJaminanId($groupKey, $jenisJaminanCache); if (!$legalitasJaminanId) { - throw new \Exception('Legalitas jaminan tidak ditemukan'); + throw new \Exception("Legalitas jaminan tidak ditemukan untuk grup: {$groupKey}"); } - // Encode hasil sementara - $jsonResult = json_encode($this->result[$jaminanGroup], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - $dataJsonDecode = json_decode($jsonResult); - // Simpan ke database - DetailDokumenJaminan::create([ - 'name' => $jaminanGroup, - 'dokumen_jaminan_id' => $dokumenJaminanId, - 'details' => isset($dataJsonDecode->details) ? json_encode($dataJsonDecode->details) : null, - 'jenis_legalitas_jaminan_id' => $legalitasJaminanId, - 'dokumen_jaminan' => !empty($dataJsonDecode->documents) ? json_encode($dataJsonDecode->documents) : null, - 'dokumen_nomor' => $row['dokumen_nomor'] ?? null, - 'keterangan' => $row['mig_deskripsi_file'] ?? null, - ]); - - // Hapus dari result set agar tidak duplikat - unset($this->result[$jaminanGroup]); - - // Info progress - $this->command->info('Proses data detail dokumen (' . ($index + 1) . '/' . count($rows) - . ', batch ke: ' . $batchCount - . ', total dari: ' . $currentRow . '/' . $totalData . ')'); - + DetailDokumenJaminan::updateOrCreate( + [ + 'name' => $groupKey, + 'dokumen_jaminan_id' => $dokumenJaminanId, + ], + [ + 'details' => json_encode($rowData['details']), + 'jenis_legalitas_jaminan_id' => $legalitasJaminanId, + 'dokumen_jaminan' => !empty($rowData['documents']) ? json_encode($rowData['documents']) : null, + 'dokumen_nomor' => $nomorLaporan, + 'keterangan' => $groupKey, + ] + ); } - } catch (\Exception $e) { - Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage()); + // Info progress + $this->command->info("Proses data detail dokumen (Nomor Laporan: {$nomorLaporan}, batch ke: {$batchCount}, total dari: {$currentRow}/{$totalData})"); - // Catat error ke file CSV + } catch (\Exception $e) { + Log::error("Error pada nomor laporan {$nomorLaporan}: " . $e->getMessage()); $this->logError($debiturId ?? '-', $e->getMessage()); $errorDebitureIds[] = $debiturId ?? '-'; - - continue; + $errorCount++; } } - - // Reset result set setelah batch selesai - $this->result = []; } + private function groupRowsByNomorLaporann(array $rows): array + { + $grouped = []; + + foreach ($rows as $row) { + $nomorJaminan = $row['mig_nomor_laporan'] ?? null; + if (!empty($nomorJaminan)) { + $grouped[$nomorJaminan][] = $row; + } + } + + return $grouped; + } + + + // private function groupRowsByNomorLaporanAndKeterangan(array $rows): array + // { + // $groupedByNomorLaporan = $this->groupRowsByNomorLaporann($rows); + // $finalGrouped = []; + + // foreach ($groupedByNomorLaporan as $nomorLaporan => $rowList) { + // $groupedByGrpKeterangan = []; + + // // Urutkan berdasarkan mig_urutan_sub (ascending) + // usort($rowList, function ($a, $b) { + // return $a['mig_urutan_sub'] <=> $b['mig_urutan_sub']; + // }); + + // foreach ($rowList as $row) { + // $grpKeterangan = $row['mig_grp_keterangan'] ?? 'UNKNOWN_GROUP'; + + // if (!isset($groupedByGrpKeterangan[$grpKeterangan])) { + // $groupedByGrpKeterangan[$grpKeterangan] = [ + // 'details' => [], + // 'documents' => [] + // ]; + // } + + // $keyKeterangan = $row['mig_key_keterangan'] ?? 'UNKNOWN_KEY'; + // $value = $row['mig_nilai'] ?? null; + + // // Jika belum ada detail, inisialisasi sebagai array asosiatif + // if (empty($groupedByGrpKeterangan[$grpKeterangan]['details'])) { + // $groupedByGrpKeterangan[$grpKeterangan]['details'][] = []; + // } + + // // Masukkan ke dalam object tunggal (bukan item baru) + // if ($value !== null) { + // $lastIndex = count($groupedByGrpKeterangan[$grpKeterangan]['details']) - 1; + // $groupedByGrpKeterangan[$grpKeterangan]['details'][$lastIndex][$keyKeterangan] = $value; + // } + + // // Tambahkan dokumen jika ada + // $urlFile = $row['mig_url_file'] ?? null; + // if (!empty($urlFile)) { + // $groupedByGrpKeterangan[$grpKeterangan]['documents'][] = $urlFile; + // } + // } + + // $finalGrouped[$nomorLaporan] = $groupedByGrpKeterangan; + // } + + // // print_r($finalGrouped); + // return $finalGrouped; + // } + + + private function groupRowsByNomorLaporanAndKeterangan(array $rows): array +{ + $groupedByNomorLaporan = $this->groupRowsByNomorLaporann($rows); + $finalGrouped = []; + + foreach ($groupedByNomorLaporan as $nomorLaporan => $rowList) { + $groupedByGrpKeterangan = []; + + // Urutkan berdasarkan mig_urutan_sub + usort($rowList, function ($a, $b) { + return $a['mig_urutan_sub'] <=> $b['mig_urutan_sub']; + }); + + foreach ($rowList as $row) { + $grpKeterangan = $row['mig_grp_keterangan'] ?? 'UNKNOWN_GROUP'; + $keyKeterangan = $row['mig_key_keterangan'] ?? 'UNKNOWN_KEY'; + $value = $row['mig_nilai'] ?? null; + + if (!isset($groupedByGrpKeterangan[$grpKeterangan])) { + $groupedByGrpKeterangan[$grpKeterangan] = [ + 'details' => [], + 'documents' => [] + ]; + } + + // Masukkan sebagai object baru ke dalam details + if ($value !== null) { + $groupedByGrpKeterangan[$grpKeterangan]['details'][] = [ + $keyKeterangan => $value + ]; + } + + // Dokumen tetap masuk sebagai array string + $urlFile = $row['mig_url_file'] ?? null; + if (!empty($urlFile)) { + $groupedByGrpKeterangan[$grpKeterangan]['documents'][] = $urlFile; + } + } + + $finalGrouped[$nomorLaporan] = $groupedByGrpKeterangan; + } + + return $finalGrouped; +} private function getDokumenJaminanId(string $code, array &$dokumenJaminanCache) { if (isset($dokumenJaminanCache[$code])) { diff --git a/database/seeders/MigrationDokumentJaminanSeeder.php b/database/seeders/MigrationDokumentJaminanSeeder.php index 0cb5d62..c25cf2c 100644 --- a/database/seeders/MigrationDokumentJaminanSeeder.php +++ b/database/seeders/MigrationDokumentJaminanSeeder.php @@ -19,7 +19,7 @@ use Illuminate\Support\Facades\Log; class MigrationDokumentJaminanSeeder extends Seeder { - protected $errorLogFile = __DIR__ . '/csv/dokumen-dan-pemilik/mig_pemilik_dan_dokument_error.csv'; + protected $errorLogFile = __DIR__ . '/csv/dokumen-pemilik/mig_pemilik_dan_dokument_external_error_log.csv'; /** * Run the database seeds. */ @@ -27,10 +27,10 @@ class MigrationDokumentJaminanSeeder extends Seeder { $this->initializeErrorLog(); // Path ke file csv - $filePath = realpath(__DIR__ . '/csv/dokumen-dan-pemilik/mig_pemilik_dan_dokument.csv'); + $filePath = realpath(__DIR__ . '/csv/dokumen-pemilik/mig_pemilik_dan_dokument_external.csv'); if (!$filePath) { - Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/mig_pemilik_dan_dokument.csv'); + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/dokumen-pemilik/mig_pemilik_dan_dokument_external.csv'); $this->command->error('File csv tidak ditemukan.'); return; } @@ -125,39 +125,45 @@ class MigrationDokumentJaminanSeeder extends Seeder DB::beginTransaction(); // Cari permohonan - $permohonan = $this->getPermohonanId( - $row['mig_kd_debitur_seq'], - $row['mig_nomor_jaminan'], - $permohonanCache - ); - if (empty($permohonan['debiture_id'])) { - throw new \Exception('Missing debiture_id'); + $permohonan = Permohonan::where('nomor_registrasi', $row['mig_nomor_jaminan'])->first(); + + if (empty($permohonan)) { + throw new \Exception('Missing debiture_id' . $row['mig_nomor_jaminan']); + continue; } // Pastikan permohonan_id belum digunakan di dokumen_jaminan - $existingDokumen = DokumenJaminan::where('permohonan_id', $permohonan['id'])->first(); + $existingDokumen = DokumenJaminan::where('permohonan_id', $permohonan->id)->first(); if ($existingDokumen) { - throw new \Exception("permohonan_id {$permohonan['id']} sudah digunakan di dokumen_jaminan"); + throw new \Exception("permohonan_id {$permohonan->id} sudah digunakan di dokumen_jaminan"); + continue; } // Ambil lokasi + + // jika external silahkan matikan ini + $proviceCode = $this->getProvinceCode($row['mig_province_name'], $provinceCache); $cityCode = $this->getCityCode($row['mig_city_name'], $cityCache); $districtCode = $this->getDistrictCode($row['mig_district_name'], $districtCache); $subdistrict = $this->getSubdistrictCode($row['mig_village_name'], $subdistrictCache, $districtCache); - $hubunganPemilik = $this->getHubunganPemilikJaminanId($row['mig_hubungan_pemilik_jaminan'], $hubunganPemilikCache); + // $hubunganPemilik = $this->getHubunganPemilikJaminanId($row['mig_hubungan_pemilik_jaminan'], $hubunganPemilikCache); + + $pemilik_jaminan_name = $this->getDebitureId($row['mig_kd_debitur_seq'], $pemilikJaminanCache); // Buat Pemilik Jaminan - $pemilik_jaminan = PemilikJaminan::create([ - 'debiture_id' => $permohonan['debiture_id'], - 'hubungan_pemilik_jaminan_id' => $hubunganPemilik, - 'name' => $row['name'], + $pemilik_jaminan = PemilikJaminan::updateOrCreate([ + 'debiture_id' => $permohonan->debiture_id, + 'hubungan_pemilik_jaminan_id' => 1, + // 'name' => $row['name'], + 'name' => $pemilik_jaminan_name, 'detail_sertifikat' => null, 'npwp' => null, 'nomor_id' => null, 'email' => null, 'phone' => null, + // jika external silahkan matikan ini 'province_code' => $proviceCode, 'city_code' => $cityCode, 'district_code' => $districtCode, @@ -172,16 +178,17 @@ class MigrationDokumentJaminanSeeder extends Seeder ]); // Buat Dokumen Jaminan - DokumenJaminan::create([ - 'debiture_id' => $permohonan['debiture_id'], - 'permohonan_id' => $permohonan['id'], - 'jenis_jaminan_id' => 17, + DokumenJaminan::updateOrCreate([ + 'debiture_id' => $permohonan->debiture_id, + 'permohonan_id' => $permohonan->id, + 'jenis_jaminan_id' => $this->getJaminanId($row['mig_jenis_seq']), 'pemilik_jaminan_id' => $pemilik_jaminan->id, - 'province_code' => $proviceCode, - 'city_code' => $cityCode, - 'district_code' => $districtCode, - 'village_code' => $subdistrict['code'], - 'postal_code' => $subdistrict['postal_code'], + // jika external silahkan matikan ini + // 'province_code' => $proviceCode, + // 'city_code' => $cityCode, + // 'district_code' => $districtCode, + // 'village_code' => $subdistrict['code'], + // 'postal_code' => $subdistrict['postal_code'], 'address' => $row['address'], 'created_at' => $this->parseTimestamp($row['created_at']), 'updated_at' => $this->parseTimestamp($row['updated_at']), @@ -201,50 +208,57 @@ class MigrationDokumentJaminanSeeder extends Seeder Log::error("Error pada baris: " . json_encode($row) . ". Pesan: " . $e->getMessage()); $this->logError($row['mig_kd_debitur_seq'] ?? '-', $e->getMessage()); $errorDebitureIds[] = $row['mig_kd_debitur_seq'] ?? '-'; + continue; } } $this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds)); } - private function getPermohonanId(string $code, string $mig_nomor_jaminan, array &$cache): ?array + // private function getPermohonanId($code,$cache) + // { + // if (isset($cache[$code])) { + // return $cache[$code]; + // } + + // $permohonan = Permohonan::where('mig_kd_debitur_seq', $code)->where('nomor_registrasi', $mig_nomor_jaminan)->first(); + + // if ($permohonan) { + // $cache[$code] = $permohonan; + // return $permohonan; + // } + + // return null; + // } + + + private function getJaminanId($code): ?int { - if (isset($cache[$code])) { - return $cache[$code]; - } - - $permohonan = Permohonan::where('mig_kd_debitur_seq', $code)->where('nomor_registrasi', $mig_nomor_jaminan)->first(); - - if ($permohonan) { - $cache[$code] = [ - 'id' => $permohonan->id, - 'debiture_id' => $permohonan->debiture_id, - 'mig_kd_debitur_seq' => $permohonan->mig_kd_debitur_seq - ]; - return $cache[$code]; - } - - return [ - 'id' => null, - 'debiture_id' => null, - 'mig_kd_debitur_seq' => null + $mapping = [ + 7 => 17, + 8 => 13, + 6 => 32, + 1 => 17, + 2 => 26, + 3 => 27, + 4 => 50, + 5 => 21, + 138051314724 => 23, + 138027243057 => 34, + 138027664224 => 35, + 138027738489 => 10, + 138051485796 => 48, + 138051492883 => 47, + 138051515419 => 40, + 138051753311 => 41, + 138051754843 => 46, + 138051759078 => 42, + 138051480538 => 45, + 123382184742 => 18, + 138051483711 => 44, + 991 => 52 ]; - } - - private function getJaminanId(string $code, array &$cache): ?int - { - if (isset($cache[$code])) { - return $cache[$code]; - } - - $jaminan = JenisJaminan::whereRaw('LOWER(name) = ?', [strtolower($code)])->first(); - - if ($jaminan) { - $cache[$code] = $jaminan->id; - return $jaminan->id; - } - - return null; + return $mapping[$code] ?? 17; } private function getPemilikJaminanId(string $code, array &$cache): ?int @@ -263,7 +277,7 @@ class MigrationDokumentJaminanSeeder extends Seeder return 1; } - private function getDebitureId(string $code, array &$cache): ?int + private function getDebitureId(string $code, array &$cache): ?string { if (isset($cache[$code])) { return $cache[$code]; @@ -272,8 +286,8 @@ class MigrationDokumentJaminanSeeder extends Seeder $debiture = Debiture::where('mig_kd_debitur_seq', $code)->first(); if ($debiture) { - $cache[$code] = $debiture->id; - return $debiture->id; + $cache[$code] = $debiture->name; + return $debiture->name; } return null; diff --git a/database/seeders/MigrationGambarInspeksiSeeder.php b/database/seeders/MigrationGambarInspeksiSeeder.php index 3da57af..c39f284 100644 --- a/database/seeders/MigrationGambarInspeksiSeeder.php +++ b/database/seeders/MigrationGambarInspeksiSeeder.php @@ -9,21 +9,27 @@ use Modules\Lpj\Models\Inspeksi; use Modules\Basicdata\Models\Branch; use Modules\Lpj\Models\DokumenJaminan; use Modules\Lpj\Models\Permohonan; +use DateTime; class MigrationGambarInspeksiSeeder extends Seeder { /** * Run the database seeds. */ - protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_foto_error.csv'; + protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_foto_20253_error.csv'; + /** + * Migrasi data gambar inspeksi dari file csv ke tabel inspeksi_gambar + * + * @return void + */ public function run() { $this->initializeErrorLog(); // Path ke file csv - $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_foto.csv'); + $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_foto_20253.csv'); if (!$filePath) { - Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_foto.csv'); + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_foto_20253.csv'); $this->command->error('File csv tidak ditemukan.'); return; } @@ -82,43 +88,44 @@ class MigrationGambarInspeksiSeeder extends Seeder } private function processBatch(array $rows, array &$branchCache, array &$userData, int &$errorCount, array &$errorDebitureIds, int $totalData, int $batchCount, int $currentRow) -{ - // Kelompokkan berdasarkan mig_nomor_jaminan - $groupedRows = $this->groupRowsByJaminan($rows); + { + // Kelompokkan berdasarkan mig_nomor_jaminan + $groupedRows = $this->groupRowsByJaminan($rows); - foreach ($groupedRows as $nomorJaminan => $groupRows) { - try { - // Ambil informasi permohonan dan dokument_id - $nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache); - if (!$nomorRegis) { - Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}"); + foreach ($groupedRows as $nomorJaminan => $groupRows) { + try { + // Ambil informasi permohonan dan dokument_id + $nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache); + if (!$nomorRegis) { + Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}"); + $errorCount++; + $errorDebitureIds[] = $nomorJaminan; + continue; + } + + // Bangun JSON foto_form + $fotoJson = $this->checkFoto($groupRows); + + Inspeksi::where('permohonan_id', $nomorRegis['id']) + ->where('dokument_id', $nomorRegis['dokument_id']) + ->whereNotNull('data_form') + ->update([ + 'foto_form' => $fotoJson, + 'updated_at' => now() + ]); + + $this->command->info("Berhasil update foto_form untuk nomor jaminan: {$nomorJaminan}"); + + } catch (\Exception $e) { + Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage()); $errorCount++; $errorDebitureIds[] = $nomorJaminan; continue; } - - // Bangun JSON foto_form - $fotoJson = $this->checkFoto($groupRows); - - Inspeksi::where('permohonan_id', $nomorRegis['id']) - ->where('dokument_id', $nomorRegis['dokument_id']) - ->whereNotNull('data_form') - ->update([ - 'foto_form' => $fotoJson, - 'updated_at' => now() - ]); - - $this->command->info("Berhasil update foto_form untuk nomor jaminan: {$nomorJaminan}"); - - } catch (\Exception $e) { - Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage()); - $errorCount++; - $errorDebitureIds[] = $nomorJaminan; - continue; } } -} - private function groupRowsByJaminan(array $rows): array { + private function groupRowsByJaminan(array $rows): array + { $grouped = []; foreach ($rows as $row) { @@ -133,46 +140,101 @@ class MigrationGambarInspeksiSeeder extends Seeder } + + + private function checkFoto(array $rows) { - $fotos = []; + // Inisialisasi kelompok untuk tiap kategori + $kategoriPrioritas = [ + 'PETA LOKASI' => [], + 'GAMBAR SITUASI / SURAT UKUR' => [], + 'FOTO JAMINAN' => [], + 'lainnya' => [] + ]; foreach ($rows as $row) { - // Pastikan kolom ada - $namaFoto = trim($row['mig_nama_gambar'] ?? ''); - $pathFoto = trim($row['mig_url_gambar'] ?? ''); - $kategori = trim($row['mig_kategori'] ?? 'lainnya'); - $urutan = (int)($row['mig_urutan_gambar'] ?? 999); // Default urutan besar jika tidak ada + // Ambil kolom penting + $namaFoto = trim($row['mig_nama_gambar'] ?? ''); + $pathFoto = trim($row['mig_url_gambar'] ?? ''); + $kategori = trim($row['mig_kategori'] ?? 'lainnya'); + $urutan = (int)($row['mig_urutan_gambar'] ?? 999); + $tgl = trim($row['mig_tgl'] ?? ''); + $nomorLpj = trim($row['mig_nomor_laporan'] ?? ''); - if (empty($pathFoto)) { - continue; // skip jika path kosong + if (empty($pathFoto) || empty($tgl)) { + continue; // Lewati jika tidak lengkap } - $fotos[] = [ + try { + $tanggal = \Carbon\Carbon::createFromFormat('Y-m-d', $tgl); + if (!$tanggal) { + throw new \Exception("Tanggal tidak valid"); + } + } catch (\Exception $e) { + continue; // Lewati jika tanggal tidak valid + } + + $tahun = $tanggal->format('Y'); + $bulanAngka = $tanggal->format('n'); + $bulanNama = [ + 1 => 'JANUARI', 2 => 'FEBRUARI', 3 => 'MARET', + 4 => 'APRIL', 5 => 'MEI', 6 => 'JUNI', + 7 => 'JULI', 8 => 'AGUSTUS', 9 => 'SEPTEMBER', + 10 => 'OKTOBER', 11 => 'NOVEMBER', 12 => 'DESEMBER' + ][(int)$bulanAngka] ?? 'UNKNOWN'; + + $tanggalFormat = $tanggal->format('dmY'); + + if (empty($namaFoto)) { + $namaFoto = basename($pathFoto) ?: 'image.jpg'; + } + + // Gunakan '/' sebagai separator path + $finalPath = "surveyor/{$tahun}/{$bulanNama}/{$tanggalFormat}/{$nomorLpj}/{$pathFoto}"; + + $fotoItem = [ 'urutan' => $urutan, 'name' => $namaFoto, - 'path' => $pathFoto, + 'path' => $finalPath, 'category' => $kategori, 'sub' => null, 'description' => '', 'created_by' => null, 'created_at' => null ]; + + // Masukkan ke dalam kelompok kategori + if (isset($kategoriPrioritas[$kategori])) { + $kategoriPrioritas[$kategori][] = $fotoItem; + } else { + $kategoriPrioritas['lainnya'][] = $fotoItem; + } } - // Urutkan array berdasarkan mig_urutan_gambar - usort($fotos, function ($a, $b) { - return $a['urutan'] <=> $b['urutan']; - }); + // Urutkan masing-masing kategori berdasarkan urutan + foreach ($kategoriPrioritas as &$kelompok) { + usort($kelompok, function ($a, $b) { + return $a['urutan'] <=> $b['urutan']; + }); + } - // Hapus indeks 'urutan' setelah diurutkan + // Gabungkan dengan urutan prioritas: PETA LOKASI -> GAMBAR SITUASI -> FOTO JAMINAN -> lainnya + $finalFotos = array_merge( + $kategoriPrioritas['PETA LOKASI'], + $kategoriPrioritas['GAMBAR SITUASI / SURAT UKUR'], + $kategoriPrioritas['FOTO JAMINAN'], + $kategoriPrioritas['lainnya'] + ); + + // Hapus indeks 'urutan' $finalFotos = array_map(function ($foto) { unset($foto['urutan']); return $foto; - }, $fotos); + }, $finalFotos); return json_encode([ - 'foto_jaminan' => $finalFotos + 'upload_foto' => $finalFotos ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); } private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache) diff --git a/database/seeders/MigrationInpseksiSeeder.php b/database/seeders/MigrationInpseksiSeeder.php index bbaca5e..1cd0443 100644 --- a/database/seeders/MigrationInpseksiSeeder.php +++ b/database/seeders/MigrationInpseksiSeeder.php @@ -14,9 +14,11 @@ use Modules\Location\Models\District; use Modules\Location\Models\Province; use Modules\Location\Models\Village; +// Load file helper +require_once __DIR__ . '/MigInspeksiHelper.php'; class MigrationInpseksiSeeder extends Seeder { - protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_error_2025.csv'; + protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_2025_error.csv'; // protected $fielKesimpulan = ; /** * Run the database seeds. @@ -28,7 +30,7 @@ class MigrationInpseksiSeeder extends Seeder $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_2025.csv'); if (!$filePath) { - Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_2022.csv'); + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_2025.csv'); $this->command->error('File csv tidak ditemukan.'); return; } @@ -86,74 +88,80 @@ class MigrationInpseksiSeeder extends Seeder } - private function processBatch( - array $rows, - array &$branchCache, - array &$debitureCache, - int &$errorCount, - array &$errorDebitureIds, - int $totalData, - int $batchCount, - int $currentRow - ) { - // Kelompokkan baris berdasarkan mig_nomor_jaminan - $groupedData = $this->groupRowsByJaminan($rows); + private function processBatch( + array $rows, + array &$branchCache, + array &$debitureCache, + int &$errorCount, + array &$errorDebitureIds, + int $totalData, + int $batchCount, + int $currentRow +) { + // Kelompokkan baris berdasarkan mig_nomor_jaminan + $groupedData = $this->groupRowsByJaminan($rows); - foreach ($groupedData as $nomorJaminan => $groupRows) { - // try { - // Cek apakah sudah ada di inspeksi + foreach ($groupedData as $nomorJaminan => $groupRows) { + try { + // Ambil informasi permohonan + $nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache); + if (!$nomorRegis) { + Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}"); + $errorCount++; + $errorDebitureIds[] = $nomorJaminan; + continue; + } + // Cek apakah sudah ada data + $existingRecord = Inspeksi::where('permohonan_id', $nomorRegis['id']) + ->where('dokument_id', $nomorRegis['dokument_id']) + ->whereNotNull('data_form') + ->first(); - // Ambil informasi permohonan - $nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache); - if (!$nomorRegis) { - Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}"); - $errorCount++; - $errorDebitureIds[] = $nomorJaminan; - continue; - } + if ($existingRecord) { + $this->command->info("Data untuk nomor jaminan {$nomorJaminan} sudah ada. Lewati..."); + continue; + } - $existingRecord = Inspeksi::where('permohonan_id', $nomorRegis['id']) - ->where('dokument_id', $nomorRegis['dokument_id']) - ->whereNotNull('data_form') - ->first(); + // Ambil baris pertama untuk created_at/updated_at + $firstRow = reset($groupRows); - if ($existingRecord) { - $this->command->info("Data untuk nomor jaminan {$nomorJaminan} sudah ada. Lewati..."); - continue; - } + // Bangun JSON lengkap + $dataFormJson = $this->buildFullDataForm($groupRows); + $jenisJaminan = $this->checkJenisJaminan($groupRows[0]['mig_name'] ?? ''); - // Ambil created_at / updated_at dari baris pertama - $firstRow = reset($groupRows); + if (!$dataFormJson) { + Log::warning("Data form kosong untuk nomor jaminan: {$nomorJaminan}"); + $errorCount++; + $errorDebitureIds[] = $nomorJaminan; + continue; + } - // Bangun JSON lengkap - $dataFormJson = $this->buildFullDataForm($groupRows); + // Simpan ke database hanya sekali per grup + Inspeksi::create([ + 'name' => $jenisJaminan, + 'data_form' => $dataFormJson, + 'foto_form' => null, + 'data_pembanding' => null, + 'permohonan_id' => $nomorRegis['id'] ?? null, + 'dokument_id' => $nomorRegis['dokument_id'] ?? null, + 'created_at' => $this->parseTimestamp($firstRow['created_at'] ?? null), + 'updated_at' => $this->parseTimestamp($firstRow['updated_at'] ?? null), + 'nomor_lpj' => $nomorJaminan, + 'processed_at' => now(), + 'is_mig' => 1 + ]); - // Simpan ke database hanya sekali per grup - Inspeksi::create([ - 'name' => 'tanah,bangunan,lingkungan,fakta,informasi', - 'data_form' => $dataFormJson, - 'foto_form' => null, - 'data_pembanding' => null, - 'permohonan_id' => $nomorRegis['id'] ?? null, - 'dokument_id' => $nomorRegis['dokument_id'] ?? null, - 'created_at' => $this->parseTimestamp($firstRow['created_at']), - 'updated_at' => $this->parseTimestamp($firstRow['updated_at']), - 'nomor_lpj' => $nomorJaminan, - 'processed_at' => now(), - 'is_mig' => 1 - ]); + $this->command->info("Berhasil simpan data inspeksi untuk nomor jaminan: {$nomorJaminan}"); - $this->command->info("Berhasil simpan data inspeksi untuk nomor jaminan: {$nomorJaminan}"); - - // } catch (\Exception $e) { - // Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage()); - // $errorCount++; - // $errorDebitureIds[] = $nomorJaminan; - // continue; - // } + } catch (\Exception $e) { + Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage()); + $errorCount++; + $errorDebitureIds[] = $nomorJaminan; + continue; } } +} private function groupRowsByJaminan(array $rows): array { $grouped = []; @@ -199,34 +207,29 @@ class MigrationInpseksiSeeder extends Seeder } - private function buildFullDataForm(array $rows) - { - - $assetJson = json_decode($this->checkAsset($rows)[0] ?? '', true); - $tanahJson = json_decode($this->checkTanah($rows)[0] ?? '', true); - $bangunanJson = json_decode($this->checkBangunan($rows)[0] ?? '', true); - $lingkunganJson = json_decode($this->checkLingkungan($rows)[0] ?? '', true); - - - $nomorLpj = $rows[0]['mig_nomor_lpj'] ?? null; - - $kesimpulanRows = $this->loadKesimpulanByNomorLpj($nomorLpj); - - $faktaJson = []; - if (!empty($kesimpulanRows)) { - $faktaResult = $this->checkKesimpulan($kesimpulanRows); - $faktaJson = json_decode($faktaResult[0] ?? '', true)['fakta'] ?? []; - } - - return json_encode([ - 'asset' => $assetJson['asset'] ?? [], - 'tanah' => $tanahJson['tanah'] ?? [], - 'bangunan' => $bangunanJson['bangunan'] ?? [], - 'lingkungan' => $lingkunganJson['lingkungan'] ?? [], - 'fakta' => $faktaJson - ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); +private function buildFullDataForm(array $rows) +{ + if (empty($rows)) { + return null; } + $jenisJaminan = $rows[0]['mig_name'] ?? null; + + if (!$jenisJaminan) { + return null; + } + + try { + $jsonResult = $this->checkBuildJson($jenisJaminan, $rows); + // Validasi apakah hasil JSON valid + json_decode($jsonResult); + return $jsonResult; + } catch (\Exception $e) { + Log::error("Gagal build JSON untuk jenis jaminan {$jenisJaminan}: " . $e->getMessage()); + return null; + } +} + private function loadKesimpulanByNomorLpj($nomorLpj) { @@ -264,173 +267,6 @@ class MigrationInpseksiSeeder extends Seeder - private function checkTanah($rows) - { - $dataToInsertJson = []; - $tanah = [ - 'luas_tanah' => ['sesuai' => null], - 'hadap_mata_angin' => ['sesuai' => null], - 'bentuk_tanah' => ['bentuk_tanah' => [], 'lainnya' => null], - 'kontur_tanah' => [], - 'ketinggian_tanah' => ['ketinggian' => [], 'lebih_tinggi' => null, 'lebih_rendah' => null], - 'kontur_jalan' => null, - 'ketinggian_jalan' => [], - 'posisi_kavling' => ['posisi_kavling' => [], 'lainnya' => null], - 'tusuk_sate' => 'no', - 'lockland' => 'no', - 'kondisi_fisik_tanah' => ['kondisi_fisik_tanah' => [], 'lainnya' => null] - ]; - - foreach ($rows as $row) { - $name = trim($row['name']); - $keySesuaiORTidak = !empty($row['mig_name_keterangan_lain']) ? 'sesuai' : 'tidak sesuai'; - $value = !empty($row['mig_name_keterangan_lain']) ? $row['mig_name_keterangan_lain'] : $row['mig_name_keterangan']; - - switch ($name) { - case 'Luas Tanah': - $tanah['luas_tanah'][$keySesuaiORTidak] = $value; - break; - - case 'Permukaan dengan Jalan': - $tanah['hadap_mata_angin'][$keySesuaiORTidak] = $value; - break; - - case 'Bentuk Tanah': - if ($value === 'Lainnya') { - $tanah['bentuk_tanah']['bentuk_tanah'][] = $value; - $tanah['bentuk_tanah']['lainnya'] = $row['mig_name_keterangan_lain']; - } else { - $tanah['bentuk_tanah']['bentuk_tanah'][] = $value; - } - break; - - case 'Kontur Tanah': - $tanah['kontur_tanah'][] = $value; - break; - - case 'Peruntukan Tanah': - $tanah['ketinggian_tanah']['ketinggian'][] = $value; - break; - - case 'Fisik Tanah': - $tanah['kondisi_fisik_tanah']['kondisi_fisik_tanah'][] = $value; - break; - } - } - - // Isi default jika kosong - if (empty($tanah['luas_tanah']['sesuai'])) { - $tanah['luas_tanah'] = ['sesuai' => null]; - } - if (empty($tanah['hadap_mata_angin']['sesuai'])) { - $tanah['hadap_mata_angin'] = ['sesuai' => null]; - } - - // Masukkan ke array JSON - $dataToInsertJson[] = json_encode([ - 'tanah' => $tanah - ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - - return $dataToInsertJson; - } - - private function checkBangunan($rows) - { - $dataToInsertJson = []; - - // Inisialisasi struktur bangunan - $bangunan = [ - 'luas_tanah_bagunan' => ['sesuai' => null], - 'jenis_bangunan' => [], - 'kondisi_bangunan' => [], - 'sifat_bangunan' => [], - 'sifat_bangunan_input' => [null, null, null], - 'spesifikasi_bangunan' => [ - [ - 'bagunan' => 'Bangunan 1', - 'spek_kategori_bangunan' => [ - 'Pondasi' => ['0' => null, '1' => null, 'lainnya' => null], - 'Struktur' => ['0' => null, '1' => null, 'lainnya' => null], - 'Rangka Atap' => ['0' => null, 'lainnya' => null], - 'Tutup Atap' => ['0' => null, 'lainnya' => null], - 'Plafond' => ['lainnya' => null], - 'Dinding' => ['0' => null, '1' => null, 'lainnya' => null], - 'Pelapis Dinding' => ['0' => null, 'lainnya' => null], - 'Pintu Jendela' => ['0' => null, '1' => null, '2' => null, '3' => null, 'lainnya' => null], - 'Lantai' => ['0' => null, '1' => null, 'lainnya' => null], - ] - ] - ], - 'sarana_pelengkap' => [], - 'sarana_pelengkap_input' => [null, null, null, null, null, null, null, null, null] - ]; - - foreach ($rows as $row) { - $name = trim($row['name']); - $keySesuaiORTidak = !empty($row['mig_name_keterangan_lain']) ? 'sesuai' : 'tidak sesuai'; - $value = !empty($row['mig_name_keterangan_lain']) ? $row['mig_name_keterangan_lain'] : $row['mig_name_keterangan']; - - switch ($name) { - case 'Luas Bangunan': - $bangunan['luas_tanah_bagunan'][$keySesuaiORTidak] = $value; - break; - - case 'Jenis Bangunan': - if ($value === 'Lainnya') { - $bangunan['jenis_bangunan'][] = $value; - } else { - $bangunan['jenis_bangunan'][] = $value; - } - break; - - case 'Kondisi Bangunan': - $bangunan['kondisi_bangunan'][] = $value; - break; - - case 'Sifat Bangunan': - $bangunan['sifat_bangunan'][] = $value; - break; - - case 'Lantai': - $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Lantai']['0'] = $value; - break; - - case 'Dinding': - $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Dinding']['0'] = $value; - break; - - case 'Langit-langit / Plafon': - $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Plafond']['lainnya'] = $value; - break; - - case 'Kusen-kusen': - $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Pintu Jendela']['0'] = $value; - break; - - case 'Penutup Atap': - $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Tutup Atap']['0'] = $value; - break; - - case 'Partisi': - $bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Dinding']['1'] = $value; - break; - } - } - - // Isi default jika kosong - if (empty($bangunan['luas_tanah_bagunan']['sesuai'])) { - $bangunan['luas_tanah_bagunan'] = ['sesuai' => null]; - } - - // Masukkan ke array JSON - $dataToInsertJson[] = json_encode([ - 'bangunan' => $bangunan - ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - - return $dataToInsertJson; - } - - private function checkLingkungan($rows) { $dataToInsertJson = []; @@ -605,9 +441,15 @@ class MigrationInpseksiSeeder extends Seeder } // Isi default jika kosong - if (empty($hubCadeb)) $hubCadeb = ["tidak sesuai" => null]; - if (empty($hubPenghuni)) $hubPenghuni = ["tidak sesuai" => null]; - if (empty($jenisAsset)) $jenisAsset = ["sesuai" => null]; + if (empty($hubCadeb)) { + $hubCadeb = ["tidak sesuai" => null]; + } + if (empty($hubPenghuni)) { + $hubPenghuni = ["tidak sesuai" => null]; + } + if (empty($jenisAsset)) { + $jenisAsset = ["sesuai" => null]; + } // Bangun struktur JSON $asset = [ @@ -677,7 +519,8 @@ class MigrationInpseksiSeeder extends Seeder 'gss' => null, 'pelebaran_jalan' => null, 'nama_petugas' => null, - 'keterangan' => [] + 'keterangan' => [], + 'saran' => [] ]; foreach ($rows as $row) { @@ -705,13 +548,19 @@ class MigrationInpseksiSeeder extends Seeder $fakta['kondisi_lain_bangunan'][] = $keterangan; break; - case 'Informasi Dokumen': + case 'Lain - lain': $fakta['informasi_dokument'][] = $keterangan; break; - case 'Lain - lain': + case 'CATATAN YANG PERLU DIPERHATIKAN': $fakta['keterangan'][] = $keterangan; break; + case 'Catatan': + $fakta['keterangan'][] = $keterangan; + break; + case 'Saran': + $fakta['saran'][] = $keterangan; + break; } } @@ -838,7 +687,7 @@ class MigrationInpseksiSeeder extends Seeder fclose($handle); } - private function logError( $nomorJaminan, string $message) + private function logError($nomorJaminan, string $message) { Log::error("Error migrasi permohonan [$nomorJaminan]: $message"); @@ -847,4 +696,163 @@ class MigrationInpseksiSeeder extends Seeder fputcsv($handle, [$nomorJaminan, $message]); } + + + public function checkJenisJaminan($input) + { + $input = trim($input); + switch ($input) { + case 'Tanah dan Bangunan eks KPR-BPPN': + return 'tanah, bangunan, lingkungan, fakta, informasi'; + case 'Pabrik': + return 'tanah, bangunan, lingkungan, fakta, informasi'; + case 'Kapal Laut': + return 'kapal-laut'; + + case 'Tanah dan/atau Bangunan': + return 'tanah, bangunan'; + + case 'Kendaraan Bermotor': + return 'kendaraan-'; + + case 'Mesin-mesin dan Peralatan': + return 'mesin'; + + case 'Barang Dagangan/FEO': + return 'barang-dagangan'; + + case 'Pesawat Udara': + return 'pesawat-udara'; + + case 'Alat Berat': + return 'alat-berat'; + + case 'Deposito': + return 'deposito'; + + case 'Rekening Giro / Tabungan': + return 'rekening-giro-tabungan'; + + case 'Emas': + return 'emas'; + + case 'Jaminan Pribadi / Personal Guarantee': + return 'jaminan-pribadi'; + + case 'Jaminan Perusahaan / Corporate Guarantee': + return 'jaminan-perusahaan'; + + case 'Resi Gudang': + return 'resi-gudang'; + + case 'Surat Berharga dan Saham': + return 'surat-berharga-saham'; + + case 'Tanah dan Bangunan (KerjaSama)': + return 'tanah-bangunan-kerja-sama'; + + case 'Tanah Kavling (Kerjasama)': + return 'tanah-kavling'; + + case 'Persediaan Barang / Barang Dagangan': + return 'persediaan-barang'; + + case 'Apartemen': + return 'apartemen'; + + case 'Tagihan / Piutang Dagang': + return 'tagihan-piutang'; + + case 'Tanah dan/atau Bangunan KPR - SEDERHANA': + return 'tanah-bangunan-kpr-sederhana'; + + default: + return 'lainnya'; + } + } + + public function checkBuildJson($input, $rows = []) +{ + $input = trim($input); + + // Pastikan rows selalu array + if (!is_array($rows)) { + $rows = [$rows]; + } + + switch ($input) { + case 'Tanah dan Bangunan eks KPR-BPPN': + case 'Pabrik': + case 'Tanah dan/atau Bangunan': + case 'Apartemen': + case 'Tanah dan/atau Bangunan KPR - SEDERHANA': + $assetJson = json_decode($this->checkAsset($rows)[0] ?? '', true); + $tanahJson = json_decode(buildInspeksiTanah($rows)[0] ?? '', true); + $bangunanJson = json_decode(buildInspeksiBangunan($rows)[0] ?? '', true); + $lingkunganJson = json_decode($this->checkLingkungan($rows)[0] ?? '', true); + + $nomorLpj = $rows[0]['mig_nomor_lpj'] ?? null; + $kesimpulanRows = $this->loadKesimpulanByNomorLpj($nomorLpj); + + $faktaJson = []; + if (!empty($kesimpulanRows)) { + $faktaResult = $this->checkKesimpulan($kesimpulanRows); + $faktaJson = json_decode($faktaResult[0] ?? '', true)['fakta'] ?? []; + } + + return json_encode([ + 'asset' => $assetJson['asset'] ?? [], + 'tanah' => $tanahJson['tanah'] ?? [], + 'bangunan' => $bangunanJson['bangunan'] ?? [], + 'lingkungan' => $lingkunganJson['lingkungan'] ?? [], + 'fakta' => $faktaJson + ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + case 'Kapal Laut': + $kapal = createInspeksiKapal($rows); + return json_encode($kapal, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + case 'Kendaraan Bermotor': + $kendaraan = createInspeksiKendaraan($rows); + return json_encode($kendaraan, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + case 'Mesin-mesin dan Peralatan': + $mesin = createInspeksiMesin($rows); + return json_encode($mesin, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + case 'Pesawat Udara': + $pesawat = createInspeksiPesawat($rows); + return json_encode($pesawat, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + case 'Alat Berat': + $alatBerat = createInspeksiAlatBerat($rows); + return json_encode($alatBerat, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + + case 'Barang Dagangan/FEO': + case 'Deposito': + case 'Rekening Giro / Tabungan': + case 'Emas': + case 'Jaminan Pribadi / Personal Guarantee': + case 'Jaminan Perusahaan / Corporate Guarantee': + case 'Resi Gudang': + case 'Surat Berharga dan Saham': + case 'Persediaan Barang / Barang Dagangan': + case 'Tagihan / Piutang Dagang': + return json_encode([ + 'status' => 'pending', + 'message' => 'Fungsi untuk "' . $input . '" belum diimplementasikan.', + 'data' => $rows + ]); + case 'Tanah dan Bangunan (KerjaSama)': + case 'Tanah Kavling (Kerjasama)': + $pesawat = buildRapJsonData($rows); + return json_encode($pesawat, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + default: + return json_encode([ + 'status' => 'unknown', + 'message' => 'Jenis aset tidak dikenali: ' . $input, + 'data' => $rows + ]); + } +} } diff --git a/database/seeders/MigrationPembandingSeeder.php b/database/seeders/MigrationPembandingSeeder.php index 690b51d..9825be6 100644 --- a/database/seeders/MigrationPembandingSeeder.php +++ b/database/seeders/MigrationPembandingSeeder.php @@ -12,17 +12,17 @@ use Modules\Lpj\Models\Permohonan; class MigrationPembandingSeeder extends Seeder { - protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_penilai_pembanding_error.csv'; + protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_pembanding_2025_error.csv'; /** * Run the database seeds. */ public function run() { // Path ke file csv - $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_penilai_pembanding.csv'); + $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_pembanding_2025.csv'); if (!$filePath) { - Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_penilai_pembanding.csv'); + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_pembanding_2025.csv'); $this->command->error('File csv tidak ditemukan.'); return; } @@ -85,6 +85,8 @@ class MigrationPembandingSeeder extends Seeder // Kelompokkan berdasarkan mig_nomor_lpj $groupedRows = $this->groupRowsByJaminan($rows); + print_r($groupedRows); + foreach ($groupedRows as $nomorLpj => $groupRows) { try { // Dapatkan info permohonan untuk update inspeksi @@ -99,6 +101,8 @@ class MigrationPembandingSeeder extends Seeder // Bangun JSON data pembanding $pembandingJson = $this->checkPembanding($groupRows); + print_r($pembandingJson); + // Update ke tabel inspeksi // print_r($pembandingJson); @@ -119,7 +123,8 @@ class MigrationPembandingSeeder extends Seeder } } } - private function groupRowsByJaminan(array $rows): array { + private function groupRowsByJaminan(array $rows): array + { $grouped = []; foreach ($rows as $row) { @@ -140,20 +145,16 @@ class MigrationPembandingSeeder extends Seeder foreach ($rows as $row) { // Pastikan kolom penting tersedia $urutan = (int)($row['mig_urutan'] ?? 999); - $sumber = trim($row['mig_keterangan'] ?? ''); $pembanding = trim($row['mig_pembanding'] ?? ''); - $linkGambar = trim($row['mig_path'] ?? ''); - if (empty($pembanding) || empty($linkGambar)) { + // CUKUP VALIDASI PEMBANDING SAJA + if (empty($pembanding)) { continue; } - $pembandingList[] = [ 'urutan' => $urutan, - 'sumber' => $sumber, 'keterangan' => $pembanding, - 'foto_objek' => $linkGambar ]; } @@ -172,53 +173,53 @@ class MigrationPembandingSeeder extends Seeder 'data_pembanding' => $finalPembanding ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); } - private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache) - { - if (isset($cache[$nomor_jaminan_id])) { - return $cache[$nomor_jaminan_id]; - } - - $permohonan = Permohonan::where('nomor_lpj', $nomor_jaminan_id)->first(); - - if (!$permohonan) { - $cache[$nomor_jaminan_id] = null; - return null; - } - - $dokumenJaminan = DokumenJaminan::where('permohonan_id', $permohonan->id)->first(); - - $result = [ - 'id' => $permohonan->id, - 'dokument_id' => $dokumenJaminan ? $dokumenJaminan->id : null - ]; - - $cache[$nomor_jaminan_id] = $result; - - return $result; + private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache) + { + if (isset($cache[$nomor_jaminan_id])) { + return $cache[$nomor_jaminan_id]; } - private function initializeErrorLog() - { - $file = $this->errorLogFile; + $permohonan = Permohonan::where('nomor_lpj', $nomor_jaminan_id)->first(); - // Hapus file lama jika ada - if (file_exists($file)) { - unlink($file); - } - - // Buat file baru dengan header - $handle = fopen($file, 'w'); - fputcsv($handle, ['mig_mst_jaminan_nomor_jaminan', 'Error']); - fclose($handle); + if (!$permohonan) { + $cache[$nomor_jaminan_id] = null; + return null; } - private function logError( $nomorJaminan, string $message) - { - Log::error("Error migrasi permohonan [$nomorJaminan]: $message"); + $dokumenJaminan = DokumenJaminan::where('permohonan_id', $permohonan->id)->first(); - // Tulis ke file error - $handle = fopen($this->errorLogFile, 'a'); - fputcsv($handle, [$nomorJaminan, $message]); + $result = [ + 'id' => $permohonan->id, + 'dokument_id' => $dokumenJaminan ? $dokumenJaminan->id : null + ]; + $cache[$nomor_jaminan_id] = $result; + + return $result; + } + + private function initializeErrorLog() + { + $file = $this->errorLogFile; + + // Hapus file lama jika ada + if (file_exists($file)) { + unlink($file); } + + // Buat file baru dengan header + $handle = fopen($file, 'w'); + fputcsv($handle, ['mig_mst_jaminan_nomor_jaminan', 'Error']); + fclose($handle); + } + + private function logError($nomorJaminan, string $message) + { + Log::error("Error migrasi permohonan [$nomorJaminan]: $message"); + + // Tulis ke file error + $handle = fopen($this->errorLogFile, 'a'); + fputcsv($handle, [$nomorJaminan, $message]); + + } } diff --git a/database/seeders/MigrationPenilaiSeeder.php b/database/seeders/MigrationPenilaiSeeder.php index 54fe87d..f98031b 100644 --- a/database/seeders/MigrationPenilaiSeeder.php +++ b/database/seeders/MigrationPenilaiSeeder.php @@ -15,15 +15,15 @@ class MigrationPenilaiSeeder extends Seeder /** * Run the database seeds. */ - protected $errorLogFile = __DIR__ . '/csv/penilai-laporan/mig_penilai_laporan_error.csv'; + protected $errorLogFile = __DIR__ . '/csv/penilai-laporan/mig_penilai_error.csv'; public function run() { $this->initializeErrorLog(); // Path ke file csv - $filePath = realpath(__DIR__ . '/csv/penilai-laporan/mig_penilai_laporan.csv'); + $filePath = realpath(__DIR__ . '/csv/penilai-laporan/mig_penilai.csv'); if (!$filePath) { - Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilai-laporan/mig_penilai_laporan.csv'); + Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilai-laporan/mig_penilai.csv'); $this->command->error('File csv tidak ditemukan.'); return; } diff --git a/database/seeders/MigrationPermohonanSeeder.php b/database/seeders/MigrationPermohonanSeeder.php index 981c0be..0309a55 100644 --- a/database/seeders/MigrationPermohonanSeeder.php +++ b/database/seeders/MigrationPermohonanSeeder.php @@ -10,21 +10,19 @@ use Modules\Lpj\Models\Debiture; use Modules\Basicdata\Models\Branch; use Modules\Usermanagement\Models\User; - - class MigrationPermohonanSeeder extends Seeder { - protected $errorLogFile = __DIR__ . '/csv/permohonan/error_permohonan.csv'; + protected $errorLogFile = __DIR__ . '/csv/permohonan/mig_permohonan_extenal_error.csv'; public function run() { // Bersihkan file error sebelum mulai $this->initializeErrorLog(); - $filePath = realpath(__DIR__ . '/csv/permohonan/mig_permohonan.csv'); + $filePath = realpath(__DIR__ . '/csv/permohonan/mig_permohonan_external.csv'); if (!$filePath) { - Log::error('File CSV tidak ditemukan: ' . __DIR__ . '/csv/permohonan/mig_permohonan.csv'); + Log::error('File CSV tidak ditemukan: ' . __DIR__ . '/csv/permohonan/mig_permohonan_external.csv'); $this->command->error('File CSV tidak ditemukan.'); return; } @@ -61,7 +59,7 @@ class MigrationPermohonanSeeder extends Seeder $rows[] = array_combine($header, $data); $currentRow++; - +// print_r($rows); if (count($rows) >= $batchSize) { $batchCount++; $this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); @@ -70,7 +68,7 @@ class MigrationPermohonanSeeder extends Seeder } } - print_r($rows[0]); + // print_r($rows); if (!empty($rows)) { $batchCount++; @@ -97,12 +95,12 @@ class MigrationPermohonanSeeder extends Seeder continue; } - // Ambil branch_id - $branchId = $this->getBranchId($row['mig_mst_jaminan_kd_cabang'] ?? null, $branchCache); - if (!$branchId) { - $this->logError($branchId, 'Cabang tidak ditemukan'); - continue; - } + // Ambil branch_id + $branchId = $this->getBranchId($row['mig_mst_jaminan_kd_cabang'] ?? null, $branchCache); + // if (!$branchId) { + // $this->logError($branchId, 'Cabang tidak ditemukan'); + // continue; + // } // Ambil Debitur ID $debitureId = $this->getDebiturId($row['mig_mst_jaminan_kd_debitur_seq'], $debitureCache); @@ -113,37 +111,45 @@ class MigrationPermohonanSeeder extends Seeder // Ambil User IDs $userId = $this->getUserId($row['mig_mst_jaminan_nama_ao'], $branchCache, true); - $approved1Id = $this->getUserId($row['mig_mst_lpj_user_approved_1'], $branchCache, false); - $approved2Id = $this->getUserId($row['mig_mst_lpj_user_approved_2'], $branchCache, false); - // Ambil user IDs berdasarkan NIK - $userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id']; - $userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id']; + // jika external matikan + // $approved1Id = $this->getUserId($row['mig_mst_lpj_user_approved_1'], $branchCache, false); + // $approved2Id = $this->getUserId($row['mig_mst_lpj_user_approved_2'], $branchCache, false); - if (!$userIdUpdate || !$userIdOtorisasi) { - $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan'); - continue; - } + // // Ambil user IDs berdasarkan NIK + $userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id']; + $userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id']; - // Mapping field user - $mapUser = [ - 'created_by' => $userIdUpdate, - 'updated_by' => $userIdUpdate, - 'authorized_by' => $userIdOtorisasi, - ]; + // jika external matikan + // if (!$userIdUpdate || !$userIdOtorisasi) { + // $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan'); + // continue; + // } + // Mapping field user + $mapUser = [ + 'created_by' => $userIdUpdate, + 'updated_by' => $userIdUpdate, + 'authorized_by' => $userIdOtorisasi, + ]; - - if (!$userId || !$approved1Id || !$approved2Id) { - $this->logError($userId, 'Salah satu user tidak ditemukan'); - continue; - } + // jika external matikan + // if (!$userId || !$approved1Id || !$approved2Id) { + // $this->logError($userId, 'Salah satu user tidak ditemukan'); + // continue; + // } // Mapping data $jenisFasilitas = $this->checkJenisFasilitas($row['mig_mst_jaminan_kd_jenis_fas_seq']); $tujuanPenilaian = $this->checkTujuanPenilaian($row['mig_mst_jaminan_kd_tujuan_seq']); $regionId = $this->checkRegion($row['mig_mst_kode_kelompok_region']); + + $nomor_lpj = isset($row['mig_mst_lpj_nomor_lpj']) ? $row['mig_mst_lpj_nomor_lpj'] : ''; + $nomor_lpj = is_numeric($nomor_lpj) ? (int)$nomor_lpj : 0; + + $jenisPenilaian = $row['mig_internal_or_external'] == 1 ? 2 : 1; + // Simpan data Permohonan::create([ 'nomor_registrasi' => $nomorJaminan, @@ -155,25 +161,26 @@ class MigrationPermohonanSeeder extends Seeder 'jenis_fasilitas_kredit_id' => $jenisFasilitas, 'nilai_plafond_id' => 2, 'status' => 'done', - 'approval_eo' => $approved2Id['id'] ?? 0, - 'approval_eo_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_2']), - 'approval_dd' => 0, - 'approval_dd_at' => null, - 'approval_so' => $approved1Id['id'] ?? 0, - 'approval_so_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_1']), + // jika external matikan + // 'approval_eo' => $approved2Id['id'] ?? 0, + // 'approval_eo_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_2']), + // 'approval_dd' => 0, + // 'approval_dd_at' => null, + // 'approval_so' => $approved1Id['id'] ?? 0, + // 'approval_so_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_1']), + // end external matikan 'keterangan' => $row['mig_mst_jaminan_catatan'] ?? null, 'status_bayar' => 'sudah_bayar', 'created_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_create']), 'updated_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_update']), 'mig_kd_debitur_seq' => $row['mig_mst_jaminan_kd_debitur_seq'], - 'nomor_lpj' => $row['mig_mst_lpj_nomor_lpj'], + 'nomor_lpj' => $nomor_lpj, 'region_id' => $regionId, - + 'jenis_penilaian_id' => $jenisPenilaian, 'authorized_by' => $mapUser['authorized_by'], 'created_by' => $mapUser['created_by'], 'updated_by' => $mapUser['updated_by'], - - 'processed_at' => now(), + 'mig_nama_ao' => $row['mig_mst_jaminan_nama_ao'], 'is_mig' => 1 ]); @@ -190,7 +197,9 @@ class MigrationPermohonanSeeder extends Seeder private function getUserIdData(?string $code, array &$cache): array { - if (!$code) return ['id' => null, 'branch_id' => null]; + if (!$code) { + return ['id' => null, 'branch_id' => null]; + } if (isset($cache[$code])) { return $cache[$code]; @@ -249,7 +258,9 @@ class MigrationPermohonanSeeder extends Seeder } private function getBranchId(?string $code, array &$cache): ?int { - if (!$code) return null; + if (!$code) { + return null; + } if (isset($cache[$code])) { return $cache[$code]; @@ -268,7 +279,7 @@ class MigrationPermohonanSeeder extends Seeder { $mapping = [ 161337594516 => 1, - 161337598118 => 2, + 161337598118 => 14, 155739382483 => 7, 2 => 9, 153568936592 => 10, @@ -353,7 +364,7 @@ class MigrationPermohonanSeeder extends Seeder fclose($handle); } - private function logError( $nomorJaminan, string $message) + private function logError($nomorJaminan, string $message) { Log::error("Error migrasi permohonan [$nomorJaminan]: $message"); diff --git a/database/seeders/TujuanPenilaianKJPPSeeder.php b/database/seeders/TujuanPenilaianKJPPSeeder.php index 4e36cf6..e65f2f5 100644 --- a/database/seeders/TujuanPenilaianKJPPSeeder.php +++ b/database/seeders/TujuanPenilaianKJPPSeeder.php @@ -40,7 +40,36 @@ class TujuanPenilaianKJPPSeeder extends Seeder 'status' => 1, 'created_at' => now(), 'updated_at' => now() - ] + ], + [ + 'code' => 'TPK05', + 'name' => 'Penilaian Ulang Jaminan / Review Tahunan', + 'status' => 1, + 'created_at' => now(), + 'updated_at' => now() + ], + [ + 'code' => 'TPK06', + 'name' => 'Lelang', + 'status' => 1, + 'created_at' => now(), + 'updated_at' => now() + ], + [ + 'code' => 'TPK07', + 'name' => 'Permohonan Baru', + 'status' => 1, + 'created_at' => now(), + 'updated_at' => now() + ], + [ + 'code' => 'TPK08', + 'name' => 'Penambahan Fasilitas / Jaminan', + 'status' => 1, + 'created_at' => now(), + 'updated_at' => now() + ], + ]); } } diff --git a/resources/views/laporan-penilai-jaminan/index.blade.php b/resources/views/laporan-penilai-jaminan/index.blade.php index ec29fcf..509a129 100644 --- a/resources/views/laporan-penilai-jaminan/index.blade.php +++ b/resources/views/laporan-penilai-jaminan/index.blade.php @@ -87,18 +87,11 @@
- + + Nomor Registrasi @@ -158,12 +151,12 @@ - User Pemohon + Pemohon - Debitur + Nama Debitur @@ -210,9 +203,7 @@
- @endsection @@ -248,7 +240,7 @@ const exportStatus = document.getElementById('export_status'); const exportSelectedIds = document.getElementById('export_selected_ids'); const exportType = document.getElementById('export_type'); - + const exportSearch = document.getElementById('export_search'); const apiUrl = element.getAttribute('data-api-url'); const dataTableOptions = { apiEndpoint: apiUrl, @@ -360,13 +352,17 @@ ['done'].includes(status) ? dokumenjaminan.map(dokumen => { return ` - - Inspeksi - - - Laporan - - `; + + Inspeksi + + + Lihat + + + Laporan + + + `; }).join('') : '' } @@ -414,7 +410,7 @@ filters.branch_id = branch; } - if (laporan.length > 0) { + if (laporan.length > 0) { filters.laporan = laporan; } @@ -476,8 +472,16 @@ branch_id: branchFilter.value, laporan: Array.from(laporanFilter.selectedOptions).map(option => option.value), status: getSelectedStatuses(), + search: searchInput.value, export_type: 'filtered' }); + } else if (searchInput.value) { + // If only search is applied, export filtered results + exportData({ + search: searchInput.value, + export_type: 'filtered' + }); + } else { // If no selection and no filters, export all exportData({ @@ -495,6 +499,7 @@ exportLaporan.value = filters.laporan ? filters.laporan.join(',') : ''; exportSelectedIds.value = filters.selected_ids ? filters.selected_ids.join(',') : ''; exportType.value = filters.export_type || 'all'; + exportSearch.value = filters.search || ''; // Submit the form exportForm.submit(); } @@ -512,37 +517,37 @@ @endpush diff --git a/resources/views/laporan-penilai-jaminan/show.blade.php b/resources/views/laporan-penilai-jaminan/show.blade.php new file mode 100644 index 0000000..dbf32dc --- /dev/null +++ b/resources/views/laporan-penilai-jaminan/show.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}} +@endsection + +@section('content') +
+
+
+

Lihat Laporan

+
+ + Back +
+
+
+
+ + @php + $laporan = [ + 'sederhana' => 'lpj::penilai.components.print-out-sederhana', + 'standar' => 'lpj::penilai.components.print-out-standar', + 'resume' => 'lpj::penilai.components.print-resume', + 'memo' => 'lpj::penilai.components.print-memo', + 'rap' => 'lpj::penilai.components.print-out-rap', + 'call-report' => 'penilai.components.print-out-call-report', + ]; + @endphp + + @if (array_key_exists($lpj->type_penilai, $laporan)) + @include($laporan[$lpj->type_penilai]) + @else +

Tipe laporan tidak ditemukan.

+ @endif +
+ +@endsection diff --git a/resources/views/laporan_penilaian_jaminan/index.blade.php b/resources/views/laporan_penilaian_jaminan/index.blade.php index 6b76321..f5a3b1e 100644 --- a/resources/views/laporan_penilaian_jaminan/index.blade.php +++ b/resources/views/laporan_penilaian_jaminan/index.blade.php @@ -98,11 +98,11 @@ - Pemohon + Nama Debiture - Nama Debitur + Pemohon diff --git a/resources/views/penilai/components/analisa/fakta.blade.php b/resources/views/penilai/components/analisa/fakta.blade.php index b5d4add..3844866 100644 --- a/resources/views/penilai/components/analisa/fakta.blade.php +++ b/resources/views/penilai/components/analisa/fakta.blade.php @@ -1,4 +1,4 @@ -{{--
--}} +
@endif -
@@ -101,6 +101,5 @@
-{{--
--}} +
diff --git a/resources/views/penilai/components/analisa/lingkungan.blade.php b/resources/views/penilai/components/analisa/lingkungan.blade.php index e2a2eef..c596e00 100644 --- a/resources/views/penilai/components/analisa/lingkungan.blade.php +++ b/resources/views/penilai/components/analisa/lingkungan.blade.php @@ -137,4 +137,4 @@ @endif -
+{{-- --}} diff --git a/resources/views/penilai/components/footer.blade.php b/resources/views/penilai/components/footer.blade.php index 6565c5a..1440ba7 100644 --- a/resources/views/penilai/components/footer.blade.php +++ b/resources/views/penilai/components/footer.blade.php @@ -93,10 +93,10 @@ -