update migration file, dan laporan
This commit is contained in:
@@ -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,11 +38,59 @@ 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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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'
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
306
database/seeders/MigExternalPenawaranSeeder.php
Normal file
306
database/seeders/MigExternalPenawaranSeeder.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
1036
database/seeders/MigInspeksiHelper.php
Normal file
1036
database/seeders/MigInspeksiHelper.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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.
|
||||||
@@ -30,6 +29,9 @@ class MigPenilaianAndPenilainTeamSeeder extends Seeder
|
|||||||
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) {
|
if (($handle = fopen($filePath, 'r')) === false) {
|
||||||
@@ -87,12 +89,12 @@ class MigPenilaianAndPenilainTeamSeeder extends Seeder
|
|||||||
fclose($handle);
|
fclose($handle);
|
||||||
|
|
||||||
$this->command->info("Data debiture berhasil dimigrasikan. Total data: {$totalData}, Total batch: {$batchCount}, Total error: {$errorCount}");
|
$this->command->info("Data debiture berhasil dimigrasikan. Total data: {$totalData}, Total batch: {$batchCount}, Total error: {$errorCount}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private function processBatch(
|
private function processBatch(
|
||||||
array $rows,
|
array $rows,
|
||||||
array &$userDataChace,
|
array &$userDataChace,
|
||||||
array &$nomorRegisCahce,
|
array &$nomorRegisCahce,
|
||||||
@@ -101,7 +103,7 @@ private function processBatch(
|
|||||||
int $totalData,
|
int $totalData,
|
||||||
int $batchCount,
|
int $batchCount,
|
||||||
int $currentRow
|
int $currentRow
|
||||||
) {
|
) {
|
||||||
$userData = [];
|
$userData = [];
|
||||||
foreach ($rows as $index => $row) {
|
foreach ($rows as $index => $row) {
|
||||||
try {
|
try {
|
||||||
@@ -123,8 +125,9 @@ private function processBatch(
|
|||||||
|
|
||||||
// Ambil user ID
|
// Ambil user ID
|
||||||
$userId = $this->getUserId($row['mig_user_id'], $userDataChace);
|
$userId = $this->getUserId($row['mig_user_id'], $userDataChace);
|
||||||
if (!$userId ) {
|
if (!$userId) {
|
||||||
throw new \Exception("User tidak ditemukan");
|
// $this->logError($row['mig_user_id'], 'Salah satu user tidak ditemukan');
|
||||||
|
throw new \Exception($row['mig_user_id'] . " User tidak ditemukan");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +135,7 @@ private function processBatch(
|
|||||||
$userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id'];
|
$userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id'];
|
||||||
|
|
||||||
if (!$userIdUpdate || !$userIdOtorisasi) {
|
if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||||
$this->logError($kode, 'Salah satu user tidak ditemukan');
|
// $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +182,7 @@ private function processBatch(
|
|||||||
|
|
||||||
// Commit transaksi
|
// Commit transaksi
|
||||||
DB::commit();
|
DB::commit();
|
||||||
$this->command->info('Proses data penilaian ' . $row['mig_nama_user'] . ' (' . ($index + 1) . '/' . count($rows) . ')');
|
$this->command->info('Proses data penilaian ' . $row['mig_nomor_lpj'] . ' (' . ($index + 1) . '/' . count($rows) . ')');
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
// Rollback jika ada error
|
// Rollback jika ada error
|
||||||
@@ -195,10 +198,11 @@ private function processBatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
$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,7 +266,7 @@ 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)
|
||||||
@@ -277,10 +283,10 @@ private function processBatch(
|
|||||||
Log::error('Gagal memparsing timestamp: ' . $timestamp . '. Pesan: ' . $e->getMessage());
|
Log::error('Gagal memparsing timestamp: ' . $timestamp . '. Pesan: ' . $e->getMessage());
|
||||||
return null;
|
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)) {
|
||||||
|
|||||||
@@ -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'],
|
||||||
|
|||||||
@@ -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,43 +112,29 @@ 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;
|
||||||
}
|
|
||||||
|
|
||||||
|
// Cari debitur ID dari salah satu field
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
if ($row['mig_nomor_laporan'] == $nomorLaporan) {
|
||||||
$debiturId = $row['mig_kd_debitur_seq'] ?? null;
|
$debiturId = $row['mig_kd_debitur_seq'] ?? null;
|
||||||
$jaminanGroup = $row['mig_grp_keterangan'];
|
break;
|
||||||
$keyName = $row['mig_key_keterangan'];
|
}
|
||||||
$value = $row['mig_nilai'];
|
|
||||||
$urlFile = $row['mig_url_file'] ?? null;
|
|
||||||
|
|
||||||
// Inisialisasi struktur jika belum ada
|
|
||||||
if (!isset($this->result[$jaminanGroup])) {
|
|
||||||
$this->result[$jaminanGroup] = [
|
|
||||||
'group' => $jaminanGroup,
|
|
||||||
'details' => [],
|
|
||||||
'documents' => []
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gabungkan detail
|
if (!$debiturId) {
|
||||||
$detailItem = [$keyName => $value];
|
throw new \Exception('Debitur ID tidak ditemukan');
|
||||||
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
|
// Ambil ID dokumen jaminan
|
||||||
$dokumenJaminanId = $this->getDokumenJaminanId($debiturId, $dokumenJaminanCache);
|
$dokumenJaminanId = $this->getDokumenJaminanId($debiturId, $dokumenJaminanCache);
|
||||||
@@ -156,53 +142,153 @@ class MigrationDetailDokumenJaminanSeeder extends Seeder
|
|||||||
throw new \Exception('Dokumen jaminan tidak ditemukan');
|
throw new \Exception('Dokumen jaminan tidak ditemukan');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ambil ID legalitas jaminan
|
foreach ($dataPerGrup as $groupKey => $rowData) {
|
||||||
$legalitasJaminanId = $this->getLegalitasJaminanId($jaminanGroup, $jenisJaminanCache);
|
// 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,
|
[
|
||||||
|
'name' => $groupKey,
|
||||||
'dokumen_jaminan_id' => $dokumenJaminanId,
|
'dokumen_jaminan_id' => $dokumenJaminanId,
|
||||||
'details' => isset($dataJsonDecode->details) ? json_encode($dataJsonDecode->details) : null,
|
],
|
||||||
|
[
|
||||||
|
'details' => json_encode($rowData['details']),
|
||||||
'jenis_legalitas_jaminan_id' => $legalitasJaminanId,
|
'jenis_legalitas_jaminan_id' => $legalitasJaminanId,
|
||||||
'dokumen_jaminan' => !empty($dataJsonDecode->documents) ? json_encode($dataJsonDecode->documents) : null,
|
'dokumen_jaminan' => !empty($rowData['documents']) ? json_encode($rowData['documents']) : null,
|
||||||
'dokumen_nomor' => $row['dokumen_nomor'] ?? null,
|
'dokumen_nomor' => $nomorLaporan,
|
||||||
'keterangan' => $row['mig_deskripsi_file'] ?? null,
|
'keterangan' => $groupKey,
|
||||||
]);
|
]
|
||||||
|
);
|
||||||
// Hapus dari result set agar tidak duplikat
|
}
|
||||||
unset($this->result[$jaminanGroup]);
|
|
||||||
|
|
||||||
// Info progress
|
// Info progress
|
||||||
$this->command->info('Proses data detail dokumen (' . ($index + 1) . '/' . count($rows)
|
$this->command->info("Proses data detail dokumen (Nomor Laporan: {$nomorLaporan}, batch ke: {$batchCount}, total dari: {$currentRow}/{$totalData})");
|
||||||
. ', batch ke: ' . $batchCount
|
|
||||||
. ', total dari: ' . $currentRow . '/' . $totalData . ')');
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage());
|
Log::error("Error pada nomor laporan {$nomorLaporan}: " . $e->getMessage());
|
||||||
|
|
||||||
// Catat error ke file CSV
|
|
||||||
$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])) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
138027738489 => 10,
|
||||||
|
138051485796 => 48,
|
||||||
|
138051492883 => 47,
|
||||||
|
138051515419 => 40,
|
||||||
|
138051753311 => 41,
|
||||||
|
138051754843 => 46,
|
||||||
|
138051759078 => 42,
|
||||||
|
138051480538 => 45,
|
||||||
|
123382184742 => 18,
|
||||||
|
138051483711 => 44,
|
||||||
|
991 => 52
|
||||||
];
|
];
|
||||||
return $cache[$code];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
return $mapping[$code] ?? 17;
|
||||||
'id' => null,
|
|
||||||
'debiture_id' => null,
|
|
||||||
'mig_kd_debitur_seq' => null
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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;
|
||||||
|
|||||||
@@ -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,7 +88,7 @@ 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);
|
||||||
|
|
||||||
@@ -117,8 +123,9 @@ class MigrationGambarInspeksiSeeder extends Seeder
|
|||||||
continue;
|
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) {
|
||||||
|
usort($kelompok, function ($a, $b) {
|
||||||
return $a['urutan'] <=> $b['urutan'];
|
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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -95,15 +97,12 @@ class MigrationInpseksiSeeder extends Seeder
|
|||||||
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
|
// Ambil informasi permohonan
|
||||||
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache);
|
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache);
|
||||||
if (!$nomorRegis) {
|
if (!$nomorRegis) {
|
||||||
@@ -113,6 +112,7 @@ class MigrationInpseksiSeeder extends Seeder
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cek apakah sudah ada data
|
||||||
$existingRecord = Inspeksi::where('permohonan_id', $nomorRegis['id'])
|
$existingRecord = Inspeksi::where('permohonan_id', $nomorRegis['id'])
|
||||||
->where('dokument_id', $nomorRegis['dokument_id'])
|
->where('dokument_id', $nomorRegis['dokument_id'])
|
||||||
->whereNotNull('data_form')
|
->whereNotNull('data_form')
|
||||||
@@ -123,22 +123,30 @@ class MigrationInpseksiSeeder extends Seeder
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ambil created_at / updated_at dari baris pertama
|
// Ambil baris pertama untuk created_at/updated_at
|
||||||
$firstRow = reset($groupRows);
|
$firstRow = reset($groupRows);
|
||||||
|
|
||||||
// Bangun JSON lengkap
|
// Bangun JSON lengkap
|
||||||
$dataFormJson = $this->buildFullDataForm($groupRows);
|
$dataFormJson = $this->buildFullDataForm($groupRows);
|
||||||
|
$jenisJaminan = $this->checkJenisJaminan($groupRows[0]['mig_name'] ?? '');
|
||||||
|
|
||||||
|
if (!$dataFormJson) {
|
||||||
|
Log::warning("Data form kosong untuk nomor jaminan: {$nomorJaminan}");
|
||||||
|
$errorCount++;
|
||||||
|
$errorDebitureIds[] = $nomorJaminan;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Simpan ke database hanya sekali per grup
|
// Simpan ke database hanya sekali per grup
|
||||||
Inspeksi::create([
|
Inspeksi::create([
|
||||||
'name' => 'tanah,bangunan,lingkungan,fakta,informasi',
|
'name' => $jenisJaminan,
|
||||||
'data_form' => $dataFormJson,
|
'data_form' => $dataFormJson,
|
||||||
'foto_form' => null,
|
'foto_form' => null,
|
||||||
'data_pembanding' => null,
|
'data_pembanding' => null,
|
||||||
'permohonan_id' => $nomorRegis['id'] ?? null,
|
'permohonan_id' => $nomorRegis['id'] ?? null,
|
||||||
'dokument_id' => $nomorRegis['dokument_id'] ?? null,
|
'dokument_id' => $nomorRegis['dokument_id'] ?? null,
|
||||||
'created_at' => $this->parseTimestamp($firstRow['created_at']),
|
'created_at' => $this->parseTimestamp($firstRow['created_at'] ?? null),
|
||||||
'updated_at' => $this->parseTimestamp($firstRow['updated_at']),
|
'updated_at' => $this->parseTimestamp($firstRow['updated_at'] ?? null),
|
||||||
'nomor_lpj' => $nomorJaminan,
|
'nomor_lpj' => $nomorJaminan,
|
||||||
'processed_at' => now(),
|
'processed_at' => now(),
|
||||||
'is_mig' => 1
|
'is_mig' => 1
|
||||||
@@ -146,14 +154,14 @@ class MigrationInpseksiSeeder extends Seeder
|
|||||||
|
|
||||||
$this->command->info("Berhasil simpan data inspeksi untuk nomor jaminan: {$nomorJaminan}");
|
$this->command->info("Berhasil simpan data inspeksi untuk nomor jaminan: {$nomorJaminan}");
|
||||||
|
|
||||||
// } catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
// Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage());
|
Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage());
|
||||||
// $errorCount++;
|
$errorCount++;
|
||||||
// $errorDebitureIds[] = $nomorJaminan;
|
$errorDebitureIds[] = $nomorJaminan;
|
||||||
// continue;
|
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([
|
$jenisJaminan = $rows[0]['mig_name'] ?? null;
|
||||||
'asset' => $assetJson['asset'] ?? [],
|
|
||||||
'tanah' => $tanahJson['tanah'] ?? [],
|
if (!$jenisJaminan) {
|
||||||
'bangunan' => $bangunanJson['bangunan'] ?? [],
|
return null;
|
||||||
'lingkungan' => $lingkunganJson['lingkungan'] ?? [],
|
|
||||||
'fakta' => $faktaJson
|
|
||||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,7 +213,7 @@ class MigrationPembandingSeeder 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");
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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++;
|
||||||
@@ -99,10 +97,10 @@ class MigrationPermohonanSeeder extends Seeder
|
|||||||
|
|
||||||
// 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,17 +111,20 @@ 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
|
||||||
|
// $approved1Id = $this->getUserId($row['mig_mst_lpj_user_approved_1'], $branchCache, false);
|
||||||
|
// $approved2Id = $this->getUserId($row['mig_mst_lpj_user_approved_2'], $branchCache, false);
|
||||||
|
|
||||||
|
// // Ambil user IDs berdasarkan NIK
|
||||||
$userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id'];
|
$userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id'];
|
||||||
$userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id'];
|
$userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id'];
|
||||||
|
|
||||||
if (!$userIdUpdate || !$userIdOtorisasi) {
|
// jika external matikan
|
||||||
$this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
|
// if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||||
continue;
|
// $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
|
||||||
}
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
// Mapping field user
|
// Mapping field user
|
||||||
$mapUser = [
|
$mapUser = [
|
||||||
@@ -132,18 +133,23 @@ class MigrationPermohonanSeeder extends Seeder
|
|||||||
'authorized_by' => $userIdOtorisasi,
|
'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");
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
],
|
||||||
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,14 +91,7 @@
|
|||||||
<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,
|
||||||
@@ -362,10 +354,14 @@
|
|||||||
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 class="btn btn-sm btn-info" href="laporan-penilai-jaminan/show/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}" >
|
||||||
|
<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)">
|
<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
|
<i class="ki-filled ki-printer"></i>Laporan
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
`;
|
`;
|
||||||
}).join('') : ''
|
}).join('') : ''
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
39
resources/views/laporan-penilai-jaminan/show.blade.php
Normal file
39
resources/views/laporan-penilai-jaminan/show.blade.php
Normal 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
|
||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -137,4 +137,4 @@
|
|||||||
</tr>
|
</tr>
|
||||||
@endif
|
@endif
|
||||||
</table>
|
</table>
|
||||||
</div>
|
{{-- </div> --}}
|
||||||
|
|||||||
@@ -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> --}}
|
||||||
|
|||||||
@@ -97,10 +97,13 @@
|
|||||||
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>
|
||||||
@@ -136,7 +149,9 @@
|
|||||||
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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
Reference in New Issue
Block a user