Files
lpj/resources/views/memo/show.blade.php
Daeng Deni Mardaeni 5c3a93c49b feat(lpj): implementasi fitur Memo Penyelesaian dengan controller, view, dan routing lengkap
Perubahan yang dilakukan:

**Controller MemoController:**
- Menambahkan MemoController untuk mengelola memo penyelesaian permohonan.
- Method index() untuk menampilkan daftar permohonan yang bisa dipilih.
- Method create() untuk form pembuatan memo dengan pemilihan data bulk.
- Method store() untuk menyimpan memo dan mengupdate status permohonan terkait.
- Method show() untuk menampilkan detail memo yang telah dibuat.
- Method dataForDatatables() untuk API datatables dengan filter, search, dan pagination.
- Implementasi DB transaction untuk menjaga integritas data.
- Logging dan error handling komprehensif di setiap method.

**View Template:**
- index.blade.php: Tabel data permohonan dengan fitur checkbox selection (bulk).
- create.blade.php: Form pembuatan memo dari data yang dipilih.
- show.blade.php: Halaman detail memo penyelesaian.
- Menggunakan Bootstrap untuk styling dan interaksi dinamis dengan JavaScript.
- Validasi client-side untuk memastikan data sesuai sebelum dikirim.

**Routing dan Navigasi:**
- Menambahkan route resource untuk operasi CRUD Memo.
- Menambahkan route khusus untuk datatables API dan bulk create.
- Integrasi menu "Memo Penyelesaian" di navigasi utama aplikasi.
- Role-based access control untuk keamanan akses fitur.

**Integrasi Data:**
- Menggunakan model Permohonan sebagai sumber data utama dengan eager loading.
- Relasi dengan tabel user, debitur, branch, dan tujuan penilaian.
- Menambahkan status management untuk mempermudah tracking progress permohonan.

**Keamanan dan Validasi:**
- Validasi input baik di sisi controller maupun client-side.
- CSRF protection dan XSS prevention untuk menjaga keamanan aplikasi.
- Permission checking sesuai level user.

**Performance dan UX:**
- Pagination dan query optimization untuk performa lebih baik.
- Caching strategi untuk data yang sering diakses.
- Interface yang intuitif, dengan loading state dan feedback message.
- Responsive design untuk desktop dan mobile.
- Shortcut keyboard untuk efisiensi power user.

**Teknis dan Testing:**
- Struktur kode mengikuti Laravel best practice dan design pattern.
- Siap untuk unit test dan integration test.
- Logging lengkap untuk monitoring dan debugging.
- Error scenario handling dan fallback yang robust.

Tujuan perubahan:
- Menyediakan fitur pengelolaan memo penyelesaian permohonan secara bulk dengan user experience yang optimal dan performa efisien.
2025-07-15 10:05:22 +07:00

306 lines
14 KiB
PHP

