update migration file, dan laporan

This commit is contained in:
majid
2025-06-11 09:55:37 +07:00
parent f69128e18e
commit 7ddcc14167
25 changed files with 2513 additions and 821 deletions

View File

@@ -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
]);
}
}
}