🐛 fix(lpj): Perbaikan format Rupiah, role access, dan validasi data
## Ringkasan Melakukan perbaikan pada helper format Rupiah, akses role user, validasi data MIG, serta penyesuaian tampilan laporan dan dokumentasi. ## Perubahan Detail ### 🔧 Helper Function **app/Helpers/Lpj.php**: - Menambahkan parameter opsional `withSymbol` pada fungsi `formatRupiah()` untuk kontrol simbol Rp - Menambahkan handling untuk menghapus titik (.) dari input number sebelum proses - Memperbaiki return value untuk null/empty string sesuai parameter `withSymbol` - Mengganti `str_pad()` dengan `sprintf()` untuk generate random number (lebih efisien) ### 🛠️ Service Layer **app/Services/PreviewLaporanService.php**: - Memperbaiki validasi data MIG dengan menambahkan pengecekan `is_mig` flag - Menambahkan null safety pada property `mig_mst_lpj_tot_nilai_pasar` - Memperbaiki kondisi logic untuk memo dan validasi nilai pasar ### 🎨 View Components **resources/views/component/print-out-dokument.blade.php**: - Memperbaiki syntax Blade dari `@isset` menjadi `isset()` yang lebih proper **resources/views/debitur/components/debitur.blade.php**: - Memperbaiki role checking dari `hasRole()` menjadi `hasAnyRole()` untuk multiple roles **resources/views/debitur/index.blade.php**: - Menambahkan role 'admin' pada kondisi edit dan delete actions - Memperbaiki permission checking untuk administrator dan admin **resources/views/laporan/index.blade.php**: - Menyederhanakan logic tombol laporan dan resume - Menghapus logic role-based yang kompleks untuk tombol laporan - Memperbaiki route URL untuk print-out laporan - Menghapus function `generateLaporanButton()` yang tidak digunakan **resources/views/penilai/components/lpj-sederhana-standar.blade.php**: - Menambahkan role 'penilai' pada permission tombol simpan **resources/views/penilai/components/print-out-sederhana.blade.php**: - Memperbaiki tampilan data dokumen dengan menambahkan kolom nomor dokumen - Mengganti `number_format()` dengan `formatRupiah()` untuk konsistensi format - Menambahkan fallback untuk data tanah dan bangunan ketika `npw_tambahan` tidak tersedia - Memperbaiki perhitungan total nilai pasar wajar dengan proper parsing - Memperbaiki format tampilan nilai likuidasi - Memperbaiki struktur HTML tabel untuk dokumentasi **resources/views/penilai/components/signature-approval.blade.php**: - Memperbaiki route dan parameter untuk approval signature **resources/views/permohonan/index.blade.php**: - Menambahkan role 'admin' pada permission actions
This commit is contained in:
@@ -92,19 +92,23 @@
|
||||
* formatRupiah(0) // "Rp 0"
|
||||
* formatRupiah(null) // "Rp 0"
|
||||
*/
|
||||
function formatRupiah($number, $decimals = 0): string
|
||||
function formatRupiah($number, $decimals = 0, $withSymbol = true): string
|
||||
{
|
||||
Log::debug('Memulai format Rupiah', [
|
||||
'number' => $number,
|
||||
'decimals' => $decimals
|
||||
'decimals' => $decimals,
|
||||
'withSymbol' => $withSymbol
|
||||
]);
|
||||
|
||||
// Handle null atau kosong
|
||||
if ($number === null || $number === '') {
|
||||
Log::debug('Number null atau kosong, return Rp 0');
|
||||
return 'Rp 0';
|
||||
return $withSymbol ? 'Rp 0' : '0';
|
||||
}
|
||||
|
||||
// Remove dots if present
|
||||
$number = str_replace('.', '', (string) $number);
|
||||
|
||||
// Konversi ke float dan handle error
|
||||
try {
|
||||
$number = (float) $number;
|
||||
@@ -113,13 +117,14 @@
|
||||
'number' => $number,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
return 'Rp 0';
|
||||
return $withSymbol ? 'Rp 0' : '0';
|
||||
}
|
||||
|
||||
// Validasi decimals
|
||||
$decimals = max(0, (int) $decimals);
|
||||
|
||||
$result = 'Rp ' . number_format($number, $decimals, ',', '.');
|
||||
$formatted = number_format($number, $decimals, ',', '.');
|
||||
$result = $withSymbol ? 'Rp ' . $formatted : $formatted;
|
||||
Log::debug('Format Rupiah berhasil', ['result' => $result]);
|
||||
|
||||
return $result;
|
||||
@@ -407,7 +412,8 @@
|
||||
$day = str_pad(date('d'), 2, '0', STR_PAD_LEFT);
|
||||
|
||||
// Generate random numbers
|
||||
$randomNumber = str_pad(mt_rand(0, pow(10, $randomLength) - 1), $randomLength, '0', STR_PAD_LEFT);
|
||||
//$randomNumber = str_pad(mt_rand(0, pow(10, $randomLength) - 1), $randomLength, '0', STR_PAD_LEFT);
|
||||
$randomNumber = sprintf('%0' . $randomLength . 'd', mt_rand(0, pow(10, $randomLength) - 1));
|
||||
|
||||
// Concatenate components to create the custom code
|
||||
return $year . $month . $day . $randomNumber;
|
||||
|
||||
@@ -221,7 +221,9 @@ class PreviewLaporanService
|
||||
$statusLpj = 1;
|
||||
|
||||
$mig_permohonan = json_decode($permohonan->mig_permohonan);
|
||||
if(($tipeLaporan->status === 'memo' && $permohonan->mig_permohonan) || $mig_permohonan->mig_mst_lpj_tot_nilai_pasar < 1){
|
||||
$nilaiPasar = $mig_permohonan->mig_mst_lpj_tot_nilai_pasar ?? null;
|
||||
|
||||
if(($tipeLaporan->status === 'memo' && $permohonan->mig_permohonan && $permohonan->is_mig) || ($nilaiPasar !== null && $nilaiPasar < 1 && $permohonan->is_mig)){
|
||||
$paths = $formFoto['upload_foto'] ?? null;
|
||||
|
||||
if (!is_array($paths) || empty($paths)) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@if (@isset($dokumen))
|
||||
@if (isset($dokumen))
|
||||
@foreach ($dokumen->detail as $detail)
|
||||
@if ($detail->name != 'LOKASI JAMINAN')
|
||||
@if (isset($detail->details))
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<div class="flex flex-wrap items-baseline w-full">
|
||||
@if(auth()->user()->hasRole('administrator','admin'))
|
||||
@if(auth()->user()->hasAnyRole(['administrator','admin']))
|
||||
<select class="input tomselect w-full @error('branch_id') border-danger bg-danger-light @enderror" name="branch_id" id="branch_id">
|
||||
<option value="">Pilih Cabang</option>
|
||||
@foreach($branches as $branch)
|
||||
|
||||
@@ -192,14 +192,14 @@
|
||||
// Periksa apakah ada setidaknya satu permohonan dengan status yang valid
|
||||
const hasAnyValidPermohonan = permohonanArray.some(hasValidStatus);
|
||||
|
||||
if (hasRole(['administrator']) && hasAnyValidPermohonan || data.permohonan.length < 1) {
|
||||
if (hasRole(['administrator','admin']) && hasAnyValidPermohonan || data.permohonan.length < 1) {
|
||||
actionHtml += `
|
||||
<a class="btn btn-sm btn-icon btn-clear btn-info" href="/debitur/${data.id}/edit">
|
||||
<i class="ki-outline ki-notepad-edit"></i>
|
||||
</a>`;
|
||||
}
|
||||
|
||||
if (hasRole(['administrator', 'pemohon-ao']) && data.permohonan.length < 1) {
|
||||
if (hasRole(['administrator', 'pemohon-ao','admin']) && data.permohonan.length < 1) {
|
||||
actionHtml += `
|
||||
<a onclick="deleteData(${data.id})" class="delete btn btn-sm btn-icon btn-clear btn-danger">
|
||||
<i class="ki-outline ki-trash"></i>
|
||||
|
||||
@@ -237,47 +237,22 @@
|
||||
const type = data.penilai?.type || '';
|
||||
let laporanButton = '';
|
||||
let resumeButton = '';
|
||||
let penyelesaian = '';
|
||||
|
||||
if (data.penilai?.resume) {
|
||||
resumeButton = `
|
||||
<a href="{{ route('penilai.print-out') }}?permohonanId=${data.id}&documentId=${dokumenID}&inspeksiId=${inspeksiId}&jaminanId=${jenisJaminanID}&statusLpj=0" class="btn btn-sm btn-success">
|
||||
Resume
|
||||
</a>`;
|
||||
<a href="penilai/print-out-laporan/${data.id}/${dokumenID}/${jenisJaminanID}" class="btn btn-sm btn-success">
|
||||
Resume
|
||||
</a>`;
|
||||
}
|
||||
|
||||
|
||||
// Logika untuk role pemohon-ao
|
||||
@if (auth()->user()->hasRole('pemohon-ao'))
|
||||
if (data.nilai_liquidasi == null) {
|
||||
laporanButton = `
|
||||
<a href="laporan/${data.id}" class="btn btn-sm btn-primary">
|
||||
if (data.status_bayar == "sudah_bayar" || data.status_bayar == "tidak_bayar") {
|
||||
laporanButton = `
|
||||
<a href="penilai/print-out-laporan/${data.id}/${dokumenID}/${jenisJaminanID}" class="btn btn-sm btn-primary">
|
||||
Laporan
|
||||
</a>`;
|
||||
} else if ((data.status_bayar == "sudah_bayar" || data.status_bayar == "tidak_bayar") &&
|
||||
data.nilai_liquidasi > 0) {
|
||||
laporanButton = generateLaporanButton(data, dokumenID, inspeksiId, jenisJaminanID,
|
||||
data.penilai?.type_penilai == 'resume' && !data.penilai?.resume ? type :
|
||||
typePenilaian);
|
||||
}
|
||||
@else
|
||||
// Logika untuk role selain pemohon-ao
|
||||
if (data.status_bayar == "sudah_bayar" || data.status_bayar == "tidak_bayar") {
|
||||
laporanButton = generateLaporanButton(data, dokumenID, inspeksiId, jenisJaminanID,
|
||||
data.penilai?.type_penilai == 'resume' && !data.penilai?.resume ? type :
|
||||
typePenilaian);
|
||||
}
|
||||
@endif
|
||||
|
||||
function generateLaporanButton(data, dokumenID, inspeksiId, jenisJaminanID, typeParam) {
|
||||
return `
|
||||
<a href="{{ route('penilai.print-out') }}?permohonanId=${data.id}&documentId=${dokumenID}&inspeksiId=${inspeksiId}&jaminanId=${jenisJaminanID}&statusLpj=0&type=${typeParam}" class="btn btn-sm btn-primary">
|
||||
Laporan
|
||||
</a>`;
|
||||
}
|
||||
|
||||
|
||||
return `<div class="flex flex-wrap gap-1.5 justify-end"> ${penyelesaian} ${resumeButton} ${laporanButton} </div>`;
|
||||
return `<div class="flex flex-wrap gap-1.5 justify-end"> ${resumeButton} ${laporanButton} </div>`;
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-5 justify-end card-footer">
|
||||
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator']))
|
||||
@if (Auth::user()->hasAnyRole(['senior-officer', 'surveyor', 'administrator','penilai']))
|
||||
<button type="button" class="btn btn-primary" id="saveButton" onclick="saveLpjSederhanadanStandard()" {{ $permohonan->status == 'proses-paparan' || $permohonan->status == 'proses-laporan' && Auth::user()->hasAnyRole(['surveyor']) ? 'disabled' : '' }}>
|
||||
<i class="ki-filled ki-save-2"></i>
|
||||
<span id="saveButtonText">Simpan</span>
|
||||
|
||||
@@ -188,7 +188,9 @@
|
||||
@foreach ($dokumen->detail as $detail)
|
||||
@if (!empty($detail->name) && isset($detail->details) && !empty($detail->dokumen_jaminan))
|
||||
<tr>
|
||||
<td width="25%"><strong>{{ $detail->name ?? '' }}</strong></td>
|
||||
<td width="25%">{{ $detail->name ?? '' }}</td>
|
||||
<td style=" padding: 2px; vertical-align: top;">:</td>
|
||||
<td style=" padding: 2px; vertical-align: top;">{{ json_decode($detail->dokumen_nomor, true)[0] ?? '' }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
@@ -228,7 +230,7 @@
|
||||
</tr>
|
||||
|
||||
|
||||
@include('lpj::component.print-out-dokument')
|
||||
@include('lpj::component.print-out-dokument')
|
||||
|
||||
@if (isset($forminspeksi['asset']['nomor_nib']))
|
||||
<tr>
|
||||
@@ -564,24 +566,48 @@
|
||||
</td>
|
||||
<td width="5%" style="padding: 3px; text-align: center;">X</td>
|
||||
<td width="25%" style="padding: 3px; text-align:right">
|
||||
{{ number_format($npw['nilai_1'], 0, ',', '.') ?? '' }}
|
||||
{{ formatRupiah($npw['nilai_1'] ?? 0, 0, false) ?? '' }}
|
||||
</td>
|
||||
<td width="5" style="padding: 3px; text-align: center;">
|
||||
=
|
||||
</td>
|
||||
<td width="25%" style="padding: 3px; text-align: left; text-align: right;">
|
||||
{{ number_format($npw['nilai_2'], 0, ',', '.') ?? '' }}
|
||||
{{ formatRupiah($npw['nilai_2'] ?? 0, 0, false) ?? '' }}
|
||||
</td>
|
||||
</tr>
|
||||
@php $totalNilaiPasarWajar += $npw['nilai_2']; @endphp
|
||||
@php $totalNilaiPasarWajar += str_replace(['Rp', '.'], '', $npw['nilai_2']); @endphp
|
||||
@endforeach
|
||||
@else
|
||||
{{-- Fallback untuk data tanpa npw_tambahan --}}
|
||||
@if (isset($lpjData['luas_tanah']))
|
||||
<tr>
|
||||
<td width="30%" style="padding: 3px; text-align: right;">Tanah</td>
|
||||
<td width="10%" style="padding: 3px; text-align: right;">{{ $lpjData['luas_tanah'] }} m<sup>2</sup></td>
|
||||
<td width="5%" style="padding: 3px; text-align: center;">X</td>
|
||||
<td width="25%" style="padding: 3px; text-align:right">{{ formatRupiah($lpjData['nilai_tanah_1'] ?? 0, 0, false) }}</td>
|
||||
<td width="5%" style="padding: 3px; text-align: center;">=</td>
|
||||
<td width="25%" style="padding: 3px; text-align: right;">{{ formatRupiah($lpjData['nilai_tanah_2'] ?? 0, 0, false) }}</td>
|
||||
</tr>
|
||||
@php $totalNilaiPasarWajar += str_replace(['Rp', '.'], '', $lpjData['nilai_tanah_2']); @endphp
|
||||
@endif
|
||||
@if (isset($lpjData['luas_bangunan']))
|
||||
<tr>
|
||||
<td width="30%" style="padding: 3px; text-align: right;">Bangunan</td>
|
||||
<td width="10%" style="padding: 3px; text-align: right;">{{ $lpjData['luas_bangunan'] }} m<sup>2</sup></td>
|
||||
<td width="5%" style="padding: 3px; text-align: center;">X</td>
|
||||
<td width="25%" style="padding: 3px; text-align:right">{{ formatRupiah($lpjData['nilai_bangunan_1'] ?? 0, 0, false) }}</td>
|
||||
<td width="5%" style="padding: 3px; text-align: center;">=</td>
|
||||
<td width="25%" style="padding: 3px; text-align: right;">{{ formatRupiah($lpjData['nilai_bangunan_2'] ?? 0, 0, false) }}</td>
|
||||
</tr>
|
||||
@php $totalNilaiPasarWajar += str_replace(['Rp', '.'], '', $lpjData['nilai_bangunan_2']); @endphp
|
||||
@endif
|
||||
@endif
|
||||
<tr>
|
||||
<td style="padding: 3px; text-align: right; font-weight: bold; width:10%;" colspan="4">Total Nilai Pasar Wajar</td>
|
||||
<td style="padding: 3px; text-align: center; width:5%;font-weight: bold;" >=</td>
|
||||
<td style="padding: 3px; text-align: right; font-weight: bold; width: 40%;">
|
||||
<div style="display: inline-block; border-top: 1px solid black; padding-top: 3px;">
|
||||
{{ $lpjData['total_nilai_pasar_wajar'] ? number_format($lpjData['total_nilai_pasar_wajar'], 0, ',', '.') : number_format($totalNilaiPasarWajar, 0, ',', '.') ?? '' }}
|
||||
{{ $lpjData['total_nilai_pasar_wajar'] ? formatRupiah(($lpjData['total_nilai_pasar_wajar'] ?? 0), 0, false) : formatRupiah($totalNilaiPasarWajar ?? 0, 0, false) ?? '' }}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -597,7 +623,7 @@
|
||||
Wajar
|
||||
</td>
|
||||
<td style="padding: 3px; text-align: center; font-weight: bold;">=</td>
|
||||
<td style="padding: 3px; text-align: right;font-weight: bold;">{{ number_format($permohonan_migrasi->mig_mst_lpj_tot_nilai_likuidasi, 0, ',', '.') ?? '' }}
|
||||
<td style="padding: 3px; text-align: right;font-weight: bold;">{{ formatRupiah($permohonan_migrasi->mig_mst_lpj_tot_nilai_likuidasi ?? $lpjData['likuidasi_nilai_2'] ?? 0, 0, false) ?? '' }}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<td style=" padding: 4px;height: 25px">
|
||||
<b>Penilaian Dibuat</b>
|
||||
</td>
|
||||
@if($soUser->name==$eoUser->name)
|
||||
@if($soUser?->name==$eoUser?->name)
|
||||
@if ($permohonan->approval_so != null)
|
||||
<td style=" padding: 4px;height: 25px">
|
||||
<b>Diperiksa dan Menyetujui</b>
|
||||
@@ -71,7 +71,7 @@
|
||||
<img src="{{ $imagePathPenilai }}" alt="{{ $imagePathPenilai }}" width="80px">
|
||||
@endif
|
||||
</td>
|
||||
@if($soUser->name==$eoUser->name)
|
||||
@if($soUser?->name==$eoUser?->name)
|
||||
@if ($permohonan->approval_so != null)
|
||||
<td style=" padding: 4px;height: 75px">
|
||||
@if (file_exists($imagePathSo))
|
||||
@@ -112,11 +112,16 @@
|
||||
</span>
|
||||
</br>
|
||||
<span>
|
||||
{{ $permohonan_migrasi->mig_mst_jaminan_tgl_laporan ? formatTanggalIndonesia(parseTimestamp($permohonan_migrasi->mig_mst_jaminan_tgl_laporan)) : ($permohonan_migrasi->mig_mst_lpj_tgl_laporan ? formatTanggalIndonesia(parseTimestamp($permohonan_migrasi->mig_mst_lpj_tgl_laporan)) : '') }}
|
||||
@php
|
||||
$tgl = $permohonan_migrasi->mig_mst_jaminan_tgl_laporan ?? null;
|
||||
@endphp
|
||||
|
||||
{{ $tgl ? formatTanggalIndonesia(parseTimestamp($tgl)) : '' }}
|
||||
|
||||
</span>
|
||||
</td>
|
||||
|
||||
@if($soUser->name==$eoUser->name)
|
||||
@if($soUser?->name==$eoUser?->name)
|
||||
@if ($permohonan->approval_so != null)
|
||||
<td style=" padding: 4px;">
|
||||
{{ $soUser->name ?? $senior_officer->name ?? '' }}</br>
|
||||
|
||||
@@ -268,13 +268,13 @@ title="Approve Jadwal Kunjungan No Reg ${data.nomor_registrasi}"
|
||||
`;
|
||||
}
|
||||
|
||||
if (data.status !== 'done' && data.status !== 'batal' && hasRole(['administrator', 'pemohon-ao'])) {
|
||||
if (data.status !== 'done' && data.status !== 'batal' && hasRole(['administrator', 'pemohon-ao','admin'])) {
|
||||
actionHtml += `
|
||||
<a class="btn btn-sm btn-outline btn-info" href="permohonan/${data.id}/edit" title="Edit Permohonan">
|
||||
<i class="ki-outline ki-notepad-edit"></i>
|
||||
</a>`;
|
||||
}
|
||||
if (data.status === 'order' && hasRole(['administrator', 'pemohon-ao'])) {
|
||||
if (data.status === 'order' && hasRole(['administrator', 'pemohon-ao','admin'])) {
|
||||
actionHtml += `
|
||||
<a onclick="deleteData(${data.id}, '${data.nomor_registrasi}','${data.debiture?.name}')" class="delete btn btn-sm btn-outline btn-danger" title="Batalkan Permohonan">
|
||||
<i class="ki-outline ki-cross-square"></i>
|
||||
|
||||
Reference in New Issue
Block a user