@extends('layouts.main')
@section('content')
<div class="grid gap-5 mx-auto w-full lg:gap-7.5">
<!-- Header -->
<div class="card">
<div class="card-header">
<h3 class="card-title">
Detail Memo Penyelesaian
</h3>
<div class="flex items-center gap-2">
<a href="{{ route('memo.index') }}" class="btn btn-sm btn-light">
<i class="ki-filled ki-black-left"></i>
Kembali
</a>
<button onclick="window.print()" class="btn btn-sm btn-primary">
<i class="ki-filled ki-printer"></i>
Cetak
</button>
</div>
</div>
</div>
<!-- Detail Memo -->
<div class="card">
<div class="card-header bg-gray-50">
<h4 class="card-title text-lg">
Informasi Memo Penyelesaian
</h4>
</div>
<div class="card-body">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
<div class="space-y-4">
<div>
<label class="text-sm font-medium text-gray-600">Judul Memo:</label>
<p class="text-gray-900 font-semibold mt-1">
{{ $permohonan->memo_penyelesaian_title ?? 'Belum ada memo' }}
</p>
</div>
<div>
<label class="text-sm font-medium text-gray-600">Tanggal Memo:</label>
<p class="text-gray-900 mt-1">
@if($permohonan->memo_penyelesaian_date)
{{ \Carbon\Carbon::parse($permohonan->memo_penyelesaian_date)->format('d F Y') }}
@else
-
@endif
</p>
</div>
</div>
<div class="space-y-4">
<div>
<label class="text-sm font-medium text-gray-600">Status:</label>
<p class="mt-1">
@if($permohonan->status === 'memo-penyelesaian')
<span class="badge badge-success uppercase">{{ $permohonan->status }}</span>
@else
<span class="badge badge-warning uppercase">{{ $permohonan->status }}</span>
@endif
</p>
</div>
<div>
<label class="text-sm font-medium text-gray-600">Dibuat Pada:</label>
<p class="text-gray-900 mt-1">
@if($permohonan->memo_penyelesaian_created_at)
{{ \Carbon\Carbon::parse($permohonan->memo_penyelesaian_created_at)->format('d F Y H:i') }}
@else
-
@endif
</p>
</div>
</div>
</div>
@if($permohonan->memo_penyelesaian_content)
<div class="mb-8">
<label class="text-sm font-medium text-gray-600 mb-3 block">Isi Memo:</label>
<div class="p-4 bg-gray-50 rounded-lg border">
<div class="prose max-w-none">
{!! nl2br(e($permohonan->memo_penyelesaian_content)) !!}
</div>
</div>
</div>
@endif
</div>
</div>
<!-- Detail Permohonan -->
<div class="card">
<div class="card-header bg-blue-50">
<h4 class="card-title text-lg">
Detail Permohonan
</h4>
</div>
<div class="card-body">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<div class="space-y-4">
<div>
<label class="text-sm font-medium text-gray-600">Nomor Registrasi:</label>
<p class="text-gray-900 font-semibold mt-1">{{ $permohonan->nomor_registrasi }}</p>
</div>
<div>
<label class="text-sm font-medium text-gray-600">Debitur:</label>
<p class="text-gray-900 mt-1">{{ $permohonan->debiture->name ?? '-' }}</p>
</div>
<div>
<label class="text-sm font-medium text-gray-600">Cabang/Direktorat:</label>
<p class="text-gray-900 mt-1">{{ $permohonan->branch->name ?? '-' }}</p>
</div>
<div>
<label class="text-sm font-medium text-gray-600">Account Officer:</label>
<p class="text-gray-900 mt-1">{{ $permohonan->user->name ?? '-' }}</p>
</div>
</div>
<div class="space-y-4">
<div>
<label class="text-sm font-medium text-gray-600">Tujuan Penilaian:</label>
<p class="mt-1">
@if($permohonan->tujuanPenilaian)
<span class="badge badge-primary">{{ $permohonan->tujuanPenilaian->name }}</span>
@else
-
@endif
</p>
</div>
<div>
<label class="text-sm font-medium text-gray-600">Fasilitas Kredit:</label>
<p class="text-gray-900 mt-1">{{ $permohonan->jenisFasilitasKredit->name ?? '-' }}</p>
</div>
<div>
<label class="text-sm font-medium text-gray-600">Tanggal Permohonan:</label>
<p class="text-gray-900 mt-1">
@if($permohonan->tanggal_permohonan)
{{ \Carbon\Carbon::parse($permohonan->tanggal_permohonan)->format('d F Y') }}
@else
-
@endif
</p>
</div>
@if($permohonan->nilai_liquidasi)
<div>
<label class="text-sm font-medium text-gray-600">Nilai Liquidasi:</label>
<p class="text-gray-900 font-semibold mt-1">
Rp {{ number_format($permohonan->nilai_liquidasi, 0, ',', '.') }}
</p>
</div>
@endif
</div>
</div>
</div>
</div>
<!-- Informasi Penilaian -->
@if($permohonan->penilaian)
<div class="card">
<div class="card-header bg-green-50">
<h4 class="card-title text-lg">
Informasi Penilaian
</h4>
</div>
<div class="card-body">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<div class="space-y-4">
@if($permohonan->penilaian->waktu_penilaian)
<div>
<label class="text-sm font-medium text-gray-600">Waktu Penilaian:</label>
<p class="text-gray-900 mt-1">
{{ \Carbon\Carbon::parse($permohonan->penilaian->waktu_penilaian)->format('d F Y H:i') }}
</p>
</div>
@endif
@if($permohonan->penilai)
<div>
<label class="text-sm font-medium text-gray-600">Tipe Penilai:</label>
<p class="mt-1">
<span class="badge badge-info uppercase">{{ $permohonan->penilai->type_penilai ?? '-' }}</span>
</p>
</div>
@endif
</div>
<div class="space-y-4">
@if($permohonan->penilaian->created_at)
<div>
<label class="text-sm font-medium text-gray-600">Dibuat Pada:</label>
<p class="text-gray-900 mt-1">
{{ \Carbon\Carbon::parse($permohonan->penilaian->created_at)->format('d F Y H:i') }}
</p>
</div>
@endif
</div>
</div>
</div>
</div>
@endif
<!-- Informasi Approval -->
<div class="card">
<div class="card-header bg-yellow-50">
<h4 class="card-title text-lg">
Status Approval
</h4>
</div>
<div class="card-body">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<div class="text-center p-4 border rounded-lg">
<div class="mb-2">
@if($permohonan->approval_so_at)
<i class="ki-filled ki-check-circle text-3xl text-green-500"></i>
@else
<i class="ki-filled ki-time text-3xl text-gray-400"></i>
@endif
</div>
<h5 class="font-semibold text-gray-900">Senior Officer</h5>
<p class="text-sm text-gray-600 mt-1">
@if($permohonan->approval_so_at)
Disetujui pada<br>
{{ \Carbon\Carbon::parse($permohonan->approval_so_at)->format('d F Y H:i') }}
@else
Menunggu Persetujuan
@endif
</p>
</div>
<div class="text-center p-4 border rounded-lg">
<div class="mb-2">
@if($permohonan->approval_eo_at)
<i class="ki-filled ki-check-circle text-3xl text-green-500"></i>
@else
<i class="ki-filled ki-time text-3xl text-gray-400"></i>
@endif
</div>
<h5 class="font-semibold text-gray-900">Executive Officer</h5>
<p class="text-sm text-gray-600 mt-1">
@if($permohonan->approval_eo_at)
Disetujui pada<br>
{{ \Carbon\Carbon::parse($permohonan->approval_eo_at)->format('d F Y H:i') }}
@else
Menunggu Persetujuan
@endif
</p>
</div>
<div class="text-center p-4 border rounded-lg">
<div class="mb-2">
@if($permohonan->approval_dd_at)
<i class="ki-filled ki-check-circle text-3xl text-green-500"></i>
@else
<i class="ki-filled ki-time text-3xl text-gray-400"></i>
@endif
</div>
<h5 class="font-semibold text-gray-900">Deputy Director</h5>
<p class="text-sm text-gray-600 mt-1">
@if($permohonan->approval_dd_at)
Disetujui pada<br>
{{ \Carbon\Carbon::parse($permohonan->approval_dd_at)->format('d F Y H:i') }}
@else
Menunggu Persetujuan
@endif
</p>
</div>
</div>
</div>
</div>
</div>
@endsection
@push('styles')
<style>
@media print {
.btn, .card-header .flex {
display: none !important;
}
.card {
box-shadow: none !important;
border: 1px solid #e5e7eb !important;
margin-bottom: 1rem !important;
}
body {
font-size: 12px !important;
}
.card-title {
font-size: 16px !important;
font-weight: bold !important;
}
}
</style>
@endpush