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

@@ -10,6 +10,9 @@ use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Exports\LaporanPenilaiJaminanExport; use Modules\Lpj\Exports\LaporanPenilaiJaminanExport;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Models\Branch; 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 class LaporanPenilaiJaminanController extends Controller
{ {
@@ -17,6 +20,14 @@ class LaporanPenilaiJaminanController extends Controller
/** /**
* Display a listing of the resource. * Display a listing of the resource.
*/ */
protected $surveyorController;
public function __construct(SurveyorController $surveyorController)
{
$this->surveyorController = $surveyorController;
}
public function index() public function index()
{ {
$status_permohonan = StatusPermohonan::all(); $status_permohonan = StatusPermohonan::all();
@@ -27,12 +38,60 @@ class LaporanPenilaiJaminanController extends Controller
/** /**
* Show the specified resource. * 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) public function dataForDatatables(Request $request)
{ {

View File

@@ -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'); $documentId = $request->query('documentId');
// Ambil data berdasarkan ID // Ambil data berdasarkan ID

View File

@@ -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('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->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'); $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([ $table->dropColumn([
'mig_kd_debitur_seq', 'mig_kd_debitur_seq',
'nomor_lpj', 'nomor_lpj',
'processed_at', 'mig_nama_ao',
'is_mig' 'is_mig'
]); ]);
}); });

View File

@@ -47,12 +47,15 @@ class LpjDatabaseSeeder extends Seeder
// MigrationDebitureSeeder::class, // MigrationDebitureSeeder::class,
// MigrationPermohonanSeeder::class, // MigrationPermohonanSeeder::class,
// MigrationDokumentJaminanSeeder::class, // MigrationDokumentJaminanSeeder::class,
// MigrationDetailDokumenJaminanSeeder::class // MigrationDetailDokumenJaminanSeeder::class,
// MigPenilaianAndPenilainTeamSeeder::class // MigPenilaianAndPenilainTeamSeeder::class,
// MigrationInpseksiSeeder::class // MigrationInpseksiSeeder::class,
// MigrationGambarInspeksiSeeder::class MigrationGambarInspeksiSeeder::class,
MigrationPembandingSeeder::class // MigrationPembandingSeeder::class,
// MigrationPenilaiSeeder::class // MigrationPenilaiSeeder::class
// ini untuk penilaian external
// MigExternalPenawaranSeeder::class,
]); ]);
} }
} }

View File

@@ -0,0 +1,306 @@
<?php
namespace Modules\Lpj\Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PenawaranTender;
use Modules\Usermanagement\Models\User;
use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\PenilaianTeam;
class MigExternalPenawaranSeeder extends Seeder
{
protected $errorLogFile = __DIR__ . '/csv/penawaran/mig_penawaran_external_error.csv';
/**
* Run the database seeds.
*/
public function run()
{
// Bersihkan/Inisialisasi file error log
$this->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;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -11,10 +11,9 @@ use Modules\Usermanagement\Models\User;
use Modules\Lpj\Models\PenilaianTeam; use Modules\Lpj\Models\PenilaianTeam;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
class MigPenilaianAndPenilainTeamSeeder extends Seeder 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. * Run the database seeds.
@@ -23,182 +22,187 @@ class MigPenilaianAndPenilainTeamSeeder extends Seeder
{ {
// Bersihkan/Inisialisasi file error log // Bersihkan/Inisialisasi file error log
$this->initializeErrorLog(); $this->initializeErrorLog();
// Path ke file csv // Path ke file csv
$filePath = realpath(__DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv'); $filePath = realpath(__DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv');
if (!$filePath) { if (!$filePath) {
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv'); Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv');
$this->command->error('File csv tidak ditemukan.'); $this->command->error('File csv tidak ditemukan.');
return; 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); if (($handle = fopen($filePath, 'r')) === false) {
$currentRow++; Log::error('Gagal membuka file CSV: ' . $filePath);
$this->command->error('Gagal membuka file CSV.');
return;
}
// Jika sudah mencapai batch size, proses batch $header = fgetcsv($handle, 0, '~');
if (count($rows) >= $batchSize) { $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++; $batchCount++;
$this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); $this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})");
$this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow); $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( // Cek apakah sudah diproses
array $rows, $existingRecord = Penilaian::where('nomor_registrasi', $row['mig_nomor_registrasi'])->first();
array &$userDataChace, if ($existingRecord && $existingRecord->created_at) {
array &$nomorRegisCahce, $this->command->info('Data sudah diproses sebelumnya: ' . $row['mig_nomor_registrasi']);
int &$errorCount, continue;
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 // Ambil nomor registrasi
$existingRecord = Penilaian::where('nomor_registrasi', $row['mig_nomor_registrasi'])->first(); $nomor_registrasi = $this->getNomorRegistrasiPermohonan($row['mig_nomor_registrasi'], $nomorRegisCahce);
if ($existingRecord && $existingRecord->created_at) { if (!$nomor_registrasi) {
$this->command->info('Data sudah diproses sebelumnya: ' . $row['mig_nomor_registrasi']); throw new \Exception("Nomor registrasi tidak valid");
continue; }
}
// Ambil nomor registrasi // Ambil user ID
$nomor_registrasi = $this->getNomorRegistrasiPermohonan($row['mig_nomor_registrasi'], $nomorRegisCahce); $userId = $this->getUserId($row['mig_user_id'], $userDataChace);
if (!$nomor_registrasi) { if (!$userId) {
throw new \Exception("Nomor registrasi tidak valid"); // $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 $userIdUpdate = $this->getUserIdData($row['mig_created_by'] ?? null, $userData)['id'];
$userId = $this->getUserId($row['mig_user_id'], $userDataChace); $userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id'];
if (!$userId ) {
throw new \Exception("User tidak ditemukan");
continue;
}
$userIdUpdate = $this->getUserIdData($row['mig_created_by'] ?? null, $userData)['id']; if (!$userIdUpdate || !$userIdOtorisasi) {
$userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id']; // $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
continue;
}
if (!$userIdUpdate || !$userIdOtorisasi) { // Mapping field user
$this->logError($kode, 'Salah satu user tidak ditemukan'); $mapUser = [
continue; 'created_by' => $userIdUpdate,
} 'updated_by' => $userIdUpdate,
'authorized_by' => $userIdOtorisasi,
];
// Mapping field user // Ambil team ID
$mapUser = [ $teamId = $this->checkTeams($row['mig_team_id']);
'created_by' => $userIdUpdate, if (!$teamId) {
'updated_by' => $userIdUpdate, throw new \Exception("Team tidak ditemukan");
'authorized_by' => $userIdOtorisasi, }
];
// Ambil team ID // Buat penilaian
$teamId = $this->checkTeams($row['mig_team_id']); $penilaian = Penilaian::create([
if (!$teamId) { 'nomor_registrasi' => $nomor_registrasi,
throw new \Exception("Team tidak ditemukan"); 'jenis_penilaian_id' => 1,
} 'tanggal_kunjungan' => $this->parseTimestamp($row['mig_tanggal_kunjungan']) ?? now(),
'waktu_penilaian' => $this->parseTimestamp($row['mig_waktu_penilaian']),
// Buat penilaian 'status' => 'done',
$penilaian = Penilaian::create([ 'keterangan' => null,
'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']), 'created_at' => $this->parseTimestamp($row['mig_created_at']),
'updated_at' => $this->parseTimestamp($row['mig_updated_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])) { if (isset($nomorRegisCahce[$nomor_registrasi_id])) {
return $nomorRegisCahce[$nomor_registrasi_id]; return $nomorRegisCahce[$nomor_registrasi_id];
} }
@@ -214,7 +218,9 @@ private function processBatch(
} }
private function getUserIdData(?string $code, array &$cache): array 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])) { if (isset($cache[$code])) {
return $cache[$code]; return $cache[$code];
@@ -260,27 +266,27 @@ private function processBatch(
private function parseTimestamp(?string $timestamp): ?string private function parseTimestamp(?string $timestamp): ?string
{ {
try { try {
if ($timestamp) { if ($timestamp) {
// Cek jika format hanya tanggal (Y-m-d) // Cek jika format hanya tanggal (Y-m-d)
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $timestamp)) { if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $timestamp)) {
return \Carbon\Carbon::createFromFormat('Y-m-d', $timestamp) return \Carbon\Carbon::createFromFormat('Y-m-d', $timestamp)
->startOfDay() ->startOfDay()
->toDateTimeString(); ->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 null;
return \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $timestamp)->toDateTimeString(); } 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 // Jika file lama ada, hapus
if (file_exists($this->errorLogFile)) { if (file_exists($this->errorLogFile)) {

View File

@@ -108,10 +108,10 @@ class MigrationDebitureSeeder extends Seeder
$userIdUpdate = $this->getUserId($row['mig_user_update'] ?? null, $userData)['id']; $userIdUpdate = $this->getUserId($row['mig_user_update'] ?? null, $userData)['id'];
$userIdOtorisasi = $this->getUserId($row['mig_user_oto'] ?? null, $userData)['id']; $userIdOtorisasi = $this->getUserId($row['mig_user_oto'] ?? null, $userData)['id'];
if (!$userIdUpdate || !$userIdOtorisasi) { // if (!$userIdUpdate || !$userIdOtorisasi) {
$this->logError($kode, 'Salah satu user tidak ditemukan'); // $this->logError($kode, 'Salah satu user tidak ditemukan');
continue; // continue;
} // }
// Mapping field user // Mapping field user
$mapUser = [ $mapUser = [
@@ -147,8 +147,8 @@ class MigrationDebitureSeeder extends Seeder
'address' => $row['address'] ?? null, 'address' => $row['address'] ?? null,
'authorized_at' => $authorizedAt, 'authorized_at' => $authorizedAt,
'authorized_by' => $mapUser['authorized_by'], 'authorized_by' => $mapUser['authorized_by'],
'created_by' => $mapUser['created_by'], 'created_by' => $mapUser['created_by'] ?? null,
'updated_by' => $mapUser['updated_by'], 'updated_by' => $mapUser['updated_by'] ?? null,
'created_at' => $createdAt, 'created_at' => $createdAt,
'updated_at' => $updatedAt, 'updated_at' => $updatedAt,
'mig_kd_debitur_seq' => $row['mig_kd_debitur_seq'], 'mig_kd_debitur_seq' => $row['mig_kd_debitur_seq'],

View File

@@ -19,7 +19,7 @@ use Illuminate\Support\Facades\Log;
class MigrationDetailDokumenJaminanSeeder extends Seeder 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. * Run the database seeds.
*/ */
@@ -28,10 +28,10 @@ class MigrationDetailDokumenJaminanSeeder extends Seeder
{ {
$this->initializeErrorLog(); $this->initializeErrorLog();
// Path ke file csv // 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) { 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.'); $this->command->error('File csv tidak ditemukan.');
return; return;
} }
@@ -112,97 +112,183 @@ class MigrationDetailDokumenJaminanSeeder extends Seeder
int &$errorCount, int &$errorCount,
array &$errorDebitureIds array &$errorDebitureIds
) { ) {
foreach ($rows as $index => $row) { $groupedRows = $this->groupRowsByNomorLaporanAndKeterangan($rows);
// print_r($groupedRows);
foreach ($groupedRows as $nomorLaporan => $dataPerGrup) {
// print_r($dataPerGrup);
try { try {
// Pastikan field penting tersedia // Ambil salah satu baris untuk referensi (misal baris pertama dari grup)
if (!isset($row['mig_grp_keterangan'], $row['mig_key_keterangan'], $row['mig_nilai'])) { $firstRow = reset($dataPerGrup)['details'] ? reset($dataPerGrup) : reset($dataPerGrup);
throw new \Exception('Field wajib tidak ditemukan'); $debiturId = null;
}
$debiturId = $row['mig_kd_debitur_seq'] ?? null; // Cari debitur ID dari salah satu field
$jaminanGroup = $row['mig_grp_keterangan']; foreach ($rows as $row) {
$keyName = $row['mig_key_keterangan']; if ($row['mig_nomor_laporan'] == $nomorLaporan) {
$value = $row['mig_nilai']; $debiturId = $row['mig_kd_debitur_seq'] ?? null;
$urlFile = $row['mig_url_file'] ?? null; break;
// 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');
} }
}
// Ambil ID legalitas jaminan if (!$debiturId) {
$legalitasJaminanId = $this->getLegalitasJaminanId($jaminanGroup, $jenisJaminanCache); 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) { 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 // Simpan ke database
DetailDokumenJaminan::create([ DetailDokumenJaminan::updateOrCreate(
'name' => $jaminanGroup, [
'dokumen_jaminan_id' => $dokumenJaminanId, 'name' => $groupKey,
'details' => isset($dataJsonDecode->details) ? json_encode($dataJsonDecode->details) : null, 'dokumen_jaminan_id' => $dokumenJaminanId,
'jenis_legalitas_jaminan_id' => $legalitasJaminanId, ],
'dokumen_jaminan' => !empty($dataJsonDecode->documents) ? json_encode($dataJsonDecode->documents) : null, [
'dokumen_nomor' => $row['dokumen_nomor'] ?? null, 'details' => json_encode($rowData['details']),
'keterangan' => $row['mig_deskripsi_file'] ?? null, 'jenis_legalitas_jaminan_id' => $legalitasJaminanId,
]); 'dokumen_jaminan' => !empty($rowData['documents']) ? json_encode($rowData['documents']) : null,
'dokumen_nomor' => $nomorLaporan,
// Hapus dari result set agar tidak duplikat 'keterangan' => $groupKey,
unset($this->result[$jaminanGroup]); ]
);
// Info progress
$this->command->info('Proses data detail dokumen (' . ($index + 1) . '/' . count($rows)
. ', batch ke: ' . $batchCount
. ', total dari: ' . $currentRow . '/' . $totalData . ')');
} }
} catch (\Exception $e) { // Info progress
Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage()); $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()); $this->logError($debiturId ?? '-', $e->getMessage());
$errorDebitureIds[] = $debiturId ?? '-'; $errorDebitureIds[] = $debiturId ?? '-';
$errorCount++;
continue;
} }
} }
// 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) private function getDokumenJaminanId(string $code, array &$dokumenJaminanCache)
{ {
if (isset($dokumenJaminanCache[$code])) { if (isset($dokumenJaminanCache[$code])) {

View File

@@ -19,7 +19,7 @@ use Illuminate\Support\Facades\Log;
class MigrationDokumentJaminanSeeder extends Seeder 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. * Run the database seeds.
*/ */
@@ -27,10 +27,10 @@ class MigrationDokumentJaminanSeeder extends Seeder
{ {
$this->initializeErrorLog(); $this->initializeErrorLog();
// Path ke file csv // 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) { 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.'); $this->command->error('File csv tidak ditemukan.');
return; return;
} }
@@ -125,39 +125,45 @@ class MigrationDokumentJaminanSeeder extends Seeder
DB::beginTransaction(); DB::beginTransaction();
// Cari permohonan // Cari permohonan
$permohonan = $this->getPermohonanId(
$row['mig_kd_debitur_seq'],
$row['mig_nomor_jaminan'],
$permohonanCache
);
if (empty($permohonan['debiture_id'])) { $permohonan = Permohonan::where('nomor_registrasi', $row['mig_nomor_jaminan'])->first();
throw new \Exception('Missing debiture_id');
if (empty($permohonan)) {
throw new \Exception('Missing debiture_id' . $row['mig_nomor_jaminan']);
continue;
} }
// Pastikan permohonan_id belum digunakan di dokumen_jaminan // 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) { 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 // Ambil lokasi
// jika external silahkan matikan ini
$proviceCode = $this->getProvinceCode($row['mig_province_name'], $provinceCache); $proviceCode = $this->getProvinceCode($row['mig_province_name'], $provinceCache);
$cityCode = $this->getCityCode($row['mig_city_name'], $cityCache); $cityCode = $this->getCityCode($row['mig_city_name'], $cityCache);
$districtCode = $this->getDistrictCode($row['mig_district_name'], $districtCache); $districtCode = $this->getDistrictCode($row['mig_district_name'], $districtCache);
$subdistrict = $this->getSubdistrictCode($row['mig_village_name'], $subdistrictCache, $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 // Buat Pemilik Jaminan
$pemilik_jaminan = PemilikJaminan::create([ $pemilik_jaminan = PemilikJaminan::updateOrCreate([
'debiture_id' => $permohonan['debiture_id'], 'debiture_id' => $permohonan->debiture_id,
'hubungan_pemilik_jaminan_id' => $hubunganPemilik, 'hubungan_pemilik_jaminan_id' => 1,
'name' => $row['name'], // 'name' => $row['name'],
'name' => $pemilik_jaminan_name,
'detail_sertifikat' => null, 'detail_sertifikat' => null,
'npwp' => null, 'npwp' => null,
'nomor_id' => null, 'nomor_id' => null,
'email' => null, 'email' => null,
'phone' => null, 'phone' => null,
// jika external silahkan matikan ini
'province_code' => $proviceCode, 'province_code' => $proviceCode,
'city_code' => $cityCode, 'city_code' => $cityCode,
'district_code' => $districtCode, 'district_code' => $districtCode,
@@ -172,16 +178,17 @@ class MigrationDokumentJaminanSeeder extends Seeder
]); ]);
// Buat Dokumen Jaminan // Buat Dokumen Jaminan
DokumenJaminan::create([ DokumenJaminan::updateOrCreate([
'debiture_id' => $permohonan['debiture_id'], 'debiture_id' => $permohonan->debiture_id,
'permohonan_id' => $permohonan['id'], 'permohonan_id' => $permohonan->id,
'jenis_jaminan_id' => 17, 'jenis_jaminan_id' => $this->getJaminanId($row['mig_jenis_seq']),
'pemilik_jaminan_id' => $pemilik_jaminan->id, 'pemilik_jaminan_id' => $pemilik_jaminan->id,
'province_code' => $proviceCode, // jika external silahkan matikan ini
'city_code' => $cityCode, // 'province_code' => $proviceCode,
'district_code' => $districtCode, // 'city_code' => $cityCode,
'village_code' => $subdistrict['code'], // 'district_code' => $districtCode,
'postal_code' => $subdistrict['postal_code'], // 'village_code' => $subdistrict['code'],
// 'postal_code' => $subdistrict['postal_code'],
'address' => $row['address'], 'address' => $row['address'],
'created_at' => $this->parseTimestamp($row['created_at']), 'created_at' => $this->parseTimestamp($row['created_at']),
'updated_at' => $this->parseTimestamp($row['updated_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()); Log::error("Error pada baris: " . json_encode($row) . ". Pesan: " . $e->getMessage());
$this->logError($row['mig_kd_debitur_seq'] ?? '-', $e->getMessage()); $this->logError($row['mig_kd_debitur_seq'] ?? '-', $e->getMessage());
$errorDebitureIds[] = $row['mig_kd_debitur_seq'] ?? '-'; $errorDebitureIds[] = $row['mig_kd_debitur_seq'] ?? '-';
continue;
} }
} }
$this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds)); $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])) { $mapping = [
return $cache[$code]; 7 => 17,
} 8 => 13,
6 => 32,
$permohonan = Permohonan::where('mig_kd_debitur_seq', $code)->where('nomor_registrasi', $mig_nomor_jaminan)->first(); 1 => 17,
2 => 26,
if ($permohonan) { 3 => 27,
$cache[$code] = [ 4 => 50,
'id' => $permohonan->id, 5 => 21,
'debiture_id' => $permohonan->debiture_id, 138051314724 => 23,
'mig_kd_debitur_seq' => $permohonan->mig_kd_debitur_seq 138027243057 => 34,
]; 138027664224 => 35,
return $cache[$code]; 138027738489 => 10,
} 138051485796 => 48,
138051492883 => 47,
return [ 138051515419 => 40,
'id' => null, 138051753311 => 41,
'debiture_id' => null, 138051754843 => 46,
'mig_kd_debitur_seq' => null 138051759078 => 42,
138051480538 => 45,
123382184742 => 18,
138051483711 => 44,
991 => 52
]; ];
}
return $mapping[$code] ?? 17;
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;
} }
private function getPemilikJaminanId(string $code, array &$cache): ?int private function getPemilikJaminanId(string $code, array &$cache): ?int
@@ -263,7 +277,7 @@ class MigrationDokumentJaminanSeeder extends Seeder
return 1; return 1;
} }
private function getDebitureId(string $code, array &$cache): ?int private function getDebitureId(string $code, array &$cache): ?string
{ {
if (isset($cache[$code])) { if (isset($cache[$code])) {
return $cache[$code]; return $cache[$code];
@@ -272,8 +286,8 @@ class MigrationDokumentJaminanSeeder extends Seeder
$debiture = Debiture::where('mig_kd_debitur_seq', $code)->first(); $debiture = Debiture::where('mig_kd_debitur_seq', $code)->first();
if ($debiture) { if ($debiture) {
$cache[$code] = $debiture->id; $cache[$code] = $debiture->name;
return $debiture->id; return $debiture->name;
} }
return null; return null;

View File

@@ -9,21 +9,27 @@ use Modules\Lpj\Models\Inspeksi;
use Modules\Basicdata\Models\Branch; use Modules\Basicdata\Models\Branch;
use Modules\Lpj\Models\DokumenJaminan; use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use DateTime;
class MigrationGambarInspeksiSeeder extends Seeder class MigrationGambarInspeksiSeeder extends Seeder
{ {
/** /**
* Run the database seeds. * 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() public function run()
{ {
$this->initializeErrorLog(); $this->initializeErrorLog();
// Path ke file csv // 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) { 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.'); $this->command->error('File csv tidak ditemukan.');
return; 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) private function processBatch(array $rows, array &$branchCache, array &$userData, int &$errorCount, array &$errorDebitureIds, int $totalData, int $batchCount, int $currentRow)
{ {
// Kelompokkan berdasarkan mig_nomor_jaminan // Kelompokkan berdasarkan mig_nomor_jaminan
$groupedRows = $this->groupRowsByJaminan($rows); $groupedRows = $this->groupRowsByJaminan($rows);
foreach ($groupedRows as $nomorJaminan => $groupRows) { foreach ($groupedRows as $nomorJaminan => $groupRows) {
try { try {
// Ambil informasi permohonan dan dokument_id // Ambil informasi permohonan dan dokument_id
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache); $nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache);
if (!$nomorRegis) { if (!$nomorRegis) {
Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}"); 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++; $errorCount++;
$errorDebitureIds[] = $nomorJaminan; $errorDebitureIds[] = $nomorJaminan;
continue; 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 = []; $grouped = [];
foreach ($rows as $row) { foreach ($rows as $row) {
@@ -133,46 +140,101 @@ class MigrationGambarInspeksiSeeder extends Seeder
} }
private function checkFoto(array $rows) 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) { foreach ($rows as $row) {
// Pastikan kolom ada // Ambil kolom penting
$namaFoto = trim($row['mig_nama_gambar'] ?? ''); $namaFoto = trim($row['mig_nama_gambar'] ?? '');
$pathFoto = trim($row['mig_url_gambar'] ?? ''); $pathFoto = trim($row['mig_url_gambar'] ?? '');
$kategori = trim($row['mig_kategori'] ?? 'lainnya'); $kategori = trim($row['mig_kategori'] ?? 'lainnya');
$urutan = (int)($row['mig_urutan_gambar'] ?? 999); // Default urutan besar jika tidak ada $urutan = (int)($row['mig_urutan_gambar'] ?? 999);
$tgl = trim($row['mig_tgl'] ?? '');
$nomorLpj = trim($row['mig_nomor_laporan'] ?? '');
if (empty($pathFoto)) { if (empty($pathFoto) || empty($tgl)) {
continue; // skip jika path kosong 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, 'urutan' => $urutan,
'name' => $namaFoto, 'name' => $namaFoto,
'path' => $pathFoto, 'path' => $finalPath,
'category' => $kategori, 'category' => $kategori,
'sub' => null, 'sub' => null,
'description' => '', 'description' => '',
'created_by' => null, 'created_by' => null,
'created_at' => 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 // Urutkan masing-masing kategori berdasarkan urutan
usort($fotos, function ($a, $b) { foreach ($kategoriPrioritas as &$kelompok) {
return $a['urutan'] <=> $b['urutan']; 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) { $finalFotos = array_map(function ($foto) {
unset($foto['urutan']); unset($foto['urutan']);
return $foto; return $foto;
}, $fotos); }, $finalFotos);
return json_encode([ return json_encode([
'foto_jaminan' => $finalFotos 'upload_foto' => $finalFotos
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
} }
private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache) private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache)

View File

@@ -14,9 +14,11 @@ use Modules\Location\Models\District;
use Modules\Location\Models\Province; use Modules\Location\Models\Province;
use Modules\Location\Models\Village; use Modules\Location\Models\Village;
// Load file helper
require_once __DIR__ . '/MigInspeksiHelper.php';
class MigrationInpseksiSeeder extends Seeder 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 = ; // protected $fielKesimpulan = ;
/** /**
* Run the database seeds. * Run the database seeds.
@@ -28,7 +30,7 @@ class MigrationInpseksiSeeder extends Seeder
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_2025.csv'); $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_2025.csv');
if (!$filePath) { 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.'); $this->command->error('File csv tidak ditemukan.');
return; return;
} }
@@ -86,74 +88,80 @@ class MigrationInpseksiSeeder extends Seeder
} }
private function processBatch( private function processBatch(
array $rows, array $rows,
array &$branchCache, array &$branchCache,
array &$debitureCache, array &$debitureCache,
int &$errorCount, int &$errorCount,
array &$errorDebitureIds, array &$errorDebitureIds,
int $totalData, int $totalData,
int $batchCount, int $batchCount,
int $currentRow int $currentRow
) { ) {
// Kelompokkan baris berdasarkan mig_nomor_jaminan // Kelompokkan baris berdasarkan mig_nomor_jaminan
$groupedData = $this->groupRowsByJaminan($rows); $groupedData = $this->groupRowsByJaminan($rows);
foreach ($groupedData as $nomorJaminan => $groupRows) { foreach ($groupedData as $nomorJaminan => $groupRows) {
// try { try {
// Cek apakah sudah ada di inspeksi // 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 if ($existingRecord) {
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache); $this->command->info("Data untuk nomor jaminan {$nomorJaminan} sudah ada. Lewati...");
if (!$nomorRegis) { continue;
Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}"); }
$errorCount++;
$errorDebitureIds[] = $nomorJaminan;
continue;
}
$existingRecord = Inspeksi::where('permohonan_id', $nomorRegis['id']) // Ambil baris pertama untuk created_at/updated_at
->where('dokument_id', $nomorRegis['dokument_id']) $firstRow = reset($groupRows);
->whereNotNull('data_form')
->first();
if ($existingRecord) { // Bangun JSON lengkap
$this->command->info("Data untuk nomor jaminan {$nomorJaminan} sudah ada. Lewati..."); $dataFormJson = $this->buildFullDataForm($groupRows);
continue; $jenisJaminan = $this->checkJenisJaminan($groupRows[0]['mig_name'] ?? '');
}
// Ambil created_at / updated_at dari baris pertama if (!$dataFormJson) {
$firstRow = reset($groupRows); Log::warning("Data form kosong untuk nomor jaminan: {$nomorJaminan}");
$errorCount++;
$errorDebitureIds[] = $nomorJaminan;
continue;
}
// Bangun JSON lengkap // Simpan ke database hanya sekali per grup
$dataFormJson = $this->buildFullDataForm($groupRows); 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 $this->command->info("Berhasil simpan data inspeksi untuk nomor jaminan: {$nomorJaminan}");
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}"); } catch (\Exception $e) {
Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage());
// } catch (\Exception $e) { $errorCount++;
// Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage()); $errorDebitureIds[] = $nomorJaminan;
// $errorCount++; continue;
// $errorDebitureIds[] = $nomorJaminan;
// continue;
// }
} }
} }
}
private function groupRowsByJaminan(array $rows): array private function groupRowsByJaminan(array $rows): array
{ {
$grouped = []; $grouped = [];
@@ -199,34 +207,29 @@ class MigrationInpseksiSeeder extends Seeder
} }
private function buildFullDataForm(array $rows) private function buildFullDataForm(array $rows)
{ {
if (empty($rows)) {
$assetJson = json_decode($this->checkAsset($rows)[0] ?? '', true); return null;
$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);
} }
$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) 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) private function checkLingkungan($rows)
{ {
$dataToInsertJson = []; $dataToInsertJson = [];
@@ -605,9 +441,15 @@ class MigrationInpseksiSeeder extends Seeder
} }
// Isi default jika kosong // Isi default jika kosong
if (empty($hubCadeb)) $hubCadeb = ["tidak sesuai" => null]; if (empty($hubCadeb)) {
if (empty($hubPenghuni)) $hubPenghuni = ["tidak sesuai" => null]; $hubCadeb = ["tidak sesuai" => null];
if (empty($jenisAsset)) $jenisAsset = ["sesuai" => null]; }
if (empty($hubPenghuni)) {
$hubPenghuni = ["tidak sesuai" => null];
}
if (empty($jenisAsset)) {
$jenisAsset = ["sesuai" => null];
}
// Bangun struktur JSON // Bangun struktur JSON
$asset = [ $asset = [
@@ -677,7 +519,8 @@ class MigrationInpseksiSeeder extends Seeder
'gss' => null, 'gss' => null,
'pelebaran_jalan' => null, 'pelebaran_jalan' => null,
'nama_petugas' => null, 'nama_petugas' => null,
'keterangan' => [] 'keterangan' => [],
'saran' => []
]; ];
foreach ($rows as $row) { foreach ($rows as $row) {
@@ -705,13 +548,19 @@ class MigrationInpseksiSeeder extends Seeder
$fakta['kondisi_lain_bangunan'][] = $keterangan; $fakta['kondisi_lain_bangunan'][] = $keterangan;
break; break;
case 'Informasi Dokumen': case 'Lain - lain':
$fakta['informasi_dokument'][] = $keterangan; $fakta['informasi_dokument'][] = $keterangan;
break; break;
case 'Lain - lain': case 'CATATAN YANG PERLU DIPERHATIKAN':
$fakta['keterangan'][] = $keterangan; $fakta['keterangan'][] = $keterangan;
break; break;
case 'Catatan':
$fakta['keterangan'][] = $keterangan;
break;
case 'Saran':
$fakta['saran'][] = $keterangan;
break;
} }
} }
@@ -838,7 +687,7 @@ class MigrationInpseksiSeeder extends Seeder
fclose($handle); fclose($handle);
} }
private function logError( $nomorJaminan, string $message) private function logError($nomorJaminan, string $message)
{ {
Log::error("Error migrasi permohonan [$nomorJaminan]: $message"); Log::error("Error migrasi permohonan [$nomorJaminan]: $message");
@@ -847,4 +696,163 @@ class MigrationInpseksiSeeder extends Seeder
fputcsv($handle, [$nomorJaminan, $message]); 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
]);
}
}
} }

View File

@@ -12,17 +12,17 @@ use Modules\Lpj\Models\Permohonan;
class MigrationPembandingSeeder extends Seeder 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. * Run the database seeds.
*/ */
public function run() public function run()
{ {
// Path ke file csv // Path ke file csv
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_penilai_pembanding.csv'); $filePath = realpath(__DIR__ . '/csv/inspeksi/mig_pembanding_2025.csv');
if (!$filePath) { 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.'); $this->command->error('File csv tidak ditemukan.');
return; return;
} }
@@ -85,6 +85,8 @@ class MigrationPembandingSeeder extends Seeder
// Kelompokkan berdasarkan mig_nomor_lpj // Kelompokkan berdasarkan mig_nomor_lpj
$groupedRows = $this->groupRowsByJaminan($rows); $groupedRows = $this->groupRowsByJaminan($rows);
print_r($groupedRows);
foreach ($groupedRows as $nomorLpj => $groupRows) { foreach ($groupedRows as $nomorLpj => $groupRows) {
try { try {
// Dapatkan info permohonan untuk update inspeksi // Dapatkan info permohonan untuk update inspeksi
@@ -99,6 +101,8 @@ class MigrationPembandingSeeder extends Seeder
// Bangun JSON data pembanding // Bangun JSON data pembanding
$pembandingJson = $this->checkPembanding($groupRows); $pembandingJson = $this->checkPembanding($groupRows);
print_r($pembandingJson);
// Update ke tabel inspeksi // Update ke tabel inspeksi
// print_r($pembandingJson); // print_r($pembandingJson);
@@ -119,7 +123,8 @@ class MigrationPembandingSeeder extends Seeder
} }
} }
} }
private function groupRowsByJaminan(array $rows): array { private function groupRowsByJaminan(array $rows): array
{
$grouped = []; $grouped = [];
foreach ($rows as $row) { foreach ($rows as $row) {
@@ -140,20 +145,16 @@ class MigrationPembandingSeeder extends Seeder
foreach ($rows as $row) { foreach ($rows as $row) {
// Pastikan kolom penting tersedia // Pastikan kolom penting tersedia
$urutan = (int)($row['mig_urutan'] ?? 999); $urutan = (int)($row['mig_urutan'] ?? 999);
$sumber = trim($row['mig_keterangan'] ?? '');
$pembanding = trim($row['mig_pembanding'] ?? ''); $pembanding = trim($row['mig_pembanding'] ?? '');
$linkGambar = trim($row['mig_path'] ?? '');
if (empty($pembanding) || empty($linkGambar)) { // CUKUP VALIDASI PEMBANDING SAJA
if (empty($pembanding)) {
continue; continue;
} }
$pembandingList[] = [ $pembandingList[] = [
'urutan' => $urutan, 'urutan' => $urutan,
'sumber' => $sumber,
'keterangan' => $pembanding, 'keterangan' => $pembanding,
'foto_objek' => $linkGambar
]; ];
} }
@@ -172,53 +173,53 @@ class MigrationPembandingSeeder extends Seeder
'data_pembanding' => $finalPembanding 'data_pembanding' => $finalPembanding
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
} }
private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache) private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache)
{ {
if (isset($cache[$nomor_jaminan_id])) { if (isset($cache[$nomor_jaminan_id])) {
return $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 initializeErrorLog() $permohonan = Permohonan::where('nomor_lpj', $nomor_jaminan_id)->first();
{
$file = $this->errorLogFile;
// Hapus file lama jika ada if (!$permohonan) {
if (file_exists($file)) { $cache[$nomor_jaminan_id] = null;
unlink($file); return null;
}
// 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) $dokumenJaminan = DokumenJaminan::where('permohonan_id', $permohonan->id)->first();
{
Log::error("Error migrasi permohonan [$nomorJaminan]: $message");
// Tulis ke file error $result = [
$handle = fopen($this->errorLogFile, 'a'); 'id' => $permohonan->id,
fputcsv($handle, [$nomorJaminan, $message]); '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]);
}
} }

View File

@@ -15,15 +15,15 @@ class MigrationPenilaiSeeder extends Seeder
/** /**
* Run the database seeds. * 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() public function run()
{ {
$this->initializeErrorLog(); $this->initializeErrorLog();
// Path ke file csv // 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) { 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.'); $this->command->error('File csv tidak ditemukan.');
return; return;
} }

View File

@@ -10,21 +10,19 @@ use Modules\Lpj\Models\Debiture;
use Modules\Basicdata\Models\Branch; use Modules\Basicdata\Models\Branch;
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
class MigrationPermohonanSeeder extends Seeder 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() public function run()
{ {
// Bersihkan file error sebelum mulai // Bersihkan file error sebelum mulai
$this->initializeErrorLog(); $this->initializeErrorLog();
$filePath = realpath(__DIR__ . '/csv/permohonan/mig_permohonan.csv'); $filePath = realpath(__DIR__ . '/csv/permohonan/mig_permohonan_external.csv');
if (!$filePath) { 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.'); $this->command->error('File CSV tidak ditemukan.');
return; return;
} }
@@ -61,7 +59,7 @@ class MigrationPermohonanSeeder extends Seeder
$rows[] = array_combine($header, $data); $rows[] = array_combine($header, $data);
$currentRow++; $currentRow++;
// print_r($rows);
if (count($rows) >= $batchSize) { if (count($rows) >= $batchSize) {
$batchCount++; $batchCount++;
$this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})"); $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)) { if (!empty($rows)) {
$batchCount++; $batchCount++;
@@ -97,12 +95,12 @@ class MigrationPermohonanSeeder extends Seeder
continue; continue;
} }
// Ambil branch_id // Ambil branch_id
$branchId = $this->getBranchId($row['mig_mst_jaminan_kd_cabang'] ?? null, $branchCache); $branchId = $this->getBranchId($row['mig_mst_jaminan_kd_cabang'] ?? null, $branchCache);
if (!$branchId) { // if (!$branchId) {
$this->logError($branchId, 'Cabang tidak ditemukan'); // $this->logError($branchId, 'Cabang tidak ditemukan');
continue; // continue;
} // }
// Ambil Debitur ID // Ambil Debitur ID
$debitureId = $this->getDebiturId($row['mig_mst_jaminan_kd_debitur_seq'], $debitureCache); $debitureId = $this->getDebiturId($row['mig_mst_jaminan_kd_debitur_seq'], $debitureCache);
@@ -113,37 +111,45 @@ class MigrationPermohonanSeeder extends Seeder
// Ambil User IDs // Ambil User IDs
$userId = $this->getUserId($row['mig_mst_jaminan_nama_ao'], $branchCache, true); $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 // jika external matikan
$userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id']; // $approved1Id = $this->getUserId($row['mig_mst_lpj_user_approved_1'], $branchCache, false);
$userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id']; // $approved2Id = $this->getUserId($row['mig_mst_lpj_user_approved_2'], $branchCache, false);
if (!$userIdUpdate || !$userIdOtorisasi) { // // Ambil user IDs berdasarkan NIK
$this->logError($userIdUpdate, 'Salah satu user tidak ditemukan'); $userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id'];
continue; $userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id'];
}
// Mapping field user // jika external matikan
$mapUser = [ // if (!$userIdUpdate || !$userIdOtorisasi) {
'created_by' => $userIdUpdate, // $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
'updated_by' => $userIdUpdate, // continue;
'authorized_by' => $userIdOtorisasi, // }
];
// Mapping field user
$mapUser = [
'created_by' => $userIdUpdate,
'updated_by' => $userIdUpdate,
'authorized_by' => $userIdOtorisasi,
];
// jika external matikan
if (!$userId || !$approved1Id || !$approved2Id) { // if (!$userId || !$approved1Id || !$approved2Id) {
$this->logError($userId, 'Salah satu user tidak ditemukan'); // $this->logError($userId, 'Salah satu user tidak ditemukan');
continue; // continue;
} // }
// Mapping data // Mapping data
$jenisFasilitas = $this->checkJenisFasilitas($row['mig_mst_jaminan_kd_jenis_fas_seq']); $jenisFasilitas = $this->checkJenisFasilitas($row['mig_mst_jaminan_kd_jenis_fas_seq']);
$tujuanPenilaian = $this->checkTujuanPenilaian($row['mig_mst_jaminan_kd_tujuan_seq']); $tujuanPenilaian = $this->checkTujuanPenilaian($row['mig_mst_jaminan_kd_tujuan_seq']);
$regionId = $this->checkRegion($row['mig_mst_kode_kelompok_region']); $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 // Simpan data
Permohonan::create([ Permohonan::create([
'nomor_registrasi' => $nomorJaminan, 'nomor_registrasi' => $nomorJaminan,
@@ -155,25 +161,26 @@ class MigrationPermohonanSeeder extends Seeder
'jenis_fasilitas_kredit_id' => $jenisFasilitas, 'jenis_fasilitas_kredit_id' => $jenisFasilitas,
'nilai_plafond_id' => 2, 'nilai_plafond_id' => 2,
'status' => 'done', 'status' => 'done',
'approval_eo' => $approved2Id['id'] ?? 0, // jika external matikan
'approval_eo_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_2']), // 'approval_eo' => $approved2Id['id'] ?? 0,
'approval_dd' => 0, // 'approval_eo_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_2']),
'approval_dd_at' => null, // 'approval_dd' => 0,
'approval_so' => $approved1Id['id'] ?? 0, // 'approval_dd_at' => null,
'approval_so_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_1']), // '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, 'keterangan' => $row['mig_mst_jaminan_catatan'] ?? null,
'status_bayar' => 'sudah_bayar', 'status_bayar' => 'sudah_bayar',
'created_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_create']), 'created_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_create']),
'updated_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_update']), 'updated_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_update']),
'mig_kd_debitur_seq' => $row['mig_mst_jaminan_kd_debitur_seq'], '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, 'region_id' => $regionId,
'jenis_penilaian_id' => $jenisPenilaian,
'authorized_by' => $mapUser['authorized_by'], 'authorized_by' => $mapUser['authorized_by'],
'created_by' => $mapUser['created_by'], 'created_by' => $mapUser['created_by'],
'updated_by' => $mapUser['updated_by'], 'updated_by' => $mapUser['updated_by'],
'mig_nama_ao' => $row['mig_mst_jaminan_nama_ao'],
'processed_at' => now(),
'is_mig' => 1 'is_mig' => 1
]); ]);
@@ -190,7 +197,9 @@ class MigrationPermohonanSeeder extends Seeder
private function getUserIdData(?string $code, array &$cache): array 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])) { if (isset($cache[$code])) {
return $cache[$code]; return $cache[$code];
@@ -249,7 +258,9 @@ class MigrationPermohonanSeeder extends Seeder
} }
private function getBranchId(?string $code, array &$cache): ?int private function getBranchId(?string $code, array &$cache): ?int
{ {
if (!$code) return null; if (!$code) {
return null;
}
if (isset($cache[$code])) { if (isset($cache[$code])) {
return $cache[$code]; return $cache[$code];
@@ -268,7 +279,7 @@ class MigrationPermohonanSeeder extends Seeder
{ {
$mapping = [ $mapping = [
161337594516 => 1, 161337594516 => 1,
161337598118 => 2, 161337598118 => 14,
155739382483 => 7, 155739382483 => 7,
2 => 9, 2 => 9,
153568936592 => 10, 153568936592 => 10,
@@ -353,7 +364,7 @@ class MigrationPermohonanSeeder extends Seeder
fclose($handle); fclose($handle);
} }
private function logError( $nomorJaminan, string $message) private function logError($nomorJaminan, string $message)
{ {
Log::error("Error migrasi permohonan [$nomorJaminan]: $message"); Log::error("Error migrasi permohonan [$nomorJaminan]: $message");

View File

@@ -40,7 +40,36 @@ class TujuanPenilaianKJPPSeeder extends Seeder
'status' => 1, 'status' => 1,
'created_at' => now(), 'created_at' => now(),
'updated_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()
],
]); ]);
} }
} }

View File

@@ -87,18 +87,11 @@
</div> </div>
<div class="flex flex-col"> <div class="flex flex-col">
<label class="text-base font-medium mb-1">Laporan</label> <label class="text-base font-medium mb-1">Laporan</label>
<select class="select tomselect" name="laporan[]" id="laporan" multiple> <select class="select tomselect" name="laporan[]" id="laporan" multiple>
<option value="">Semua Laporan</option> <option value="">Semua Laporan</option>
@php @php
$status_laporan = [ $status_laporan = ['Standar', 'Sederhana', 'Memo', 'Resume', 'Call Report', 'RAP'];
'Standar',
'Sederhana',
'Memo',
'Resume',
'Call Report',
'RAP',
];
@endphp @endphp
@foreach ($status_laporan as $item) @foreach ($status_laporan as $item)
<option value="{{ strtolower($item) }}">{{ $item }}</option> <option value="{{ strtolower($item) }}">{{ $item }}</option>
@@ -115,8 +108,7 @@
<i class="ki-outline ki-filter fs-2 me-1"></i> <i class="ki-outline ki-filter fs-2 me-1"></i>
Terapkan Filter Terapkan Filter
</button> </button>
<button class="btn btn-sm btn-light" <button class="btn btn-sm btn-light" id="export-btn">
id="export-btn">
<i class="ki-outline ki-file-down fs-2 me-1"></i> <i class="ki-outline ki-file-down fs-2 me-1"></i>
Export to Excel Export to Excel
</button> </button>
@@ -142,7 +134,8 @@
<thead> <thead>
<tr> <tr>
<th class="w-14"> <th class="w-14">
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox" id="check-all"/> <input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"
id="check-all" />
</th> </th>
<th class="min-w-[150px]" data-datatable-column="nomor_registrasi"> <th class="min-w-[150px]" data-datatable-column="nomor_registrasi">
<span class="sort"><span class="sort-label">Nomor Registrasi</span> <span class="sort"><span class="sort-label">Nomor Registrasi</span>
@@ -158,12 +151,12 @@
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="user_id"> <th class="min-w-[150px]" data-datatable-column="user_id">
<span class="sort"><span class="sort-label">User Pemohon</span> <span class="sort"><span class="sort-label">Pemohon</span>
<span class="sort-icon"></span> <span class="sort-icon"></span>
</span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="debitur_id"> <th class="min-w-[150px]" data-datatable-column="debitur_id">
<span class="sort"><span class="sort-label">Debitur</span> <span class="sort"><span class="sort-label">Nama Debitur</span>
<span class="sort-icon"></span> <span class="sort-icon"></span>
</span> </span>
</th> </th>
@@ -210,9 +203,7 @@
</div> </div>
<!-- Form tersembunyi untuk export --> <!-- Form tersembunyi untuk export -->
<form id="export-form" <form id="export-form" action="{{ route('laporan-penilai-jaminan.export') }}" method="GET" class="hidden">
action="{{ route('laporan-penilai-jaminan.export') }}"
method="GET" class="hidden">
<input type="hidden" name="start_date" id="export_tanggal_awal"> <input type="hidden" name="start_date" id="export_tanggal_awal">
<input type="hidden" name="end_date" id="export_tanggal_akhir"> <input type="hidden" name="end_date" id="export_tanggal_akhir">
<input type="hidden" name="status" id="export_status"> <input type="hidden" name="status" id="export_status">
@@ -220,6 +211,7 @@
<input type="hidden" name="laporan" id="export_laporan"> <input type="hidden" name="laporan" id="export_laporan">
<input type="hidden" name="selected_ids" id="export_selected_ids"> <input type="hidden" name="selected_ids" id="export_selected_ids">
<input type="hidden" name="export_type" id="export_type" value="all"> <input type="hidden" name="export_type" id="export_type" value="all">
<input type="hidden" id="export_search" name="search">
</form> </form>
@endsection @endsection
@@ -248,7 +240,7 @@
const exportStatus = document.getElementById('export_status'); const exportStatus = document.getElementById('export_status');
const exportSelectedIds = document.getElementById('export_selected_ids'); const exportSelectedIds = document.getElementById('export_selected_ids');
const exportType = document.getElementById('export_type'); const exportType = document.getElementById('export_type');
const exportSearch = document.getElementById('export_search');
const apiUrl = element.getAttribute('data-api-url'); const apiUrl = element.getAttribute('data-api-url');
const dataTableOptions = { const dataTableOptions = {
apiEndpoint: apiUrl, apiEndpoint: apiUrl,
@@ -360,13 +352,17 @@
['done'].includes(status) ? ['done'].includes(status) ?
dokumenjaminan.map(dokumen => { dokumenjaminan.map(dokumen => {
return ` return `
<a class="btn btn-sm btn-primary" href="surveyor/print-out-inspeksi/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}"> <a class="btn btn-sm btn-primary" href="surveyor/print-out-inspeksi/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}">
<i class="ki-outline ki-printer"></i>Inspeksi <i class="ki-outline ki-printer"></i>Inspeksi
</a> </a>
<a class="btn btn-sm btn-success" onclick="checkLaporan('${data.id}', '${dokumen.id}', '${dokumen.jenis_jaminan_id}', 0)"> <a class="btn btn-sm btn-info" href="laporan-penilai-jaminan/show/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}" >
<i class="ki-filled ki-printer"></i>Laporan <i class="ki-filled ki-eye"></i>Lihat
</a> </a>
`; <a class="btn btn-sm btn-success" onclick="checkLaporan('${data.id}', '${dokumen.id}', '${dokumen.jenis_jaminan_id}', 0)">
<i class="ki-filled ki-printer"></i>Laporan
</a>
`;
}).join('') : '' }).join('') : ''
} }
</div> </div>
@@ -414,7 +410,7 @@
filters.branch_id = branch; filters.branch_id = branch;
} }
if (laporan.length > 0) { if (laporan.length > 0) {
filters.laporan = laporan; filters.laporan = laporan;
} }
@@ -476,8 +472,16 @@
branch_id: branchFilter.value, branch_id: branchFilter.value,
laporan: Array.from(laporanFilter.selectedOptions).map(option => option.value), laporan: Array.from(laporanFilter.selectedOptions).map(option => option.value),
status: getSelectedStatuses(), status: getSelectedStatuses(),
search: searchInput.value,
export_type: 'filtered' export_type: 'filtered'
}); });
} else if (searchInput.value) {
// If only search is applied, export filtered results
exportData({
search: searchInput.value,
export_type: 'filtered'
});
} else { } else {
// If no selection and no filters, export all // If no selection and no filters, export all
exportData({ exportData({
@@ -495,6 +499,7 @@
exportLaporan.value = filters.laporan ? filters.laporan.join(',') : ''; exportLaporan.value = filters.laporan ? filters.laporan.join(',') : '';
exportSelectedIds.value = filters.selected_ids ? filters.selected_ids.join(',') : ''; exportSelectedIds.value = filters.selected_ids ? filters.selected_ids.join(',') : '';
exportType.value = filters.export_type || 'all'; exportType.value = filters.export_type || 'all';
exportSearch.value = filters.search || '';
// Submit the form // Submit the form
exportForm.submit(); exportForm.submit();
} }
@@ -512,37 +517,37 @@
</script> </script>
<script> <script>
function checkLaporan(permohonanId, documentId, statusLpj) { function checkLaporan(permohonanId, documentId, statusLpj) {
// showLoadingSwal('Tunggu...'); // showLoadingSwal('Tunggu...');
fetch( fetch(
`{{ url('/penilai/check-laporan') }}?permohonanId=${permohonanId}&documentId=${documentId}` `{{ url('/penilai/check-laporan') }}?permohonanId=${permohonanId}&documentId=${documentId}`
) )
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
if (data.status) { if (data.status) {
window.location.href = window.location.href =
`{{ route('penilai.print-out') }}?permohonanId=${permohonanId}&documentId=${documentId}&statusLpj=${0}&type=${data.status}`; `{{ route('penilai.print-out') }}?permohonanId=${permohonanId}&documentId=${documentId}&statusLpj=${0}&type=${data.status}`;
} else { } else {
// Jika laporan belum ada, tampilkan pesan peringatan // Jika laporan belum ada, tampilkan pesan peringatan
Swal.fire({
title: 'Laporan Belum Ada',
text: data.message,
icon: 'warning',
confirmButtonText: 'OK',
confirmButtonColor: '#3085d6',
});
}
})
.catch(error => {
console.error('Error:', error);
Swal.fire({ Swal.fire({
title: 'Laporan Belum Ada', title: 'Terjadi Kesalahan',
text: data.message, text: 'Tidak dapat memproses permintaan. Silakan coba lagi nanti.',
icon: 'warning', icon: 'error',
confirmButtonText: 'OK', confirmButtonText: 'OK',
confirmButtonColor: '#3085d6', confirmButtonColor: '#d33',
}); });
}
})
.catch(error => {
console.error('Error:', error);
Swal.fire({
title: 'Terjadi Kesalahan',
text: 'Tidak dapat memproses permintaan. Silakan coba lagi nanti.',
icon: 'error',
confirmButtonText: 'OK',
confirmButtonColor: '#d33',
}); });
}); }
}
</script> </script>
@endpush @endpush

View File

@@ -0,0 +1,39 @@
@extends('layouts.main')
@section('breadcrumbs')
{{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}}
@endsection
@section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card">
<div class="card-header py-5 flex-wrap">
<h3 class="card-title">Lihat Laporan</h3>
<div class="flex items-wrap gap-2.5">
<a href="{{ route('laporan-penilai-jaminan.index') }}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i>
Back</a>
</div>
</div>
</div>
<div class="card-body">
@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
<p>Tipe laporan tidak ditemukan.</p>
@endif
</div>
@endsection

View File

@@ -98,11 +98,11 @@
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="pemohon"> <th class="min-w-[150px]" data-datatable-column="pemohon">
<span class="sort"> <span class="sort-label"> Pemohon </span> <span class="sort"> <span class="sort-label"> Nama Debiture </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="name"> <th class="min-w-[150px]" data-datatable-column="name">
<span class="sort"> <span class="sort-label"> Nama Debitur </span> <span class="sort"> <span class="sort-label"> Pemohon </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>

View File

@@ -1,4 +1,4 @@
{{-- <div class="no-break"> --}} <div class="no-break">
<table class="judul" style="width: 100%; "> <table class="judul" style="width: 100%; ">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
@@ -101,6 +101,5 @@
</tr> </tr>
@endif @endif
</table> </table>
{{-- </div> --}} </div>

View File

@@ -137,4 +137,4 @@
</tr> </tr>
@endif @endif
</table> </table>
</div> {{-- </div> --}}

View File

@@ -93,10 +93,10 @@
</div> </div>
</div> </div>
<footer id="footer"> {{-- <footer id="footer"> --}}
{{-- Cabang : {{ $permohonan->debiture->branch->name ?? '' }} --}} {{-- Cabang : {{ $permohonan->debiture->branch->name ?? '' }} --}}
</footer> {{-- </footer> --}}
<script type="text/php"> {{-- <script type="text/php">
if (isset($pdf)) { if (isset($pdf)) {
$pdf->page_script(' $pdf->page_script('
$font = $fontMetrics->get_font("Arial, Helvetica, sans-serif", "normal"); $font = $fontMetrics->get_font("Arial, Helvetica, sans-serif", "normal");
@@ -107,8 +107,8 @@
$pdf->text($x, $y, $pageText, $font, $size); $pdf->text($x, $y, $pageText, $font, $size);
'); ');
} }
</script> </script> --}}
<script> {{-- <script>
const datas = @json($forminspeksi); const datas = @json($forminspeksi);
console.log(datas); console.log(datas);
const lpjData = @json($lpjData); const lpjData = @json($lpjData);
@@ -138,4 +138,4 @@
}); });
</script> </script>
</body> </body>
</html> </html> --}}

View File

@@ -96,11 +96,14 @@
<table width="100%" border="0" <table width="100%" border="0"
style="align-content: center; text-align: center; margin-bottom: 20px"> style="align-content: center; text-align: center; margin-bottom: 20px">
@foreach ($chunkedPhotos as $item) @foreach ($chunkedPhotos as $item)
@php @php
$imagePath = storage_path('app/public/' . $item['path']); $filePath = asset('storage/' . $item['path']);
$extension = strtolower(pathinfo($item['path'], PATHINFO_EXTENSION));
$isImage = in_array($extension, ['jpg', 'jpeg', 'png', 'gif']);
$isPdf = $extension === 'pdf';
@endphp @endphp
<tr> <tr>
<td style="width: 100%; padding: 10px;" class="photo-item border"> <td style="width: 100%; padding: 10px; text-align: center" class="photo-item border" >
<p style="font-weight: medium; font-size: 10px">{{ $category }} - <p style="font-weight: medium; font-size: 10px">{{ $category }} -
@isset($subcategory) @isset($subcategory)
@if (trim($subcategory) !== '') @if (trim($subcategory) !== '')
@@ -109,8 +112,18 @@
@endisset @endisset
{{ $item['name'] ?? '' }} {{ $item['name'] ?? '' }}
</p> </p>
@if ($statusLpj || file_exists($imagePath)) @if ($statusLpj || file_exists(public_path('storage/' . $item['path'])))
<img src="{{ $imagePath }}" alt="{{ $item['path'] }}" class="photo-image"> @if ($isImage)
<img src="{{ $filePath }}" alt="{{ $item['path'] }}" class="photo-image" style="text-align: center;">
@elseif ($isPdf)
<a href="{{ $filePath }}" download="{{ basename($filePath) }}" style="font-size:12px; color:#1a73e8; text-decoration: underline;">
⬇️ Unduh File PDF
</a>
@else
<a href="{{ $filePath }}" download="{{ basename($filePath) }}" style="font-size:12px; color:#1a73e8; text-decoration: underline;">
⬇️ Unduh File
</a>
@endif
@endif @endif
@isset($item['description']) @isset($item['description'])
<p style="font-size:9px">{{ $item['description'] }}</p> <p style="font-size:9px">{{ $item['description'] }}</p>
@@ -135,8 +148,10 @@
<table width="100%" border="0" <table width="100%" border="0"
style="align-content: center; text-align: center; margin-bottom: 20px"> style="align-content: center; text-align: center; margin-bottom: 20px">
@foreach ($chunkedPhotos as $item) @foreach ($chunkedPhotos as $item)
@php @php
$imagePath = storage_path('app/public/' . $item['path']); $filePath = asset('storage/' . $item['path']);
$extension = strtolower(pathinfo($item['path'], PATHINFO_EXTENSION));
$isPdf = $extension === 'pdf';
@endphp @endphp
<tr> <tr>
<td style="width: 100%; padding: 10px;" class="photo-item border"> <td style="width: 100%; padding: 10px;" class="photo-item border">
@@ -148,8 +163,18 @@
@endisset @endisset
{{ $item['name'] ?? '' }} {{ $item['name'] ?? '' }}
</p> </p>
@if ($statusLpj || file_exists($imagePath)) @if ($statusLpj || file_exists(public_path('storage/' . $item['path'])))
<img src="{{ $imagePath }}" alt="{{ $item['path'] }}" class="photo-image"> @if ($isImage)
<img src="{{ $filePath }}" alt="{{ $item['path'] }}" class="photo-image" style="text-align: center;">
@elseif ($isPdf)
<a href="{{ $filePath }}" download="{{ basename($filePath) }}" style="font-size:12px; color:#1a73e8; text-decoration: underline;">
⬇️ Unduh File PDF
</a>
@else
<a href="{{ $filePath }}" download="{{ basename($filePath) }}" style="font-size:12px; color:#1a73e8; text-decoration: underline;">
⬇️ Unduh File
</a>
@endif
@endif @endif
@isset($item['description']) @isset($item['description'])
<p style="font-size:9px">{{ $item['description'] }}</p> <p style="font-size:9px">{{ $item['description'] }}</p>

View File

@@ -21,7 +21,7 @@
} }
#header { /* #header {
position: fixed; position: fixed;
top: -80px; top: -80px;
left: 0; left: 0;
@@ -29,15 +29,15 @@
height: 50px; height: 50px;
text-align: center; text-align: center;
padding-bottom: 10px; padding-bottom: 10px;
} } */
.header-logo { /* .header-logo {
position: absolute; position: absolute;
left: 20px; left: 20px;
top: 10px; top: 10px;
max-height: 80px; max-height: 80px;
max-width: 150px; max-width: 150px;
} } */
.header-title { .header-title {
margin-top: 20px; margin-top: 20px;
@@ -88,9 +88,9 @@
page-break-before: always; page-break-before: always;
break-before: page; break-before: page;
} }
.border { /* .border {
border: 1px solid #000; border: 1px solid #000;
} } */
.no-break { .no-break {
page-break-inside: avoid; page-break-inside: avoid;

View File

@@ -22,11 +22,11 @@ use Modules\Lpj\Http\Controllers\LampiranDokumenController;
use Modules\Lpj\Http\Controllers\LaporanAdminKreditController; use Modules\Lpj\Http\Controllers\LaporanAdminKreditController;
use Modules\Lpj\Http\Controllers\LaporanController; use Modules\Lpj\Http\Controllers\LaporanController;
use Modules\Lpj\Http\Controllers\LaporanExternalController; use Modules\Lpj\Http\Controllers\LaporanExternalController;
use Modules\Lpj\Http\Controllers\LaporanHasilPenilaianJaminanInternalExternalController; use Modules\Lpj\Http\Controllers\LaporanHasilPenilaianJaminanInternalExternalController;
use Modules\Lpj\Http\Controllers\LaporanPembatalanController; use Modules\Lpj\Http\Controllers\LaporanPembatalanController;
use Modules\Lpj\Http\Controllers\LaporanPenilaianJaminanController; use Modules\Lpj\Http\Controllers\LaporanPenilaianJaminanController;
use Modules\Lpj\Http\Controllers\LaporanPermohonanController; use Modules\Lpj\Http\Controllers\LaporanPermohonanController;
use Modules\Lpj\Http\Controllers\NilaiPlafondController; use Modules\Lpj\Http\Controllers\NilaiPlafondController;
use Modules\Lpj\Http\Controllers\NocController; use Modules\Lpj\Http\Controllers\NocController;
use Modules\Lpj\Http\Controllers\PembatalanController; use Modules\Lpj\Http\Controllers\PembatalanController;
use Modules\Lpj\Http\Controllers\PemilikJaminanController; use Modules\Lpj\Http\Controllers\PemilikJaminanController;
@@ -687,9 +687,10 @@ Route::middleware(['auth'])->group(function () {
Route::get('/', [LaporanPenilaiJaminanController::class, 'index'])->name('index'); Route::get('/', [LaporanPenilaiJaminanController::class, 'index'])->name('index');
Route::get('datatables', [LaporanPenilaiJaminanController::class, 'dataForDatatables'])->name('datatables'); Route::get('datatables', [LaporanPenilaiJaminanController::class, 'dataForDatatables'])->name('datatables');
Route::get('export', [LaporanPenilaiJaminanController::class, 'export'])->name('export'); Route::get('export', [LaporanPenilaiJaminanController::class, 'export'])->name('export');
Route::get('show/{permohonan_id}/{dokumen_id}/{jaminan_id}/', [LaporanPenilaiJaminanController::class,'show'])->name('show');
}); });
Route::prefix('laporan-permohonan')->name('laporan-permohonan.')->group(function() { Route::prefix('laporan-permohonan')->name('laporan-permohonan.')->group(function () {
Route::get('datatables', [LaporanPermohonanController::class, 'dataForDatatables'])->name('data'); Route::get('datatables', [LaporanPermohonanController::class, 'dataForDatatables'])->name('data');
Route::get('export', [LaporanPermohonanController::class, 'export'])->name('export'); Route::get('export', [LaporanPermohonanController::class, 'export'])->name('export');
Route::get('/', [LaporanPermohonanController::class, 'index'])->name('index'); Route::get('/', [LaporanPermohonanController::class, 'index'])->name('index');
@@ -702,13 +703,13 @@ Route::middleware(['auth'])->group(function () {
Route::get('/export', [LaporanPembatalanController::class, 'export'])->name('export'); Route::get('/export', [LaporanPembatalanController::class, 'export'])->name('export');
}); });
Route::prefix('laporan-penilaian-jaminan')->name('laporan-penilaian-jaminan.')->group(function() { Route::prefix('laporan-penilaian-jaminan')->name('laporan-penilaian-jaminan.')->group(function () {
Route::get('datatables', [LaporanPenilaianJaminanController::class, 'dataForDatatables'])->name('data'); Route::get('datatables', [LaporanPenilaianJaminanController::class, 'dataForDatatables'])->name('data');
Route::get('export', [LaporanPenilaianJaminanController::class, 'export'])->name('export'); Route::get('export', [LaporanPenilaianJaminanController::class, 'export'])->name('export');
Route::get('/', [LaporanPenilaianJaminanController::class, 'index'])->name('index'); Route::get('/', [LaporanPenilaianJaminanController::class, 'index'])->name('index');
}); });
Route::prefix('laporan-hasil-penilaian-jaminan-internal-external')->name('laporan-hasil-penilaian-jaminan-internal-external.')->group(function() { Route::prefix('laporan-hasil-penilaian-jaminan-internal-external')->name('laporan-hasil-penilaian-jaminan-internal-external.')->group(function () {
Route::get('datatables', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'dataForDatatables'])->name('data'); Route::get('datatables', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'dataForDatatables'])->name('data');
Route::get('export', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'export'])->name('export'); Route::get('export', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'export'])->name('export');
Route::get('/', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'index'])->name('index'); Route::get('/', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'index'])->name('index');