Merge branch 'staging' of https://git.putrakuningan.com/daengdeni/lpj into tender

This commit is contained in:
2025-03-20 08:15:21 +07:00
11 changed files with 131 additions and 34 deletions

View File

@@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Builder;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat; use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
use Modules\Lpj\Models\Debiture; use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Helpers\Lpj;
class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMapping, ShouldAutoSize class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMapping, ShouldAutoSize
{ {
@@ -30,7 +31,7 @@ class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMappin
public function query() public function query()
{ {
$query = Permohonan::query() $query = Permohonan::query()
->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai']); ->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian', 'dokumenjaminan.jenisJaminan','nilaiPlafond', 'penilai', 'inspeksi']);
// Filter by date range if provided // Filter by date range if provided
if ($this->tanggalAwal && $this->tanggalAkhir) { if ($this->tanggalAwal && $this->tanggalAkhir) {
@@ -41,6 +42,7 @@ class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMappin
// Filter by status if provided // Filter by status if provided
if ($this->status) { if ($this->status) {
$types = is_array($this->status) ? $this->status : [$this->status]; $types = is_array($this->status) ? $this->status : [$this->status];
$types = array_map('strtolower', $types);
$query->whereHas('penilai', function (Builder $query) use ($types) { $query->whereHas('penilai', function (Builder $query) use ($types) {
$query->whereIn('type_penilai', $types); $query->whereIn('type_penilai', $types);
}); });
@@ -59,10 +61,22 @@ class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMappin
public function map($row): array public function map($row): array
{ {
$fieldPenilai = ['sederhana', 'standar', 'resume', 'memo', 'rap', 'call-report'];
// ambil data alamat dari inspeksi
$alamat_inspeksi = null;
if ($row->inspeksi) {
$alamat_inspeksi = json_decode($row->inspeksi->data_form, true) ?? null;
$alamat_inspeksi = $alamat_inspeksi['asset']['alamat']['sesuai'] ?? $alamat_inspeksi['asset']['alamat']['tidak sesuai'] ?? [];
}
$alamat_inspeksi = $alamat_inspeksi['address'] ?? '-';
// ambil data dari table penilai
$fieldPenilai = ['lpj', 'resume', 'memo', 'rap', 'call-report'];
$penilaiCek = null; $penilaiCek = null;
// Find the first available field in the array // Cari field yang tersedia
foreach ($fieldPenilai as $value) { foreach ($fieldPenilai as $value) {
if (!empty($row->penilai->$value)) { if (!empty($row->penilai->$value)) {
$penilaiCek = $row->penilai->$value; $penilaiCek = $row->penilai->$value;
@@ -71,6 +85,39 @@ class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMappin
} }
$decodePenilai = json_decode($penilaiCek, true) ?? []; $decodePenilai = json_decode($penilaiCek, true) ?? [];
// Ambil nilai utama
$luasTanah = $decodePenilai['luas_tanah'] ?? 0;
$nilaiTanah1 = $decodePenilai['nilai_tanah_1'] ?? 0;
$luasBangunan = $decodePenilai['luas_bangunan'] ?? 0;
$nilaiBangunan1 = $decodePenilai['nilai_bangunan_1'] ?? 0;
$totalNilaiPasar = $decodePenilai['total_nilai_pasar_wajar'] ?? 0;
$likuidasi = $decodePenilai['likuidasi'] ?? 0;
// Ambil data npw_tambahan jika ada
$npwTambahan = $decodePenilai['npw_tambahan'] ?? [];
$tambahanDetails = [];
foreach ($npwTambahan as $tambahan) {
$tambahanDetails[] = sprintf(
'%s: Luas: %s, Nilai 1: %s, Nilai 2: %s',
$tambahan['name'] ?? '-',
$tambahan['luas'] ?? 0,
$tambahan['nilai_1'] ?? 0,
$tambahan['nilai_2'] ?? 0
);
}
$tambahanSummary = implode("; ", $tambahanDetails);
// Ambil data penilaian dari table penilaian
$user_penilai = $row->penilaian->userPenilai ?? null;
$user_penilai_name = null;
foreach ($user_penilai as $value) {
if ($value->role == 'penilai') {
$user_penilai_name = $value->user->name;
$nik_penilai = $value->user->nik ?? '-';
break;
}
}
return [ return [
$row->id, $row->id,
@@ -80,27 +127,28 @@ class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMappin
$row->tujuanPenilaian->name, $row->tujuanPenilaian->name,
$row->debiture->name, $row->debiture->name,
$row->penilai->type_penilai ?? '-', $row->penilai->type_penilai ?? '-',
'-', $alamat_inspeksi ?? '-',
$decodePenilai['luas_tanah'] ?? 0, $luasTanah,
$decodePenilai['luas_bangunan'] ?? 0, $luasBangunan,
$decodePenilai['nilai_tanah_1'] ?? 0, $nilaiTanah1,
$decodePenilai['nilai_bangunan_1'] ?? 0, $nilaiBangunan1,
$decodePenilai['total_nilai_pasar_wajar'] ?? 0, $totalNilaiPasar,
$decodePenilai['likuidasi'] ?? 0, $likuidasi,
$row->authorized_at, $row->laporan->created_at ?? '-',
$row->authorized_status ?? '-', $user_penilai_name,
$row->authorized_by ?? '-', $nik_penilai,
$row->created_at, $row->created_at,
]; ];
} }
public function headings(): array public function headings(): array
{ {
return [ return [
'ID', 'ID',
'Nomor Registrasi', 'Nomor Registrasi',
'User Pemohon', 'User Pemohon',
'Branch Pemohon', 'Cabang',
'Tujuan Penilaian', 'Tujuan Penilaian',
'Debitur', 'Debitur',
'Jenis Laporan', 'Jenis Laporan',
@@ -114,6 +162,7 @@ class LaporanPenilaiJaminanExport implements FromQuery, WithHeadings, WithMappin
'Tanggal Laporan', 'Tanggal Laporan',
'Nama Penilai', 'Nama Penilai',
'Nik Penilai', 'Nik Penilai',
'Created At',
]; ];
} }
public function columnFormats(): array public function columnFormats(): array

View File

@@ -514,10 +514,10 @@ class PenilaianController extends Controller
$status = 'done'; $status = 'done';
} }
if($status=='done'){ if ($status == 'done') {
$_permohonan = Permohonan::with(['documents.jenisJaminan','penilaian._user_penilai','penilai','documents.detail.jenisLegalitasJaminan'])->find(6); $_permohonan = Permohonan::with(['documents.jenisJaminan','penilaian._user_penilai','penilai','documents.detail.jenisLegalitasJaminan'])->find(6);
if(isset($_permohonan->penilai->lpj)){ if (isset($_permohonan->penilai->lpj)) {
$npw = json_decode($_permohonan->penilai->lpj, true); $npw = json_decode($_permohonan->penilai->lpj, true);
$npw = $npw['total_nilai_pasar_wajar'] ?? 0; $npw = $npw['total_nilai_pasar_wajar'] ?? 0;
} }
@@ -559,7 +559,7 @@ class PenilaianController extends Controller
]); ]);
} elseif (Auth::user()->roles[0]->name === 'EO Appraisal' || Auth::user()->roles[0]->name === 'administrator' && $authorization->approve_so && $authorization->approve_eo === null) { } elseif (Auth::user()->roles[0]->name === 'EO Appraisal' || Auth::user()->roles[0]->name === 'administrator' && $authorization->approve_so && $authorization->approve_eo === null) {
$status = '2'; $status = '2';
if (!in_array($permohonan->nilai_plafond_id, [1, 4])) { if (!in_array($permohonan->nilai_plafond_id, [1, 2])) {
$status = '1'; $status = '1';
$permohonan->update([ $permohonan->update([
'status' => $authorization->request 'status' => $authorization->request
@@ -603,7 +603,7 @@ class PenilaianController extends Controller
]); ]);
} elseif (Auth::user()->roles[0]->name === 'EO Appraisal') { } elseif (Auth::user()->roles[0]->name === 'EO Appraisal') {
$status = '2'; $status = '2';
if (!in_array($permohonan->nilai_plafond_id, [1,4])) { if (!in_array($permohonan->nilai_plafond_id, [1,2])) {
$status = '1'; $status = '1';
$permohonan->update([ $permohonan->update([
'status' => $authorization->request 'status' => $authorization->request

View File

@@ -248,4 +248,15 @@
{ {
return $this->belongsTo(LaporanExternal::class,'id','permohonan_id'); return $this->belongsTo(LaporanExternal::class,'id','permohonan_id');
} }
public function laporan()
{
return $this->belongsTo(Laporan::class,'id','permohonan_id');
}
public function inspeksi(){
return $this->belongsTo(Inspeksi::class, 'permohonan_id');
}
} }

View File

@@ -27,7 +27,7 @@
@else @else
{{ $item }} {{ $item }}
@if ($key == 'luas_bangunan' || $key == 'luas_tanah') @if ($key == 'luas_bangunan' || $key == 'luas_tanah')
<sup>m2</sup> <span>m²</span>
@endif @endif
@endif @endif
</td> </td>

View File

@@ -18,7 +18,7 @@
@endphp @endphp
<td style="width: 25%; padding: 2px; vertical-align: top;">Luas Unit</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Luas Unit</td>
<td style="width: 1%; padding: 2px; vertical-align: top;">:</td> <td style="width: 1%; padding: 2px; vertical-align: top;">:</td>
<td style="width: 74%; padding: 2px; vertical-align: top;">{{ $luas ?? '' }}</td> <td style="width: 74%; padding: 2px; vertical-align: top;">{{ $luas ?? '' }} <span></span></td>
</tr> </tr>
<tr> <tr>
<td style="width: 25%; padding: 2px; vertical-align: top;">Bentuk Unit</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Bentuk Unit</td>

View File

@@ -22,7 +22,7 @@
: '-'); : '-');
@endphp @endphp
{{ $output }} <sup>m2</sup> {{ $output }} <span>m²</span>
</td> </td>
</tr> </tr>

View File

@@ -16,7 +16,7 @@
@endphp @endphp
<td style="width: 25%; padding: 2px; vertical-align: top;">Luas Tanah</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Luas Tanah</td>
<td style=" width:1%; padding: 2px; vertical-align: top;">:</td> <td style=" width:1%; padding: 2px; vertical-align: top;">:</td>
<td style="width: 74%; padding: 2px; vertical-align: top;">{{ $luas ?? '' }} <sup>m2</sup></td> <td style="width: 74%; padding: 2px; vertical-align: top;">{{ $luas ?? '' }} <span>m²</span></td>
</tr> </tr>
<tr> <tr>
@php @php

View File

@@ -270,7 +270,7 @@
@endphp @endphp
<td style="padding: 2px; vertical-align: top;">Luas Tanah</td> <td style="padding: 2px; vertical-align: top;">Luas Tanah</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $luas ?? '' }} <sup>m2</sup></td> <td style="padding: 2px; vertical-align: top;">{{ $luas ?? '' }} <span>m²</span></td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Bentuk Tanah</td> <td style="padding: 2px; vertical-align: top;">Bentuk Tanah</td>
@@ -373,7 +373,7 @@
: '-'); : '-');
@endphp @endphp
{{ $output }} <sup>m2</sup> {{ $output }} <span>m²</span>
</td> </td>
</tr> </tr>

View File

@@ -162,7 +162,7 @@
href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}"> href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}">
Lihat Laporan Lihat Laporan
</a> </a>
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $permohonan->approval_so == null) @if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $permohonan->approval_so == 0)
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary"> <button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
Otorisator {{ $header ?? '' }} Otorisator {{ $header ?? '' }}
@@ -171,7 +171,7 @@
@if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) &&
$permohonan->approval_so && $permohonan->approval_so &&
$permohonan->approval_eo == null && $permohonan->approval_eo == 0 &&
in_array($permohonan->nilai_plafond_id, [1, 2])) in_array($permohonan->nilai_plafond_id, [1, 2]))
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary"> <button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
@@ -181,7 +181,7 @@
@if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) && @if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) &&
$permohonan->approval_eo && $permohonan->approval_eo &&
$permohonan->approval_dd == null && $permohonan->approval_dd == 0 &&
in_array($permohonan->nilai_plafond_id, [1, 2, 4])) in_array($permohonan->nilai_plafond_id, [1, 2, 4]))
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary"> <button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
@@ -216,7 +216,7 @@
</button> </button>
@endif @endif
@if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) && $authorization->approve_so && $authorization->approve_eo == null) @if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) && $authorization->approve_so && $authorization->approve_eo == null && in_array($permohonan->nilai_plafond_id, [1, 2]))
<button onclick="otorisatorData({{ $authorization->id }},'EO')" type="button" <button onclick="otorisatorData({{ $authorization->id }},'EO')" type="button"
class="btn btn-primary"> class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
@@ -224,7 +224,7 @@
</button> </button>
@endif @endif
@if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) && $authorization->approve_eo && $authorization->approve_dd == null) @if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) && $authorization->approve_eo && $authorization->approve_dd == null && in_array($permohonan->nilai_plafond_id, [1, 4]))
<button onclick="otorisatorData({{ $authorization->id }},'DD')" type="button" <button onclick="otorisatorData({{ $authorization->id }},'DD')" type="button"
class="btn btn-primary"> class="btn btn-primary">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>

