Files
lpj/resources/views/memo/preview.blade.php
Daeng Deni Mardaeni cf0059fe66 feat(memo): implementasi jenis penilaian dinamis dan perbaikan checkbox pada memo penyelesaian
Perubahan yang dilakukan:
- Menghapus validasi input pada method `preview()` untuk mendukung fleksibilitas data preview
- Mengganti eager loading dari `tujuanPenilaian` menjadi `jenisPenilaian` agar sesuai dengan kebutuhan data dinamis
- Menambahkan method chaining `->get()` pada akhir query untuk memastikan eksekusi query yang benar
- Menambahkan field `jenisPenilaian` ke dalam memoData agar template dapat menampilkan instruksi pembayaran secara dinamis
- Mengimplementasikan checkbox visual yang disabled dengan hidden input untuk tetap mengirim data saat form submit
- Memisahkan antara checkbox untuk tampilan (disabled) dan input data (hidden) untuk meningkatkan UX
- Mengubah lebar label dari 80px menjadi 200px pada template PDF dan preview untuk layout yang lebih baik
- Mengganti informasi jaminan menjadi statis "Tanah & Bangunan" pada template PDF dan preview
- Menambahkan conditional rendering untuk menampilkan instruksi pembayaran sesuai dengan jenis penilaian (Internal/KJPP)
- Menyesuaikan layout dan formatting pada template PDF dan preview agar lebih konsisten secara visual
- Menambahkan logika text dinamis untuk jenis penilaian pada bagian instruksi pembayaran
- Mengoptimalkan struktur query agar lebih efisien dan menghindari duplikasi

Tujuan perubahan:
- Mendukung proses memo penyelesaian dengan jenis penilaian yang lebih fleksibel (Internal/KJPP)
- Meningkatkan pengalaman pengguna dengan tampilan checkbox yang jelas namun tetap menyimpan data dengan aman
- Menyederhanakan layout dan formatting agar lebih profesional dan konsisten di preview maupun PDF
- Memastikan proses generate memo berjalan sesuai kebutuhan bisnis dengan instruksi pembayaran yang tepat
2025-07-17 16:05:56 +07:00

374 lines
19 KiB
PHP

