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

@@ -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])) {