View File

@@ -94,7 +94,7 @@
<div class="flex flex-wrap gap-4"> <div class="flex flex-wrap gap-4">
<div class="flex w-full items-center justify-center gap-4"> <div class="flex w-full items-center justify-center gap-4">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Total Luas</span> <span class="form-label"> Luas</span>
</label> </label>
<input type="text" name="luas_denah[]" <input type="text" name="luas_denah[]"
class="input w-full number-format" class="input w-full number-format"
@@ -151,7 +151,7 @@
<div class="flex flex-wrap gap-4"> <div class="flex flex-wrap gap-4">
<div class="flex w-full items-center justify-center gap-4"> <div class="flex w-full items-center justify-center gap-4">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Total Luas</span> <span class="form-label"> Luas</span>
</label> </label>
<input type="text" name="luas_denah[]" class="input w-full number-format" <input type="text" name="luas_denah[]" class="input w-full number-format"
onkeyup="formatNumber(this)"> onkeyup="formatNumber(this)">
@@ -164,6 +164,17 @@
</div> </div>
<div class="w-full p-4">
<div class="flex flex-wrap gap-4">
<div class="flex w-full items-center justify-center gap-4">
<label class="form-label max-w-56">
<span class="form-label">Total Luas</span>
</label>
<input type="text" name="total_luas" id="totalLuas" class="input w-full number-format" readonly>
</div>
</div>
</div>
<div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px"> <div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px">
<button type="button" class="btn btn-success" id="saveButton" onclick="submitDenah()"> <button type="button" class="btn btn-success" id="saveButton" onclick="submitDenah()">
<span id="saveButtonText">Save</span> <span id="saveButtonText">Save</span>
@@ -229,6 +240,32 @@
}); });
}); });
function calculateTotalLuas() {
let totalLuas = 0;
const luasInputs = document.querySelectorAll('input[name="luas_denah[]"]');
luasInputs.forEach(input => {
const value = parseFloat(input.value.replace(/[^0-9.]/g, ''));
if (!isNaN(value)) {
totalLuas += value;
}
});
const totalLuasInput = document.getElementById('totalLuas');
totalLuasInput.value = totalLuas ? `${totalLuas.toLocaleString()} m²` : '';
}
// Tambahkan event listener untuk setiap input luas_denah[]
document.addEventListener('input', function (e) {
if (e.target && e.target.name === 'luas_denah[]') {
calculateTotalLuas();
}
});
// Jalankan hitung ulang saat halaman dimuat (jika ada nilai default)
document.addEventListener('DOMContentLoaded', calculateTotalLuas);
function createDenahElement(index) { function createDenahElement(index) {
const denahItem = document.createElement('div'); const denahItem = document.createElement('div');
denahItem.className = 'denah-item grid gap-5 mb-5 border p-4 rounded'; denahItem.className = 'denah-item grid gap-5 mb-5 border p-4 rounded';
@@ -267,7 +304,7 @@
<div class="flex flex-wrap gap-4"> <div class="flex flex-wrap gap-4">
<div class="flex w-full items-center justify-center gap-4"> <div class="flex w-full items-center justify-center gap-4">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
<span class="form-label">Total Luas</span> <span class="form-label"> Luas</span>
</label> </label>
<input type="text" name="luas_denah[]" <input type="text" name="luas_denah[]"
class="input w-full number-format" class="input w-full number-format"

View File

@@ -21,12 +21,12 @@
class="btn btn-xs btn-info"> class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>
@elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor']) && Route::currentRouteName('penilai.show')) @elseif (Auth::user()->hasAnyRole(['administrator', 'surveyor', 'penilai']))
@if (Request::is('surveyor/inspeksi/*/create') && request()->has('dokument') && request()->has('jenis_jaminan')) @if (Request::is('surveyor/inspeksi/*/create') && request()->has('dokument') && request()->has('jenis_jaminan'))
<a href="{{ route('surveyor.show', $permohonan->id) }}" class="btn btn-xs btn-info"> <a href="{{ route('surveyor.show', $permohonan->id) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>
@else @elseif (Request::is('penilai/*/*'))
<a href="{{ route('penilai.show', $permohonan->id) }}" class="btn btn-xs btn-info"> <a href="{{ route('penilai.show', $permohonan->id) }}" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back <i class="ki-filled ki-exit-left"></i> Back
</a> </a>