@extends('layouts.main')
@section('breadcrumbs')
{{ Breadcrumbs::render('memo.create') }}
@endsection
@section('content')
<div class="w-full">
<!-- Preview Memo Penyelesaian -->
<div class="bg-white">
<!-- Header Controls - Hidden saat print -->
<div class="p-4 border-b bg-agi-50 no-print">
<div class="flex justify-between items-center mx-auto">
<h3 class="text-lg font-semibold text-gray-800">
Preview Memo Penyelesaian
</h3>
<div class="flex gap-2">
<button onclick="history.back()" class="btn btn-sm btn-light">
<i class="ki-filled ki-black-left"></i>
Kembali Edit
</button>
<button type="button" onclick="window.print()" class="btn btn-sm btn-secondary">
<i class="ki-filled ki-printer"></i>
Print Preview
</button>
</div>
</div>
</div>
@if (session('error'))
<div class="m-4 no-print alert alert-danger">
{{ session('error') }}
</div>
@endif
<!-- Halaman 1: Memo Utama -->
<div class="p-5 w-full bg-white page-memo">
<!-- Header Bank -->
<div class="flex items-center mb-3">
<img class="default-logo min-h-[22px] max-w-none" style="height: 53.55px;"
src="assets/media/images/logo-arthagraha.png" />
</div>
<!-- Judul Memo -->
<div class="mb-8 text-left">
<h4 class="text-base font-semibold" style="margin: 0;"><strong>Memo Instruksi Penyelesaian</strong>
Rekening Escrow / <strong>KSL Penilai Jaminan</strong></h4>
</div>
<!-- Informasi Memo -->
<div class="mb-8">
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="width: 80px; padding: 2px 0; vertical-align: top;">Kepada</td>
<td style="width: 10px; padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">SUBDIT E-Channel Support & Operation (NOC)</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Dari</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">SUBDIT Appraisal</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Nomor</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;"><strong>{{ $memoData['memo_number'] }}</strong>
</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Tanggal</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">
{{ dateFormat($memoData['memo_date']) }}</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Perihal</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">Penyelesaian Rekening Escrow / <strong>KSL
Penilai Jaminan (PJ)</strong></td>
</tr>
</table>
</div>
<hr style="border: none; border-top: 1px solid #000; margin: 20px 0;">
<!-- Isi Memo -->
<div class="mb-8">
<p style="margin-bottom: 16px; text-align: justify;">Sehubungan dengan telah dilakukannya penilaian
jaminan dengan keterangan sbb :</p>
<table style="width: 100%; border-collapse: collapse; margin-bottom: 16px;">
<tr>
<td style="width: 200px; padding: 2px 0; vertical-align: top;">Nama Debitur</td>
<td style="width: 10px; padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">Terlampir ({{ $memoData['debitur_count'] }}
Debitur)</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Jaminan</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">Tanah & Bangunan</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Total Biaya PJ</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;"><strong>Rp
{{ number_format($memoData['total_biaya_pj'], 0, ',', '.') }},-</strong></td>
</tr>
<tr>
<td></td>
<td></td>
<td style="padding: 2px 0; vertical-align: top; font-size: 11pt;">
({{ terbilang($memoData['total_biaya_pj']) }} Rupiah)</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Pembayaran Tanggal</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">
{{ \Carbon\Carbon::parse($memoData['payment_date'])->format('d F Y') }}</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">LPJ selesai dikirim</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">-</td>
</tr>
<tr>
<td style="padding: 2px 0; vertical-align: top;">Jenis Penilaian</td>
<td style="padding: 2px 0; vertical-align: top;">:</td>
<td style="padding: 2px 0; vertical-align: top;">
<strong>
@if ($memoData['jenisPenilaian'] == 2)
KJPP
@else
Internal
@endif
</strong>
</td>
</tr>
</table>
<p style="margin-bottom: 16px; text-align: justify;">
Kami menginstruksikan kepada Sentra Operasi untuk menyelesaikan Rekening Escrow /
<strong>KSL Penilai Jaminan</strong> atas nama debitur tersebut diatas ke
@if ($memoData['jenisPenilaian'] == 2)
<strong>KJPP (terlampir)</strong>.
@else
<strong>PDPT-Lainnya Penilaian Jaminan KPNO (IDR 57557)</strong>.
@endif
</p>
<p style="margin-bottom: 16px; text-align: justify;">Demikian kami sampaikan, atas perhatian dan
kerjasamanya kami ucapkan terima kasih.</p>
</div>
<!-- Tanda Tangan -->
<div style="display: flex; justify-content: space-between; margin-top: 60px;">
<div style="text-align: center; width: 30%;">
<p style="margin-bottom: 80px;">Salam</p>
<div style="border-bottom: 1px solid #000; margin: 0 auto 8px; width: 120px;"></div>
<p style="font-weight: 500; margin: 0;">Innawati Sulina</p>
<p style="font-size: 11pt; margin: 0;">DD Operation 2</p>
</div>
<div style="text-align: center; width: 30%;">
<p style="margin-bottom: 80px;">&nbsp;</p>
<div style="border-bottom: 1px solid #000; margin: 0 auto 8px; width: 120px;"></div>
<p style="font-weight: 500; margin: 0;">Wahab N. Wibawa</p>
<p style="font-size: 11pt; margin: 0;">Pgs EO Subdit Appraisal</p>
</div>
<div style="text-align: center; width: 30%;">
<p style="margin-bottom: 80px;">&nbsp;</p>
<div style="border-bottom: 1px solid #000; margin: 0 auto 8px; width: 120px;"></div>
<p style="font-weight: 500; margin: 0;">Sumurung P. Siahaan</p>
<p style="font-size: 11pt; margin: 0;">&nbsp;</p>
</div>
</div>
<!-- Lampiran -->
<div style="margin-top: 40px;">
<p style="font-weight: 500; margin-bottom: 8px;">Lampiran :</p>
<ul style="margin: 0; padding-left: 20px; font-size: 11pt;">
<li style="margin-bottom: 4px;">Rekap permohonan penyelesaian biaya KJPP (Eksternal)</li>
<li style="margin-bottom: 4px;">Asli Invoice & Faktur Pajak KJPP (Eksternal)</li>
<li style="margin-bottom: 4px;">Copy Tiket Debet (KSL)</li>
</ul>
</div>
</div>
<!-- Halaman 2: Lampiran Daftar Permohonan -->
<div class="p-5 w-full bg-white page-lampiran">
<div style="text-align: center; margin-bottom: 30px;">
<h3 style="font-weight: bold; margin: 0; font-size: 14pt;">LAMPIRAN</h3>
<h4 style="font-weight: bold; margin: 8px 0 0 0; font-size: 13pt;">REKAP PERMOHONAN PENYELESAIAN BIAYA
KJPP</h4>
<p style="margin: 8px 0 0 0; font-size: 11pt;">Memo No: {{ $memoData['memo_number'] }}</p>
</div>
<div style="overflow-x: auto;">
<table style="width: 100%; border-collapse: collapse; font-size: 10pt;">
<thead>
<tr style="background-color: #f8f9fa;">
<th style="border: 1px solid #000; padding: 8px; text-align: center; font-weight: bold;">No
</th>
<th style="border: 1px solid #000; padding: 8px; text-align: left; font-weight: bold;">Nomor
Registrasi</th>
<th style="border: 1px solid #000; padding: 8px; text-align: left; font-weight: bold;">
Debitur</th>
<th style="border: 1px solid #000; padding: 8px; text-align: left; font-weight: bold;">
Cabang</th>
<th style="border: 1px solid #000; padding: 8px; text-align: left; font-weight: bold;">AO
</th>
<th style="border: 1px solid #000; padding: 8px; text-align: left; font-weight: bold;">
Tujuan Penilaian</th>
<th style="border: 1px solid #000; padding: 8px; text-align: right; font-weight: bold;">
Biaya PJ</th>
</tr>
</thead>
<tbody>
@foreach ($permohonanList as $index => $permohonan)
<tr>
<td style="border: 1px solid #000; padding: 6px; text-align: center;">
{{ $index + 1 }}</td>
<td style="border: 1px solid #000; padding: 6px; font-weight: 500;">
{{ $permohonan->nomor_registrasi }}</td>
<td style="border: 1px solid #000; padding: 6px;">
{{ $permohonan->debiture->name ?? '-' }}</td>
<td style="border: 1px solid #000; padding: 6px;">
{{ $permohonan->branch->name ?? '-' }}</td>
<td style="border: 1px solid #000; padding: 6px;">{{ $permohonan->user->name ?? '-' }}
</td>
<td style="border: 1px solid #000; padding: 6px;">
@if ($permohonan->tujuanPenilaian)
{{ $permohonan->tujuanPenilaian->name }}
@else
-
@endif
</td>
<td style="border: 1px solid #000; padding: 6px; text-align: right; font-weight: 500;">
Rp {{ number_format($permohonan->noc->nominal_bayar ?? 0, 0, ',', '.') }}
</td>
</tr>
@endforeach
</tbody>
<tfoot>
<tr style="background-color: #f8f9fa; font-weight: bold;">
<td colspan="6"
style="border: 1px solid #000; padding: 8px; text-align: right; font-weight: bold;">
Total Biaya PJ:</td>
<td style="border: 1px solid #000; padding: 8px; text-align: right; font-weight: bold;">Rp
{{ number_format($totalBiayaPJ, 0, ',', '.') }}</td>
</tr>
</tfoot>
</table>
</div>
</div>
<!-- Form untuk Generate PDF - Hidden saat print -->
<div class="p-4 bg-gray-50 border-t no-print">
<form action="{{ route('memo.generate-pdf') }}" method="POST" id="generate-form" class="mx-auto">
@csrf
@foreach ($permohonanList as $permohonan)
<input type="hidden" name="permohonan_ids[]" value="{{ $permohonan->id }}">
@endforeach
<input type="hidden" name="memo_number" value="{{ $memoData['memo_number'] }}">
<input type="hidden" name="memo_date" value="{{ $memoData['memo_date'] }}">
<input type="hidden" name="payment_date" value="{{ $memoData['payment_date'] }}">
<div class="flex gap-2 justify-end">
<button type="submit" class="btn btn-primary" id="generate-btn">
<i class="ki-filled ki-file-down"></i>
Generate PDF & Simpan
</button>
</div>
</form>
</div>
</div>
</div>
@endsection
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
const generateForm = document.getElementById('generate-form');
const generateBtn = document.getElementById('generate-btn');
/**
* Event listener untuk form generate PDF
*/
if (generateForm) {
generateForm.addEventListener('submit', function(e) {
// Konfirmasi sebelum generate
const confirmed = confirm(
'Apakah Anda yakin ingin generate PDF dan menyimpan memo penyelesaian ini?'
);
if (!confirmed) {
e.preventDefault();
return false;
}
// Disable submit button untuk mencegah double submit
if (generateBtn) {
generateBtn.disabled = true;
generateBtn.innerHTML = '<i class="ki-filled ki-loading"></i> Memproses...';
}
});
}
});
</script>
@endpush
@push('styles')
<style>
/* Print Styles */
@media print {
* {
-webkit-print-color-adjust: exact !important;
color-adjust: exact !important;
}
body {
margin: 0 !important;
padding: 0 !important;
background: white !important;
}
.no-print {
display: none !important;
}
.page-memo,
.page-lampiran {
width: 210mm !important;
min-height: 297mm !important;
margin: 0 !important;
padding: 20mm !important;
page-break-after: always;
box-shadow: none !important;
}
.page-lampiran {
page-break-before: always !important;
}
/* Ensure table borders print correctly */
table,
th,
td {
border-collapse: collapse !important;
}
th,
td {
border: 1px solid #000 !important;
}
/* Ensure background colors print */
.bg-gray-50,
tr[style*="background-color: #f8f9fa"] {
background-color: #f8f9fa !important;
}
}
/* Screen Styles */
@media screen {
.page-memo,
.page-lampiran {
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
margin-bottom: 20px;
}
}
</style>
@endpush