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 Maatwebsite\Excel\Facades\Excel;
|
||||
use Modules\Lpj\Models\Branch;
|
||||
use Modules\Lpj\Http\Controllers\SurveyorController;
|
||||
use Modules\Lpj\Models\Inspeksi;
|
||||
use Modules\Lpj\Models\Penilai;
|
||||
|
||||
class LaporanPenilaiJaminanController extends Controller
|
||||
{
|
||||
@@ -17,6 +20,14 @@ class LaporanPenilaiJaminanController extends Controller
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
|
||||
protected $surveyorController;
|
||||
|
||||
public function __construct(SurveyorController $surveyorController)
|
||||
{
|
||||
$this->surveyorController = $surveyorController;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$status_permohonan = StatusPermohonan::all();
|
||||
@@ -27,12 +38,60 @@ class LaporanPenilaiJaminanController extends Controller
|
||||
/**
|
||||
* Show the specified resource.
|
||||
*/
|
||||
public function show($id)
|
||||
public function show($permohonan_id, $dokumen_id, $jaminan_id)
|
||||
{
|
||||
return view('lpj::laporan-penilai-jaminan.show');
|
||||
$permohonan = $this->surveyorController->getPermohonanJaminanId(
|
||||
$permohonan_id,
|
||||
$dokumen_id,
|
||||
$jaminan_id
|
||||
);
|
||||
|
||||
|
||||
|
||||
$basicData = $this->surveyorController->getCommonData();
|
||||
|
||||
$inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first();
|
||||
$lpj = Penilai::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first();
|
||||
|
||||
$nomorLaporan = getNomorLaporan($permohonan_id, $dokumen_id);
|
||||
$tanggalLaporan = $lpj->created_at ?? null;
|
||||
$forminspeksi = null;
|
||||
$lpjData = null;
|
||||
$formFoto = null;
|
||||
|
||||
if ($inspeksi) {
|
||||
$forminspeksi = json_decode($inspeksi->data_form, true);
|
||||
$formFoto = json_decode($inspeksi->foto_form, true);
|
||||
// $denahForm = json_decode($data->denah_form, true);
|
||||
$dataPembanding = json_decode($inspeksi->data_pembanding, true);
|
||||
}
|
||||
|
||||
if ($lpj) {
|
||||
$lpjData = json_decode($lpj->lpj, true);
|
||||
$memo = json_decode($lpj->memo, true);
|
||||
$resumeData = json_decode($lpj->resume, true);
|
||||
$rap = json_decode($lpj->rap, true);
|
||||
$report = json_decode($lpj->call_report, true);
|
||||
}
|
||||
|
||||
$inputAddress = $forminspeksi['asset']['alamat']['sesuai'] ?? $forminspeksi['asset']['alamat']['tidak sesuai'] ?? [];
|
||||
|
||||
$alamat = [
|
||||
'address' => $inputAddress['address'] ?? null,
|
||||
'village_code' => getWilayahName($inputAddress['village_code'] ?? null, 'village'),
|
||||
'district_code' => getWilayahName($inputAddress['district_code'] ?? null, 'district'),
|
||||
'city_code' => getWilayahName($inputAddress['city_code'] ?? null, 'city'),
|
||||
'province_code' => getWilayahName($inputAddress['province_code'] ?? null, 'province')
|
||||
];
|
||||
|
||||
$statusLpj = 0;
|
||||
|
||||
// $viewLaporan = $this->getViewLaporan($tipeLaporan);
|
||||
return view('lpj::laporan-penilai-jaminan.show', compact('permohonan', 'basicData', 'forminspeksi', 'alamat', 'lpjData', 'memo', 'resumeData', 'rap', 'report', 'lpj', 'formFoto', 'nomorLaporan', 'tanggalLaporan', 'dataPembanding', 'inspeksi', 'statusLpj'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function dataForDatatables(Request $request)
|
||||
{
|
||||
|
||||
|
||||
@@ -1420,9 +1420,11 @@ class PenilaiController extends Controller
|
||||
];
|
||||
}
|
||||
|
||||
public function checkPrintOutLaporan(Request $request)
|
||||
public function checkPrintOutLaporan($permohonan_id, $dokumen_id)
|
||||
{
|
||||
$permohonanId = $request->query('permohonanId');
|
||||
// $permohonanId = $request->query('permohonanId');
|
||||
// $documentId = $request->query('documentId');
|
||||
$permohonanId = $permohonan_id;
|
||||
$documentId = $request->query('documentId');
|
||||
|
||||
// Ambil data berdasarkan ID
|
||||
|
||||
@@ -18,7 +18,7 @@ return new class () extends Migration {
|
||||
|
||||
$table->unsignedBigInteger('mig_kd_debitur_seq')->nullable()->comment('asal data LPJ.PRM_DEBITUR.KD_DEBITUR_SEQ. Berguna untuk update debitur_id menggunakan KD_DEBITUR_SEQ nya');
|
||||
$table->unsignedBigInteger('nomor_lpj')->nullable();
|
||||
$table->timestamp('processed_at')->nullable();
|
||||
$table->string('mig_nama_ao')->nullable();
|
||||
$table->char('is_mig', 1)->nullable()->comment('untuk menandakan row ini dari LPJ OLD');
|
||||
});
|
||||
}
|
||||
@@ -39,7 +39,7 @@ return new class () extends Migration {
|
||||
$table->dropColumn([
|
||||
'mig_kd_debitur_seq',
|
||||
'nomor_lpj',
|
||||
'processed_at',
|
||||
'mig_nama_ao',
|
||||
'is_mig'
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -47,12 +47,15 @@ class LpjDatabaseSeeder extends Seeder
|
||||
// MigrationDebitureSeeder::class,
|
||||
// MigrationPermohonanSeeder::class,
|
||||
// MigrationDokumentJaminanSeeder::class,
|
||||
// MigrationDetailDokumenJaminanSeeder::class
|
||||
// MigPenilaianAndPenilainTeamSeeder::class
|
||||
// MigrationInpseksiSeeder::class
|
||||
// MigrationGambarInspeksiSeeder::class
|
||||
MigrationPembandingSeeder::class
|
||||
// MigrationDetailDokumenJaminanSeeder::class,
|
||||
// MigPenilaianAndPenilainTeamSeeder::class,
|
||||
// MigrationInpseksiSeeder::class,
|
||||
MigrationGambarInspeksiSeeder::class,
|
||||
// MigrationPembandingSeeder::class,
|
||||
// MigrationPenilaiSeeder::class
|
||||
|
||||
// ini untuk penilaian external
|
||||
// MigExternalPenawaranSeeder::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
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\Permohonan;
|
||||
|
||||
|
||||
class MigPenilaianAndPenilainTeamSeeder extends Seeder
|
||||
{
|
||||
protected $errorLogFile = __DIR__ . '/csv/penilaian/error_migration_penilaian_and_team.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/penilaian/mig_penilaian_and_team_error.csv';
|
||||
|
||||
/**
|
||||
* Run the database seeds.
|
||||
@@ -23,182 +22,187 @@ class MigPenilaianAndPenilainTeamSeeder extends Seeder
|
||||
{
|
||||
// Bersihkan/Inisialisasi file error log
|
||||
$this->initializeErrorLog();
|
||||
// Path ke file csv
|
||||
$filePath = realpath(__DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv');
|
||||
// Path ke file csv
|
||||
$filePath = realpath(__DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilaian/mig_penilaian_and_team.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
|
||||
if (($handle = fopen($filePath, 'r')) === false) {
|
||||
Log::error('Gagal membuka file CSV: ' . $filePath);
|
||||
$this->command->error('Gagal membuka file CSV.');
|
||||
return;
|
||||
}
|
||||
|
||||
$header = fgetcsv($handle, 0, '~');
|
||||
$rows = [];
|
||||
$batchSize = 500; // Ukuran batch
|
||||
$userDataChace = [];
|
||||
$nomorRegisCahce = [];
|
||||
$errorCount = 0; // Inisialisasi variabel errorCount
|
||||
$errorDebitureIds = []; // Inisialisasi array errorDebitureIds
|
||||
$totalData = 0;
|
||||
|
||||
// Menghitung total data di file CSV
|
||||
while (($data = fgetcsv($handle, 0, '~')) !== false) {
|
||||
$totalData++;
|
||||
}
|
||||
|
||||
rewind($handle); // Reset pointer ke awal file
|
||||
fgetcsv($handle, 0, '~'); // Skip header
|
||||
|
||||
$batchCount = 0;
|
||||
$currentRow = 0;
|
||||
|
||||
while (($data = fgetcsv($handle, 0, '~')) !== false) {
|
||||
if (count($data) != count($header)) {
|
||||
Log::warning('Baris CSV memiliki jumlah kolom yang tidak sesuai: ' . json_encode($data));
|
||||
continue;
|
||||
}
|
||||
|
||||
$rows[] = array_combine($header, $data);
|
||||
$currentRow++;
|
||||
if (($handle = fopen($filePath, 'r')) === false) {
|
||||
Log::error('Gagal membuka file CSV: ' . $filePath);
|
||||
$this->command->error('Gagal membuka file CSV.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Jika sudah mencapai batch size, proses batch
|
||||
if (count($rows) >= $batchSize) {
|
||||
$header = fgetcsv($handle, 0, '~');
|
||||
$rows = [];
|
||||
$batchSize = 500; // Ukuran batch
|
||||
$userDataChace = [];
|
||||
$nomorRegisCahce = [];
|
||||
$errorCount = 0; // Inisialisasi variabel errorCount
|
||||
$errorDebitureIds = []; // Inisialisasi array errorDebitureIds
|
||||
$totalData = 0;
|
||||
|
||||
// Menghitung total data di file CSV
|
||||
while (($data = fgetcsv($handle, 0, '~')) !== false) {
|
||||
$totalData++;
|
||||
}
|
||||
|
||||
rewind($handle); // Reset pointer ke awal file
|
||||
fgetcsv($handle, 0, '~'); // Skip header
|
||||
|
||||
$batchCount = 0;
|
||||
$currentRow = 0;
|
||||
|
||||
while (($data = fgetcsv($handle, 0, '~')) !== false) {
|
||||
if (count($data) != count($header)) {
|
||||
Log::warning('Baris CSV memiliki jumlah kolom yang tidak sesuai: ' . json_encode($data));
|
||||
continue;
|
||||
}
|
||||
|
||||
$rows[] = array_combine($header, $data);
|
||||
$currentRow++;
|
||||
|
||||
// Jika sudah mencapai batch size, proses batch
|
||||
if (count($rows) >= $batchSize) {
|
||||
$batchCount++;
|
||||
$this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})");
|
||||
$this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow);
|
||||
$rows = [];
|
||||
}
|
||||
}
|
||||
|
||||
// Proses sisa data jika ada
|
||||
// print_r($rows[0]);
|
||||
if (!empty($rows)) {
|
||||
$batchCount++;
|
||||
$this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})");
|
||||
$this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow);
|
||||
$rows = [];
|
||||
}
|
||||
|
||||
fclose($handle);
|
||||
|
||||
$this->command->info("Data debiture berhasil dimigrasikan. Total data: {$totalData}, Total batch: {$batchCount}, Total error: {$errorCount}");
|
||||
}
|
||||
|
||||
// Proses sisa data jika ada
|
||||
// print_r($rows[0]);
|
||||
if (!empty($rows)) {
|
||||
$batchCount++;
|
||||
$this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})");
|
||||
$this->processBatch($rows, $nomorRegisCahce, $userDataChace, $errorCount, $errorDebitureIds, $totalData, $batchCount, $currentRow);
|
||||
}
|
||||
|
||||
fclose($handle);
|
||||
|
||||
$this->command->info("Data debiture berhasil dimigrasikan. Total data: {$totalData}, Total batch: {$batchCount}, Total error: {$errorCount}");
|
||||
}
|
||||
|
||||
|
||||
|
||||
private function processBatch(
|
||||
array $rows,
|
||||
array &$userDataChace,
|
||||
array &$nomorRegisCahce,
|
||||
int &$errorCount,
|
||||
array &$errorDebitureIds,
|
||||
int $totalData,
|
||||
int $batchCount,
|
||||
int $currentRow
|
||||
) {
|
||||
$userData = [];
|
||||
foreach ($rows as $index => $row) {
|
||||
try {
|
||||
// Jalankan setiap baris dengan transaksi sendiri
|
||||
DB::beginTransaction();
|
||||
|
||||
private function processBatch(
|
||||
array $rows,
|
||||
array &$userDataChace,
|
||||
array &$nomorRegisCahce,
|
||||
int &$errorCount,
|
||||
array &$errorDebitureIds,
|
||||
int $totalData,
|
||||
int $batchCount,
|
||||
int $currentRow
|
||||
) {
|
||||
$userData = [];
|
||||
foreach ($rows as $index => $row) {
|
||||
try {
|
||||
// Jalankan setiap baris dengan transaksi sendiri
|
||||
DB::beginTransaction();
|
||||
// Cek apakah sudah diproses
|
||||
$existingRecord = Penilaian::where('nomor_registrasi', $row['mig_nomor_registrasi'])->first();
|
||||
if ($existingRecord && $existingRecord->created_at) {
|
||||
$this->command->info('Data sudah diproses sebelumnya: ' . $row['mig_nomor_registrasi']);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Cek apakah sudah diproses
|
||||
$existingRecord = Penilaian::where('nomor_registrasi', $row['mig_nomor_registrasi'])->first();
|
||||
if ($existingRecord && $existingRecord->created_at) {
|
||||
$this->command->info('Data sudah diproses sebelumnya: ' . $row['mig_nomor_registrasi']);
|
||||
continue;
|
||||
}
|
||||
// Ambil nomor registrasi
|
||||
$nomor_registrasi = $this->getNomorRegistrasiPermohonan($row['mig_nomor_registrasi'], $nomorRegisCahce);
|
||||
if (!$nomor_registrasi) {
|
||||
throw new \Exception("Nomor registrasi tidak valid");
|
||||
}
|
||||
|
||||
// Ambil nomor registrasi
|
||||
$nomor_registrasi = $this->getNomorRegistrasiPermohonan($row['mig_nomor_registrasi'], $nomorRegisCahce);
|
||||
if (!$nomor_registrasi) {
|
||||
throw new \Exception("Nomor registrasi tidak valid");
|
||||
}
|
||||
// Ambil user ID
|
||||
$userId = $this->getUserId($row['mig_user_id'], $userDataChace);
|
||||
if (!$userId) {
|
||||
// $this->logError($row['mig_user_id'], 'Salah satu user tidak ditemukan');
|
||||
throw new \Exception($row['mig_user_id'] . " User tidak ditemukan");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Ambil user ID
|
||||
$userId = $this->getUserId($row['mig_user_id'], $userDataChace);
|
||||
if (!$userId ) {
|
||||
throw new \Exception("User tidak ditemukan");
|
||||
continue;
|
||||
}
|
||||
$userIdUpdate = $this->getUserIdData($row['mig_created_by'] ?? null, $userData)['id'];
|
||||
$userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id'];
|
||||
|
||||
$userIdUpdate = $this->getUserIdData($row['mig_created_by'] ?? null, $userData)['id'];
|
||||
$userIdOtorisasi = $this->getUserIdData($row['mig_authorized_by'] ?? null, $userData)['id'];
|
||||
if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||
// $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||
$this->logError($kode, 'Salah satu user tidak ditemukan');
|
||||
continue;
|
||||
}
|
||||
// Mapping field user
|
||||
$mapUser = [
|
||||
'created_by' => $userIdUpdate,
|
||||
'updated_by' => $userIdUpdate,
|
||||
'authorized_by' => $userIdOtorisasi,
|
||||
];
|
||||
|
||||
// Mapping field user
|
||||
$mapUser = [
|
||||
'created_by' => $userIdUpdate,
|
||||
'updated_by' => $userIdUpdate,
|
||||
'authorized_by' => $userIdOtorisasi,
|
||||
];
|
||||
// Ambil team ID
|
||||
$teamId = $this->checkTeams($row['mig_team_id']);
|
||||
if (!$teamId) {
|
||||
throw new \Exception("Team tidak ditemukan");
|
||||
}
|
||||
|
||||
// Ambil team ID
|
||||
$teamId = $this->checkTeams($row['mig_team_id']);
|
||||
if (!$teamId) {
|
||||
throw new \Exception("Team tidak ditemukan");
|
||||
}
|
||||
|
||||
// Buat penilaian
|
||||
$penilaian = Penilaian::create([
|
||||
'nomor_registrasi' => $nomor_registrasi,
|
||||
'jenis_penilaian_id' => 1,
|
||||
'tanggal_kunjungan' => $this->parseTimestamp($row['mig_tanggal_kunjungan']) ?? now(),
|
||||
'waktu_penilaian' => $this->parseTimestamp($row['mig_waktu_penilaian']),
|
||||
'status' => 'done',
|
||||
'keterangan' => null,
|
||||
'created_at' => $this->parseTimestamp($row['mig_created_at']),
|
||||
'updated_at' => $this->parseTimestamp($row['mig_updated_at']),
|
||||
'authorized_by' => $mapUser['authorized_by'],
|
||||
'created_by' => $mapUser['created_by'],
|
||||
'updated_by' => $mapUser['updated_by'],
|
||||
]);
|
||||
|
||||
// Buat tim penilaian
|
||||
$roles = ['surveyor', 'penilai'];
|
||||
foreach ($roles as $role) {
|
||||
PenilaianTeam::create([
|
||||
'penilaian_id' => $penilaian->id,
|
||||
'user_id' => $userId,
|
||||
'role' => $role,
|
||||
'team_id' => $teamId,
|
||||
// Buat penilaian
|
||||
$penilaian = Penilaian::create([
|
||||
'nomor_registrasi' => $nomor_registrasi,
|
||||
'jenis_penilaian_id' => 1,
|
||||
'tanggal_kunjungan' => $this->parseTimestamp($row['mig_tanggal_kunjungan']) ?? now(),
|
||||
'waktu_penilaian' => $this->parseTimestamp($row['mig_waktu_penilaian']),
|
||||
'status' => 'done',
|
||||
'keterangan' => null,
|
||||
'created_at' => $this->parseTimestamp($row['mig_created_at']),
|
||||
'updated_at' => $this->parseTimestamp($row['mig_updated_at']),
|
||||
'authorized_by' => $mapUser['authorized_by'],
|
||||
'created_by' => $mapUser['created_by'],
|
||||
'updated_by' => $mapUser['updated_by'],
|
||||
]);
|
||||
|
||||
// Buat tim penilaian
|
||||
$roles = ['surveyor', 'penilai'];
|
||||
foreach ($roles as $role) {
|
||||
PenilaianTeam::create([
|
||||
'penilaian_id' => $penilaian->id,
|
||||
'user_id' => $userId,
|
||||
'role' => $role,
|
||||
'team_id' => $teamId,
|
||||
'created_at' => $this->parseTimestamp($row['mig_created_at']),
|
||||
'updated_at' => $this->parseTimestamp($row['mig_updated_at']),
|
||||
]);
|
||||
}
|
||||
|
||||
// Commit transaksi
|
||||
DB::commit();
|
||||
$this->command->info('Proses data penilaian ' . $row['mig_nomor_lpj'] . ' (' . ($index + 1) . '/' . count($rows) . ')');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Rollback jika ada error
|
||||
DB::rollBack();
|
||||
|
||||
Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage());
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $row['mig_team_id'] ?? '-';
|
||||
$this->logError($row['mig_team_id'] ?? '-', $e->getMessage());
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Commit transaksi
|
||||
DB::commit();
|
||||
$this->command->info('Proses data penilaian ' . $row['mig_nama_user'] . ' (' . ($index + 1) . '/' . count($rows) . ')');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Rollback jika ada error
|
||||
DB::rollBack();
|
||||
|
||||
Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage());
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $row['mig_team_id'] ?? '-';
|
||||
$this->logError($row['mig_team_id'] ?? '-', $e->getMessage());
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds));
|
||||
}
|
||||
|
||||
$this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds));
|
||||
}
|
||||
|
||||
|
||||
private function getNomorRegistrasiPermohonan($nomor_registrasi_id, $nomorRegisCahce){
|
||||
private function getNomorRegistrasiPermohonan($nomor_registrasi_id, $nomorRegisCahce)
|
||||
{
|
||||
if (isset($nomorRegisCahce[$nomor_registrasi_id])) {
|
||||
return $nomorRegisCahce[$nomor_registrasi_id];
|
||||
}
|
||||
@@ -214,7 +218,9 @@ private function processBatch(
|
||||
}
|
||||
private function getUserIdData(?string $code, array &$cache): array
|
||||
{
|
||||
if (!$code) return ['id' => null, 'branch_id' => null];
|
||||
if (!$code) {
|
||||
return ['id' => null, 'branch_id' => null];
|
||||
}
|
||||
|
||||
if (isset($cache[$code])) {
|
||||
return $cache[$code];
|
||||
@@ -260,27 +266,27 @@ private function processBatch(
|
||||
|
||||
|
||||
private function parseTimestamp(?string $timestamp): ?string
|
||||
{
|
||||
try {
|
||||
if ($timestamp) {
|
||||
// Cek jika format hanya tanggal (Y-m-d)
|
||||
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $timestamp)) {
|
||||
return \Carbon\Carbon::createFromFormat('Y-m-d', $timestamp)
|
||||
->startOfDay()
|
||||
->toDateTimeString();
|
||||
{
|
||||
try {
|
||||
if ($timestamp) {
|
||||
// Cek jika format hanya tanggal (Y-m-d)
|
||||
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $timestamp)) {
|
||||
return \Carbon\Carbon::createFromFormat('Y-m-d', $timestamp)
|
||||
->startOfDay()
|
||||
->toDateTimeString();
|
||||
}
|
||||
// Format lengkap (Y-m-d H:i:s)
|
||||
return \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $timestamp)->toDateTimeString();
|
||||
}
|
||||
// Format lengkap (Y-m-d H:i:s)
|
||||
return \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $timestamp)->toDateTimeString();
|
||||
return null;
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Gagal memparsing timestamp: ' . $timestamp . '. Pesan: ' . $e->getMessage());
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Gagal memparsing timestamp: ' . $timestamp . '. Pesan: ' . $e->getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function initializeErrorLog()
|
||||
private function initializeErrorLog()
|
||||
{
|
||||
// Jika file lama ada, hapus
|
||||
if (file_exists($this->errorLogFile)) {
|
||||
|
||||
@@ -108,10 +108,10 @@ class MigrationDebitureSeeder extends Seeder
|
||||
$userIdUpdate = $this->getUserId($row['mig_user_update'] ?? null, $userData)['id'];
|
||||
$userIdOtorisasi = $this->getUserId($row['mig_user_oto'] ?? null, $userData)['id'];
|
||||
|
||||
if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||
$this->logError($kode, 'Salah satu user tidak ditemukan');
|
||||
continue;
|
||||
}
|
||||
// if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||
// $this->logError($kode, 'Salah satu user tidak ditemukan');
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// Mapping field user
|
||||
$mapUser = [
|
||||
@@ -147,8 +147,8 @@ class MigrationDebitureSeeder extends Seeder
|
||||
'address' => $row['address'] ?? null,
|
||||
'authorized_at' => $authorizedAt,
|
||||
'authorized_by' => $mapUser['authorized_by'],
|
||||
'created_by' => $mapUser['created_by'],
|
||||
'updated_by' => $mapUser['updated_by'],
|
||||
'created_by' => $mapUser['created_by'] ?? null,
|
||||
'updated_by' => $mapUser['updated_by'] ?? null,
|
||||
'created_at' => $createdAt,
|
||||
'updated_at' => $updatedAt,
|
||||
'mig_kd_debitur_seq' => $row['mig_kd_debitur_seq'],
|
||||
|
||||
@@ -19,7 +19,7 @@ use Illuminate\Support\Facades\Log;
|
||||
|
||||
class MigrationDetailDokumenJaminanSeeder extends Seeder
|
||||
{
|
||||
protected $errorLogFile = __DIR__ . '/csv/mig_pemilik_dan_dokument_error.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/detail-dokumen/mig_detail_dokument_external_error.csv';
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
@@ -28,10 +28,10 @@ class MigrationDetailDokumenJaminanSeeder extends Seeder
|
||||
{
|
||||
$this->initializeErrorLog();
|
||||
// Path ke file csv
|
||||
$filePath = realpath(__DIR__ . '/csv/detail-dokumen/mig_detail_dokumen.csv');
|
||||
$filePath = realpath(__DIR__ . '/csv/detail-dokumen/mig_detail_dokument_external.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/detail-dokumen/mig_detail_dokumen.csv');
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/detail-dokumen/mig_detail_dokument_external.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
@@ -112,97 +112,183 @@ class MigrationDetailDokumenJaminanSeeder extends Seeder
|
||||
int &$errorCount,
|
||||
array &$errorDebitureIds
|
||||
) {
|
||||
foreach ($rows as $index => $row) {
|
||||
$groupedRows = $this->groupRowsByNomorLaporanAndKeterangan($rows);
|
||||
|
||||
// print_r($groupedRows);
|
||||
|
||||
foreach ($groupedRows as $nomorLaporan => $dataPerGrup) {
|
||||
|
||||
// print_r($dataPerGrup);
|
||||
try {
|
||||
// Pastikan field penting tersedia
|
||||
if (!isset($row['mig_grp_keterangan'], $row['mig_key_keterangan'], $row['mig_nilai'])) {
|
||||
throw new \Exception('Field wajib tidak ditemukan');
|
||||
}
|
||||
// Ambil salah satu baris untuk referensi (misal baris pertama dari grup)
|
||||
$firstRow = reset($dataPerGrup)['details'] ? reset($dataPerGrup) : reset($dataPerGrup);
|
||||
$debiturId = null;
|
||||
|
||||
$debiturId = $row['mig_kd_debitur_seq'] ?? null;
|
||||
$jaminanGroup = $row['mig_grp_keterangan'];
|
||||
$keyName = $row['mig_key_keterangan'];
|
||||
$value = $row['mig_nilai'];
|
||||
$urlFile = $row['mig_url_file'] ?? null;
|
||||
|
||||
// Inisialisasi struktur jika belum ada
|
||||
if (!isset($this->result[$jaminanGroup])) {
|
||||
$this->result[$jaminanGroup] = [
|
||||
'group' => $jaminanGroup,
|
||||
'details' => [],
|
||||
'documents' => []
|
||||
];
|
||||
}
|
||||
|
||||
// Gabungkan detail
|
||||
$detailItem = [$keyName => $value];
|
||||
if (!empty($this->result[$jaminanGroup]['details'])) {
|
||||
$existingDetails = $this->result[$jaminanGroup]['details'][0];
|
||||
$detailItem = array_merge($existingDetails, $detailItem);
|
||||
}
|
||||
$this->result[$jaminanGroup]['details'] = [$detailItem];
|
||||
|
||||
// Tambahkan dokumen jika ada
|
||||
if ($urlFile && !in_array($urlFile, $this->result[$jaminanGroup]['documents'])) {
|
||||
$this->result[$jaminanGroup]['documents'][] = $urlFile;
|
||||
}
|
||||
|
||||
// Jika sudah akhir group atau baris terakhir, simpan ke DB
|
||||
if ($index === count($rows) - 1 || $row['mig_grp_keterangan'] !== $rows[$index + 1]['mig_grp_keterangan']) {
|
||||
|
||||
// Ambil ID dokumen jaminan
|
||||
$dokumenJaminanId = $this->getDokumenJaminanId($debiturId, $dokumenJaminanCache);
|
||||
if (!$dokumenJaminanId) {
|
||||
throw new \Exception('Dokumen jaminan tidak ditemukan');
|
||||
// Cari debitur ID dari salah satu field
|
||||
foreach ($rows as $row) {
|
||||
if ($row['mig_nomor_laporan'] == $nomorLaporan) {
|
||||
$debiturId = $row['mig_kd_debitur_seq'] ?? null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Ambil ID legalitas jaminan
|
||||
$legalitasJaminanId = $this->getLegalitasJaminanId($jaminanGroup, $jenisJaminanCache);
|
||||
if (!$debiturId) {
|
||||
throw new \Exception('Debitur ID tidak ditemukan');
|
||||
}
|
||||
|
||||
// Ambil ID dokumen jaminan
|
||||
$dokumenJaminanId = $this->getDokumenJaminanId($debiturId, $dokumenJaminanCache);
|
||||
if (!$dokumenJaminanId) {
|
||||
throw new \Exception('Dokumen jaminan tidak ditemukan');
|
||||
}
|
||||
|
||||
foreach ($dataPerGrup as $groupKey => $rowData) {
|
||||
// Ambil legalitas jaminan ID berdasarkan grup keterangan
|
||||
$legalitasJaminanId = $this->getLegalitasJaminanId($groupKey, $jenisJaminanCache);
|
||||
if (!$legalitasJaminanId) {
|
||||
throw new \Exception('Legalitas jaminan tidak ditemukan');
|
||||
throw new \Exception("Legalitas jaminan tidak ditemukan untuk grup: {$groupKey}");
|
||||
}
|
||||
|
||||
// Encode hasil sementara
|
||||
$jsonResult = json_encode($this->result[$jaminanGroup], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
$dataJsonDecode = json_decode($jsonResult);
|
||||
|
||||
// Simpan ke database
|
||||
DetailDokumenJaminan::create([
|
||||
'name' => $jaminanGroup,
|
||||
'dokumen_jaminan_id' => $dokumenJaminanId,
|
||||
'details' => isset($dataJsonDecode->details) ? json_encode($dataJsonDecode->details) : null,
|
||||
'jenis_legalitas_jaminan_id' => $legalitasJaminanId,
|
||||
'dokumen_jaminan' => !empty($dataJsonDecode->documents) ? json_encode($dataJsonDecode->documents) : null,
|
||||
'dokumen_nomor' => $row['dokumen_nomor'] ?? null,
|
||||
'keterangan' => $row['mig_deskripsi_file'] ?? null,
|
||||
]);
|
||||
|
||||
// Hapus dari result set agar tidak duplikat
|
||||
unset($this->result[$jaminanGroup]);
|
||||
|
||||
// Info progress
|
||||
$this->command->info('Proses data detail dokumen (' . ($index + 1) . '/' . count($rows)
|
||||
. ', batch ke: ' . $batchCount
|
||||
. ', total dari: ' . $currentRow . '/' . $totalData . ')');
|
||||
|
||||
DetailDokumenJaminan::updateOrCreate(
|
||||
[
|
||||
'name' => $groupKey,
|
||||
'dokumen_jaminan_id' => $dokumenJaminanId,
|
||||
],
|
||||
[
|
||||
'details' => json_encode($rowData['details']),
|
||||
'jenis_legalitas_jaminan_id' => $legalitasJaminanId,
|
||||
'dokumen_jaminan' => !empty($rowData['documents']) ? json_encode($rowData['documents']) : null,
|
||||
'dokumen_nomor' => $nomorLaporan,
|
||||
'keterangan' => $groupKey,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error pada baris: ' . json_encode($row) . '. Pesan: ' . $e->getMessage());
|
||||
// Info progress
|
||||
$this->command->info("Proses data detail dokumen (Nomor Laporan: {$nomorLaporan}, batch ke: {$batchCount}, total dari: {$currentRow}/{$totalData})");
|
||||
|
||||
// Catat error ke file CSV
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error pada nomor laporan {$nomorLaporan}: " . $e->getMessage());
|
||||
$this->logError($debiturId ?? '-', $e->getMessage());
|
||||
$errorDebitureIds[] = $debiturId ?? '-';
|
||||
|
||||
continue;
|
||||
$errorCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// Reset result set setelah batch selesai
|
||||
$this->result = [];
|
||||
}
|
||||
|
||||
|
||||
private function groupRowsByNomorLaporann(array $rows): array
|
||||
{
|
||||
$grouped = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$nomorJaminan = $row['mig_nomor_laporan'] ?? null;
|
||||
if (!empty($nomorJaminan)) {
|
||||
$grouped[$nomorJaminan][] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
return $grouped;
|
||||
}
|
||||
|
||||
|
||||
// private function groupRowsByNomorLaporanAndKeterangan(array $rows): array
|
||||
// {
|
||||
// $groupedByNomorLaporan = $this->groupRowsByNomorLaporann($rows);
|
||||
// $finalGrouped = [];
|
||||
|
||||
// foreach ($groupedByNomorLaporan as $nomorLaporan => $rowList) {
|
||||
// $groupedByGrpKeterangan = [];
|
||||
|
||||
// // Urutkan berdasarkan mig_urutan_sub (ascending)
|
||||
// usort($rowList, function ($a, $b) {
|
||||
// return $a['mig_urutan_sub'] <=> $b['mig_urutan_sub'];
|
||||
// });
|
||||
|
||||
// foreach ($rowList as $row) {
|
||||
// $grpKeterangan = $row['mig_grp_keterangan'] ?? 'UNKNOWN_GROUP';
|
||||
|
||||
// if (!isset($groupedByGrpKeterangan[$grpKeterangan])) {
|
||||
// $groupedByGrpKeterangan[$grpKeterangan] = [
|
||||
// 'details' => [],
|
||||
// 'documents' => []
|
||||
// ];
|
||||
// }
|
||||
|
||||
// $keyKeterangan = $row['mig_key_keterangan'] ?? 'UNKNOWN_KEY';
|
||||
// $value = $row['mig_nilai'] ?? null;
|
||||
|
||||
// // Jika belum ada detail, inisialisasi sebagai array asosiatif
|
||||
// if (empty($groupedByGrpKeterangan[$grpKeterangan]['details'])) {
|
||||
// $groupedByGrpKeterangan[$grpKeterangan]['details'][] = [];
|
||||
// }
|
||||
|
||||
// // Masukkan ke dalam object tunggal (bukan item baru)
|
||||
// if ($value !== null) {
|
||||
// $lastIndex = count($groupedByGrpKeterangan[$grpKeterangan]['details']) - 1;
|
||||
// $groupedByGrpKeterangan[$grpKeterangan]['details'][$lastIndex][$keyKeterangan] = $value;
|
||||
// }
|
||||
|
||||
// // Tambahkan dokumen jika ada
|
||||
// $urlFile = $row['mig_url_file'] ?? null;
|
||||
// if (!empty($urlFile)) {
|
||||
// $groupedByGrpKeterangan[$grpKeterangan]['documents'][] = $urlFile;
|
||||
// }
|
||||
// }
|
||||
|
||||
// $finalGrouped[$nomorLaporan] = $groupedByGrpKeterangan;
|
||||
// }
|
||||
|
||||
// // print_r($finalGrouped);
|
||||
// return $finalGrouped;
|
||||
// }
|
||||
|
||||
|
||||
private function groupRowsByNomorLaporanAndKeterangan(array $rows): array
|
||||
{
|
||||
$groupedByNomorLaporan = $this->groupRowsByNomorLaporann($rows);
|
||||
$finalGrouped = [];
|
||||
|
||||
foreach ($groupedByNomorLaporan as $nomorLaporan => $rowList) {
|
||||
$groupedByGrpKeterangan = [];
|
||||
|
||||
// Urutkan berdasarkan mig_urutan_sub
|
||||
usort($rowList, function ($a, $b) {
|
||||
return $a['mig_urutan_sub'] <=> $b['mig_urutan_sub'];
|
||||
});
|
||||
|
||||
foreach ($rowList as $row) {
|
||||
$grpKeterangan = $row['mig_grp_keterangan'] ?? 'UNKNOWN_GROUP';
|
||||
$keyKeterangan = $row['mig_key_keterangan'] ?? 'UNKNOWN_KEY';
|
||||
$value = $row['mig_nilai'] ?? null;
|
||||
|
||||
if (!isset($groupedByGrpKeterangan[$grpKeterangan])) {
|
||||
$groupedByGrpKeterangan[$grpKeterangan] = [
|
||||
'details' => [],
|
||||
'documents' => []
|
||||
];
|
||||
}
|
||||
|
||||
// Masukkan sebagai object baru ke dalam details
|
||||
if ($value !== null) {
|
||||
$groupedByGrpKeterangan[$grpKeterangan]['details'][] = [
|
||||
$keyKeterangan => $value
|
||||
];
|
||||
}
|
||||
|
||||
// Dokumen tetap masuk sebagai array string
|
||||
$urlFile = $row['mig_url_file'] ?? null;
|
||||
if (!empty($urlFile)) {
|
||||
$groupedByGrpKeterangan[$grpKeterangan]['documents'][] = $urlFile;
|
||||
}
|
||||
}
|
||||
|
||||
$finalGrouped[$nomorLaporan] = $groupedByGrpKeterangan;
|
||||
}
|
||||
|
||||
return $finalGrouped;
|
||||
}
|
||||
private function getDokumenJaminanId(string $code, array &$dokumenJaminanCache)
|
||||
{
|
||||
if (isset($dokumenJaminanCache[$code])) {
|
||||
|
||||
@@ -19,7 +19,7 @@ use Illuminate\Support\Facades\Log;
|
||||
|
||||
class MigrationDokumentJaminanSeeder extends Seeder
|
||||
{
|
||||
protected $errorLogFile = __DIR__ . '/csv/dokumen-dan-pemilik/mig_pemilik_dan_dokument_error.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/dokumen-pemilik/mig_pemilik_dan_dokument_external_error_log.csv';
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
@@ -27,10 +27,10 @@ class MigrationDokumentJaminanSeeder extends Seeder
|
||||
{
|
||||
$this->initializeErrorLog();
|
||||
// Path ke file csv
|
||||
$filePath = realpath(__DIR__ . '/csv/dokumen-dan-pemilik/mig_pemilik_dan_dokument.csv');
|
||||
$filePath = realpath(__DIR__ . '/csv/dokumen-pemilik/mig_pemilik_dan_dokument_external.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/mig_pemilik_dan_dokument.csv');
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/dokumen-pemilik/mig_pemilik_dan_dokument_external.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
@@ -125,39 +125,45 @@ class MigrationDokumentJaminanSeeder extends Seeder
|
||||
DB::beginTransaction();
|
||||
|
||||
// Cari permohonan
|
||||
$permohonan = $this->getPermohonanId(
|
||||
$row['mig_kd_debitur_seq'],
|
||||
$row['mig_nomor_jaminan'],
|
||||
$permohonanCache
|
||||
);
|
||||
|
||||
if (empty($permohonan['debiture_id'])) {
|
||||
throw new \Exception('Missing debiture_id');
|
||||
$permohonan = Permohonan::where('nomor_registrasi', $row['mig_nomor_jaminan'])->first();
|
||||
|
||||
if (empty($permohonan)) {
|
||||
throw new \Exception('Missing debiture_id' . $row['mig_nomor_jaminan']);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Pastikan permohonan_id belum digunakan di dokumen_jaminan
|
||||
$existingDokumen = DokumenJaminan::where('permohonan_id', $permohonan['id'])->first();
|
||||
$existingDokumen = DokumenJaminan::where('permohonan_id', $permohonan->id)->first();
|
||||
if ($existingDokumen) {
|
||||
throw new \Exception("permohonan_id {$permohonan['id']} sudah digunakan di dokumen_jaminan");
|
||||
throw new \Exception("permohonan_id {$permohonan->id} sudah digunakan di dokumen_jaminan");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Ambil lokasi
|
||||
|
||||
// jika external silahkan matikan ini
|
||||
|
||||
$proviceCode = $this->getProvinceCode($row['mig_province_name'], $provinceCache);
|
||||
$cityCode = $this->getCityCode($row['mig_city_name'], $cityCache);
|
||||
$districtCode = $this->getDistrictCode($row['mig_district_name'], $districtCache);
|
||||
$subdistrict = $this->getSubdistrictCode($row['mig_village_name'], $subdistrictCache, $districtCache);
|
||||
$hubunganPemilik = $this->getHubunganPemilikJaminanId($row['mig_hubungan_pemilik_jaminan'], $hubunganPemilikCache);
|
||||
// $hubunganPemilik = $this->getHubunganPemilikJaminanId($row['mig_hubungan_pemilik_jaminan'], $hubunganPemilikCache);
|
||||
|
||||
|
||||
$pemilik_jaminan_name = $this->getDebitureId($row['mig_kd_debitur_seq'], $pemilikJaminanCache);
|
||||
// Buat Pemilik Jaminan
|
||||
$pemilik_jaminan = PemilikJaminan::create([
|
||||
'debiture_id' => $permohonan['debiture_id'],
|
||||
'hubungan_pemilik_jaminan_id' => $hubunganPemilik,
|
||||
'name' => $row['name'],
|
||||
$pemilik_jaminan = PemilikJaminan::updateOrCreate([
|
||||
'debiture_id' => $permohonan->debiture_id,
|
||||
'hubungan_pemilik_jaminan_id' => 1,
|
||||
// 'name' => $row['name'],
|
||||
'name' => $pemilik_jaminan_name,
|
||||
'detail_sertifikat' => null,
|
||||
'npwp' => null,
|
||||
'nomor_id' => null,
|
||||
'email' => null,
|
||||
'phone' => null,
|
||||
// jika external silahkan matikan ini
|
||||
'province_code' => $proviceCode,
|
||||
'city_code' => $cityCode,
|
||||
'district_code' => $districtCode,
|
||||
@@ -172,16 +178,17 @@ class MigrationDokumentJaminanSeeder extends Seeder
|
||||
]);
|
||||
|
||||
// Buat Dokumen Jaminan
|
||||
DokumenJaminan::create([
|
||||
'debiture_id' => $permohonan['debiture_id'],
|
||||
'permohonan_id' => $permohonan['id'],
|
||||
'jenis_jaminan_id' => 17,
|
||||
DokumenJaminan::updateOrCreate([
|
||||
'debiture_id' => $permohonan->debiture_id,
|
||||
'permohonan_id' => $permohonan->id,
|
||||
'jenis_jaminan_id' => $this->getJaminanId($row['mig_jenis_seq']),
|
||||
'pemilik_jaminan_id' => $pemilik_jaminan->id,
|
||||
'province_code' => $proviceCode,
|
||||
'city_code' => $cityCode,
|
||||
'district_code' => $districtCode,
|
||||
'village_code' => $subdistrict['code'],
|
||||
'postal_code' => $subdistrict['postal_code'],
|
||||
// jika external silahkan matikan ini
|
||||
// 'province_code' => $proviceCode,
|
||||
// 'city_code' => $cityCode,
|
||||
// 'district_code' => $districtCode,
|
||||
// 'village_code' => $subdistrict['code'],
|
||||
// 'postal_code' => $subdistrict['postal_code'],
|
||||
'address' => $row['address'],
|
||||
'created_at' => $this->parseTimestamp($row['created_at']),
|
||||
'updated_at' => $this->parseTimestamp($row['updated_at']),
|
||||
@@ -201,50 +208,57 @@ class MigrationDokumentJaminanSeeder extends Seeder
|
||||
Log::error("Error pada baris: " . json_encode($row) . ". Pesan: " . $e->getMessage());
|
||||
$this->logError($row['mig_kd_debitur_seq'] ?? '-', $e->getMessage());
|
||||
$errorDebitureIds[] = $row['mig_kd_debitur_seq'] ?? '-';
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$this->command->info("Batch {$batchCount} selesai. Total error: " . count($errorDebitureIds));
|
||||
}
|
||||
private function getPermohonanId(string $code, string $mig_nomor_jaminan, array &$cache): ?array
|
||||
// private function getPermohonanId($code,$cache)
|
||||
// {
|
||||
// if (isset($cache[$code])) {
|
||||
// return $cache[$code];
|
||||
// }
|
||||
|
||||
// $permohonan = Permohonan::where('mig_kd_debitur_seq', $code)->where('nomor_registrasi', $mig_nomor_jaminan)->first();
|
||||
|
||||
// if ($permohonan) {
|
||||
// $cache[$code] = $permohonan;
|
||||
// return $permohonan;
|
||||
// }
|
||||
|
||||
// return null;
|
||||
// }
|
||||
|
||||
|
||||
private function getJaminanId($code): ?int
|
||||
{
|
||||
if (isset($cache[$code])) {
|
||||
return $cache[$code];
|
||||
}
|
||||
|
||||
$permohonan = Permohonan::where('mig_kd_debitur_seq', $code)->where('nomor_registrasi', $mig_nomor_jaminan)->first();
|
||||
|
||||
if ($permohonan) {
|
||||
$cache[$code] = [
|
||||
'id' => $permohonan->id,
|
||||
'debiture_id' => $permohonan->debiture_id,
|
||||
'mig_kd_debitur_seq' => $permohonan->mig_kd_debitur_seq
|
||||
];
|
||||
return $cache[$code];
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => null,
|
||||
'debiture_id' => null,
|
||||
'mig_kd_debitur_seq' => null
|
||||
$mapping = [
|
||||
7 => 17,
|
||||
8 => 13,
|
||||
6 => 32,
|
||||
1 => 17,
|
||||
2 => 26,
|
||||
3 => 27,
|
||||
4 => 50,
|
||||
5 => 21,
|
||||
138051314724 => 23,
|
||||
138027243057 => 34,
|
||||
138027664224 => 35,
|
||||
138027738489 => 10,
|
||||
138051485796 => 48,
|
||||
138051492883 => 47,
|
||||
138051515419 => 40,
|
||||
138051753311 => 41,
|
||||
138051754843 => 46,
|
||||
138051759078 => 42,
|
||||
138051480538 => 45,
|
||||
123382184742 => 18,
|
||||
138051483711 => 44,
|
||||
991 => 52
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
private function getJaminanId(string $code, array &$cache): ?int
|
||||
{
|
||||
if (isset($cache[$code])) {
|
||||
return $cache[$code];
|
||||
}
|
||||
|
||||
$jaminan = JenisJaminan::whereRaw('LOWER(name) = ?', [strtolower($code)])->first();
|
||||
|
||||
if ($jaminan) {
|
||||
$cache[$code] = $jaminan->id;
|
||||
return $jaminan->id;
|
||||
}
|
||||
|
||||
return null;
|
||||
return $mapping[$code] ?? 17;
|
||||
}
|
||||
|
||||
private function getPemilikJaminanId(string $code, array &$cache): ?int
|
||||
@@ -263,7 +277,7 @@ class MigrationDokumentJaminanSeeder extends Seeder
|
||||
return 1;
|
||||
}
|
||||
|
||||
private function getDebitureId(string $code, array &$cache): ?int
|
||||
private function getDebitureId(string $code, array &$cache): ?string
|
||||
{
|
||||
if (isset($cache[$code])) {
|
||||
return $cache[$code];
|
||||
@@ -272,8 +286,8 @@ class MigrationDokumentJaminanSeeder extends Seeder
|
||||
$debiture = Debiture::where('mig_kd_debitur_seq', $code)->first();
|
||||
|
||||
if ($debiture) {
|
||||
$cache[$code] = $debiture->id;
|
||||
return $debiture->id;
|
||||
$cache[$code] = $debiture->name;
|
||||
return $debiture->name;
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
@@ -9,21 +9,27 @@ use Modules\Lpj\Models\Inspeksi;
|
||||
use Modules\Basicdata\Models\Branch;
|
||||
use Modules\Lpj\Models\DokumenJaminan;
|
||||
use Modules\Lpj\Models\Permohonan;
|
||||
use DateTime;
|
||||
|
||||
class MigrationGambarInspeksiSeeder extends Seeder
|
||||
{
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_foto_error.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_foto_20253_error.csv';
|
||||
/**
|
||||
* Migrasi data gambar inspeksi dari file csv ke tabel inspeksi_gambar
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$this->initializeErrorLog();
|
||||
// Path ke file csv
|
||||
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_foto.csv');
|
||||
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_foto_20253.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_foto.csv');
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_foto_20253.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
@@ -82,43 +88,44 @@ class MigrationGambarInspeksiSeeder extends Seeder
|
||||
}
|
||||
|
||||
private function processBatch(array $rows, array &$branchCache, array &$userData, int &$errorCount, array &$errorDebitureIds, int $totalData, int $batchCount, int $currentRow)
|
||||
{
|
||||
// Kelompokkan berdasarkan mig_nomor_jaminan
|
||||
$groupedRows = $this->groupRowsByJaminan($rows);
|
||||
{
|
||||
// Kelompokkan berdasarkan mig_nomor_jaminan
|
||||
$groupedRows = $this->groupRowsByJaminan($rows);
|
||||
|
||||
foreach ($groupedRows as $nomorJaminan => $groupRows) {
|
||||
try {
|
||||
// Ambil informasi permohonan dan dokument_id
|
||||
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache);
|
||||
if (!$nomorRegis) {
|
||||
Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}");
|
||||
foreach ($groupedRows as $nomorJaminan => $groupRows) {
|
||||
try {
|
||||
// Ambil informasi permohonan dan dokument_id
|
||||
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache);
|
||||
if (!$nomorRegis) {
|
||||
Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}");
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $nomorJaminan;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Bangun JSON foto_form
|
||||
$fotoJson = $this->checkFoto($groupRows);
|
||||
|
||||
Inspeksi::where('permohonan_id', $nomorRegis['id'])
|
||||
->where('dokument_id', $nomorRegis['dokument_id'])
|
||||
->whereNotNull('data_form')
|
||||
->update([
|
||||
'foto_form' => $fotoJson,
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
$this->command->info("Berhasil update foto_form untuk nomor jaminan: {$nomorJaminan}");
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage());
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $nomorJaminan;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Bangun JSON foto_form
|
||||
$fotoJson = $this->checkFoto($groupRows);
|
||||
|
||||
Inspeksi::where('permohonan_id', $nomorRegis['id'])
|
||||
->where('dokument_id', $nomorRegis['dokument_id'])
|
||||
->whereNotNull('data_form')
|
||||
->update([
|
||||
'foto_form' => $fotoJson,
|
||||
'updated_at' => now()
|
||||
]);
|
||||
|
||||
$this->command->info("Berhasil update foto_form untuk nomor jaminan: {$nomorJaminan}");
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage());
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $nomorJaminan;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
private function groupRowsByJaminan(array $rows): array {
|
||||
private function groupRowsByJaminan(array $rows): array
|
||||
{
|
||||
$grouped = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
@@ -133,46 +140,101 @@ class MigrationGambarInspeksiSeeder extends Seeder
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private function checkFoto(array $rows)
|
||||
{
|
||||
$fotos = [];
|
||||
// Inisialisasi kelompok untuk tiap kategori
|
||||
$kategoriPrioritas = [
|
||||
'PETA LOKASI' => [],
|
||||
'GAMBAR SITUASI / SURAT UKUR' => [],
|
||||
'FOTO JAMINAN' => [],
|
||||
'lainnya' => []
|
||||
];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
// Pastikan kolom ada
|
||||
$namaFoto = trim($row['mig_nama_gambar'] ?? '');
|
||||
$pathFoto = trim($row['mig_url_gambar'] ?? '');
|
||||
$kategori = trim($row['mig_kategori'] ?? 'lainnya');
|
||||
$urutan = (int)($row['mig_urutan_gambar'] ?? 999); // Default urutan besar jika tidak ada
|
||||
// Ambil kolom penting
|
||||
$namaFoto = trim($row['mig_nama_gambar'] ?? '');
|
||||
$pathFoto = trim($row['mig_url_gambar'] ?? '');
|
||||
$kategori = trim($row['mig_kategori'] ?? 'lainnya');
|
||||
$urutan = (int)($row['mig_urutan_gambar'] ?? 999);
|
||||
$tgl = trim($row['mig_tgl'] ?? '');
|
||||
$nomorLpj = trim($row['mig_nomor_laporan'] ?? '');
|
||||
|
||||
if (empty($pathFoto)) {
|
||||
continue; // skip jika path kosong
|
||||
if (empty($pathFoto) || empty($tgl)) {
|
||||
continue; // Lewati jika tidak lengkap
|
||||
}
|
||||
|
||||
$fotos[] = [
|
||||
try {
|
||||
$tanggal = \Carbon\Carbon::createFromFormat('Y-m-d', $tgl);
|
||||
if (!$tanggal) {
|
||||
throw new \Exception("Tanggal tidak valid");
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
continue; // Lewati jika tanggal tidak valid
|
||||
}
|
||||
|
||||
$tahun = $tanggal->format('Y');
|
||||
$bulanAngka = $tanggal->format('n');
|
||||
$bulanNama = [
|
||||
1 => 'JANUARI', 2 => 'FEBRUARI', 3 => 'MARET',
|
||||
4 => 'APRIL', 5 => 'MEI', 6 => 'JUNI',
|
||||
7 => 'JULI', 8 => 'AGUSTUS', 9 => 'SEPTEMBER',
|
||||
10 => 'OKTOBER', 11 => 'NOVEMBER', 12 => 'DESEMBER'
|
||||
][(int)$bulanAngka] ?? 'UNKNOWN';
|
||||
|
||||
$tanggalFormat = $tanggal->format('dmY');
|
||||
|
||||
if (empty($namaFoto)) {
|
||||
$namaFoto = basename($pathFoto) ?: 'image.jpg';
|
||||
}
|
||||
|
||||
// Gunakan '/' sebagai separator path
|
||||
$finalPath = "surveyor/{$tahun}/{$bulanNama}/{$tanggalFormat}/{$nomorLpj}/{$pathFoto}";
|
||||
|
||||
$fotoItem = [
|
||||
'urutan' => $urutan,
|
||||
'name' => $namaFoto,
|
||||
'path' => $pathFoto,
|
||||
'path' => $finalPath,
|
||||
'category' => $kategori,
|
||||
'sub' => null,
|
||||
'description' => '',
|
||||
'created_by' => null,
|
||||
'created_at' => null
|
||||
];
|
||||
|
||||
// Masukkan ke dalam kelompok kategori
|
||||
if (isset($kategoriPrioritas[$kategori])) {
|
||||
$kategoriPrioritas[$kategori][] = $fotoItem;
|
||||
} else {
|
||||
$kategoriPrioritas['lainnya'][] = $fotoItem;
|
||||
}
|
||||
}
|
||||
|
||||
// Urutkan array berdasarkan mig_urutan_gambar
|
||||
usort($fotos, function ($a, $b) {
|
||||
return $a['urutan'] <=> $b['urutan'];
|
||||
});
|
||||
// Urutkan masing-masing kategori berdasarkan urutan
|
||||
foreach ($kategoriPrioritas as &$kelompok) {
|
||||
usort($kelompok, function ($a, $b) {
|
||||
return $a['urutan'] <=> $b['urutan'];
|
||||
});
|
||||
}
|
||||
|
||||
// Hapus indeks 'urutan' setelah diurutkan
|
||||
// Gabungkan dengan urutan prioritas: PETA LOKASI -> GAMBAR SITUASI -> FOTO JAMINAN -> lainnya
|
||||
$finalFotos = array_merge(
|
||||
$kategoriPrioritas['PETA LOKASI'],
|
||||
$kategoriPrioritas['GAMBAR SITUASI / SURAT UKUR'],
|
||||
$kategoriPrioritas['FOTO JAMINAN'],
|
||||
$kategoriPrioritas['lainnya']
|
||||
);
|
||||
|
||||
// Hapus indeks 'urutan'
|
||||
$finalFotos = array_map(function ($foto) {
|
||||
unset($foto['urutan']);
|
||||
return $foto;
|
||||
}, $fotos);
|
||||
}, $finalFotos);
|
||||
|
||||
return json_encode([
|
||||
'foto_jaminan' => $finalFotos
|
||||
'upload_foto' => $finalFotos
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
}
|
||||
private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache)
|
||||
|
||||
@@ -14,9 +14,11 @@ use Modules\Location\Models\District;
|
||||
use Modules\Location\Models\Province;
|
||||
use Modules\Location\Models\Village;
|
||||
|
||||
// Load file helper
|
||||
require_once __DIR__ . '/MigInspeksiHelper.php';
|
||||
class MigrationInpseksiSeeder extends Seeder
|
||||
{
|
||||
protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_error_2025.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_inspeksi_2025_error.csv';
|
||||
// protected $fielKesimpulan = ;
|
||||
/**
|
||||
* Run the database seeds.
|
||||
@@ -28,7 +30,7 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_inspeksi_2025.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_2022.csv');
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_inspeksi_2025.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
@@ -86,74 +88,80 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
}
|
||||
|
||||
|
||||
private function processBatch(
|
||||
array $rows,
|
||||
array &$branchCache,
|
||||
array &$debitureCache,
|
||||
int &$errorCount,
|
||||
array &$errorDebitureIds,
|
||||
int $totalData,
|
||||
int $batchCount,
|
||||
int $currentRow
|
||||
) {
|
||||
// Kelompokkan baris berdasarkan mig_nomor_jaminan
|
||||
$groupedData = $this->groupRowsByJaminan($rows);
|
||||
private function processBatch(
|
||||
array $rows,
|
||||
array &$branchCache,
|
||||
array &$debitureCache,
|
||||
int &$errorCount,
|
||||
array &$errorDebitureIds,
|
||||
int $totalData,
|
||||
int $batchCount,
|
||||
int $currentRow
|
||||
) {
|
||||
// Kelompokkan baris berdasarkan mig_nomor_jaminan
|
||||
$groupedData = $this->groupRowsByJaminan($rows);
|
||||
|
||||
foreach ($groupedData as $nomorJaminan => $groupRows) {
|
||||
// try {
|
||||
// Cek apakah sudah ada di inspeksi
|
||||
foreach ($groupedData as $nomorJaminan => $groupRows) {
|
||||
try {
|
||||
// Ambil informasi permohonan
|
||||
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache);
|
||||
if (!$nomorRegis) {
|
||||
Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}");
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $nomorJaminan;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Cek apakah sudah ada data
|
||||
$existingRecord = Inspeksi::where('permohonan_id', $nomorRegis['id'])
|
||||
->where('dokument_id', $nomorRegis['dokument_id'])
|
||||
->whereNotNull('data_form')
|
||||
->first();
|
||||
|
||||
// Ambil informasi permohonan
|
||||
$nomorRegis = $this->getNomorRegistrasiPermohonan($nomorJaminan, $branchCache);
|
||||
if (!$nomorRegis) {
|
||||
Log::warning("Nomor registrasi tidak ditemukan untuk nomor jaminan: {$nomorJaminan}");
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $nomorJaminan;
|
||||
continue;
|
||||
}
|
||||
if ($existingRecord) {
|
||||
$this->command->info("Data untuk nomor jaminan {$nomorJaminan} sudah ada. Lewati...");
|
||||
continue;
|
||||
}
|
||||
|
||||
$existingRecord = Inspeksi::where('permohonan_id', $nomorRegis['id'])
|
||||
->where('dokument_id', $nomorRegis['dokument_id'])
|
||||
->whereNotNull('data_form')
|
||||
->first();
|
||||
// Ambil baris pertama untuk created_at/updated_at
|
||||
$firstRow = reset($groupRows);
|
||||
|
||||
if ($existingRecord) {
|
||||
$this->command->info("Data untuk nomor jaminan {$nomorJaminan} sudah ada. Lewati...");
|
||||
continue;
|
||||
}
|
||||
// Bangun JSON lengkap
|
||||
$dataFormJson = $this->buildFullDataForm($groupRows);
|
||||
$jenisJaminan = $this->checkJenisJaminan($groupRows[0]['mig_name'] ?? '');
|
||||
|
||||
// Ambil created_at / updated_at dari baris pertama
|
||||
$firstRow = reset($groupRows);
|
||||
if (!$dataFormJson) {
|
||||
Log::warning("Data form kosong untuk nomor jaminan: {$nomorJaminan}");
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $nomorJaminan;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Bangun JSON lengkap
|
||||
$dataFormJson = $this->buildFullDataForm($groupRows);
|
||||
// Simpan ke database hanya sekali per grup
|
||||
Inspeksi::create([
|
||||
'name' => $jenisJaminan,
|
||||
'data_form' => $dataFormJson,
|
||||
'foto_form' => null,
|
||||
'data_pembanding' => null,
|
||||
'permohonan_id' => $nomorRegis['id'] ?? null,
|
||||
'dokument_id' => $nomorRegis['dokument_id'] ?? null,
|
||||
'created_at' => $this->parseTimestamp($firstRow['created_at'] ?? null),
|
||||
'updated_at' => $this->parseTimestamp($firstRow['updated_at'] ?? null),
|
||||
'nomor_lpj' => $nomorJaminan,
|
||||
'processed_at' => now(),
|
||||
'is_mig' => 1
|
||||
]);
|
||||
|
||||
// Simpan ke database hanya sekali per grup
|
||||
Inspeksi::create([
|
||||
'name' => 'tanah,bangunan,lingkungan,fakta,informasi',
|
||||
'data_form' => $dataFormJson,
|
||||
'foto_form' => null,
|
||||
'data_pembanding' => null,
|
||||
'permohonan_id' => $nomorRegis['id'] ?? null,
|
||||
'dokument_id' => $nomorRegis['dokument_id'] ?? null,
|
||||
'created_at' => $this->parseTimestamp($firstRow['created_at']),
|
||||
'updated_at' => $this->parseTimestamp($firstRow['updated_at']),
|
||||
'nomor_lpj' => $nomorJaminan,
|
||||
'processed_at' => now(),
|
||||
'is_mig' => 1
|
||||
]);
|
||||
$this->command->info("Berhasil simpan data inspeksi untuk nomor jaminan: {$nomorJaminan}");
|
||||
|
||||
$this->command->info("Berhasil simpan data inspeksi untuk nomor jaminan: {$nomorJaminan}");
|
||||
|
||||
// } catch (\Exception $e) {
|
||||
// Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage());
|
||||
// $errorCount++;
|
||||
// $errorDebitureIds[] = $nomorJaminan;
|
||||
// continue;
|
||||
// }
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error pada nomor jaminan {$nomorJaminan}: " . $e->getMessage());
|
||||
$errorCount++;
|
||||
$errorDebitureIds[] = $nomorJaminan;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
private function groupRowsByJaminan(array $rows): array
|
||||
{
|
||||
$grouped = [];
|
||||
@@ -199,34 +207,29 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
}
|
||||
|
||||
|
||||
private function buildFullDataForm(array $rows)
|
||||
{
|
||||
|
||||
$assetJson = json_decode($this->checkAsset($rows)[0] ?? '', true);
|
||||
$tanahJson = json_decode($this->checkTanah($rows)[0] ?? '', true);
|
||||
$bangunanJson = json_decode($this->checkBangunan($rows)[0] ?? '', true);
|
||||
$lingkunganJson = json_decode($this->checkLingkungan($rows)[0] ?? '', true);
|
||||
|
||||
|
||||
$nomorLpj = $rows[0]['mig_nomor_lpj'] ?? null;
|
||||
|
||||
$kesimpulanRows = $this->loadKesimpulanByNomorLpj($nomorLpj);
|
||||
|
||||
$faktaJson = [];
|
||||
if (!empty($kesimpulanRows)) {
|
||||
$faktaResult = $this->checkKesimpulan($kesimpulanRows);
|
||||
$faktaJson = json_decode($faktaResult[0] ?? '', true)['fakta'] ?? [];
|
||||
}
|
||||
|
||||
return json_encode([
|
||||
'asset' => $assetJson['asset'] ?? [],
|
||||
'tanah' => $tanahJson['tanah'] ?? [],
|
||||
'bangunan' => $bangunanJson['bangunan'] ?? [],
|
||||
'lingkungan' => $lingkunganJson['lingkungan'] ?? [],
|
||||
'fakta' => $faktaJson
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
private function buildFullDataForm(array $rows)
|
||||
{
|
||||
if (empty($rows)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$jenisJaminan = $rows[0]['mig_name'] ?? null;
|
||||
|
||||
if (!$jenisJaminan) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
$jsonResult = $this->checkBuildJson($jenisJaminan, $rows);
|
||||
// Validasi apakah hasil JSON valid
|
||||
json_decode($jsonResult);
|
||||
return $jsonResult;
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Gagal build JSON untuk jenis jaminan {$jenisJaminan}: " . $e->getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function loadKesimpulanByNomorLpj($nomorLpj)
|
||||
{
|
||||
@@ -264,173 +267,6 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
|
||||
|
||||
|
||||
private function checkTanah($rows)
|
||||
{
|
||||
$dataToInsertJson = [];
|
||||
$tanah = [
|
||||
'luas_tanah' => ['sesuai' => null],
|
||||
'hadap_mata_angin' => ['sesuai' => null],
|
||||
'bentuk_tanah' => ['bentuk_tanah' => [], 'lainnya' => null],
|
||||
'kontur_tanah' => [],
|
||||
'ketinggian_tanah' => ['ketinggian' => [], 'lebih_tinggi' => null, 'lebih_rendah' => null],
|
||||
'kontur_jalan' => null,
|
||||
'ketinggian_jalan' => [],
|
||||
'posisi_kavling' => ['posisi_kavling' => [], 'lainnya' => null],
|
||||
'tusuk_sate' => 'no',
|
||||
'lockland' => 'no',
|
||||
'kondisi_fisik_tanah' => ['kondisi_fisik_tanah' => [], 'lainnya' => null]
|
||||
];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$name = trim($row['name']);
|
||||
$keySesuaiORTidak = !empty($row['mig_name_keterangan_lain']) ? 'sesuai' : 'tidak sesuai';
|
||||
$value = !empty($row['mig_name_keterangan_lain']) ? $row['mig_name_keterangan_lain'] : $row['mig_name_keterangan'];
|
||||
|
||||
switch ($name) {
|
||||
case 'Luas Tanah':
|
||||
$tanah['luas_tanah'][$keySesuaiORTidak] = $value;
|
||||
break;
|
||||
|
||||
case 'Permukaan dengan Jalan':
|
||||
$tanah['hadap_mata_angin'][$keySesuaiORTidak] = $value;
|
||||
break;
|
||||
|
||||
case 'Bentuk Tanah':
|
||||
if ($value === 'Lainnya') {
|
||||
$tanah['bentuk_tanah']['bentuk_tanah'][] = $value;
|
||||
$tanah['bentuk_tanah']['lainnya'] = $row['mig_name_keterangan_lain'];
|
||||
} else {
|
||||
$tanah['bentuk_tanah']['bentuk_tanah'][] = $value;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Kontur Tanah':
|
||||
$tanah['kontur_tanah'][] = $value;
|
||||
break;
|
||||
|
||||
case 'Peruntukan Tanah':
|
||||
$tanah['ketinggian_tanah']['ketinggian'][] = $value;
|
||||
break;
|
||||
|
||||
case 'Fisik Tanah':
|
||||
$tanah['kondisi_fisik_tanah']['kondisi_fisik_tanah'][] = $value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Isi default jika kosong
|
||||
if (empty($tanah['luas_tanah']['sesuai'])) {
|
||||
$tanah['luas_tanah'] = ['sesuai' => null];
|
||||
}
|
||||
if (empty($tanah['hadap_mata_angin']['sesuai'])) {
|
||||
$tanah['hadap_mata_angin'] = ['sesuai' => null];
|
||||
}
|
||||
|
||||
// Masukkan ke array JSON
|
||||
$dataToInsertJson[] = json_encode([
|
||||
'tanah' => $tanah
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
return $dataToInsertJson;
|
||||
}
|
||||
|
||||
private function checkBangunan($rows)
|
||||
{
|
||||
$dataToInsertJson = [];
|
||||
|
||||
// Inisialisasi struktur bangunan
|
||||
$bangunan = [
|
||||
'luas_tanah_bagunan' => ['sesuai' => null],
|
||||
'jenis_bangunan' => [],
|
||||
'kondisi_bangunan' => [],
|
||||
'sifat_bangunan' => [],
|
||||
'sifat_bangunan_input' => [null, null, null],
|
||||
'spesifikasi_bangunan' => [
|
||||
[
|
||||
'bagunan' => 'Bangunan 1',
|
||||
'spek_kategori_bangunan' => [
|
||||
'Pondasi' => ['0' => null, '1' => null, 'lainnya' => null],
|
||||
'Struktur' => ['0' => null, '1' => null, 'lainnya' => null],
|
||||
'Rangka Atap' => ['0' => null, 'lainnya' => null],
|
||||
'Tutup Atap' => ['0' => null, 'lainnya' => null],
|
||||
'Plafond' => ['lainnya' => null],
|
||||
'Dinding' => ['0' => null, '1' => null, 'lainnya' => null],
|
||||
'Pelapis Dinding' => ['0' => null, 'lainnya' => null],
|
||||
'Pintu Jendela' => ['0' => null, '1' => null, '2' => null, '3' => null, 'lainnya' => null],
|
||||
'Lantai' => ['0' => null, '1' => null, 'lainnya' => null],
|
||||
]
|
||||
]
|
||||
],
|
||||
'sarana_pelengkap' => [],
|
||||
'sarana_pelengkap_input' => [null, null, null, null, null, null, null, null, null]
|
||||
];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
$name = trim($row['name']);
|
||||
$keySesuaiORTidak = !empty($row['mig_name_keterangan_lain']) ? 'sesuai' : 'tidak sesuai';
|
||||
$value = !empty($row['mig_name_keterangan_lain']) ? $row['mig_name_keterangan_lain'] : $row['mig_name_keterangan'];
|
||||
|
||||
switch ($name) {
|
||||
case 'Luas Bangunan':
|
||||
$bangunan['luas_tanah_bagunan'][$keySesuaiORTidak] = $value;
|
||||
break;
|
||||
|
||||
case 'Jenis Bangunan':
|
||||
if ($value === 'Lainnya') {
|
||||
$bangunan['jenis_bangunan'][] = $value;
|
||||
} else {
|
||||
$bangunan['jenis_bangunan'][] = $value;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Kondisi Bangunan':
|
||||
$bangunan['kondisi_bangunan'][] = $value;
|
||||
break;
|
||||
|
||||
case 'Sifat Bangunan':
|
||||
$bangunan['sifat_bangunan'][] = $value;
|
||||
break;
|
||||
|
||||
case 'Lantai':
|
||||
$bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Lantai']['0'] = $value;
|
||||
break;
|
||||
|
||||
case 'Dinding':
|
||||
$bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Dinding']['0'] = $value;
|
||||
break;
|
||||
|
||||
case 'Langit-langit / Plafon':
|
||||
$bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Plafond']['lainnya'] = $value;
|
||||
break;
|
||||
|
||||
case 'Kusen-kusen':
|
||||
$bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Pintu Jendela']['0'] = $value;
|
||||
break;
|
||||
|
||||
case 'Penutup Atap':
|
||||
$bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Tutup Atap']['0'] = $value;
|
||||
break;
|
||||
|
||||
case 'Partisi':
|
||||
$bangunan['spesifikasi_bangunan'][0]['spek_kategori_bangunan']['Dinding']['1'] = $value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Isi default jika kosong
|
||||
if (empty($bangunan['luas_tanah_bagunan']['sesuai'])) {
|
||||
$bangunan['luas_tanah_bagunan'] = ['sesuai' => null];
|
||||
}
|
||||
|
||||
// Masukkan ke array JSON
|
||||
$dataToInsertJson[] = json_encode([
|
||||
'bangunan' => $bangunan
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
return $dataToInsertJson;
|
||||
}
|
||||
|
||||
|
||||
private function checkLingkungan($rows)
|
||||
{
|
||||
$dataToInsertJson = [];
|
||||
@@ -605,9 +441,15 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
}
|
||||
|
||||
// Isi default jika kosong
|
||||
if (empty($hubCadeb)) $hubCadeb = ["tidak sesuai" => null];
|
||||
if (empty($hubPenghuni)) $hubPenghuni = ["tidak sesuai" => null];
|
||||
if (empty($jenisAsset)) $jenisAsset = ["sesuai" => null];
|
||||
if (empty($hubCadeb)) {
|
||||
$hubCadeb = ["tidak sesuai" => null];
|
||||
}
|
||||
if (empty($hubPenghuni)) {
|
||||
$hubPenghuni = ["tidak sesuai" => null];
|
||||
}
|
||||
if (empty($jenisAsset)) {
|
||||
$jenisAsset = ["sesuai" => null];
|
||||
}
|
||||
|
||||
// Bangun struktur JSON
|
||||
$asset = [
|
||||
@@ -677,7 +519,8 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
'gss' => null,
|
||||
'pelebaran_jalan' => null,
|
||||
'nama_petugas' => null,
|
||||
'keterangan' => []
|
||||
'keterangan' => [],
|
||||
'saran' => []
|
||||
];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
@@ -705,13 +548,19 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
$fakta['kondisi_lain_bangunan'][] = $keterangan;
|
||||
break;
|
||||
|
||||
case 'Informasi Dokumen':
|
||||
case 'Lain - lain':
|
||||
$fakta['informasi_dokument'][] = $keterangan;
|
||||
break;
|
||||
|
||||
case 'Lain - lain':
|
||||
case 'CATATAN YANG PERLU DIPERHATIKAN':
|
||||
$fakta['keterangan'][] = $keterangan;
|
||||
break;
|
||||
case 'Catatan':
|
||||
$fakta['keterangan'][] = $keterangan;
|
||||
break;
|
||||
case 'Saran':
|
||||
$fakta['saran'][] = $keterangan;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -838,7 +687,7 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
private function logError( $nomorJaminan, string $message)
|
||||
private function logError($nomorJaminan, string $message)
|
||||
{
|
||||
Log::error("Error migrasi permohonan [$nomorJaminan]: $message");
|
||||
|
||||
@@ -847,4 +696,163 @@ class MigrationInpseksiSeeder extends Seeder
|
||||
fputcsv($handle, [$nomorJaminan, $message]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function checkJenisJaminan($input)
|
||||
{
|
||||
$input = trim($input);
|
||||
switch ($input) {
|
||||
case 'Tanah dan Bangunan eks KPR-BPPN':
|
||||
return 'tanah, bangunan, lingkungan, fakta, informasi';
|
||||
case 'Pabrik':
|
||||
return 'tanah, bangunan, lingkungan, fakta, informasi';
|
||||
case 'Kapal Laut':
|
||||
return 'kapal-laut';
|
||||
|
||||
case 'Tanah dan/atau Bangunan':
|
||||
return 'tanah, bangunan';
|
||||
|
||||
case 'Kendaraan Bermotor':
|
||||
return 'kendaraan-';
|
||||
|
||||
case 'Mesin-mesin dan Peralatan':
|
||||
return 'mesin';
|
||||
|
||||
case 'Barang Dagangan/FEO':
|
||||
return 'barang-dagangan';
|
||||
|
||||
case 'Pesawat Udara':
|
||||
return 'pesawat-udara';
|
||||
|
||||
case 'Alat Berat':
|
||||
return 'alat-berat';
|
||||
|
||||
case 'Deposito':
|
||||
return 'deposito';
|
||||
|
||||
case 'Rekening Giro / Tabungan':
|
||||
return 'rekening-giro-tabungan';
|
||||
|
||||
case 'Emas':
|
||||
return 'emas';
|
||||
|
||||
case 'Jaminan Pribadi / Personal Guarantee':
|
||||
return 'jaminan-pribadi';
|
||||
|
||||
case 'Jaminan Perusahaan / Corporate Guarantee':
|
||||
return 'jaminan-perusahaan';
|
||||
|
||||
case 'Resi Gudang':
|
||||
return 'resi-gudang';
|
||||
|
||||
case 'Surat Berharga dan Saham':
|
||||
return 'surat-berharga-saham';
|
||||
|
||||
case 'Tanah dan Bangunan (KerjaSama)':
|
||||
return 'tanah-bangunan-kerja-sama';
|
||||
|
||||
case 'Tanah Kavling (Kerjasama)':
|
||||
return 'tanah-kavling';
|
||||
|
||||
case 'Persediaan Barang / Barang Dagangan':
|
||||
return 'persediaan-barang';
|
||||
|
||||
case 'Apartemen':
|
||||
return 'apartemen';
|
||||
|
||||
case 'Tagihan / Piutang Dagang':
|
||||
return 'tagihan-piutang';
|
||||
|
||||
case 'Tanah dan/atau Bangunan KPR - SEDERHANA':
|
||||
return 'tanah-bangunan-kpr-sederhana';
|
||||
|
||||
default:
|
||||
return 'lainnya';
|
||||
}
|
||||
}
|
||||
|
||||
public function checkBuildJson($input, $rows = [])
|
||||
{
|
||||
$input = trim($input);
|
||||
|
||||
// Pastikan rows selalu array
|
||||
if (!is_array($rows)) {
|
||||
$rows = [$rows];
|
||||
}
|
||||
|
||||
switch ($input) {
|
||||
case 'Tanah dan Bangunan eks KPR-BPPN':
|
||||
case 'Pabrik':
|
||||
case 'Tanah dan/atau Bangunan':
|
||||
case 'Apartemen':
|
||||
case 'Tanah dan/atau Bangunan KPR - SEDERHANA':
|
||||
$assetJson = json_decode($this->checkAsset($rows)[0] ?? '', true);
|
||||
$tanahJson = json_decode(buildInspeksiTanah($rows)[0] ?? '', true);
|
||||
$bangunanJson = json_decode(buildInspeksiBangunan($rows)[0] ?? '', true);
|
||||
$lingkunganJson = json_decode($this->checkLingkungan($rows)[0] ?? '', true);
|
||||
|
||||
$nomorLpj = $rows[0]['mig_nomor_lpj'] ?? null;
|
||||
$kesimpulanRows = $this->loadKesimpulanByNomorLpj($nomorLpj);
|
||||
|
||||
$faktaJson = [];
|
||||
if (!empty($kesimpulanRows)) {
|
||||
$faktaResult = $this->checkKesimpulan($kesimpulanRows);
|
||||
$faktaJson = json_decode($faktaResult[0] ?? '', true)['fakta'] ?? [];
|
||||
}
|
||||
|
||||
return json_encode([
|
||||
'asset' => $assetJson['asset'] ?? [],
|
||||
'tanah' => $tanahJson['tanah'] ?? [],
|
||||
'bangunan' => $bangunanJson['bangunan'] ?? [],
|
||||
'lingkungan' => $lingkunganJson['lingkungan'] ?? [],
|
||||
'fakta' => $faktaJson
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
case 'Kapal Laut':
|
||||
$kapal = createInspeksiKapal($rows);
|
||||
return json_encode($kapal, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
case 'Kendaraan Bermotor':
|
||||
$kendaraan = createInspeksiKendaraan($rows);
|
||||
return json_encode($kendaraan, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
case 'Mesin-mesin dan Peralatan':
|
||||
$mesin = createInspeksiMesin($rows);
|
||||
return json_encode($mesin, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
case 'Pesawat Udara':
|
||||
$pesawat = createInspeksiPesawat($rows);
|
||||
return json_encode($pesawat, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
case 'Alat Berat':
|
||||
$alatBerat = createInspeksiAlatBerat($rows);
|
||||
return json_encode($alatBerat, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
case 'Barang Dagangan/FEO':
|
||||
case 'Deposito':
|
||||
case 'Rekening Giro / Tabungan':
|
||||
case 'Emas':
|
||||
case 'Jaminan Pribadi / Personal Guarantee':
|
||||
case 'Jaminan Perusahaan / Corporate Guarantee':
|
||||
case 'Resi Gudang':
|
||||
case 'Surat Berharga dan Saham':
|
||||
case 'Persediaan Barang / Barang Dagangan':
|
||||
case 'Tagihan / Piutang Dagang':
|
||||
return json_encode([
|
||||
'status' => 'pending',
|
||||
'message' => 'Fungsi untuk "' . $input . '" belum diimplementasikan.',
|
||||
'data' => $rows
|
||||
]);
|
||||
case 'Tanah dan Bangunan (KerjaSama)':
|
||||
case 'Tanah Kavling (Kerjasama)':
|
||||
$pesawat = buildRapJsonData($rows);
|
||||
return json_encode($pesawat, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
default:
|
||||
return json_encode([
|
||||
'status' => 'unknown',
|
||||
'message' => 'Jenis aset tidak dikenali: ' . $input,
|
||||
'data' => $rows
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,17 +12,17 @@ use Modules\Lpj\Models\Permohonan;
|
||||
|
||||
class MigrationPembandingSeeder extends Seeder
|
||||
{
|
||||
protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_penilai_pembanding_error.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/inspeksi/mig_pembanding_2025_error.csv';
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
// Path ke file csv
|
||||
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_penilai_pembanding.csv');
|
||||
$filePath = realpath(__DIR__ . '/csv/inspeksi/mig_pembanding_2025.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_penilai_pembanding.csv');
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/inspeksi/mig_pembanding_2025.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
@@ -85,6 +85,8 @@ class MigrationPembandingSeeder extends Seeder
|
||||
// Kelompokkan berdasarkan mig_nomor_lpj
|
||||
$groupedRows = $this->groupRowsByJaminan($rows);
|
||||
|
||||
print_r($groupedRows);
|
||||
|
||||
foreach ($groupedRows as $nomorLpj => $groupRows) {
|
||||
try {
|
||||
// Dapatkan info permohonan untuk update inspeksi
|
||||
@@ -99,6 +101,8 @@ class MigrationPembandingSeeder extends Seeder
|
||||
// Bangun JSON data pembanding
|
||||
$pembandingJson = $this->checkPembanding($groupRows);
|
||||
|
||||
print_r($pembandingJson);
|
||||
|
||||
// Update ke tabel inspeksi
|
||||
|
||||
// print_r($pembandingJson);
|
||||
@@ -119,7 +123,8 @@ class MigrationPembandingSeeder extends Seeder
|
||||
}
|
||||
}
|
||||
}
|
||||
private function groupRowsByJaminan(array $rows): array {
|
||||
private function groupRowsByJaminan(array $rows): array
|
||||
{
|
||||
$grouped = [];
|
||||
|
||||
foreach ($rows as $row) {
|
||||
@@ -140,20 +145,16 @@ class MigrationPembandingSeeder extends Seeder
|
||||
foreach ($rows as $row) {
|
||||
// Pastikan kolom penting tersedia
|
||||
$urutan = (int)($row['mig_urutan'] ?? 999);
|
||||
$sumber = trim($row['mig_keterangan'] ?? '');
|
||||
$pembanding = trim($row['mig_pembanding'] ?? '');
|
||||
$linkGambar = trim($row['mig_path'] ?? '');
|
||||
|
||||
if (empty($pembanding) || empty($linkGambar)) {
|
||||
// CUKUP VALIDASI PEMBANDING SAJA
|
||||
if (empty($pembanding)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
$pembandingList[] = [
|
||||
'urutan' => $urutan,
|
||||
'sumber' => $sumber,
|
||||
'keterangan' => $pembanding,
|
||||
'foto_objek' => $linkGambar
|
||||
];
|
||||
}
|
||||
|
||||
@@ -172,53 +173,53 @@ class MigrationPembandingSeeder extends Seeder
|
||||
'data_pembanding' => $finalPembanding
|
||||
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
}
|
||||
private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache)
|
||||
{
|
||||
if (isset($cache[$nomor_jaminan_id])) {
|
||||
return $cache[$nomor_jaminan_id];
|
||||
}
|
||||
|
||||
$permohonan = Permohonan::where('nomor_lpj', $nomor_jaminan_id)->first();
|
||||
|
||||
if (!$permohonan) {
|
||||
$cache[$nomor_jaminan_id] = null;
|
||||
return null;
|
||||
}
|
||||
|
||||
$dokumenJaminan = DokumenJaminan::where('permohonan_id', $permohonan->id)->first();
|
||||
|
||||
$result = [
|
||||
'id' => $permohonan->id,
|
||||
'dokument_id' => $dokumenJaminan ? $dokumenJaminan->id : null
|
||||
];
|
||||
|
||||
$cache[$nomor_jaminan_id] = $result;
|
||||
|
||||
return $result;
|
||||
private function getNomorRegistrasiPermohonan($nomor_jaminan_id, array &$cache)
|
||||
{
|
||||
if (isset($cache[$nomor_jaminan_id])) {
|
||||
return $cache[$nomor_jaminan_id];
|
||||
}
|
||||
|
||||
private function initializeErrorLog()
|
||||
{
|
||||
$file = $this->errorLogFile;
|
||||
$permohonan = Permohonan::where('nomor_lpj', $nomor_jaminan_id)->first();
|
||||
|
||||
// Hapus file lama jika ada
|
||||
if (file_exists($file)) {
|
||||
unlink($file);
|
||||
}
|
||||
|
||||
// Buat file baru dengan header
|
||||
$handle = fopen($file, 'w');
|
||||
fputcsv($handle, ['mig_mst_jaminan_nomor_jaminan', 'Error']);
|
||||
fclose($handle);
|
||||
if (!$permohonan) {
|
||||
$cache[$nomor_jaminan_id] = null;
|
||||
return null;
|
||||
}
|
||||
|
||||
private function logError( $nomorJaminan, string $message)
|
||||
{
|
||||
Log::error("Error migrasi permohonan [$nomorJaminan]: $message");
|
||||
$dokumenJaminan = DokumenJaminan::where('permohonan_id', $permohonan->id)->first();
|
||||
|
||||
// Tulis ke file error
|
||||
$handle = fopen($this->errorLogFile, 'a');
|
||||
fputcsv($handle, [$nomorJaminan, $message]);
|
||||
$result = [
|
||||
'id' => $permohonan->id,
|
||||
'dokument_id' => $dokumenJaminan ? $dokumenJaminan->id : null
|
||||
];
|
||||
|
||||
$cache[$nomor_jaminan_id] = $result;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function initializeErrorLog()
|
||||
{
|
||||
$file = $this->errorLogFile;
|
||||
|
||||
// Hapus file lama jika ada
|
||||
if (file_exists($file)) {
|
||||
unlink($file);
|
||||
}
|
||||
|
||||
// Buat file baru dengan header
|
||||
$handle = fopen($file, 'w');
|
||||
fputcsv($handle, ['mig_mst_jaminan_nomor_jaminan', 'Error']);
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
private function logError($nomorJaminan, string $message)
|
||||
{
|
||||
Log::error("Error migrasi permohonan [$nomorJaminan]: $message");
|
||||
|
||||
// Tulis ke file error
|
||||
$handle = fopen($this->errorLogFile, 'a');
|
||||
fputcsv($handle, [$nomorJaminan, $message]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,15 +15,15 @@ class MigrationPenilaiSeeder extends Seeder
|
||||
/**
|
||||
* Run the database seeds.
|
||||
*/
|
||||
protected $errorLogFile = __DIR__ . '/csv/penilai-laporan/mig_penilai_laporan_error.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/penilai-laporan/mig_penilai_error.csv';
|
||||
public function run()
|
||||
{
|
||||
$this->initializeErrorLog();
|
||||
// Path ke file csv
|
||||
$filePath = realpath(__DIR__ . '/csv/penilai-laporan/mig_penilai_laporan.csv');
|
||||
$filePath = realpath(__DIR__ . '/csv/penilai-laporan/mig_penilai.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilai-laporan/mig_penilai_laporan.csv');
|
||||
Log::error('File csv tidak ditemukan: ' . __DIR__ . '/csv/penilai-laporan/mig_penilai.csv');
|
||||
$this->command->error('File csv tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -10,21 +10,19 @@ use Modules\Lpj\Models\Debiture;
|
||||
use Modules\Basicdata\Models\Branch;
|
||||
use Modules\Usermanagement\Models\User;
|
||||
|
||||
|
||||
|
||||
class MigrationPermohonanSeeder extends Seeder
|
||||
{
|
||||
protected $errorLogFile = __DIR__ . '/csv/permohonan/error_permohonan.csv';
|
||||
protected $errorLogFile = __DIR__ . '/csv/permohonan/mig_permohonan_extenal_error.csv';
|
||||
|
||||
public function run()
|
||||
{
|
||||
// Bersihkan file error sebelum mulai
|
||||
$this->initializeErrorLog();
|
||||
|
||||
$filePath = realpath(__DIR__ . '/csv/permohonan/mig_permohonan.csv');
|
||||
$filePath = realpath(__DIR__ . '/csv/permohonan/mig_permohonan_external.csv');
|
||||
|
||||
if (!$filePath) {
|
||||
Log::error('File CSV tidak ditemukan: ' . __DIR__ . '/csv/permohonan/mig_permohonan.csv');
|
||||
Log::error('File CSV tidak ditemukan: ' . __DIR__ . '/csv/permohonan/mig_permohonan_external.csv');
|
||||
$this->command->error('File CSV tidak ditemukan.');
|
||||
return;
|
||||
}
|
||||
@@ -61,7 +59,7 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
|
||||
$rows[] = array_combine($header, $data);
|
||||
$currentRow++;
|
||||
|
||||
// print_r($rows);
|
||||
if (count($rows) >= $batchSize) {
|
||||
$batchCount++;
|
||||
$this->command->info("Memproses batch ke-{$batchCount} ({$currentRow}/{$totalData})");
|
||||
@@ -70,7 +68,7 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
}
|
||||
}
|
||||
|
||||
print_r($rows[0]);
|
||||
// print_r($rows);
|
||||
|
||||
if (!empty($rows)) {
|
||||
$batchCount++;
|
||||
@@ -97,12 +95,12 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
continue;
|
||||
}
|
||||
|
||||
// Ambil branch_id
|
||||
$branchId = $this->getBranchId($row['mig_mst_jaminan_kd_cabang'] ?? null, $branchCache);
|
||||
if (!$branchId) {
|
||||
$this->logError($branchId, 'Cabang tidak ditemukan');
|
||||
continue;
|
||||
}
|
||||
// Ambil branch_id
|
||||
$branchId = $this->getBranchId($row['mig_mst_jaminan_kd_cabang'] ?? null, $branchCache);
|
||||
// if (!$branchId) {
|
||||
// $this->logError($branchId, 'Cabang tidak ditemukan');
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// Ambil Debitur ID
|
||||
$debitureId = $this->getDebiturId($row['mig_mst_jaminan_kd_debitur_seq'], $debitureCache);
|
||||
@@ -113,37 +111,45 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
|
||||
// Ambil User IDs
|
||||
$userId = $this->getUserId($row['mig_mst_jaminan_nama_ao'], $branchCache, true);
|
||||
$approved1Id = $this->getUserId($row['mig_mst_lpj_user_approved_1'], $branchCache, false);
|
||||
$approved2Id = $this->getUserId($row['mig_mst_lpj_user_approved_2'], $branchCache, false);
|
||||
|
||||
// Ambil user IDs berdasarkan NIK
|
||||
$userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id'];
|
||||
$userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id'];
|
||||
// jika external matikan
|
||||
// $approved1Id = $this->getUserId($row['mig_mst_lpj_user_approved_1'], $branchCache, false);
|
||||
// $approved2Id = $this->getUserId($row['mig_mst_lpj_user_approved_2'], $branchCache, false);
|
||||
|
||||
if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||
$this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
|
||||
continue;
|
||||
}
|
||||
// // Ambil user IDs berdasarkan NIK
|
||||
$userIdUpdate = $this->getUserIdData($row['mig_mst_jaminan_user_create'] ?? null, $userData)['id'];
|
||||
$userIdOtorisasi = $this->getUserIdData($row['mig_mst_jaminan_user_oto'] ?? null, $userData)['id'];
|
||||
|
||||
// Mapping field user
|
||||
$mapUser = [
|
||||
'created_by' => $userIdUpdate,
|
||||
'updated_by' => $userIdUpdate,
|
||||
'authorized_by' => $userIdOtorisasi,
|
||||
];
|
||||
// jika external matikan
|
||||
// if (!$userIdUpdate || !$userIdOtorisasi) {
|
||||
// $this->logError($userIdUpdate, 'Salah satu user tidak ditemukan');
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// Mapping field user
|
||||
$mapUser = [
|
||||
'created_by' => $userIdUpdate,
|
||||
'updated_by' => $userIdUpdate,
|
||||
'authorized_by' => $userIdOtorisasi,
|
||||
];
|
||||
|
||||
|
||||
if (!$userId || !$approved1Id || !$approved2Id) {
|
||||
$this->logError($userId, 'Salah satu user tidak ditemukan');
|
||||
continue;
|
||||
}
|
||||
// jika external matikan
|
||||
// if (!$userId || !$approved1Id || !$approved2Id) {
|
||||
// $this->logError($userId, 'Salah satu user tidak ditemukan');
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// Mapping data
|
||||
$jenisFasilitas = $this->checkJenisFasilitas($row['mig_mst_jaminan_kd_jenis_fas_seq']);
|
||||
$tujuanPenilaian = $this->checkTujuanPenilaian($row['mig_mst_jaminan_kd_tujuan_seq']);
|
||||
$regionId = $this->checkRegion($row['mig_mst_kode_kelompok_region']);
|
||||
|
||||
|
||||
$nomor_lpj = isset($row['mig_mst_lpj_nomor_lpj']) ? $row['mig_mst_lpj_nomor_lpj'] : '';
|
||||
$nomor_lpj = is_numeric($nomor_lpj) ? (int)$nomor_lpj : 0;
|
||||
|
||||
$jenisPenilaian = $row['mig_internal_or_external'] == 1 ? 2 : 1;
|
||||
|
||||
// Simpan data
|
||||
Permohonan::create([
|
||||
'nomor_registrasi' => $nomorJaminan,
|
||||
@@ -155,25 +161,26 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
'jenis_fasilitas_kredit_id' => $jenisFasilitas,
|
||||
'nilai_plafond_id' => 2,
|
||||
'status' => 'done',
|
||||
'approval_eo' => $approved2Id['id'] ?? 0,
|
||||
'approval_eo_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_2']),
|
||||
'approval_dd' => 0,
|
||||
'approval_dd_at' => null,
|
||||
'approval_so' => $approved1Id['id'] ?? 0,
|
||||
'approval_so_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_1']),
|
||||
// jika external matikan
|
||||
// 'approval_eo' => $approved2Id['id'] ?? 0,
|
||||
// 'approval_eo_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_2']),
|
||||
// 'approval_dd' => 0,
|
||||
// 'approval_dd_at' => null,
|
||||
// 'approval_so' => $approved1Id['id'] ?? 0,
|
||||
// 'approval_so_at' => $this->parseTimestamp($row['mig_mst_lpj_tgl_approved_1']),
|
||||
// end external matikan
|
||||
'keterangan' => $row['mig_mst_jaminan_catatan'] ?? null,
|
||||
'status_bayar' => 'sudah_bayar',
|
||||
'created_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_create']),
|
||||
'updated_at' => $this->parseTimestamp($row['mig_mst_jaminan_tgl_update']),
|
||||
'mig_kd_debitur_seq' => $row['mig_mst_jaminan_kd_debitur_seq'],
|
||||
'nomor_lpj' => $row['mig_mst_lpj_nomor_lpj'],
|
||||
'nomor_lpj' => $nomor_lpj,
|
||||
'region_id' => $regionId,
|
||||
|
||||
'jenis_penilaian_id' => $jenisPenilaian,
|
||||
'authorized_by' => $mapUser['authorized_by'],
|
||||
'created_by' => $mapUser['created_by'],
|
||||
'updated_by' => $mapUser['updated_by'],
|
||||
|
||||
'processed_at' => now(),
|
||||
'mig_nama_ao' => $row['mig_mst_jaminan_nama_ao'],
|
||||
'is_mig' => 1
|
||||
]);
|
||||
|
||||
@@ -190,7 +197,9 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
|
||||
private function getUserIdData(?string $code, array &$cache): array
|
||||
{
|
||||
if (!$code) return ['id' => null, 'branch_id' => null];
|
||||
if (!$code) {
|
||||
return ['id' => null, 'branch_id' => null];
|
||||
}
|
||||
|
||||
if (isset($cache[$code])) {
|
||||
return $cache[$code];
|
||||
@@ -249,7 +258,9 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
}
|
||||
private function getBranchId(?string $code, array &$cache): ?int
|
||||
{
|
||||
if (!$code) return null;
|
||||
if (!$code) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (isset($cache[$code])) {
|
||||
return $cache[$code];
|
||||
@@ -268,7 +279,7 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
{
|
||||
$mapping = [
|
||||
161337594516 => 1,
|
||||
161337598118 => 2,
|
||||
161337598118 => 14,
|
||||
155739382483 => 7,
|
||||
2 => 9,
|
||||
153568936592 => 10,
|
||||
@@ -353,7 +364,7 @@ class MigrationPermohonanSeeder extends Seeder
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
private function logError( $nomorJaminan, string $message)
|
||||
private function logError($nomorJaminan, string $message)
|
||||
{
|
||||
Log::error("Error migrasi permohonan [$nomorJaminan]: $message");
|
||||
|
||||
|
||||
@@ -40,7 +40,36 @@ class TujuanPenilaianKJPPSeeder extends Seeder
|
||||
'status' => 1,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now()
|
||||
]
|
||||
],
|
||||
[
|
||||
'code' => 'TPK05',
|
||||
'name' => 'Penilaian Ulang Jaminan / Review Tahunan',
|
||||
'status' => 1,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now()
|
||||
],
|
||||
[
|
||||
'code' => 'TPK06',
|
||||
'name' => 'Lelang',
|
||||
'status' => 1,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now()
|
||||
],
|
||||
[
|
||||
'code' => 'TPK07',
|
||||
'name' => 'Permohonan Baru',
|
||||
'status' => 1,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now()
|
||||
],
|
||||
[
|
||||
'code' => 'TPK08',
|
||||
'name' => 'Penambahan Fasilitas / Jaminan',
|
||||
'status' => 1,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now()
|
||||
],
|
||||
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,18 +87,11 @@
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
|
||||
<label class="text-base font-medium mb-1">Laporan</label>
|
||||
<label class="text-base font-medium mb-1">Laporan</label>
|
||||
<select class="select tomselect" name="laporan[]" id="laporan" multiple>
|
||||
<option value="">Semua Laporan</option>
|
||||
@php
|
||||
$status_laporan = [
|
||||
'Standar',
|
||||
'Sederhana',
|
||||
'Memo',
|
||||
'Resume',
|
||||
'Call Report',
|
||||
'RAP',
|
||||
];
|
||||
$status_laporan = ['Standar', 'Sederhana', 'Memo', 'Resume', 'Call Report', 'RAP'];
|
||||
@endphp
|
||||
@foreach ($status_laporan as $item)
|
||||
<option value="{{ strtolower($item) }}">{{ $item }}</option>
|
||||
@@ -115,8 +108,7 @@
|
||||
<i class="ki-outline ki-filter fs-2 me-1"></i>
|
||||
Terapkan Filter
|
||||
</button>
|
||||
<button class="btn btn-sm btn-light"
|
||||
id="export-btn">
|
||||
<button class="btn btn-sm btn-light" id="export-btn">
|
||||
<i class="ki-outline ki-file-down fs-2 me-1"></i>
|
||||
Export to Excel
|
||||
</button>
|
||||
@@ -142,7 +134,8 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<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 class="min-w-[150px]" data-datatable-column="nomor_registrasi">
|
||||
<span class="sort"><span class="sort-label">Nomor Registrasi</span>
|
||||
@@ -158,12 +151,12 @@
|
||||
<span class="sort-icon"> </span> </span>
|
||||
</th>
|
||||
<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>
|
||||
</th>
|
||||
<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>
|
||||
</th>
|
||||
@@ -210,9 +203,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Form tersembunyi untuk export -->
|
||||
<form id="export-form"
|
||||
action="{{ route('laporan-penilai-jaminan.export') }}"
|
||||
method="GET" class="hidden">
|
||||
<form id="export-form" action="{{ route('laporan-penilai-jaminan.export') }}" method="GET" class="hidden">
|
||||
<input type="hidden" name="start_date" id="export_tanggal_awal">
|
||||
<input type="hidden" name="end_date" id="export_tanggal_akhir">
|
||||
<input type="hidden" name="status" id="export_status">
|
||||
@@ -220,6 +211,7 @@
|
||||
<input type="hidden" name="laporan" id="export_laporan">
|
||||
<input type="hidden" name="selected_ids" id="export_selected_ids">
|
||||
<input type="hidden" name="export_type" id="export_type" value="all">
|
||||
<input type="hidden" id="export_search" name="search">
|
||||
</form>
|
||||
@endsection
|
||||
|
||||
@@ -248,7 +240,7 @@
|
||||
const exportStatus = document.getElementById('export_status');
|
||||
const exportSelectedIds = document.getElementById('export_selected_ids');
|
||||
const exportType = document.getElementById('export_type');
|
||||
|
||||
const exportSearch = document.getElementById('export_search');
|
||||
const apiUrl = element.getAttribute('data-api-url');
|
||||
const dataTableOptions = {
|
||||
apiEndpoint: apiUrl,
|
||||
@@ -360,13 +352,17 @@
|
||||
['done'].includes(status) ?
|
||||
dokumenjaminan.map(dokumen => {
|
||||
return `
|
||||
<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
|
||||
</a>
|
||||
<a class="btn btn-sm btn-success" onclick="checkLaporan('${data.id}', '${dokumen.id}', '${dokumen.jenis_jaminan_id}', 0)">
|
||||
<i class="ki-filled ki-printer"></i>Laporan
|
||||
</a>
|
||||
`;
|
||||
<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
|
||||
</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 class="btn btn-sm btn-success" onclick="checkLaporan('${data.id}', '${dokumen.id}', '${dokumen.jenis_jaminan_id}', 0)">
|
||||
<i class="ki-filled ki-printer"></i>Laporan
|
||||
</a>
|
||||
|
||||
`;
|
||||
}).join('') : ''
|
||||
}
|
||||
</div>
|
||||
@@ -414,7 +410,7 @@
|
||||
filters.branch_id = branch;
|
||||
}
|
||||
|
||||
if (laporan.length > 0) {
|
||||
if (laporan.length > 0) {
|
||||
filters.laporan = laporan;
|
||||
}
|
||||
|
||||
@@ -476,8 +472,16 @@
|
||||
branch_id: branchFilter.value,
|
||||
laporan: Array.from(laporanFilter.selectedOptions).map(option => option.value),
|
||||
status: getSelectedStatuses(),
|
||||
search: searchInput.value,
|
||||
export_type: 'filtered'
|
||||
});
|
||||
} else if (searchInput.value) {
|
||||
// If only search is applied, export filtered results
|
||||
exportData({
|
||||
search: searchInput.value,
|
||||
export_type: 'filtered'
|
||||
});
|
||||
|
||||
} else {
|
||||
// If no selection and no filters, export all
|
||||
exportData({
|
||||
@@ -495,6 +499,7 @@
|
||||
exportLaporan.value = filters.laporan ? filters.laporan.join(',') : '';
|
||||
exportSelectedIds.value = filters.selected_ids ? filters.selected_ids.join(',') : '';
|
||||
exportType.value = filters.export_type || 'all';
|
||||
exportSearch.value = filters.search || '';
|
||||
// Submit the form
|
||||
exportForm.submit();
|
||||
}
|
||||
@@ -512,37 +517,37 @@
|
||||
</script>
|
||||
|
||||
<script>
|
||||
function checkLaporan(permohonanId, documentId, statusLpj) {
|
||||
// showLoadingSwal('Tunggu...');
|
||||
fetch(
|
||||
`{{ url('/penilai/check-laporan') }}?permohonanId=${permohonanId}&documentId=${documentId}`
|
||||
)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.status) {
|
||||
window.location.href =
|
||||
`{{ route('penilai.print-out') }}?permohonanId=${permohonanId}&documentId=${documentId}&statusLpj=${0}&type=${data.status}`;
|
||||
} else {
|
||||
// Jika laporan belum ada, tampilkan pesan peringatan
|
||||
function checkLaporan(permohonanId, documentId, statusLpj) {
|
||||
// showLoadingSwal('Tunggu...');
|
||||
fetch(
|
||||
`{{ url('/penilai/check-laporan') }}?permohonanId=${permohonanId}&documentId=${documentId}`
|
||||
)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.status) {
|
||||
window.location.href =
|
||||
`{{ route('penilai.print-out') }}?permohonanId=${permohonanId}&documentId=${documentId}&statusLpj=${0}&type=${data.status}`;
|
||||
} else {
|
||||
// Jika laporan belum ada, tampilkan pesan peringatan
|
||||
Swal.fire({
|
||||
title: 'Laporan Belum Ada',
|
||||
text: data.message,
|
||||
icon: 'warning',
|
||||
confirmButtonText: 'OK',
|
||||
confirmButtonColor: '#3085d6',
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
Swal.fire({
|
||||
title: 'Laporan Belum Ada',
|
||||
text: data.message,
|
||||
icon: 'warning',
|
||||
title: 'Terjadi Kesalahan',
|
||||
text: 'Tidak dapat memproses permintaan. Silakan coba lagi nanti.',
|
||||
icon: 'error',
|
||||
confirmButtonText: 'OK',
|
||||
confirmButtonColor: '#3085d6',
|
||||
confirmButtonColor: '#d33',
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
Swal.fire({
|
||||
title: 'Terjadi Kesalahan',
|
||||
text: 'Tidak dapat memproses permintaan. Silakan coba lagi nanti.',
|
||||
icon: 'error',
|
||||
confirmButtonText: 'OK',
|
||||
confirmButtonColor: '#d33',
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@endpush
|
||||
|
||||
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>
|
||||
</th>
|
||||
<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>
|
||||
</th>
|
||||
<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>
|
||||
</th>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{{-- <div class="no-break"> --}}
|
||||
<div class="no-break">
|
||||
<table class="judul" style="width: 100%; ">
|
||||
<tr>
|
||||
<td style="width: 100%; border: 1px solid #000; text-align: center;">
|
||||
@@ -101,6 +101,5 @@
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
|
||||
</table>
|
||||
{{-- </div> --}}
|
||||
</div>
|
||||
|
||||
@@ -137,4 +137,4 @@
|
||||
</tr>
|
||||
@endif
|
||||
</table>
|
||||
</div>
|
||||
{{-- </div> --}}
|
||||
|
||||
@@ -93,10 +93,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer id="footer">
|
||||
{{-- <footer id="footer"> --}}
|
||||
{{-- Cabang : {{ $permohonan->debiture->branch->name ?? '' }} --}}
|
||||
</footer>
|
||||
<script type="text/php">
|
||||
{{-- </footer> --}}
|
||||
{{-- <script type="text/php">
|
||||
if (isset($pdf)) {
|
||||
$pdf->page_script('
|
||||
$font = $fontMetrics->get_font("Arial, Helvetica, sans-serif", "normal");
|
||||
@@ -107,8 +107,8 @@
|
||||
$pdf->text($x, $y, $pageText, $font, $size);
|
||||
');
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
</script> --}}
|
||||
{{-- <script>
|
||||
const datas = @json($forminspeksi);
|
||||
console.log(datas);
|
||||
const lpjData = @json($lpjData);
|
||||
@@ -138,4 +138,4 @@
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
</html> --}}
|
||||
|
||||
@@ -96,11 +96,14 @@
|
||||
<table width="100%" border="0"
|
||||
style="align-content: center; text-align: center; margin-bottom: 20px">
|
||||
@foreach ($chunkedPhotos as $item)
|
||||
@php
|
||||
$imagePath = storage_path('app/public/' . $item['path']);
|
||||
@php
|
||||
$filePath = asset('storage/' . $item['path']);
|
||||
$extension = strtolower(pathinfo($item['path'], PATHINFO_EXTENSION));
|
||||
$isImage = in_array($extension, ['jpg', 'jpeg', 'png', 'gif']);
|
||||
$isPdf = $extension === 'pdf';
|
||||
@endphp
|
||||
<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 }} -
|
||||
@isset($subcategory)
|
||||
@if (trim($subcategory) !== '')
|
||||
@@ -109,8 +112,18 @@
|
||||
@endisset
|
||||
{{ $item['name'] ?? '' }}
|
||||
</p>
|
||||
@if ($statusLpj || file_exists($imagePath))
|
||||
<img src="{{ $imagePath }}" alt="{{ $item['path'] }}" class="photo-image">
|
||||
@if ($statusLpj || file_exists(public_path('storage/' . $item['path'])))
|
||||
@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
|
||||
@isset($item['description'])
|
||||
<p style="font-size:9px">{{ $item['description'] }}</p>
|
||||
@@ -135,8 +148,10 @@
|
||||
<table width="100%" border="0"
|
||||
style="align-content: center; text-align: center; margin-bottom: 20px">
|
||||
@foreach ($chunkedPhotos as $item)
|
||||
@php
|
||||
$imagePath = storage_path('app/public/' . $item['path']);
|
||||
@php
|
||||
$filePath = asset('storage/' . $item['path']);
|
||||
$extension = strtolower(pathinfo($item['path'], PATHINFO_EXTENSION));
|
||||
$isPdf = $extension === 'pdf';
|
||||
@endphp
|
||||
<tr>
|
||||
<td style="width: 100%; padding: 10px;" class="photo-item border">
|
||||
@@ -148,8 +163,18 @@
|
||||
@endisset
|
||||
{{ $item['name'] ?? '' }}
|
||||
</p>
|
||||
@if ($statusLpj || file_exists($imagePath))
|
||||
<img src="{{ $imagePath }}" alt="{{ $item['path'] }}" class="photo-image">
|
||||
@if ($statusLpj || file_exists(public_path('storage/' . $item['path'])))
|
||||
@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
|
||||
@isset($item['description'])
|
||||
<p style="font-size:9px">{{ $item['description'] }}</p>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
}
|
||||
|
||||
#header {
|
||||
/* #header {
|
||||
position: fixed;
|
||||
top: -80px;
|
||||
left: 0;
|
||||
@@ -29,15 +29,15 @@
|
||||
height: 50px;
|
||||
text-align: center;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
} */
|
||||
|
||||
.header-logo {
|
||||
/* .header-logo {
|
||||
position: absolute;
|
||||
left: 20px;
|
||||
top: 10px;
|
||||
max-height: 80px;
|
||||
max-width: 150px;
|
||||
}
|
||||
} */
|
||||
|
||||
.header-title {
|
||||
margin-top: 20px;
|
||||
@@ -88,9 +88,9 @@
|
||||
page-break-before: always;
|
||||
break-before: page;
|
||||
}
|
||||
.border {
|
||||
/* .border {
|
||||
border: 1px solid #000;
|
||||
}
|
||||
} */
|
||||
|
||||
.no-break {
|
||||
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\LaporanController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanExternalController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanHasilPenilaianJaminanInternalExternalController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanPembatalanController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanPenilaianJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanPermohonanController;
|
||||
use Modules\Lpj\Http\Controllers\NilaiPlafondController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanHasilPenilaianJaminanInternalExternalController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanPembatalanController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanPenilaianJaminanController;
|
||||
use Modules\Lpj\Http\Controllers\LaporanPermohonanController;
|
||||
use Modules\Lpj\Http\Controllers\NilaiPlafondController;
|
||||
use Modules\Lpj\Http\Controllers\NocController;
|
||||
use Modules\Lpj\Http\Controllers\PembatalanController;
|
||||
use Modules\Lpj\Http\Controllers\PemilikJaminanController;
|
||||
@@ -687,9 +687,10 @@ Route::middleware(['auth'])->group(function () {
|
||||
Route::get('/', [LaporanPenilaiJaminanController::class, 'index'])->name('index');
|
||||
Route::get('datatables', [LaporanPenilaiJaminanController::class, 'dataForDatatables'])->name('datatables');
|
||||
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('export', [LaporanPermohonanController::class, 'export'])->name('export');
|
||||
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::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('export', [LaporanPenilaianJaminanController::class, 'export'])->name('export');
|
||||
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('export', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'export'])->name('export');
|
||||
Route::get('/', [LaporanHasilPenilaianJaminanInternalExternalController::class, 'index'])->name('index');
|
||||
|
||||
Reference in New Issue
Block a user