Compare commits

..

34 Commits

Author SHA1 Message Date
Daeng Deni Mardaeni
45cebcf325 🔧(services): Selaraskan fallback path foto pada PreviewLaporanService dan tambah logging
- Menyelaraskan resolusi path file foto di PreviewLaporanService dengan logika fallback seperti pada komponen foto:
  - Menggunakan `originalPath = $path['path']` sebagai path utama
  - Jika `statusLpj == 1` dan file asli tidak ditemukan, maka:
    - Ekstrak dua bagian terakhir dari path (contoh: `251051/251051_2_2.png`)
    - Bangun `fallbackPath` dengan pola `surveyor/001/{lastTwoParts}`
  - Tentukan `pathToUse`:
    - Apabila `fallbackPath` ada dan file fallback ditemukan, gunakan `fallbackPath`
    - Jika tidak, tetap gunakan `originalPath`
  - Resolusi final: `storage_path('app/public/' . $pathToUse)`

- Menambahkan logging untuk setiap operasi penting dan setiap titik pengembalian:
  - `Log::warning` saat path kosong terdeteksi dalam daftar paths
  - `Log::info` saat fallback kandidat dibangun dari `originalPath`
  - `Log::warning` saat file tidak ditemukan pada original maupun fallback (dengan menyertakan ketiganya: original, fallback, resolved)
  - `Log::info` saat file berhasil ditambahkan ke daftar unduhan
  - `Log::warning` saat tidak ada file valid setelah resolusi path
  - `Log::info` saat mengunduh single file
  - `Log::info` saat zip file berhasil dibuat (dengan jumlah file)
  - `Log::error` saat zip file gagal dibuat

- Memindahkan logika resolusi path di dalam loop pengolahan `$paths` untuk setiap item:
  - Mengganti setting langsung `storage_path('app/public/' . $path['path'])` dengan resolusi path yang bisa fallback
  - Menjaga struktur kontrol dengan `continue` jika file final tetap tidak ditemukan

- Menambahkan komentar level-fungsi (docblock) pada `previewLaporan`:
  - Menjelaskan tanggung jawab fungsi dalam menghasilkan PDF atau unduhan foto
  - Menjelaskan skenario fallback path dan tujuan mengurangi gambar hilang
  - Mendokumentasikan parameter dan bentuk nilai kembali respons
2025-11-07 10:57:46 +07:00
Daeng Deni Mardaeni
a442f879b7 🔧(services): Perbaikan logika preview laporan dan format saran pada print-out
- **PreviewLaporanService.php**:
  - Menambahkan parsing JSON untuk mig_permohonan sebelum digunakan
  - Memperbaiki kondisi untuk menentukan statusLpj dengan menambahkan validasi nilai pasar < 1
  - Meningkatkan logika penentuan path foto berdasarkan status memo dan nilai total pasar wajar

- **print-out-standar.blade.php**:
  - Memindahkan header tabel 'SARAN' keluar dari loop foreach untuk mencegah duplikasi header
  - Menambahkan format list (ul/li) pada tampilan saran untuk meningkatkan readability
  - Menambahkan margin-top 20px pada section penutup laporan untuk spacing yang lebih baik
  - Memperbaiki struktur HTML dengan wrapping konten saran dalam list item
2025-10-31 10:07:02 +07:00
Daeng Deni Mardaeni
796cb89d21 🔧(penilai): Perbaikan layout dan validasi data pada komponen laporan
- **foto-jaminan.blade.php**: Memindahkan page-break ke awal chunk (kecuali chunk pertama) untuk mencegah page break yang tidak perlu di akhir
- **print-out-sederhana.blade.php**:
  - Menambahkan validasi isset() untuk mencegah error undefined index pada hub_cadeb
  - Menambahkan prefix 'Lain-lain, ' untuk hubungan debitur yang tidak sesuai
  - Menambahkan guard clause untuk mencegah error saat SARANA PELENGKAP DAN LINGKUNGAN tidak ada
  - Menambahkan guard clause untuk ANALISA TANAH DAN BANGUNAN
- **print-out-standar.blade.php**:
  - Menambahkan validasi null check untuk mig_detail_legalitas_jaminan
  - Memperbaiki indentasi dan struktur kode untuk konsistensi

Perubahan ini meningkatkan stabilitas aplikasi dengan mencegah error undefined index dan memperbaiki layout PDF yang dihasilkan dengan penempatan page break yang lebih tepat.
2025-10-30 14:00:49 +07:00
Daeng Deni Mardaeni
fb22d370b5 🔧(penilai): Perbaikan tampilan dan logika fallback foto jaminan
Implementasi berbagai perbaikan pada komponen penilai dan foto jaminan:

**Detail Lokasi (detail-lokasi.blade.php):**
- Menambahkan logika untuk menghindari duplikasi label yang sama
- Implementasi tracking currentKey untuk mencegah label berulang
- Perbaikan tampilan tabel dengan label yang lebih bersih

**Footer (footer.blade.php):**
- Perbaikan indentasi dan formatting kode
- Reorganisasi array customLabels untuk konsistensi
- Perbaikan struktur conditional untuk upload_gs

**Foto Jaminan (foto-jaminan.blade.php):**
- Implementasi sistem fallback path untuk file foto yang tidak ditemukan
- Logika fallback: surveyor/2025/APRIL/26042025/251051/251051_2_2.png → surveyor/001/251051/251051_2_2.png
- Penambahan urutan kategori foto yang diinginkan (BLAD TATA KOTA sebelum FOTO JAMINAN)
- Skip kategori DOKUMEN PENDUKUNG dari tampilan utama
- Perbaikan class ordering (border photo-item)
- Update alt attribute untuk menggunakan pathToUse
- Penambahan debug @dd untuk otherPhotos (sementara)

**Print Out Sederhana (print-out-sederhana.blade.php):**
- Perbaikan tampilan Total Nilai Pasar Wajar dengan colspan yang benar
- Restructuring tabel NPW tambahan dengan width yang tepat
- Perbaikan alignment dan formatting nilai
- Update parameter signature-approval dengan npw
- Perbaikan tampilan Total Nilai Likuidasi
- Penambahan tanda '--' pada SARANA PELENGKAP DAN LINGKUNGAN

**Print Out Standar (print-out-standar.blade.php):**
- Implementasi logika untuk menghindari duplikasi label
- Perbaikan struktur tabel dengan width 100%
- Update tracking currentLabel untuk konsistensi tampilan
2025-10-29 10:50:13 +07:00
Daeng Deni Mardaeni
478c0c8079 🔧(helpers): Tambah fungsi parseTimestamp & perbaiki parsing tanggal
- Tambah fungsi parseTimestamp di app/Helpers/Lpj.php untuk parsing timestamp yang robust
- Gunakan native PHP DateTime & fallback ke Carbon untuk multiple format
- Validasi lengkap day, month, year, hour, minute, second dengan range aman
- Support format: Y-m-d H:i:s, Y-m-d, d/m/Y H:i:s, d/m/Y, d-m-Y, j-n-Y, dll
- Tambah logging detail & trim whitespace untuk reliability tinggi
- Return selalu format Y-m-d H:i:s agar konsisten di seluruh sistem
- signature-approval.blade.php gunakan parseTimestamp() untuk mig_mst_jaminan_tgl_laporan
- Tanggal migrasi kini diparsing & diformat dengan lebih akurat
- Hasil: parsing timestamp konsisten, error handling lebih kuat, dan log lebih informatif
2025-10-28 14:02:50 +07:00
Daeng Deni Mardaeni
73d0d238c0 🔧(penilai): Perbaiki total nilai & signature approval
- Gabungkan header 'Total Nilai Pasar Wajar' dengan colspan=2
- Gunakan nilai likuidasi default 70% & data migrasi mig_mst_lpj_tot_nilai_likuidasi
- Tambah parameter laporan='sederhana' pada include signature-approval
- Perbaiki layout tabel di print-out-sederhana & print-out-standar
- Tambah parsing mig_permohonan dengan json_decode untuk data migrasi
- Sesuaikan width kolom agar tampilan lebih proporsional
- Hilangkan Carbon::createFromFormat & tambah kondisi laporan di signature-approval
- Tampilkan SENIOR OFFICER untuk laporan sederhana, EO untuk standar
2025-10-28 13:40:11 +07:00
Daeng Deni Mardaeni
d6d0ed28b9 🔧(penilai): Perbaiki logika approval & tanggal laporan
- Nonaktifkan filter dokument_id di PreviewLaporanService untuk fleksibilitas
- Tambah kondisi tampilkan DD hanya jika berbeda dengan EO
- Gunakan tanggal mig_mst_jaminan_tgl_laporan sebagai sumber utama
- Perbaiki logika nama & tanggal approval SO
- Gunakan Carbon::createFromFormat untuk parsing tanggal migrasi
- Tambah validasi kondisional agar tidak duplikasi approval
- Rapikan struktur HTML & indentasi signature-approval.blade.php
- Pastikan konsistensi data antara preview service & signature view
- Hasil: tampilan signature lebih akurat & sesuai data migrasi
2025-10-28 12:33:25 +07:00
Daeng Deni Mardaeni
ee828455a9 🗑️(penilai): Menghapus section perhitungan nilai pasar wajar otomatis
Menghapus loop perhitungan nilai pasar wajar otomatis dari labelNilai pada komponen print-out laporan untuk memberikan kontrol manual yang lebih baik.

Perubahan yang dilakukan:

1. Print-out Sederhana (print-out-sederhana.blade.php)
- Menghapus foreach loop untuk labelNilai yang menampilkan perhitungan otomatis
- Menghapus 18 baris kode yang menghandle luas dan nilai per kategori
- Mempertahankan section npw_tambahan dengan perbaikan styling width
- Memperbaiki alignment dan width konsistensi pada tabel

2. Print-out Standar (print-out-standar.blade.php)
- Menghapus foreach loop untuk labelNilai yang sama
- Menghapus 18 baris kode perhitungan otomatis nilai pasar wajar
- Mempertahankan section npw_tambahan dengan styling yang diperbaiki
- Memperbaiki width property pada td element (menambahkan spasi)
2025-10-27 18:18:51 +07:00
Daeng Deni Mardaeni
a6481dd482 🔧(penilai): Perbaiki tampilan laporan & tambah fitur saran
- PreviewLaporanService.php:
  - Aktifkan kembali filter dokument_id untuk query Penilai
  - Tambahkan validasi dokumen ID agar data yang diambil tepat
  - Perbaiki logika pengambilan status LPJ untuk akurasi laporan

- informasi.blade.php:
  - Tambahkan section baru untuk menampilkan data saran dari form inspeksi
  - Implementasi loop untuk menampilkan banyak saran (array/string)
  - Styling tabel saran dengan border & alignment konsisten

- print-out-sederhana.blade.php:
  - Hilangkan koma awal di nilai dengan ltrim() untuk tampilan bersih
  - Konsistensi format antar section laporan

- print-out-standar.blade.php:
  - Tambah field 'Fasilitas Kredit' dan 'Alamat & Telepon Debitur'
  - Perbaiki logika total nilai pasar wajar dengan conditional formatting
  - Tambah section saran yang konsisten dengan komponen lain
  - Hapus semicolon berlebih (syntax fix)

- signature-approval.blade.php:
  - Ubah sumber tanggal dari updated_at ke tanggal_kunjungan untuk akurasi
2025-10-27 15:13:35 +07:00
Daeng Deni Mardaeni
cbf54353f4 (slik): Tambahkan halaman index SLIK untuk admin kredit
- Tambah halaman index SLIK di modul admin kredit untuk manajemen data Sistem Layanan Informasi Keuangan
- Buat tabel data dengan kolom: Sandi Bank, Tahun, No Rekening, CIF, Nama Debitur, Kolektibilitas, Fasilitas, Nilai Agunan, dan Status
- Implementasi pencarian keyword serta filter tahun, bulan, dan status agunan
- Tambahkan tombol aksi 'Detail' untuk melihat data lengkap
- Tambahkan fitur import dari Excel (.xlsx/.xls/.csv) dengan validasi format & file size ≤ 10MB
- Tambahkan fitur export Excel berdasarkan filter aktif
- Tambahkan tombol download template Excel untuk panduan format import
- Implementasi fungsi truncate/hapus semua data SLIK dengan modal konfirmasi
- Tambahkan validasi kombinasi unik (sandi bank, tahun, bulan, no rekening) untuk update data otomatis
- Gunakan KTDataTable dengan server-side processing, layout responsif, dan scroll horizontal
- Tambahkan modal import & modal konfirmasi hapus
- Tambahkan breadcrumbs, event listener untuk pencarian/filter, dan CSRF protection
- Implementasi validasi keamanan file upload dan pesan error/success
2025-10-23 16:59:47 +07:00
Daeng Deni Mardaeni
a701e78982 🔧 fix(LPJ): Perbaikan logika preview laporan dan optimasi import service
Perubahan utama pada PreviewLaporanService.php:
- Mengoptimalkan urutan import dengan mengelompokkan berdasarkan namespace
- Memperbaiki logika tanggal laporan untuk data migrasi dengan fallback ke tgl_create
- Menghapus filter dokument_id pada query LPJ untuk fleksibilitas
- Menambahkan penanganan khusus untuk tipe laporan 'memo' pada data migrasi
- Menambahkan validasi file path untuk download dokumen memo
- Memperbaiki kondisi pengecekan memo untuk non-migrasi data

Perubahan pada print-out-standar.blade.php:
- Menyembunyikan baris header dokumen yang menyebabkan duplikasi tampilan
- Menambahkan fungsi ltrim untuk membersihkan koma di awal nilai data

Perubahan ini meningkatkan stabilitas dan akurasi tampilan preview laporan,\nserta memperbaiki penanganan data migrasi dan memo khusus.
2025-10-23 14:35:12 +07:00
Daeng Deni Mardaeni
6305f93f0f fix(LPJ): Perbaikan label luas unit untuk jenis aset Apartemen
Mengubah label dari 'Luas Tanah' menjadi 'Luas Unit' untuk jenis aset Apartemen:
- Menambahkan kondisi baru untuk mengecek jika jenis aset adalah "Apartemen"
- Mengubah label `$labelNilai['tanah']` menjadi 'Luas Unit' untuk apartemen
- Menambahkan 'apartemen' ke dalam array mapping label dengan nilai 'Luas Unit'
- Memperbaiki indentasi kode untuk konsistensi format
2025-10-22 11:54:28 +07:00
Daeng Deni Mardaeni
6ed4e8ba41 🐛 fix(print): Perbaiki tampilan laporan standar & pembanding migrasi" -m "
- print-out-standar.blade.php: koreksi relasi cabang ke \$permohonan->branch->name
- print-out-standar.blade.php: koreksi tujuan penilaian ke \$permohonan->tujuanPenilaian->name
- print-out-standar.blade.php: perbaiki guard dokumen dengan @if(isset(\$dokumen))
- print-out-standar.blade.php: tambah baris 'Jenis Jaminan' khusus data migrasi (is_mig)
- print-out-standar.blade.php: sembunyikan section tertentu saat is_mig untuk konsistensi
- print-out-standar.blade.php: tampilkan Faktor Positif/Negatif/Lain-lain dari forminspeksi (dukungan array/string) dengan tabel ber-border & nl2br(e())
- print-pembanding.blade.php: render keterangan pembanding pakai {!! nl2br(e(parsePembandingMigration(...))) !!} agar line break tampil
- app/Helpers/Lpj.php: update parsePembandingMigration → pecah konten dengan tanda '#' jadi baris baru, trim, hapus baris kosong
- Konsolidasi formatting (spacing, border tabel) agar output rapi untuk kasus migrasi/non-migrasi
2025-10-21 17:24:20 +07:00
Daeng Deni Mardaeni
6b0022deed 🐛 fix(print): Hapus suffix angka dari key informasi dokumen" -m "
- print-out-sederhana.blade.php: gunakan preg_replace('/_([2-5])$/', '', $key) untuk hapus suffix angka di akhir key
- Pastikan key seperti 'nomor_2', 'tanggal_3', dst. tampil tanpa angka (jadi 'nomor', 'tanggal')
- Penyesuaian dilakukan hanya pada tampilan, tidak mempengaruhi nilai data
- Menangani data migrasi dengan struktur key numerik agar tampil lebih rapi
- Tampilan informasi dokumen jadi lebih bersih, konsisten, dan mudah dibaca
2025-10-20 15:47:10 +07:00
Daeng Deni Mardaeni
ae5a9ce5b7 🐛 fix(signature): Tangani SO/EO sama & perbaiki fallback tanggal migrasi" -m "
- signature-approval.blade.php: tambahkan kondisi SO==EO → render 1 kolom 'Diperiksa dan Menyetujui' (pakai jabatan EO)
- signature-approval.blade.php: bila SO≠EO → render kolom terpisah 'Diperiksa' (SO) & 'Menyetujui' (EO) seperti sebelumnya
- signature-approval.blade.php: jaga konsistensi label/jabatan & area tanda tangan agar tidak redundan
- PreviewLaporanService: ubah urutan fallback tanggal migrasi → tgl_laporan → tgl_oto → null
- PreviewLaporanService: parsing tanggal migrasi via Carbon::createFromFormat('d/m/Y H:i:s') → 'Y-m-d H:i:s'
- Akurasi tanggal laporan meningkat karena tgl_oto merefleksikan tanggal otorisasi/approval
- Tampilan blok signature lebih rapi pada kasus SO/EO sama; hilangkan duplikasi informasi
- Backward-compatible: perilaku SO≠EO & data non-migrasi tidak berubah
2025-10-20 10:47:49 +07:00
Daeng Deni Mardaeni
c8b5fcc9d1 🐛 fix(ui-print): Format nilai pasar wajar & tampilkan fakta migrasi
- Terapkan number_format(ID) (0 desimal, ',' desimal, '.' ribuan) untuk nilai pasar wajar Bagian 1
- print-out-sederhana: format nilai per kategori & nilai perbandingan (Bagian 1)
- print-out-standar: format nilai per kategori, nilai perbandingan (Bagian 1), dan nilai likuidasi
- Tambah section fakta khusus permohonan migrasi (is_mig) dengan tabel 'judul' per kategori
- Support konten fakta sebagai array/string; render dinamis & rapi
- Perbaiki logika tanggal laporan migrasi: fallback tgl_laporan → tgl_create → null
- Parsing tanggal migrasi via Carbon::createFromFormat('d/m/Y H:i:s') → 'Y-m-d H:i:s'
- Jaga konsistensi & keterbacaan angka besar (ribuan–miliaran) di semua laporan
2025-10-20 08:30:31 +07:00
Daeng Deni Mardaeni
2937add646 🐛 fix(ui-print): Format nilai pasar wajar & perbaiki hitung hari kerja migrasi
- Terapkan number_format(ID) untuk nilai pasar wajar (0 desimal, ',' desimal, '.' ribuan)
- print-out-sederhana: format nilai per kategori & nilai perbandingan agar konsisten
- print-out-standar: format nilai per kategori, nilai perbandingan, dan total nilai pasar wajar
- Ganti perhitungan manual floor/diffInDays menjadi fungsi hitungHariKerja() yang akurat
- Parsing tanggal migrasi pakai Carbon::createFromFormat('d/m/Y H:i:s', ...) sebelum dihitung
- Tata ulang tampilan informasi Dinas Tata Ruang: wrapper tabel 'judul', struktur tabel rapi, <br> untuk array
- Inisialisasi $totalNilaiPasarWajar = 0 dan akumulasi nilai kategori + perbandingan dengan fallback kalkulasi
- Pastikan konsistensi format angka di seluruh laporan & fallback bila data backend tidak tersedia
- Uji: verifikasi format ribuan/jutaan, akurasi hari kerja (migrasi/non-migrasi), dan total nilai terhitung benar
2025-10-16 10:04:40 +07:00
Daeng Deni Mardaeni
b83920d8aa 🐛(ui-print): Perbaiki struktur kondisional & penempatan elemen tabel
- Memperbaiki urutan kondisi @if/@else untuk penanganan data alamat pada print-out-sederhana.blade.php
- Memindahkan blok kode ke posisi tabel yang lebih logis dan konsisten
- Menghapus kode komentar dan duplikasi yang tidak digunakan
- Menyesuaikan penempatan baris 'Atas Nama' ke dalam kondisi yang sesuai
- Menata ulang elemen NIB agar berada dalam struktur tabel yang benar
- Memperbaiki indentasi dan format HTML untuk keterbacaan yang lebih baik
- Menjamin konsistensi tampilan print-out untuk berbagai kondisi data
- Mengurangi potensi error dari struktur kondisi yang tidak sinkron
- File diubah: resources/views/penilai/components/print-out-sederhana.blade.php
2025-10-15 08:31:08 +07:00
Daeng Deni Mardaeni
c6596cdea0 feat(ui-penilai): Tambah tampilan legalitas jaminan untuk data migrasi
Perubahan ini menambahkan fitur tampilan legalitas jaminan khusus untuk permohonan migrasi dan memperbaiki penanganan data informasi dinas tata ruang.

## Perubahan Utama:

### 1. Tampilan Legalitas Jaminan Migrasi (print-out-standar.blade.php)
- Menambahkan section khusus untuk menampilkan data legalitas jaminan dari migrasi
- Menggunakan data `mig_detail_legalitas_jaminan` yang di-decode dari JSON
- Menampilkan data dalam format tabel dengan label dan value yang terstruktur
- Menambahkan kondisi `@if ($permohonan->is_mig)` untuk hanya menampilkan pada permohonan migrasi

### 2. Penanganan Data Informasi Dinas Tata Ruang (informasi.blade.php)
- Memperbaiki penanganan data yang bisa berupa array atau string tunggal
- Menambahkan pengecekan `is_array($item)` sebelum melakukan loop
- Menambahkan fallback untuk menampilkan data langsung jika bukan array
- Memastikan tampilan tetap konsisten baik untuk data array maupun string

### 3. Kondisi Tampilan Form Kategori
- Menambahkan kondisi `@if(!$permohonan->is_mig)` untuk menyembunyikan form kategori tertentu pada permohonan migrasi
- Memastikan tampilan yang sesuai untuk jenis permohonan yang berbeda
2025-10-14 14:49:06 +07:00
Daeng Deni Mardaeni
c981237663 (ui-penilai): Konsolidasi tampilan migrasi, fallback user, dan label tanggal penilaian
- Menyesuaikan tampilan & logika untuk data permohonan hasil migrasi (is_mig)
- Tambahkan fallback user untuk SO, EO, dan DD agar nama tetap muncul meski data tidak lengkap
- Ubah label 'Tanggal Survei' menjadi 'Tanggal Penilaian' untuk konsistensi di seluruh halaman
- Perbaiki struktur & border tabel tanda tangan approval, tambahkan bold pada jabatan
- Sesuaikan kondisi tombol laporan agar hanya bergantung pada status_bayar
- Tambahkan logika decode mig_permohonan di print-out-sederhana untuk data migrasi
- Tambahkan fallback AO name dari data migrasi dan perhitungan hari kerja khusus is_mig
- Perbaiki struktur HTML, indentasi, dan formatting di semua view terkait
- File diubah: laporan/index, analisa/informasi, signature-approval, show, print-out-sederhana
2025-10-13 16:46:43 +07:00
Daeng Deni Mardaeni
291811b74a (service): Tambah migrasi tgl_laporan untuk permohonan is_mig & fallback dataPembanding
- Menambahkan logika penyesuaian tanggal laporan untuk permohonan hasil migrasi (is_mig)
- Gunakan mig_mst_jaminan_tgl_laporan jika is_mig = true, fallback ke lpj->created_at jika false
- Tambahkan inisialisasi dataPembanding = '' sebagai default untuk mencegah undefined variable
- Tambahkan variabel mig_permohonan untuk mempermudah akses data hasil migrasi
- Menambahkan logging decode mig_permohonan dan fallback tgl_laporan untuk debugging
- Menjaga konsistensi tanggal laporan antara data migrasi dan data baru
- Meningkatkan stabilitas render preview laporan untuk permohonan tanpa inspeksi
- File yang diubah: app/Services/PreviewLaporanService.php
- Kompatibel dengan Laravel 12, PHP 8.3, PostgreSQL
2025-10-13 16:43:30 +07:00
Daeng Deni Mardaeni
2d8bddff42 ♻️(refactor): Penamaan label, logging komprehensif, transaksi DB, komentar fungsi, dan idempotensi seeder
- Mengubah label 'Tanggal Survei' menjadi 'Tanggal Penilaian' di seluruh view Penilai & komponen cetak
- Menambahkan logging detail di setiap tahap proses (awal, validasi, eksekusi, return) pada controller, service, dan request
- Menerapkan transaksi database (begin, commit, rollback) di operasi tulis untuk konsistensi data (PostgreSQL)
- Menambahkan komentar fungsi (PHPDoc) di semua controller, service, dan model utama
- Menyederhanakan query dan filter laporan pada LaporanController dengan logging tambahan
- Menambahkan idempotensi pada semua seeder dengan updateOrCreate dan normalisasi delimiter CSV
- Meningkatkan robustness parsing timestamp multi-format dan logging batch proses seeding
- Menata ulang tampilan laporan, nilai plafond, dan penilai agar label dan UI konsisten
- Memastikan semua operasi penting tercatat di log dengan konteks user dan parameter penting
2025-10-10 23:48:15 +07:00
majid
be41a815f7 feat(pdf-viewer): implement pdf.js with pagination and swipe controls 2025-07-29 09:57:54 +07:00
majid
c459d1be70 Merge branch 'feature/senior-officer' into lpj-db-migratio 2025-07-21 10:17:51 +07:00
majid
142257d18d feat(laporan-user): refactor user report to display user data instead of permohonan
- Change data source from Permohonan to User model
- Simplify search functionality to only search by name and NIK
- Update table columns to show user information (NIK, name, roles)
- Remove date range filters and complex search conditions
- Add helper function getFilePath to handle storage paths
2025-07-21 10:13:47 +07:00
majid
32eab5f089 Merge branch 'staging' into feature/senior-officer 2025-07-14 09:03:18 +07:00
majid
84933206ee feat: add export functionality and simplify laporan user report
refactor: update laporan user service and views for simplified report
style: improve daftar pustaka views and remove unused code
fix: correct date field names in laporan sla penilai service
2025-07-11 21:16:01 +07:00
majid
1338085481 fix(activity): highlight table row in red when status is "freeze" 2025-07-11 21:09:51 +07:00
majid
3f57d361f9 feat: add export functionality and simplify laporan user report
refactor: update laporan user service and views for simplified report
style: improve daftar pustaka views and remove unused code
fix: correct date field names in laporan sla penilai service
2025-07-11 17:01:50 +07:00
majid
027c698a11 fix: perbaiki navigasi back di halaman laporan penilai dan tampilkan gambar/pdf pada daftar pustaka 2025-07-08 17:04:19 +07:00
majid
05f87f4767 frefactor(daftar-pustaka): replace manual file handling with Laravel Storage 2025-07-08 14:17:45 +07:00
majid
6bb13dbcaf fix(signature): perbaikkan tanda tangan otorisator 2025-07-08 13:39:54 +07:00
Daeng Deni Mardaeni
e79b8c6449 Merge remote-tracking branch 'composer/feature/senior-officer' into staging 2025-07-03 11:53:28 +07:00
Daeng Deni Mardaeni
28513100f4 refactor(noc, views): optimalkan kode, perbaiki konsistensi format, dan refactor tampilan
- **Controller (NocController)**:
  - Perbaikan nama route pada **index()** dari `noc.pembayaran` menjadi `noc.pembayaran.index`.
  - Menghapus komentar kode tak terpakai pada logika update **status permohonan** di metode penyimpanan.

- **Blade Views**:
  - Perbaikan konsistensi atribut HTML dan struktur elemen di berbagai template: `index.blade.php`, `pembayaran.blade.php`, dan `form.blade.php`.
  - Penghapusan spasi yang tidak diperlukan dan optimasi indentasi pada atribut elemen seperti `class`, `data-*`, dan lainnya.
  - Perbaikan label input dan placeholder untuk keterbacaan dan kesesuaian desain.
  - Penyelarasan nama variabel dan logika validasi berdasarkan kondisi file dan data yang ada.

- **Form NOC**:
  - Penyesuaian form handling untuk berbagai atribut seperti `status_pembayar`, `nominal_bayar`, dan `bukti_ksl`.
  - Penyesuaian aksi form untuk **update** atau **store** tergantung kondisi form.

- **Datatables**:
  - Pengoptimalan tabel untuk hierarki atribut dan nilai default seperti pagination, sorting, atau data filtering.
2025-07-03 09:46:47 +07:00
40 changed files with 2513 additions and 2149 deletions

View File

@@ -0,0 +1,232 @@
<?php
namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Branch;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class LaporanUserLimitExport implements FromCollection, WithHeadings, WithMapping, WithTitle, WithCustomStartCell, WithEvents
{
protected $request;
public function __construct($request)
{
$this->request = $request;
}
public function collection()
{
$query = Permohonan::query();
$query = $query->where('status', 'done');
// Apply date range filter if provided
if ($this->request->has('start_date') || $this->request->has('end_date')) {
$startDate = $this->request->start_date ?? '1900-01-01';
$endDate = $this->request->end_date ?? now()->toDateString();
$query->where(function ($q) use ($startDate, $endDate) {
$q->whereHas('penilaian', function ($q2) use ($startDate, $endDate) {
$q2->whereBetween('tanggal_kunjungan', [$startDate, $endDate]);
});
// OR check if has penawaran with date in range
$q->orWhereHas('penawaran', function ($q3) use ($startDate, $endDate) {
$q3->whereBetween('tanggal_penilaian_sebelumnya', [$startDate, $endDate]);
});
});
}
// Apply branch filter if provided
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
$query->where('branch_id', $this->request->branch_id);
}
if ($this->request->has('penilai_id') && !empty($this->request->penilai_id)) {
$request = $this->request; // Store in a local variable
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($request) {
$q->where('user_id', $request->penilai_id);
});
}
// Apply search filter if provided
if ($this->request->has('search') && !empty($this->request->search)) {
$search = $this->request->search;
$query->where(function ($q) use ($search) {
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('debiture', DB::raw('LOWER(name)'), 'LIKE', '%' . strtolower($search) . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search . '%');
$q->orWhere('status', 'LIKE', '%' . $search . '%');
});
}
// Default ordering
$query->orderBy('nomor_registrasi', 'asc');
return $query->get();
}
protected $rowNumber = 0;
public function map($permohonan): array
{
$this->rowNumber++;
$npw = 0;
if (isset($permohonan->penilai->lpj)) {
$lpj = json_decode($permohonan->penilai->lpj, true);
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
}
return [
$this->rowNumber,
$permohonan->nomor_registrasi,
$permohonan->debiture->branch->name ?? '',
$permohonan->debiture->name ?? '',
$permohonan->user->name ?? $permohonan->mig_nama_ao ?? '',
$permohonan->tanggal_permohonan ?? '',
$permohonan->penilaian->_user_penilai->userPenilaiTeam->name ?? '',
$permohonan->penilaian && $permohonan->penilaian->tanggal_kunjungan
? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan)
: '',
formatRupiah($npw, 2),
];
}
public function headings(): array
{
return [
'No',
'Nomor Registrasi',
'Cabang',
'Nama Debitur',
'Pemohon',
'Tanggal Permohonan',
'Nama Penilai',
'Tanggal Laporan',
'Nilai Pasar Wajar',
];
}
/**
* @return string
*/
public function title(): string
{
return 'Laporan User Limit';
}
/**
* @return string
*/
public function startCell(): string
{
return 'A7';
}
/**
* @return array
*/
public function registerEvents(): array
{
return [
AfterSheet::class => function (AfterSheet $event) {
// Get the sheet
$sheet = $event->sheet->getDelegate();
// Set the title
$sheet->setCellValue('A1', 'LAPORAN PENILAIAN JAMINAN');
$sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16);
// Merge cells for title
$sheet->mergeCells('A1:AH1');
$sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// Set the branch information if filtered
$branchInfo = '';
if ($this->request->has('branch_id') && !empty($this->request->branch_id)) {
$branch = Branch::find($this->request->branch_id);
if ($branch) {
$branchInfo = 'Cabang: ' . $branch->name;
$sheet->setCellValue('A2', $branchInfo);
$sheet->mergeCells('A2:AH2');
$sheet->getStyle('A2')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$sheet->getStyle('A2')->getFont()->setBold(true);
}
}
// Set the period
$startDate = $this->request->start_date ?? '';
$endDate = $this->request->end_date ?? '';
$rowIndex = $branchInfo ? 3 : 2;
if ($startDate && $endDate) {
$startDateFormatted = Carbon::parse($startDate)->format('d F Y');
$endDateFormatted = Carbon::parse($endDate)->format('d F Y');
$sheet->setCellValue('A' . $rowIndex, 'Periode: ' . $startDateFormatted . ' - ' . $endDateFormatted);
} else {
$sheet->setCellValue('A' . $rowIndex, 'Periode: Semua Data');
}
$sheet->mergeCells('A' . $rowIndex . ':AH' . $rowIndex);
$sheet->getStyle('A' . $rowIndex)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// Set the date of export
$rowIndex++;
$sheet->setCellValue('A' . $rowIndex, 'Tanggal Export: ' . Carbon::now()->format('d F Y H:i:s'));
// Set the user who exported
$rowIndex++;
$userName = Auth::user() ? Auth::user()->name : 'System';
$sheet->setCellValue('A' . $rowIndex, 'Diexport oleh: ' . $userName);
// Add a blank line
$rowIndex++;
$sheet->setCellValue('A' . $rowIndex, '');
// Style the header row
$headerRange = 'A7:' . $sheet->getHighestColumn() . '7';
$sheet->getStyle($headerRange)->getFont()->setBold(true);
$sheet->getStyle($headerRange)->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setARGB('FFCCCCCC');
// Auto-size columns - fixed to handle columns beyond Z
$highestColumn = $sheet->getHighestColumn();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
for ($i = 1; $i <= $highestColumnIndex; $i++) {
$currentColumn = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::stringFromColumnIndex($i);
$sheet->getColumnDimension($currentColumn)->setAutoSize(true);
}
// Add borders to all cells with data
$dataRange = 'A7:' . $sheet->getHighestColumn() . $sheet->getHighestRow();
$sheet->getStyle($dataRange)->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// Center align the header row
$sheet->getStyle($headerRange)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// Set text wrap for header cells
$sheet->getStyle($headerRange)->getAlignment()->setWrapText(true);
},
];
}
}

View File

@@ -15,6 +15,8 @@
use Modules\Lpj\Models\Penilaian; use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\TeamsUsers; use Modules\Lpj\Models\TeamsUsers;
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
function formatTanggalIndonesia($date, $time = false) function formatTanggalIndonesia($date, $time = false)
{ {
@@ -531,7 +533,6 @@
} }
function parsePembandingMigration($keterangan) { function parsePembandingMigration($keterangan) {
$keterangan = preg_replace('/[-]{5,}/', '',$keterangan); // Hapus ------ $keterangan = preg_replace('/[-]{5,}/', '',$keterangan); // Hapus ------
$keterangan = preg_replace('/[.]{5,}/', '',$keterangan); // Hapus ..... $keterangan = preg_replace('/[.]{5,}/', '',$keterangan); // Hapus .....
@@ -551,9 +552,140 @@ function parsePembandingMigration($keterangan) {
return 'Rp. ' . number_format((int)$angka, 0, ',', '.'); return 'Rp. ' . number_format((int)$angka, 0, ',', '.');
}, $line); }, $line);
// Jika ada tanda pagar (#), pisahkan menjadi baris baru
$line = str_replace('#', "\n#", $line);
$cleaned[] = $line; $cleaned[] = $line;
} }
} }
return implode("\n", $cleaned); return implode("\n", $cleaned);
} }
/**
* get full path to internal storage file or external storage file
*
* @param string $path
* @return string
*/
function getFilePath($path)
{
// define base path external storage (use .env) example: 'F:\path\to\storage' in windows
$externalBase = env('EXTERNAL_STORAGE_BASE_PATH', 'F:LPJ/lpj/LPJ Gambar/001/');
$segments = explode('/', $path);
if(strtoupper($segments[0]) === 'SURVEYOR'){
$year = $segments[1];
$month = ucfirst(strtolower($segments[2]));
$date = $segments[3];
$code = $segments[4];
$file = $segments[5] ?? '';
$extenalFullpath = $externalBase . $year . '/' . $month . '/' . $date . '/' . $code . '/' . $file;
if(File::exists($extenalFullpath)){
return $extenalFullpath;
}
}
// if not found in external storage, try to find in internal storage
if (Storage::exists($path)) {
return Storage::url('app/' . $path);
}
return $path;
}
function parseTimestamp(?string $timestamp): ?string
{
if (!$timestamp) {
return null;
}
// Trim whitespace dan normalize
$timestamp = trim($timestamp);
// Log untuk debugging
Log::info('Mencoba parsing timestamp: "' . $timestamp . '"');
// Parsing dengan DateTime native PHP untuk lebih robust
try {
// Pattern untuk format d/m/Y H:i:s
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})\s+(\d{1,2}):(\d{1,2}):(\d{1,2})$/', $timestamp, $matches)) {
$day = (int) $matches[1];
$month = (int) $matches[2];
$year = (int) $matches[3];
$hour = (int) $matches[4];
$minute = (int) $matches[5];
$second = (int) $matches[6];
// Validasi nilai
if ($day >= 1 && $day <= 31 && $month >= 1 && $month <= 12 && $year >= 1900 && $year <= 2100 &&
$hour >= 0 && $hour <= 23 && $minute >= 0 && $minute <= 59 && $second >= 0 && $second <= 59) {
// Buat DateTime object langsung
$dateTime = new \DateTime();
$dateTime->setDate($year, $month, $day);
$dateTime->setTime($hour, $minute, $second);
$result = $dateTime->format('Y-m-d H:i:s');
Log::info('Berhasil parsing dengan DateTime: ' . $timestamp . ' -> ' . $result);
return $result;
}
}
// Pattern untuk format d/m/Y tanpa waktu
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $timestamp, $matches)) {
$day = (int) $matches[1];
$month = (int) $matches[2];
$year = (int) $matches[3];
// Validasi nilai
if ($day >= 1 && $day <= 31 && $month >= 1 && $month <= 12 && $year >= 1900 && $year <= 2100) {
// Buat DateTime object langsung
$dateTime = new \DateTime();
$dateTime->setDate($year, $month, $day);
$dateTime->setTime(0, 0, 0);
$result = $dateTime->format('Y-m-d H:i:s');
Log::info('Berhasil parsing tanpa waktu dengan DateTime: ' . $timestamp . ' -> ' . $result);
return $result;
}
}
} catch (\Exception $e) {
Log::error('Gagal parsing dengan DateTime: ' . $timestamp . '. Error: ' . $e->getMessage());
}
// Fallback ke format Carbon standar untuk format lainnya
$formats = [
'Y-m-d H:i:s',
'Y-m-d',
'd-m-Y H:i:s',
'd-m-Y',
'j-n-Y H:i:s',
'j-n-Y',
];
foreach ($formats as $format) {
try {
$carbon = \Carbon\Carbon::createFromFormat($format, $timestamp);
if ($carbon && $carbon->format($format) === $timestamp) {
// Jika format tidak mengandung waktu, set ke awal hari
if (!str_contains($format, 'H:i:s')) {
$carbon = $carbon->startOfDay();
}
Log::info('Berhasil parsing dengan format ' . $format . ': ' . $timestamp . ' -> ' . $carbon->toDateTimeString());
return $carbon->toDateTimeString();
}
} catch (\Exception $e) {
// Lanjut ke format berikutnya
continue;
}
}
Log::error('Tidak dapat memparsing timestamp dengan format apapun: "' . $timestamp . '"');
return null;
}

View File

@@ -75,11 +75,9 @@ class LaporanController extends Controller
} }
// Retrieve data from the database // Retrieve data from the database
$query = Permohonan::query()->whereIn('status',['proses-laporan','done', 'paparan', 'proses-paparan'])->whereNotNull('approval_so_at')->whereNotNull('approval_eo_at')->where(function ($q) { $query = Permohonan::query()
$q->whereIn('nilai_plafond_id', [1,4]) ->whereIn('status',['proses-laporan','done', 'paparan', 'proses-paparan']);
->whereNotNull('approval_dd_at')
->orWhereIn('nilai_plafond_id', [2,3]);
});
$query = $query->orderBy('nomor_registrasi', 'desc'); $query = $query->orderBy('nomor_registrasi', 'desc');
// Apply search filter if provided // Apply search filter if provided

View File

@@ -4,6 +4,8 @@ namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Exports\LaporanUserLimitExport;
use Modules\Lpj\Services\LaporanUserService; use Modules\Lpj\Services\LaporanUserService;
class LaporanUserController extends Controller class LaporanUserController extends Controller
@@ -38,4 +40,12 @@ class LaporanUserController extends Controller
return $this->laporanUserService->dataForDatatables($request); return $this->laporanUserService->dataForDatatables($request);
} }
public function export(Request $request)
{
$startDate = $request->start_date;
$endDate = $request->end_date;
// name of the file
$fileName = 'laporan_user_limit' . $startDate . '_' . $endDate . '.xlsx';
return Excel::download(new LaporanUserLimitExport($request), $fileName);
}
} }

View File

@@ -20,7 +20,7 @@
*/ */
public function index() public function index()
{ {
return redirect()->route('noc.pembayaran'); return redirect()->route('noc.pembayaran.index');
} }
public function pembayaran() public function pembayaran()
@@ -80,7 +80,7 @@
} }
$noc->save(); $noc->save();
// Update the status of the related permohonan to 'spk' /* Update the status of the related permohonan to 'spk'
$permohonan = Permohonan::find(request()->get('permohonan_id')); $permohonan = Permohonan::find(request()->get('permohonan_id'));
if ($permohonan) { if ($permohonan) {
$permohonan->status_bayar = request()->get('status_pembayar'); $permohonan->status_bayar = request()->get('status_pembayar');
@@ -99,7 +99,7 @@
]); ]);
} }
// andy add, update status penawaran.status='spk' // andy add, update status penawaran.status='spk'
} }*/
return redirect() return redirect()
->route('noc.index')->with('success', 'NOC berhasil disimpan.'); ->route('noc.index')->with('success', 'NOC berhasil disimpan.');
@@ -175,9 +175,7 @@
/** /**
* Display the specified resource. * Display the specified resource.
*/ */
public function show(Request $request) { public function show(Noc $noc) {
$noc = Noc::find($request->get('id'));
return view('lpj::noc.memo', compact('noc')); return view('lpj::noc.memo', compact('noc'));
} }

View File

@@ -697,15 +697,17 @@ class PenilaiController extends Controller
'lokasi_lengkap' => $data->lokasi_lengkap ?? '', 'lokasi_lengkap' => $data->lokasi_lengkap ?? '',
]; ];
// Extract data pembanding if(isset($dataPembanding)){
if (isset($dataPembanding['data_pembanding'])) { // Extract data pembanding
foreach ($dataPembanding['data_pembanding'] as $index => $pembanding) { if (isset($dataPembanding['data_pembanding'])) {
if ($index == 0) { foreach ($dataPembanding['data_pembanding'] as $index => $pembanding) {
$exportData['pembanding1'] = $pembanding; if ($index == 0) {
} elseif ($index == 1) { $exportData['pembanding1'] = $pembanding;
$exportData['pembanding2'] = $pembanding; } elseif ($index == 1) {
} elseif ($index == 2) { $exportData['pembanding2'] = $pembanding;
$exportData['pembanding3'] = $pembanding; } elseif ($index == 2) {
$exportData['pembanding3'] = $pembanding;
}
} }
} }
} }

View File

@@ -14,7 +14,7 @@ class Inspeksi extends Base
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */
protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','dokument_id','data_pembanding']; protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','dokument_id','data_pembanding','mig_detail_data_jaminan'];
public function permohonan() public function permohonan()
{ {

View File

@@ -50,44 +50,40 @@ class DaftarPustakaService
// get all with pagination // get all with pagination
public function getAllDaftarPustaka($request) public function getAllDaftarPustaka($request)
{ {
$query = DaftarPustaka::query(); $query = DaftarPustaka::query();
// Filter pencarian // Filter pencarian
if (!empty($request->get('search'))) { if (!empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
$query->where(function ($q) use ($search) { $query->where(function ($q) use ($search) {
$q->orWhere('judul', 'LIKE', "%$search%"); $q->orWhere('judul', 'LIKE', "%$search%");
}); });
}
// Filter kategori
if (!empty($request->get('category'))) {
$category = explode(',', $request->input('category'));
$query->whereIn('category_id', $category);
}
// Default pagination
$page = (int) $request->get('page', 1);
$size = (int) $request->get('size', 10);
return $query->paginate($size, ['*'], 'page', $page);
} }
// Filter kategori
if (!empty($request->get('category'))) {
$category = explode(',', $request->input('category'));
$query->whereIn('category_id', $category);
}
// Default pagination
$page = (int) $request->get('page', 1);
$size = (int) $request->get('size', 10);
return $query->paginate($size, ['*'], 'page', $page);
}
private function handleUpload($file) private function handleUpload($file)
{ {
$today = now(); $today = now();
$folderPath = 'daftar_pustaka/' . $today->format('Y/m/d'); $folderPath = 'daftar_pustaka/' . $today->format('Y/m/d');
if (!file_exists(public_path($folderPath))) {
mkdir(public_path($folderPath), 0755, true);
}
$fileName = $file->getClientOriginalName(); $fileName = $file->getClientOriginalName();
$file->move(public_path($folderPath), $fileName); $filePath = $file->storeAs($folderPath, $fileName, 'public');
return $folderPath . '/' . $fileName; return $filePath;
} }

View File

@@ -0,0 +1,21 @@
<?php
namespace Modules\Lpj\Services;
use Illuminate\Http\Request;
use Modules\Lpj\Models\Permohonan;
class LaporanBiayaService
{
public function buildDataTableQuery(array $data){
$query = Permohonan::with([
'noc'
]);
if($data['search']){
}
return $query;
}
}

View File

@@ -5,124 +5,119 @@ namespace Modules\Lpj\Services;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Penilaian; use Modules\Lpj\Models\Penilaian;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Carbon\Carbon;
class LaporanSLAPenilaiService class LaporanSLAPenilaiService
{ {
public function dataForDatatables(Request $request) public function dataForDatatables(Request $request)
{ {
// Retrieve data from the database // Retrieve data from the database
$query = Permohonan::query(); $query = Permohonan::query();
$query = $query->where('status', 'done'); $query = $query->where('status', 'done');
// Apply search filter if provided // Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = json_decode($request->get('search')); $search = json_decode($request->get('search'));
if (isset($search->start_date) || isset($search->end_date)) { if (isset($search->start_date) || isset($search->end_date)) {
$query->whereBetween('tanggal_permohonan', [ $query->whereBetween('tanggal_permohonan', [
$search->start_date ?? '1900-01-01', $search->start_date ?? '1900-01-01',
$search->end_date ?? now()->toDateString() $search->end_date ?? now()->toDateString()
]); ]);
}
if (isset($search->penilai_id) && !empty($search->penilai_id)) {
$query->whereHas('penilaian._user_penilai.userPenilaiTeam', function($q) use ($search) {
$q->where('user_id', $search->penilai_id);
});
}
if (isset($search->search)) {
$query->where(function ($q) use ($search) {
$q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
});
}
} }
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if (isset($search->penilai_id) && !empty($search->penilai_id)) {
$order = $request->get('sortOrder'); $query->whereHas('penilaian._user_penilai.userPenilaiTeam', function ($q) use ($search) {
$column = $request->get('sortField'); $q->where('user_id', $search->penilai_id);
$query->orderBy($column, $order); });
} }
// Get the total count of records if (isset($search->search)) {
$totalRecords = $query->count();
// Apply pagination if provided $query->where(function ($q) use ($search) {
if ($request->has('page') && $request->has('size')) { $q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%');
$page = $request->get('page'); $q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%');
$size = $request->get('size'); $q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
$offset = ($page - 1) * $size; // Calculate the offset $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
$query->skip($offset)->take($size); $q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
});
} }
// Get the filtered count of records
$filteredRecords = $query->count();
// Get the data for the current page
$data = $query->with(['debiture.branch'])->get();
$data = $data->map(function ($permohonan) {
$luas_tanah = 0;
$luas_bangunan = 0;
$nilai_tanah = 0;
$nilai_bangunan = 0;
$npw = 0;
$nilai_liquidasi = 0;
if (isset($permohonan->penilai->lpj)) {
$lpj = json_decode($permohonan->penilai->lpj, true);
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
$luas_tanah = $lpj['luas_tanah'] ?? 0;
$luas_bangunan = $lpj['luas_bangunan'] ?? 0;
// Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_'
$nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
$nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
$nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
}
return [
'id' => $permohonan->id,
'nomor_registrasi' => $permohonan->nomor_registrasi,
'tanggal_permohonan' => $permohonan->tanggal_permohonan,
'branch' => $permohonan->debiture?->branch?->name,
'name' => $permohonan->debiture?->name,
'pemohon' => $permohonan->creator?->name,
'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name,
'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')->unique()->implode(', '),
'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
];
});
// Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size'));
// Calculate the current page number
$currentPage = $request->get('page', 1);
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
} }
// Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder');
$column = $request->get('sortField');
$query->orderBy($column, $order);
}
// Get the total count of records
$totalRecords = $query->count();
// Apply pagination if provided
if ($request->has('page') && $request->has('size')) {
$page = $request->get('page');
$size = $request->get('size');
$offset = ($page - 1) * $size; // Calculate the offset
$query->skip($offset)->take($size);
}
// Get the filtered count of records
$filteredRecords = $query->count();
// Get the data for the current page
$data = $query->with(['documents','debiture.branch'])->get();
$data = $data->map(function ($permohonan) {
$tgl_kunjungan = $permohonan->penilaian?->tanggal_kunjungan;
$tgl_otorisator = $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? $permohonan->approval_so_at;
$jangkaWaktu = $this->hitungTotalJangkaWaktuSla($tgl_kunjungan, $tgl_otorisator);
return [
'id' => $permohonan->id,
'nomor_registrasi' => $permohonan->nomor_registrasi,
'tanggal_permohonan' => $permohonan->tanggal_permohonan,
'branch' => $permohonan->debiture?->branch?->name,
'name' => $permohonan->debiture?->name,
'pemohon' => $permohonan->creator?->name,
'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name,
'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
'tanggal_approval' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
'tanggal_kunjungan' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
'jangka_waktu' => $jangkaWaktu,
'keterangan' => $permohonan->keterangan
];
});
// Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size'));
// Calculate the current page number
$currentPage = $request->get('page', 1);
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'pageCount' => $pageCount,
'page' => $currentPage,
'totalCount' => $totalRecords,
'data' => $data,
]);
}
private function hitungTotalJangkaWaktuSla($tgl_kunjungan,$tgl_otorisator){
$countHariKerja = hitungHariKerja($tgl_kunjungan, $tgl_otorisator);
return $countHariKerja;
}
} }

View File

@@ -1,8 +1,10 @@
<?php <?php
namespace Modules\Lpj\Services; namespace Modules\Lpj\Services;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Modules\Usermanagement\Models\User;
class LaporanUserService class LaporanUserService
{ {
@@ -25,36 +27,15 @@ class LaporanUserService
{ {
// Retrieve data from the database // Retrieve data from the database
$query = Permohonan::query(); $query = User::query();
$query = $query->where('status', 'done');
// Apply search filter if provided // Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = json_decode($request->get('search')); $search = json_decode($request->get('search'));
if (isset($search->start_date) || isset($search->end_date)) {
$query->whereBetween('tanggal_permohonan', [
$search->start_date ?? '1900-01-01',
$search->end_date ?? now()->toDateString()
]);
}
// Filter by branch if provided
if (isset($search->user_id) && !empty($search->user_id)) {
$query->where('user_id', $search->user_id);
}
if (isset($search->search)) { if (isset($search->search)) {
$query->where(function ($q) use ($search) { $query->where(function ($q) use ($search) {
$q->where('nomor_registrasi', 'LIKE', '%' . $search->search . '%'); $q->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%']);
$q->orWhere('tanggal_permohonan', 'LIKE', '%' . $search->search . '%'); $q->where('nik', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisFasilitasKredit', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhereRelation('jenisPenilaian', 'name', 'LIKE', '%' . $search->search . '%');
$q->orWhere('status', 'LIKE', '%' . $search->search . '%');
}); });
} }
} }
@@ -82,99 +63,16 @@ class LaporanUserService
$filteredRecords = $query->count(); $filteredRecords = $query->count();
// Get the data for the current page // Get the data for the current page
$data = $query->with(['debiture.branch'])->get(); $data = $query->with(['branch', 'roles'])->get();
$data = $data->map(function ($permohonan) { $data = $data->map(function ($user) {
$luas_tanah = 0;
$luas_bangunan = 0;
$nilai_tanah = 0;
$nilai_bangunan = 0;
$npw = 0;
$nilai_liquidasi = 0;
if (isset($permohonan->penilai->lpj)) {
$lpj = json_decode($permohonan->penilai->lpj, true);
$npw = str_replace('.', '', $lpj['total_nilai_pasar_wajar'] ?? 0);
$luas_tanah = $lpj['luas_tanah'] ?? 0;
$luas_bangunan = $lpj['luas_bangunan'] ?? 0;
// Calculate nilai_tanah dynamically by looking for all keys that start with 'nilai_tanah_'
$nilai_tanah = str_replace('.', '', $lpj['nilai_tanah_2'] ?? 0);
$nilai_bangunan = str_replace('.', '', $lpj['nilai_bangunan_2'] ?? 0);
$nilai_liquidasi = str_replace('.', '', $lpj['likuidasi_nilai_2'] ?? 0);
}
return [ return [
'id' => $permohonan->id, 'id' => $user->id,
'nomor_registrasi' => $permohonan->nomor_registrasi, 'nik' => $user->nik,
'jenis_penilaian' => $permohonan->jenisPenilaian?->name, 'name' => $user->name,
'tujuan_penilaian' => $permohonan->tujuanPenilaian?->name, 'level' => $user->roles->pluck('name')->implode(', '),
'jenis_fasilitas_kredit' => $permohonan->jenisFasilitasKredit?->name, 'approval_limit' => 0,
'branch' => $permohonan->debiture->branch?->name,
'pemohon' => $permohonan->creator?->name,
'cif' => $permohonan->debiture->cif,
'name' => $permohonan->debiture?->name,
'jenis_agunan' => $permohonan->documents?->pluck('jenisJaminan.name')
->unique()
->implode(', '),
'alamat_agunan' => $permohonan->documents?->map(function ($document) {
return formatAlamat($document);
})->unique()->implode(', '),
'bukti_kepemilikan' => (function () use ($permohonan) {
$legalitasItems = $permohonan->documents?->flatMap(function ($document) {
return $document->detail->map(function ($detail) {
// Jika tidak ada jenis legalitas jaminan, lewati
if (empty($detail->jenisLegalitasJaminan)) {
return null;
}
// Hanya tampilkan detail yang memiliki dokumen_jaminan
if (empty($detail->dokumen_jaminan)) {
return null;
}
// Tampilkan nama legalitas jaminan saja
return $detail->jenisLegalitasJaminan->name ?? '';
});
})->filter()->unique()->values()->toArray();
// Buat daftar bernomor
$result = '';
foreach ($legalitasItems as $index => $item) {
$result .= ($index + 1) . '. ' . $item . "\n";
}
return $result;
})(),
'nama_pemilik' => $permohonan->documents?->pluck('pemilik.name')
->unique()
->implode(', '),
'luas_tanah' => $luas_tanah . ' m²',
'nilai_tanah' => formatRupiah($nilai_tanah, 2),
'luas_bangunan' => $luas_bangunan . ' m²',
'nilai_bangunan' => formatRupiah($nilai_bangunan, 2),
'nilai_njop' => formatRupiah($permohonan->nilai_njop, 2),
'nilai_pasar_wajar' => formatRupiah($npw, 2),
'nilai_likuidasi' => formatRupiah($nilai_liquidasi, 2),
'tanggal_documen_diterima' => $permohonan->documents?->map(function ($document) {
return $document->created_at->format('d-m-Y');
}),
'tanggal_spk' => '',
'nomor_spk' => '',
'tanggal_rencana_kunjunagn' => '',
'tanggal_kunjungan' => '',
'taggal_delivered' => '',
'jangka_waktu_sla' => '',
'nama_penilai' => $permohonan->penilaian?->_user_penilai?->userPenilaiTeam?->name,
'nama_team_leader' => $permohonan->penilaian?->teams,
'saran' => '',
'catatan' => '',
'tanggal_permohonan' => $permohonan->tanggal_permohonan,
'tanggal_laporan' => $permohonan->approval_dd_at ?? $permohonan->approval_eo_at ?? '',
'tanggal_review' => $permohonan->penilaian?->tanggal_kunjungan ?? '',
]; ];
}); });

View File

@@ -2,76 +2,93 @@
namespace Modules\Lpj\Services; namespace Modules\Lpj\Services;
use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\LaporanExternal; use Carbon\Carbon;
use Modules\Lpj\Models\Permohonan; use App\Helpers\Lpj;
use Modules\Lpj\Models\Branch;
use Modules\Lpj\Models\Surveyor;
use Modules\Lpj\Models\BentukTanah;
use Modules\Lpj\Models\KonturTanah;
use Modules\Location\Models\Province;
use Modules\Location\Models\City;
use Modules\Location\Models\District;
use Modules\Location\Models\Village;
use Modules\Lpj\Models\PosisiKavling;
use Modules\Lpj\Models\KondisiFisikTanah;
use Modules\Lpj\Models\FotoObjekJaminan;
use Modules\Lpj\Models\Perizinan;
use Modules\Lpj\Models\KetinggianTanah;
use Modules\Lpj\Models\SifatBangunan;
use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\JenisBangunan;
use Modules\Lpj\Models\KondisiBangunan;
use Modules\Lpj\Models\SpekBangunan;
use Modules\Lpj\Models\SpekKategoritBangunan;
use Modules\Lpj\Models\SaranaPelengkap;
use Modules\Lpj\Models\ArahMataAngin;
use Modules\Lpj\Models\Analisa;
use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\PerkerasanJalan;
use Modules\Lpj\Models\AnalisaFakta;
use Modules\Lpj\Models\AnalisaLingkungan;
use Modules\Lpj\Models\AnalisaTanahBagunan;
use Modules\Lpj\Models\SpekBangunanAnalisa;
use Modules\Lpj\Models\Denah; use Modules\Lpj\Models\Denah;
use Modules\Lpj\Models\FotoJaminan;
use Modules\Lpj\Models\Lingkungan;
use Modules\Lpj\Models\LantaiUnit;
use Modules\Lpj\Models\Teams; use Modules\Lpj\Models\Teams;
use Modules\Lpj\Models\Branch;
use Modules\Lpj\Models\Lantai; use Modules\Lpj\Models\Lantai;
use Barryvdh\DomPDF\Facade\Pdf;
use Modules\Lpj\Models\Analisa;
use Modules\Lpj\Models\Penilai;
use Modules\Lpj\Models\Debiture;
use Modules\Lpj\Models\Inspeksi; use Modules\Lpj\Models\Inspeksi;
use Modules\Lpj\Models\Surveyor;
use Modules\Lpj\Models\ViewUnit; use Modules\Lpj\Models\ViewUnit;
use Modules\Location\Models\City;
use Modules\Lpj\Models\JenisUnit; use Modules\Lpj\Models\JenisUnit;
use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\Perizinan;
use Modules\Lpj\Models\BentukUnit; use Modules\Lpj\Models\BentukUnit;
use Modules\Lpj\Models\PosisiUnit;
use Modules\Lpj\Models\TerletakArea;
use Modules\Lpj\Models\FasilitasObjek;
use Modules\Lpj\Models\MerupakanDaerah;
use Modules\Lpj\Models\ObjekJaminan;
use Modules\Lpj\Models\ModelAlatBerat;
use Modules\Lpj\Models\JenisPesawat;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\DetailDokumenJaminan;
use Modules\Lpj\Models\JenisKapal; use Modules\Lpj\Models\JenisKapal;
use Modules\Lpj\Models\JenisKendaraan; use Modules\Lpj\Models\LantaiUnit;
use Modules\Lpj\Models\Lingkungan;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\PosisiUnit;
use Illuminate\Support\Facades\Log;
use Modules\Lpj\Models\AnalisaUnit;
use Modules\Lpj\Models\BentukTanah;
use Modules\Lpj\Models\FotoJaminan;
use Modules\Lpj\Models\KonturTanah;
use Modules\Lpj\Models\RuteJaminan; use Modules\Lpj\Models\RuteJaminan;
use Modules\Location\Models\Village;
use Modules\Lpj\Models\AnalisaFakta;
use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\JenisPesawat;
use Modules\Lpj\Models\ObjekJaminan;
use Modules\Lpj\Models\SpekBangunan;
use Modules\Lpj\Models\TerletakArea;
use Modules\Location\Models\District;
use Modules\Location\Models\Province;
use Modules\Lpj\Models\ArahMataAngin;
use Modules\Lpj\Models\JenisBangunan;
use Modules\Lpj\Models\PosisiKavling;
use Modules\Lpj\Models\SifatBangunan;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\FasilitasObjek;
use Modules\Lpj\Models\JenisKendaraan;
use Modules\Lpj\Models\ModelAlatBerat;
use Modules\Lpj\Models\KetinggianTanah;
use Modules\Lpj\Models\KondisiBangunan;
use Modules\Lpj\Models\LaporanExternal;
use Modules\Lpj\Models\MerupakanDaerah;
use Modules\Lpj\Models\PerkerasanJalan;
use Modules\Lpj\Models\SaranaPelengkap;
use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Models\FotoObjekJaminan;
use Modules\Lpj\Models\LaluLintasLokasi;
use Modules\Lpj\Models\TingkatKeramaian;
use Modules\Lpj\Models\AnalisaLingkungan;
use Modules\Lpj\Models\KondisiFisikTanah;
use Modules\Lpj\Models\AnalisaTanahBagunan;
use Modules\Lpj\Models\GolonganMasySekitar;
use Modules\Lpj\Models\SpekBangunanAnalisa;
use Modules\Lpj\Models\DetailDokumenJaminan;
use Modules\Lpj\Models\SpekKategoritBangunan;
use Modules\Lpj\Http\Requests\SurveyorRequest;
use Modules\Lpj\Models\HubunganPemilikJaminan; use Modules\Lpj\Models\HubunganPemilikJaminan;
use Modules\Lpj\Models\HubunganPenghuniJaminan; use Modules\Lpj\Models\HubunganPenghuniJaminan;
use Modules\Lpj\Models\AnalisaUnit;
use Modules\Lpj\Models\GolonganMasySekitar;
use Modules\Lpj\Models\TingkatKeramaian;
use Modules\Lpj\Models\TujuanPenilaian;
use Modules\Lpj\Models\LaluLintasLokasi;
use Modules\Lpj\Models\SpekBagunanAnalisaDetail; use Modules\Lpj\Models\SpekBagunanAnalisaDetail;
use Modules\Lpj\Http\Requests\SurveyorRequest;
use Modules\Lpj\Http\Requests\FormSurveyorRequest;
use Modules\Lpj\Jobs\SendJadwalKunjunganEmailJob; use Modules\Lpj\Jobs\SendJadwalKunjunganEmailJob;
use App\Helpers\Lpj; use Modules\Lpj\Http\Requests\FormSurveyorRequest;
use Modules\Lpj\Models\Penilai;
use Barryvdh\DomPDF\Facade\Pdf;
class PreviewLaporanService class PreviewLaporanService
{ {
/**
* Preview Laporan dan unduh foto terkait dengan logika fallback path.
*
* Menghasilkan PDF atau paket unduhan foto berdasarkan status laporan.
* Jika file foto asli tidak ditemukan dan status LPJ adalah 1, maka
* sistem akan mencoba menggunakan fallback path dengan pola
* `surveyor/001/{lastTwoParts}` untuk meminimalisir gambar hilang.
*
* @param int $permohonan_id ID Permohonan
* @param int $dokumen_id ID Dokumen
* @param int $jaminan_id ID Jaminan
* @param string $back URL atau rute kembali
* @return \Symfony\Component\HttpFoundation\Response
*/
public function previewLaporan($permohonan_id, $dokumen_id, $jaminan_id, $back) public function previewLaporan($permohonan_id, $dokumen_id, $jaminan_id, $back)
{ {
$permohonan = $this->getPermohonanJaminanId( $permohonan = $this->getPermohonanJaminanId(
@@ -90,14 +107,19 @@ class PreviewLaporanService
$inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first(); $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(); $lpj = Penilai::where('permohonan_id', $permohonan_id)->where('dokument_id', $dokumen_id)->first();
$mig_permohonan = json_decode($permohonan->mig_permohonan);
$nomorLaporan = getNomorLaporan($permohonan_id, $dokumen_id); $nomorLaporan = getNomorLaporan($permohonan_id, $dokumen_id);
$tanggalLaporan = $lpj->created_at ?? null; $tanggalLaporan = $permohonan->is_mig
? ($mig_permohonan->mig_mst_jaminan_tgl_laporan ?? $mig_permohonan->mig_mst_jaminan_tgl_create ?? null)
: ($lpj->created_at ?? null);
$forminspeksi = null; $forminspeksi = null;
$lpjData = null; $lpjData = null;
$formFoto = null; $formFoto = null;
// if ($inspeksi) { // if ($inspeksi) {
$forminspeksi = json_decode($inspeksi?->data_form, true) ?? null; $forminspeksi = json_decode($inspeksi?->data_form, true) ?? null;
$formFoto = json_decode($inspeksi?->foto_form, true) ?? null; $formFoto = json_decode($inspeksi?->foto_form, true) ?? null;
// $denahForm = json_decode($data->denah_form, true); // $denahForm = json_decode($data->denah_form, true);
$dataPembanding = json_decode($inspeksi?->data_pembanding, true) ?? null; $dataPembanding = json_decode($inspeksi?->data_pembanding, true) ?? null;
@@ -129,12 +151,13 @@ class PreviewLaporanService
public function printOutLaporan($permohonan_id, $document_id, $jaminan_id) public function printOutLaporan($permohonan_id, $document_id, $jaminan_id)
{ {
$tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id); $tipeLaporanResponse = $this->checkPrintOutLaporan($permohonan_id, $document_id);
$tipeLaporan = $tipeLaporanResponse->getData(); $tipeLaporan = $tipeLaporanResponse->getData();
//dd($permohonan_id, $document_id, $tipeLaporan);
if (!$tipeLaporan->status) { if (!$tipeLaporan->status) {
return redirect()->back()->with('error', 'Laporan tidak valid'); //return redirect()->back()->with('error', 'Laporan tidak valid');
} }
$permohonan = $this->getPermohonanJaminanId( $permohonan = $this->getPermohonanJaminanId(
$permohonan_id, $permohonan_id,
@@ -145,15 +168,27 @@ class PreviewLaporanService
$basicData = $this->getCommonData(); $basicData = $this->getCommonData();
$inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $document_id)->first(); $inspeksi = Inspeksi::where('permohonan_id', $permohonan_id)->where('dokument_id', $document_id)->first();
$lpj = Penilai::where('permohonan_id', $permohonan_id)->where('dokument_id', $document_id)->first(); $lpj = Penilai::where('permohonan_id', $permohonan_id)->first(); //->where('dokument_id', $document_id)->first();
$mig_permohonan = json_decode($permohonan->mig_permohonan);
$nomorLaporan = getNomorLaporan($permohonan_id, $document_id); $nomorLaporan = getNomorLaporan($permohonan_id, $document_id);
$tanggalLaporan = $lpj->created_at ?? null;
//Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s');
$tanggalLaporan = $permohonan->is_mig
? ($mig_permohonan->mig_mst_jaminan_tgl_laporan
? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_laporan)->format('Y-m-d H:i:s')
: ($mig_permohonan->mig_mst_jaminan_tgl_oto
? Carbon::createFromFormat('d/m/Y H:i:s', $mig_permohonan->mig_mst_jaminan_tgl_oto)->format('Y-m-d H:i:s')
: null))
: ($lpj->created_at ?? null);
$forminspeksi = null; $forminspeksi = null;
$lpjData = null; $lpjData = null;
$formFoto = null; $formFoto = null;
$dataPembanding ='';
if ($inspeksi) { if ($inspeksi) {
$forminspeksi = json_decode($inspeksi->data_form, true); $forminspeksi = json_decode($inspeksi->data_form, true);
$formFoto = json_decode($inspeksi->foto_form, true); $formFoto = json_decode($inspeksi->foto_form, true);
@@ -161,6 +196,7 @@ class PreviewLaporanService
$dataPembanding = json_decode($inspeksi->data_pembanding, true); $dataPembanding = json_decode($inspeksi->data_pembanding, true);
} }
if ($lpj) { if ($lpj) {
$lpjData = json_decode($lpj->lpj, true); $lpjData = json_decode($lpj->lpj, true);
$memo = json_decode($lpj->memo, true); $memo = json_decode($lpj->memo, true);
@@ -181,7 +217,96 @@ class PreviewLaporanService
]; ];
$viewLaporan = $this->getViewLaporan($tipeLaporan->status); $viewLaporan = $this->getViewLaporan($tipeLaporan->status);
$statusLpj = 1; $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){
$paths = $formFoto['upload_foto'] ?? null;
if (!is_array($paths) || empty($paths)) {
return response()->json(['error' => 'No files to download'], 404);
}
$files = [];
foreach ($paths as $path) {
if (!$path['path']) {
Log::warning('PreviewLaporanService: Path kosong terdeteksi dalam daftar paths.');
continue;
}
// Logika fallback untuk path file
$originalPath = $path['path'];
$fallbackPath = null;
// Jika file asli tidak ditemukan, buat fallback path
if ($statusLpj == 1) {
$fullOriginalPath = storage_path('app/public/' . $originalPath);
if (!file_exists($fullOriginalPath)) {
// Ekstrak bagian akhir path (contoh: 251051/251051_2_2.png)
$pathParts = explode('/', $originalPath);
if (count($pathParts) >= 2) {
$lastTwoParts = array_slice($pathParts, -2);
$fallbackPath = 'surveyor/001/' . implode('/', $lastTwoParts);
Log::info('PreviewLaporanService: Menggunakan fallback path kandidat.', [
'original' => $originalPath,
'fallback' => $fallbackPath,
]);
}
}
}
// Tentukan path yang akan digunakan
$pathToUse = ($fallbackPath && $statusLpj == 1 && file_exists(storage_path('app/public/' . $fallbackPath)))
? $fallbackPath
: $originalPath;
$fullPath = storage_path('app/public/' . $pathToUse);
if (!file_exists($fullPath)) {
Log::warning('PreviewLaporanService: File tidak ditemukan untuk original maupun fallback.', [
'original' => $originalPath,
'fallback' => $fallbackPath,
'resolved' => $pathToUse,
]);
continue;
}
Log::info('PreviewLaporanService: Menambahkan file untuk diunduh.', [
'resolved' => $pathToUse,
'fullPath' => $fullPath,
]);
$files[] = $fullPath;
}
if (empty($files)) {
Log::warning('PreviewLaporanService: Tidak ada file valid ditemukan setelah resolusi path.');
return response()->json(['error' => 'No valid files found'], 404);
}
// For single file, download directly
if (count($files) === 1) {
Log::info('PreviewLaporanService: Mengunduh single file.', ['file' => $files[0]]);
return response()->download($files[0]);
}
// For multiple files, create zip and download
$zipName = 'photos_' . time() . '.zip';
$zipPath = storage_path('app/public/' . $zipName);
$zip = new \ZipArchive();
if ($zip->open($zipPath, \ZipArchive::CREATE) === true) {
foreach ($files as $file) {
$zip->addFile($file, basename($file));
}
$zip->close();
Log::info('PreviewLaporanService: Zip file berhasil dibuat.', ['zip' => $zipPath, 'count' => count($files)]);
return response()->download($zipPath)->deleteFileAfterSend(true);
}
Log::error('PreviewLaporanService: Gagal membuat zip file.');
return response()->json(['error' => 'Failed to create zip file'], 500);
}
try { try {
$pdf = $this->generatePDF($viewLaporan, compact( $pdf = $this->generatePDF($viewLaporan, compact(
'permohonan', 'permohonan',
@@ -214,6 +339,8 @@ class PreviewLaporanService
private function generatePDF(string $viewLaporan, array $data) private function generatePDF(string $viewLaporan, array $data)
{ {
//return view('lpj::' . $viewLaporan, $data);
$pdf = PDF::loadView('lpj::' . $viewLaporan, $data); $pdf = PDF::loadView('lpj::' . $viewLaporan, $data);
$pdf->setPaper('A4', 'portrait'); $pdf->setPaper('A4', 'portrait');
$pdf->set_option('isHtml5ParserEnabled', true); $pdf->set_option('isHtml5ParserEnabled', true);
@@ -239,12 +366,14 @@ class PreviewLaporanService
public function checkPrintOutLaporan($permohonan_id, $dokumen_id) public function checkPrintOutLaporan($permohonan_id, $dokumen_id)
{ {
// Ambil data berdasarkan ID // Ambil data berdasarkan ID
$statusLpj = Penilai::where('permohonan_id', $permohonan_id) $statusLpj = Penilai::where('permohonan_id', $permohonan_id)
->where('dokument_id', $dokumen_id) //->where('dokument_id', $dokumen_id)
->first(); ->first();
$permohonan = Permohonan::where('id', $permohonan_id)->first();
// Jika data tidak ditemukan, kembalikan status null // Jika data tidak ditemukan, kembalikan status null
if (!$statusLpj) { if (!$statusLpj) {
return response()->json(['status' => null]); return response()->json(['status' => null]);
@@ -253,7 +382,7 @@ class PreviewLaporanService
// Tentukan tipe berdasarkan kondisi // Tentukan tipe berdasarkan kondisi
$type = $statusLpj->type_penilai ?? null; $type = $statusLpj->type_penilai ?? null;
if ($type === 'memo') { if ($type === 'memo' && $permohonan->is_mig!=1) {
return $this->checkDataMemo($type, $statusLpj); return $this->checkDataMemo($type, $statusLpj);
} }
@@ -281,6 +410,7 @@ class PreviewLaporanService
// Ambil data JSON dari statusLpj // Ambil data JSON dari statusLpj
$data = json_decode($statusLpj->memo, true) ?? []; $data = json_decode($statusLpj->memo, true) ?? [];
$validationRules = [ $validationRules = [
'memo' => [ 'memo' => [
'kepada', 'kepada',

View File

@@ -266,32 +266,62 @@
const status = data.status; // Anggap status berada di dalam objek data const status = data.status; // Anggap status berada di dalam objek data
const dokumenjaminan = data.dokumenjaminan || []; const dokumenjaminan = data.dokumenjaminan || [];
return ` return `
<div class="flex flex-nowrap justify-center"> <div class="flex flex-nowrap justify-center">
<a class="btn btn-sm btn-icon btn-clear btn-warning" href="activity/${data.id}/show" title="Lihat Detail"> <a class="btn btn-sm btn-icon ${status === 'freeze' ? 'btn-light' : 'btn-warning btn-clear'}" href="activity/${data.id}/show" title="Lihat Detail">
<i class="ki-outline ki-eye"></i> <i class="ki-outline ki-eye"></i>
</a> </a>
${ ${
['survey', 'done', 'proses-laporan', 'laporan', 'paparan'].includes(status) ? ['survey', 'done', 'proses-laporan', 'laporan', 'paparan'].includes(status) ?
dokumenjaminan.map(dokumen => { dokumenjaminan.map(dokumen => {
return ` return `
<a class="btn btn-sm btn-icon btn-clear btn-info" href="surveyor/print-out-inspeksi/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}" title="Print Inspeksi Permohonan"> <a class="btn btn-sm btn-icon btn-clear btn-info" href="surveyor/print-out-inspeksi/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}" title="Print Inspeksi Permohonan">
<i class="ki-outline ki-printer"></i> <i class="ki-outline ki-printer"></i>
</a> </a>
`; `;
}).join('') : '' }).join('') : ''
} }
</div> </div>
`; `;
}, },
}, },
} }
}; };
let dataTable = new KTDataTable(element, dataTableOptions); let dataTable = new KTDataTable(element, dataTableOptions);
function highlightFreezeRows() {
const table = document.querySelector('#permohonan-table table[data-datatable-table="true"]');
if (!table) return;
const rows = table.querySelectorAll('tbody tr');
rows.forEach(row => {
const statusCell = row.cells[7];
if (!statusCell) return;
const statusText = statusCell.textContent.trim().toLowerCase();
if (statusText === 'freeze') {
row.classList.add('bg-red-400', 'text-white');
} else {
row.classList.remove('bg-red-400', 'text-white');
}
});
}
// Polling setiap 1 detik untuk sementara
setInterval(() => {
highlightFreezeRows();
}, 500);
searchInput.addEventListener('input', function() { searchInput.addEventListener('input', function() {
const searchValue = this.value.trim(); const searchValue = this.value.trim();
dataTable.search(searchValue, true); dataTable.search(searchValue, true);

View File

@@ -1,10 +1,19 @@
@if (is_array($details) && count($details) > 0) @if (is_array($details) && count($details) > 0)
@php $currentKey = ''; @endphp
@foreach ($details as $value) @foreach ($details as $value)
@foreach ($value as $key => $item) @foreach ($value as $key => $item)
@if (!empty($item)) @if (!empty($item))
<tr> <tr>
<td style="padding: 2px; width:25%;"> <td style="padding: 2px; width:25%;">
{{ formatLabel($key) }} @if ($currentKey !== $key)
{{ formatLabel($key) }}
@endif
@php
if ($currentKey !== $key) {
$currentKey = $key;
}
@endphp
</td> </td>
<td style="width:1%; padding: 2px; vertical-align: top;">:</td> <td style="width:1%; padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px;"> <td style="padding: 2px;">

View File

@@ -13,9 +13,12 @@
<button id="tab-hasil" class="btn btn-sm btn-light">Hasil Inspeksi</button> <button id="tab-hasil" class="btn btn-sm btn-light">Hasil Inspeksi</button>
</div> </div>
<div class="flex items-wrap gap-2.5"> <div class="flex items-wrap gap-2.5">
<a href="{{ $back ?? route()->previous()}}" class="btn btn-xs btn-info"><i {{-- <a href="{{ $back ?? route()->previous()}}" class="btn btn-xs btn-info"><i
class="ki-filled ki-exit-left"></i> class="ki-filled ki-exit-left"></i>
Back</a> Back</a> --}}
<a id="back-button" class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
</div> </div>
</div> </div>
</div> </div>
@@ -87,6 +90,18 @@
hasilContent.classList.remove('hidden-tab'); hasilContent.classList.remove('hidden-tab');
}); });
}); });
document.getElementById('back-button').addEventListener('click', function(e) {
e.preventDefault();
console.log('Back button clicked', window.history.length);
if (window.history.length > 1) {
window.history.back();
} else {
window.location.href = "{{ $back ?? route()->previous()}}";
}
});
</script> </script>
<style> <style>

View File

@@ -57,7 +57,7 @@
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
{{-- ambil nama file pathnya hilangkan --}} {{-- ambil nama file pathnya hilangkan --}}
<a href="{{ asset($daftarPustaka->attachment) }}" class="badge badge-outline badge-md badge-info">{{ basename($daftarPustaka->attachment) }} &nbsp; <a href="{{ asset('storage/' .$daftarPustaka->attachment) }}" class="badge badge-outline badge-md badge-info">{{ basename($daftarPustaka->attachment) }} &nbsp;
<i class="ki-filled ki-cloud-download"></i> <i class="ki-filled ki-cloud-download"></i>
</a> </a>
</div> </div>

View File

@@ -5,6 +5,15 @@
@endsection @endsection
@section('content') @section('content')
<style>
@media (max-width: 768px) {
#previewContent {
height: 400px;
overflow: auto;
}
}
</style>
<div class="flex flex-col items-stretch gap-7"> <div class="flex flex-col items-stretch gap-7">
<div class="flex items-center gap-3 w-full"> <div class="flex items-center gap-3 w-full">
@@ -66,10 +75,12 @@
@if (isset($daftar_pustaka)) @if (isset($daftar_pustaka))
@foreach ($daftar_pustaka as $item) @foreach ($daftar_pustaka as $item)
<div class="card border shadow-none "> <div class="card border shadow-none ">
<a class="show-pustaka h-[300px] w-full block" href="{{ route('daftar-pustaka.show', $item->id) }}" <a class="show-pustaka h-[300px] bg-gray-200 w-full block" href="{{ route('daftar-pustaka.show', $item->id) }}"
data-url="{{ $item->attachment }}"> data-url="{{ $item->attachment }}">
<div class="p-4 h-full w-full flex items-center justify-center overflow-hidden"> <div class="p-4 h-full w-full flex items-center justify-center overflow-hidden">
<div class="preview-content h-full w-full"></div> <div class=" text-red-500 flex items-center justify-center rounded">
<i class="ki-filled ki-document text-3xl"></i>
</div>
</div> </div>
</a> </a>
@@ -84,18 +95,18 @@
</p> </p>
</a> </a>
<div class="flex justify-between items-center gap-2.5 mt-2"> <div class="flex justify-between items-center gap-2.5 mt-2">
<p class="badge rounded-full badge-sm badge-outline badge-success text-xs text-gray-700"> <p class="badge rounded-full badge-xs badge-outline badge-success text-xs text-gray-700">
# {{ $item->category->name }}</p> # {{ $item->category->name }}</p>
@auth @auth
@if (auth()->user()->hasRole(['administrator', 'admin'])) @if (auth()->user()->hasRole(['administrator', 'admin']))
<div> <div>
<a class="btn btn-sm btn-danger" onclick="deleteData({{ $item->id }})"> <a class="btn btn-xs btn-danger" onclick="deleteData({{ $item->id }})">
<i class="ki-filled ki-trash"> <i class="ki-filled ki-trash">
</i> </i>
Hapus Hapus
</a> </a>
<a class="btn btn-sm btn-info" <a class="btn btn-xs btn-info"
href="{{ route('daftar-pustaka.edit', $item->id) }}"> href="{{ route('daftar-pustaka.edit', $item->id) }}">
<i class="ki-filled ki-pencil"> <i class="ki-filled ki-pencil">
</i> </i>
@@ -120,22 +131,24 @@
<div class="card-body flex items-center flex-wrap justify-between p-2 pe-5 gap-4.5"> <div class="card-body flex items-center flex-wrap justify-between p-2 pe-5 gap-4.5">
<div class="flex items-center gap-3.5"> <div class="flex items-center gap-3.5">
<div <div
class="kt-card flex items-center justify-center bg-accent/50 h-[70px] w-[90px] shadow-none"> class="card bg-gray-200 flex items-center justify-center bg-accent/50 h-[70px] w-[90px] shadow-none">
<a class="show-pustaka h-[90px] w-full block" <a class="show-pustaka h-[90px] w-full block"
href="{{ route('daftar-pustaka.show', $item->id) }}" href="{{ route('daftar-pustaka.show', $item->id) }}"
data-url="{{ $item->attachment }}"> data-url="{{ $item->attachment }}">
<div class="p-4 h-full w-full flex items-center justify-center overflow-hidden"> <div class="p-4 h-full w-full flex items-center justify-center overflow-hidden">
<div class="preview-content h-full w-full"></div> <div class=" text-red-500 flex items-center justify-center rounded">
<i class="ki-filled ki-document text-3xl"></i>
</div>
</div> </div>
</a> </a>
</div> </div>
<a href="{{ route('daftar-pustaka.show', $item->id) }}">
<div class="flex flex-col gap-2 cursor-pointer"> <div class="flex flex-col gap-2 cursor-pointer">
<a href="{{ route('daftar-pustaka.show', $item->id) }}">
<div class="flex items-center mt-1"> <div class="flex items-center mt-1">
<a class="hover:text-primary text-sm font-medium text-mono leading-5.5"> <a class="hover:text-primary text-sm font-medium text-mono leading-5.5">
{{ $item->judul }} {{ $item->judul }}
</a> </div>
</div> </a>
<div class="flex items-center flex-wrap gap-3"> <div class="flex items-center flex-wrap gap-3">
<span class="kt-badge kt-badge-warning kt-badge-sm rounded-full gap-1"> <span class="kt-badge kt-badge-warning kt-badge-sm rounded-full gap-1">
<span class="text-xs font-medium text-foreground"> <span class="text-xs font-medium text-foreground">
@@ -144,8 +157,8 @@
</span> </span>
</div> </div>
</a> </div>
</div> </a>
</div> </div>
<div class="flex items-center gap-1.5"> <div class="flex items-center gap-1.5">
<p class="badge rounded-full badge-sm badge-outline badge-success text-xs text-gray-700"> <p class="badge rounded-full badge-sm badge-outline badge-success text-xs text-gray-700">
@@ -202,7 +215,6 @@
@endsection @endsection
@push('scripts') @push('scripts')
<script src="{{ asset('vendor/pdfobject.min.js') }}"></script>
<script type="text/javascript"> <script type="text/javascript">
function deleteData(data) { function deleteData(data) {
Swal.fire({ Swal.fire({
@@ -236,30 +248,7 @@
} }
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.show-pustaka').forEach(function(element) {
const url = element.getAttribute('data-url');
const previewContent = element.querySelector('.preview-content');
if (!previewContent || !url) return;
const fileExtension = url.split('.').pop().toLowerCase();
if (fileExtension === 'pdf') {
PDFObject.embed(url, previewContent, {
height: "100%",
width: "100%"
});
} else if (['jpg', 'jpeg', 'png', 'gif'].includes(fileExtension)) {
previewContent.innerHTML = `
<img src="${url}" alt="Preview"
class="w-full h-full object-cover rounded" />
`;
} else {
previewContent.innerHTML = '<p class="text-center">Unsupported file type</p>';
}
});
});
function showGrid() { function showGrid() {
document.getElementById("daftar_pustaka_grid").classList.remove("hidden"); document.getElementById("daftar_pustaka_grid").classList.remove("hidden");

View File

@@ -1,71 +1,165 @@
@extends('layouts.main') @extends('layouts.main')
@section('breadcrumbs') @section('breadcrumbs')
{{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}}
@endsection @endsection
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<form
<form action="{{ isset($daftarPustaka->id) ? route('daftar-pustaka.update', $daftarPustaka->id) : route('daftar-pustaka.store') }}"
action="{{ isset($daftarPustaka->id) ? route('daftar-pustaka.update', $daftarPustaka->id) : route('daftar-pustaka.store') }}" method="POST">
method="POST"> @csrf
@csrf <div class="card border border-agi-100 pb-2.5">
<div class="card border border-agi-100 pb-2.5"> <div class="card-header bg-agi-50" id="basic_settings">
<div class="card-header bg-agi-50" id="basic_settings"> <h3 class="card-title">
<h3 class="card-title"> {{ $daftarPustaka->judul ?? '' }}
{{ $daftarPustaka->judul ?? '' }} </h3>
</h3> <div class="flex items-center gap-2">
<div class="flex items-center gap-2"> <a href="{{ route('daftar-pustaka.index') }}" class="btn btn-xs btn-info">
<a href="{{ route('daftar-pustaka.index') }}" class="btn btn-xs btn-info"><i <i class="ki-filled ki-exit-left"></i> Back
class="ki-filled ki-exit-left"></i> Back</a> </a>
</div>
</div>
<div class="card-body grid gap-5">
<div
class=" min-w-3xl w-[1280px] h-[768px]">
<div class="p-4 h-full flex flex-col">
<div class="flex justify-between items-center mb-4">
<button type="button" id="downloadBtn" class="btn btn-primary btn-sm">
<i class="ki-duotone ki-cloud-download me-1"><span class="path1"></span><span
class="path2"></span></i>
Download File
</button>
</div>
<div id="previewContent" class="flex-grow"></div>
</div>
</div>
<div class="border border-t">
</div>
<div>
{{ $daftarPustaka->deskripsi ?? '' }}
</div>
</div> </div>
</div> </div>
</form> <div class="card-body grid gap-5">
</div> <div class="min-w-3xl">
<div class="p-4 h-full flex flex-col">
<div class="flex justify-between items-center mb-4">
<a href="{{ asset('storage/' . $daftarPustaka->attachment) }}" class="btn btn-primary btn-sm">
<i class="ki-duotone ki-cloud-download me-1"></i>
Download File
</a>
</div>
@php
$fileExtension = pathinfo($daftarPustaka->attachment, PATHINFO_EXTENSION);
$isPdf = strtolower($fileExtension) == 'pdf';
$imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
$isImage = in_array(strtolower($fileExtension), $imageExtensions);
$fileUrl = asset('storage/' . $daftarPustaka->attachment);
@endphp
@if ($isPdf)
<canvas id="pdfViewer" class="w-full border rounded touch-pan-y"></canvas>
<div class="flex justify-center gap-3 mt-3">
<button type="button" id="prevPage" class="btn btn-primary btn-sm">Previous</button>
<span>Page: <span id="pageNum">1</span> / <span id="pageCount">0</span></span>
<button type="button" id="nextPage" class="btn btn-primary btn-sm">Next</button>
</div>
@elseif ($isImage)
<img src="{{ $fileUrl }}" class="w-full object-contain rounded" />
@else
<p class="text-red-500">File tidak bisa ditampilkan, silakan
<a href="{{ $fileUrl }}" class="text-blue-500 underline" download>unduh di sini</a>.
</p>
@endif
</div>
</div>
<div class="border border-t"></div>
<div>
{{ $daftarPustaka->deskripsi ?? '' }}
</div>
</div>
</div>
</form>
</div>
@endsection @endsection
@push('scripts') @push('scripts')
<script src="{{ asset('vendor/pdfobject.min.js') }}"></script> <!-- PDF.js CDN -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const url = @json($fileUrl);
<script> if (url.endsWith('.pdf')) {
document.addEventListener('DOMContentLoaded', function() { const pdfjsLib = window['pdfjs-dist/build/pdf'];
let url = @json($daftarPustaka->attachment); pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';
console.log(url);
const fileExtension = url.split('.').pop().toLowerCase(); let pdfDoc = null;
const previewContent = document.getElementById('previewContent'); let pageNum = 1;
let pageRendering = false;
let pageNumPending = null;
const scale = 1.3;
const canvas = document.getElementById('pdfViewer');
const ctx = canvas.getContext('2d');
if (['pdf'].includes(fileExtension)) { function renderPage(num) {
PDFObject.embed(url, "#previewContent"); pageRendering = true;
} else if (['jpg', 'jpeg', 'png', 'gif'].includes(fileExtension)) { pdfDoc.getPage(num).then(function (page) {
previewContent.innerHTML = const viewport = page.getViewport({ scale: scale });
`<img src="${url}" alt="Preview" class="max-w-full max-h-full object-contain">`; canvas.height = viewport.height;
canvas.width = viewport.width;
const renderContext = {
canvasContext: ctx,
viewport: viewport
};
const renderTask = page.render(renderContext);
renderTask.promise.then(function () {
pageRendering = false;
document.getElementById('pageNum').textContent = num;
if (pageNumPending !== null) {
renderPage(pageNumPending);
pageNumPending = null;
}
});
});
}
function queueRenderPage(num) {
if (pageRendering) {
pageNumPending = num;
} else { } else {
previewContent.innerHTML = '<p class="text-center">Unsupported file type</p>'; renderPage(num);
} }
}
function onPrevPage() {
if (pageNum <= 1) return;
pageNum--;
queueRenderPage(pageNum);
}
function onNextPage() {
if (pageNum >= pdfDoc.numPages) return;
pageNum++;
queueRenderPage(pageNum);
}
document.getElementById('prevPage').addEventListener('click', onPrevPage);
document.getElementById('nextPage').addEventListener('click', onNextPage);
// Swipe gesture
let touchStartX = 0;
let touchEndX = 0;
canvas.addEventListener('touchstart', function (e) {
touchStartX = e.changedTouches[0].screenX;
}); });
</script>
canvas.addEventListener('touchend', function (e) {
touchEndX = e.changedTouches[0].screenX;
handleSwipe();
});
function handleSwipe() {
const swipeThreshold = 50; // min distance for swipe
if (touchEndX < touchStartX - swipeThreshold) {
onNextPage();
} else if (touchEndX > touchStartX + swipeThreshold) {
onPrevPage();
}
}
pdfjsLib.getDocument(url).promise.then(function (pdfDoc_) {
pdfDoc = pdfDoc_;
document.getElementById('pageCount').textContent = pdfDoc.numPages;
renderPage(pageNum);
});
}
});
</script>
@endpush @endpush

View File

@@ -44,15 +44,6 @@
@endforeach @endforeach
</select> </select>
</div> </div>
<div class="flex flex-col">
<label class="text-base font-medium mb-1">Penilai</label>
<select class="select tomselect" id="penilai_filter">
<option value="">Semua Penilai</option>
@foreach(\MOdules\Usermanagement\Models\User::role(['penilai','surveyor'])->get() as $penilai)
<option value="{{ $penilai->id }}">{{ $penilai->name }}</option>
@endforeach
</select>
</div>
</div> </div>
<!-- Buttons row at the bottom --> <!-- Buttons row at the bottom -->
@@ -73,7 +64,7 @@
<div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="laporan-hasil-penilaian-jaminan-internal-external-table" data-api-url="{{ route('laporan-hasil-penilaian-jaminan-internal-external.data') }}"> <div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="laporan-hasil-penilaian-jaminan-internal-external-table" data-api-url="{{ route('laporan-hasil-penilaian-jaminan-internal-external.data') }}">
<div class="card-header bg-agi-50 py-5 flex-wrap"> <div class="card-header bg-agi-50 py-5 flex-wrap">
<h3 class="card-title"> <h3 class="card-title">
Laporan Hasil Penilaian Jaminan Internal & External Rekap Penyelesaian External
</h3> </h3>
</div> </div>
@@ -89,130 +80,53 @@
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span> <span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_permohonan">
<span class="sort"> <span class="sort-label"> Tanggal Permohonan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="branch"> <th class="min-w-[150px]" data-datatable-column="branch">
<span class="sort"> <span class="sort-label"> Cabang </span> <span class="sort"> <span class="sort-label"> Cabang </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="pemohon"> <th class="min-w-[150px]" data-datatable-column="name">
<span class="sort"> <span class="sort-label"> Pemohon </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="cif">
<span class="sort"> <span class="sort-label"> CIF </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"> Nama Debitur </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_permohonan">
<span class="sort"> <span class="sort-label"> Tanggal KSL </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="pemohon">
<span class="sort"> <span class="sort-label"> Nomor KSL </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="cif">
<span class="sort"> <span class="sort-label"> Nominal KSL </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jenis_penilaian"> <th class="min-w-[150px]" data-datatable-column="jenis_penilaian">
<span class="sort"> <span class="sort-label"> Jenis Penilaian </span> <span class="sort"> <span class="sort-label">Tanggal Penyelesaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian"> <th class="min-w-[150px]" data-datatable-column="tujuan_penilaian">
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span> <span class="sort"> <span class="sort-label"> Nominal Penyelesaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="jenis_fasilitas_kredit"> <th class="min-w-[150px]" data-datatable-column="jenis_fasilitas_kredit">
<span class="sort"> <span class="sort-label"> Jenis Fasilitas Kredit </span> <span class="sort"> <span class="sort-label"> No. Rekening (Tujuan Akhir) </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jenis_fasilitas_kredit">
<span class="sort"> <span class="sort-label"> Sisa KSL </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="jenis_agunan"> <th class="min-w-[150px]" data-datatable-column="jenis_agunan">
<span class="sort"> <span class="sort-label"> Jenis Agunan </span> <span class="sort"> <span class="sort-label"> Memo </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="alamat_agunan"> <th class="min-w-[150px]" data-datatable-column="alamat_agunan">
<span class="sort"> <span class="sort-label"> Alamat Agunan </span> <span class="sort"> <span class="sort-label"> Status</span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="bukti_kepemilikan">
<span class="sort"> <span class="sort-label"> Bukti Kepemilikan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_pemilik">
<span class="sort"> <span class="sort-label"> Nama Pemilik </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="luas_tanah">
<span class="sort"> <span class="sort-label"> Luas Tanah </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_tanah">
<span class="sort"> <span class="sort-label"> Nilai Tanah </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="luas_bangunan">
<span class="sort"> <span class="sort-label"> Luas Bangunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_bangunan">
<span class="sort"> <span class="sort-label"> Nilai Bangunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_njop">
<span class="sort"> <span class="sort-label"> Nilai NJOP </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_pasar_wajar">
<span class="sort"> <span class="sort-label"> Nilai Pasar Wajar </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_likuidasi">
<span class="sort"> <span class="sort-label"> Nilai Likuidasi </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_documen_diterima">
<span class="sort"> <span class="sort-label"> Tanggal Dokumen Diterima </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_spk">
<span class="sort"> <span class="sort-label"> Tanggal SPK </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nomor_spk">
<span class="sort"> <span class="sort-label"> Nomor SPK </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_rencana_kunjunagn">
<span class="sort"> <span class="sort-label"> Tanggal Rencana Kunjungan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_kunjungan">
<span class="sort"> <span class="sort-label"> Tanggal Kunjungan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="taggal_delivered">
<span class="sort"> <span class="sort-label"> Tanggal Delivered </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jangka_waktu_sla">
<span class="sort"> <span class="sort-label"> Jangka Waktu SLA </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_laporan">
<span class="sort"> <span class="sort-label"> Tanggal Laporan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_review">
<span class="sort"> <span class="sort-label"> Tanggal Review </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_penilai">
<span class="sort"> <span class="sort-label"> Nama Penilai </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_team_leader">
<span class="sort"> <span class="sort-label"> Nama Team Leader </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="saran">
<span class="sort"> <span class="sort-label"> Saran </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="catatan"> <th class="min-w-[150px]" data-datatable-column="catatan">
<span class="sort"> <span class="sort-label"> Catatan </span> <span class="sort"> <span class="sort-label"> Catatan </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
@@ -266,144 +180,41 @@
nomor_registrasi: { nomor_registrasi: {
title: 'Nomor Registrasi', title: 'Nomor Registrasi',
}, },
tanggal_permohonan: { branch: {
title: 'Cabang',
},
name: {
title: 'Nama Debitur',
},
tanggal_ksl: {
title: 'Tanggal Permohonan', title: 'Tanggal Permohonan',
render: (item, data) => { render: (item, data) => {
return data.tanggal_permohonan ? window.formatTanggalIndonesia(data.tanggal_permohonan) : '-'; return data.tanggal_permohonan ? window.formatTanggalIndonesia(data.tanggal_permohonan) : '-';
}, },
}, },
branch: { nomor_ksl: {
title: 'Cabang',
},
pemohon: {
title: 'Pemohon',
},
cif: {
title: 'CIF', title: 'CIF',
}, },
name: { nominal_ksl: {
title: 'Nama Debitur',
},
jenis_penilaian: {
title: 'Jenis Penilaian', title: 'Jenis Penilaian',
}, },
tujuan_penilaian: { tanggal_penyelesaian: {
title: 'Tujuan Penilaian', title: 'Tujuan Penilaian',
}, },
jenis_fasilitas_kredit: { nominal_penyelesaian: {
title: 'Jenis Fasilitas Kredit', title: 'Jenis Fasilitas Kredit',
}, },
jenis_agunan: { nomor_rekening: {
title: 'Nomor Rekening',
},
sisa_ksl: {
title: 'Jenis Agunan', title: 'Jenis Agunan',
}, },
alamat_agunan: { memo: {
title: 'Alamat Agunan', title: 'Memo',
}, },
bukti_kepemilikan: { status: {
title: 'Bukti Kepemilikan', title: 'Status',
render: (item, data) => {
if (data.bukti_kepemilikan) {
// Ganti karakter baris baru dengan tag <br> untuk HTML
return data.bukti_kepemilikan.split('\n').join('<br>');
}
return '-';
},
},
nama_pemilik: {
title: 'Nama Pemilik',
},
luas_tanah: {
title: 'Luas Tanah',
},
nilai_tanah: {
title: 'Nilai Tanah',
render: (item, data) => {
return data.nilai_tanah ?? '-';
},
},
luas_bangunan: {
title: 'Luas Bangunan',
},
nilai_bangunan: {
title: 'Nilai Bangunan',
render: (item, data) => {
return data.nilai_bangunan ?? '-';
},
},
nilai_njop: {
title: 'Nilai NJOP',
render: (item, data) => {
return data.nilai_njop ?? '-';
},
},
nilai_pasar_wajar: {
title: 'Nilai Pasar Wajar',
render: (item, data) => {
return data.nilai_pasar_wajar ?? '-';
},
},
nilai_likuidasi: {
title: 'Nilai Likuidasi',
render: (item, data) => {
return data.nilai_likuidasi ?? '-';
},
},
tanggal_documen_diterima: {
title: 'Tanggal Dokumen Diterima',
render: (item, data) => {
return data.tanggal_documen_diterima ? window.formatTanggalIndonesia(data.tanggal_documen_diterima) : '-';
},
},
tanggal_spk: {
title: 'Tanggal SPK',
render: (item, data) => {
return data.tanggal_spk ? window.formatTanggalIndonesia(data.tanggal_spk) : '-';
},
},
nomor_spk: {
title: 'Nomor SPK',
},
tanggal_rencana_kunjunagn: {
title: 'Tanggal Rencana Kunjungan',
render: (item, data) => {
return data.tanggal_rencana_kunjunagn ? window.formatTanggalIndonesia(data.tanggal_rencana_kunjunagn) : '-';
},
},
tanggal_kunjungan: {
title: 'Tanggal Kunjungan',
render: (item, data) => {
return data.tanggal_kunjungan ? window.formatTanggalIndonesia(data.tanggal_kunjungan) : '-';
},
},
taggal_delivered: {
title: 'Tanggal Delivered',
render: (item, data) => {
return data.taggal_delivered ? window.formatTanggalIndonesia(data.taggal_delivered) : '-';
},
},
jangka_waktu_sla: {
title: 'Jangka Waktu SLA',
},
tanggal_laporan: {
title: 'Tanggal Laporan',
render: (item, data) => {
return data.tanggal_laporan ? window.formatTanggalIndonesia(data.tanggal_laporan) : '-';
},
},
tanggal_review: {
title: 'Tanggal Review',
render: (item, data) => {
return data.tanggal_review ? window.formatTanggalIndonesia(data.tanggal_review) : '-';
},
},
nama_penilai: {
title: 'Nama Penilai',
},
nama_team_leader: {
title: 'Nama Team Leader',
},
saran: {
title: 'Saran',
}, },
catatan: { catatan: {
title: 'Catatan', title: 'Catatan',

View File

@@ -44,15 +44,7 @@
@endforeach @endforeach
</select> </select>
</div> </div>
<div class="flex flex-col">
<label class="text-base font-medium mb-1">Penilai</label>
<select class="select tomselect" id="penilai_filter">
<option value="">Semua Penilai</option>
@foreach(\MOdules\Usermanagement\Models\User::role(['penilai','surveyor'])->get() as $penilai)
<option value="{{ $penilai->id }}">{{ $penilai->name }}</option>
@endforeach
</select>
</div>
</div> </div>
<!-- Buttons row at the bottom --> <!-- Buttons row at the bottom -->
@@ -73,7 +65,7 @@
<div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="laporan-hasil-penilaian-jaminan-internal-external-table" data-api-url="{{ route('laporan-hasil-penilaian-jaminan-internal-external.data') }}"> <div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="laporan-hasil-penilaian-jaminan-internal-external-table" data-api-url="{{ route('laporan-hasil-penilaian-jaminan-internal-external.data') }}">
<div class="card-header bg-agi-50 py-5 flex-wrap"> <div class="card-header bg-agi-50 py-5 flex-wrap">
<h3 class="card-title"> <h3 class="card-title">
Laporan Hasil Penilaian Jaminan Internal & External Rekap Penyelesaian Internal
</h3> </h3>
</div> </div>
@@ -81,7 +73,7 @@
<div class="scrollable-x-auto"> <div class="scrollable-x-auto">
<table class="table table-auto table-border align-middle text-gray-700 font-medium text-sm" data-datatable-table="true"> <table class="table table-auto table-border align-middle text-gray-700 font-medium text-sm" data-datatable-table="true">
<thead> <thead>
<tr> <tr>
<th class="w-14"> <th class="w-14">
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/> <input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/>
</th> </th>
@@ -89,130 +81,49 @@
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span> <span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_permohonan">
<span class="sort"> <span class="sort-label"> Tanggal Permohonan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="branch"> <th class="min-w-[150px]" data-datatable-column="branch">
<span class="sort"> <span class="sort-label"> Cabang </span> <span class="sort"> <span class="sort-label"> Cabang </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="pemohon"> <th class="min-w-[150px]" data-datatable-column="name">
<span class="sort"> <span class="sort-label"> Pemohon </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="cif">
<span class="sort"> <span class="sort-label"> CIF </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"> Nama Debitur </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_permohonan">
<span class="sort"> <span class="sort-label"> Tanggal KSL </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="pemohon">
<span class="sort"> <span class="sort-label"> Nomor KSL </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="cif">
<span class="sort"> <span class="sort-label"> Nominal KSL </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jenis_penilaian"> <th class="min-w-[150px]" data-datatable-column="jenis_penilaian">
<span class="sort"> <span class="sort-label"> Jenis Penilaian </span> <span class="sort"> <span class="sort-label">Tanggal Penyelesaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian"> <th class="min-w-[150px]" data-datatable-column="tujuan_penilaian">
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span> <span class="sort"> <span class="sort-label"> Nominal Penyelesaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="jenis_fasilitas_kredit"> <th class="min-w-[150px]" data-datatable-column="jenis_fasilitas_kredit">
<span class="sort"> <span class="sort-label"> Jenis Fasilitas Kredit </span> <span class="sort"> <span class="sort-label"> Sisa KSL </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="jenis_agunan"> <th class="min-w-[150px]" data-datatable-column="jenis_agunan">
<span class="sort"> <span class="sort-label"> Jenis Agunan </span> <span class="sort"> <span class="sort-label"> Memo </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="alamat_agunan"> <th class="min-w-[150px]" data-datatable-column="alamat_agunan">
<span class="sort"> <span class="sort-label"> Alamat Agunan </span> <span class="sort"> <span class="sort-label"> Status</span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="bukti_kepemilikan">
<span class="sort"> <span class="sort-label"> Bukti Kepemilikan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_pemilik">
<span class="sort"> <span class="sort-label"> Nama Pemilik </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="luas_tanah">
<span class="sort"> <span class="sort-label"> Luas Tanah </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_tanah">
<span class="sort"> <span class="sort-label"> Nilai Tanah </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="luas_bangunan">
<span class="sort"> <span class="sort-label"> Luas Bangunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_bangunan">
<span class="sort"> <span class="sort-label"> Nilai Bangunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_njop">
<span class="sort"> <span class="sort-label"> Nilai NJOP </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_pasar_wajar">
<span class="sort"> <span class="sort-label"> Nilai Pasar Wajar </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_likuidasi">
<span class="sort"> <span class="sort-label"> Nilai Likuidasi </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_documen_diterima">
<span class="sort"> <span class="sort-label"> Tanggal Dokumen Diterima </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_spk">
<span class="sort"> <span class="sort-label"> Tanggal SPK </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nomor_spk">
<span class="sort"> <span class="sort-label"> Nomor SPK </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_rencana_kunjunagn">
<span class="sort"> <span class="sort-label"> Tanggal Rencana Kunjungan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_kunjungan">
<span class="sort"> <span class="sort-label"> Tanggal Kunjungan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="taggal_delivered">
<span class="sort"> <span class="sort-label"> Tanggal Delivered </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jangka_waktu_sla">
<span class="sort"> <span class="sort-label"> Jangka Waktu SLA </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_laporan">
<span class="sort"> <span class="sort-label"> Tanggal Laporan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_review">
<span class="sort"> <span class="sort-label"> Tanggal Review </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_penilai">
<span class="sort"> <span class="sort-label"> Nama Penilai </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_team_leader">
<span class="sort"> <span class="sort-label"> Nama Team Leader </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="saran">
<span class="sort"> <span class="sort-label"> Saran </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="catatan"> <th class="min-w-[150px]" data-datatable-column="catatan">
<span class="sort"> <span class="sort-label"> Catatan </span> <span class="sort"> <span class="sort-label"> Catatan </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
@@ -266,144 +177,38 @@
nomor_registrasi: { nomor_registrasi: {
title: 'Nomor Registrasi', title: 'Nomor Registrasi',
}, },
tanggal_permohonan: { branch: {
title: 'Cabang',
},
name: {
title: 'Nama Debitur',
},
tanggal_ksl: {
title: 'Tanggal Permohonan', title: 'Tanggal Permohonan',
render: (item, data) => { render: (item, data) => {
return data.tanggal_permohonan ? window.formatTanggalIndonesia(data.tanggal_permohonan) : '-'; return data.tanggal_permohonan ? window.formatTanggalIndonesia(data.tanggal_permohonan) : '-';
}, },
}, },
branch: { nomor_ksl: {
title: 'Cabang',
},
pemohon: {
title: 'Pemohon',
},
cif: {
title: 'CIF', title: 'CIF',
}, },
name: { nominal_ksl: {
title: 'Nama Debitur',
},
jenis_penilaian: {
title: 'Jenis Penilaian', title: 'Jenis Penilaian',
}, },
tujuan_penilaian: { tanggal_penyelesaian: {
title: 'Tujuan Penilaian', title: 'Tujuan Penilaian',
}, },
jenis_fasilitas_kredit: { nominal_penyelesaian: {
title: 'Jenis Fasilitas Kredit', title: 'Jenis Fasilitas Kredit',
}, },
jenis_agunan: { sisa_ksl: {
title: 'Jenis Agunan', title: 'Jenis Agunan',
}, },
alamat_agunan: { memo: {
title: 'Alamat Agunan', title: 'Memo',
}, },
bukti_kepemilikan: { status: {
title: 'Bukti Kepemilikan', title: 'Status',
render: (item, data) => {
if (data.bukti_kepemilikan) {
// Ganti karakter baris baru dengan tag <br> untuk HTML
return data.bukti_kepemilikan.split('\n').join('<br>');
}
return '-';
},
},
nama_pemilik: {
title: 'Nama Pemilik',
},
luas_tanah: {
title: 'Luas Tanah',
},
nilai_tanah: {
title: 'Nilai Tanah',
render: (item, data) => {
return data.nilai_tanah ?? '-';
},
},
luas_bangunan: {
title: 'Luas Bangunan',
},
nilai_bangunan: {
title: 'Nilai Bangunan',
render: (item, data) => {
return data.nilai_bangunan ?? '-';
},
},
nilai_njop: {
title: 'Nilai NJOP',
render: (item, data) => {
return data.nilai_njop ?? '-';
},
},
nilai_pasar_wajar: {
title: 'Nilai Pasar Wajar',
render: (item, data) => {
return data.nilai_pasar_wajar ?? '-';
},
},
nilai_likuidasi: {
title: 'Nilai Likuidasi',
render: (item, data) => {
return data.nilai_likuidasi ?? '-';
},
},
tanggal_documen_diterima: {
title: 'Tanggal Dokumen Diterima',
render: (item, data) => {
return data.tanggal_documen_diterima ? window.formatTanggalIndonesia(data.tanggal_documen_diterima) : '-';
},
},
tanggal_spk: {
title: 'Tanggal SPK',
render: (item, data) => {
return data.tanggal_spk ? window.formatTanggalIndonesia(data.tanggal_spk) : '-';
},
},
nomor_spk: {
title: 'Nomor SPK',
},
tanggal_rencana_kunjunagn: {
title: 'Tanggal Rencana Kunjungan',
render: (item, data) => {
return data.tanggal_rencana_kunjunagn ? window.formatTanggalIndonesia(data.tanggal_rencana_kunjunagn) : '-';
},
},
tanggal_kunjungan: {
title: 'Tanggal Kunjungan',
render: (item, data) => {
return data.tanggal_kunjungan ? window.formatTanggalIndonesia(data.tanggal_kunjungan) : '-';
},
},
taggal_delivered: {
title: 'Tanggal Delivered',
render: (item, data) => {
return data.taggal_delivered ? window.formatTanggalIndonesia(data.taggal_delivered) : '-';
},
},
jangka_waktu_sla: {
title: 'Jangka Waktu SLA',
},
tanggal_laporan: {
title: 'Tanggal Laporan',
render: (item, data) => {
return data.tanggal_laporan ? window.formatTanggalIndonesia(data.tanggal_laporan) : '-';
},
},
tanggal_review: {
title: 'Tanggal Review',
render: (item, data) => {
return data.tanggal_review ? window.formatTanggalIndonesia(data.tanggal_review) : '-';
},
},
nama_penilai: {
title: 'Nama Penilai',
},
nama_team_leader: {
title: 'Nama Team Leader',
},
saran: {
title: 'Saran',
}, },
catatan: { catatan: {
title: 'Catatan', title: 'Catatan',

View File

@@ -35,21 +35,19 @@
<thead> <thead>
<tr> <tr>
<th class="min-w-[100px]">Nama Debitur</th> <th class="min-w-[100px]">Nama Debitur</th>
<th class="min-w-[100px]">Tujuan Penilaian</th> <th class="min-w-[100px]">Cabang</th>
<th class="min-w-[100px]">Status Bayar</th> <th class="min-w-[100px]">Lokasi Jaminan</th>
<th class="min-w-[100px]">Jenis Asset</th> <th class="min-w-[100px]">TUjuan Penilaian</th>
<th class="min-w-[100px]">Penugasan</th>
<th class="min-w-[100px]">Jenis Report</th>
<th class="min-w-[100px]">Tgl Register</th>
<th class="min-w-[100px]">Tgl Assign</th>
<th class="min-w-[100px]">Tgl Kunjungan</th> <th class="min-w-[100px]">Tgl Kunjungan</th>
<th class="min-w-[100px]">Tgl Reported</th> <th class="min-w-[100px]">Tgl Lpj Done</th>
<th class="min-w-[100px]">Progress</th> <th class="min-w-[100px]">SLA Buku Kjpp</th>
<th class="min-w-[100px]">SLA Laporan</th> <th class="min-w-[100px]">Status</th>
<th class="min-w-[100px]">SLA Paparan</th> <th class="min-w-[100px]">Poin</th>
<th class="min-w-[100px]">Approve</th> <th class="min-w-[100px]">SLA INTERNAL</th>
<th class="min-w-[100px]">SLA PENDAMPINGAN KJPP</th>
<th class="min-w-[100px]">Absensi</th>
<th class="min-w-[100px]">Zabtu</th>
<th class="min-w-[50px] text-center">Keterangan</th> <th class="min-w-[50px] text-center">Keterangan</th>
<th class="min-w-[50px] text-center">Action</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -189,20 +187,7 @@
return `${window.formatTanggalIndonesia(data.paparan)}`; return `${window.formatTanggalIndonesia(data.paparan)}`;
} }
}, },
approve: {
title: 'Approve',
render: (item, data) => {
// Gabungkan nama dengan <br> untuk pemisah baris baru
let dataHtml = `
${data.permohonan?.approve_so?.name || ''}
<br>
${data.permohonan?.approve_eo?.name || ''}
<br>
${data.permohonan?.approve_dd?.name || ''}
`;
return dataHtml;
},
},
keterangan: { keterangan: {

View File

@@ -219,7 +219,8 @@
@push('scripts') @push('scripts')
<script type="module"> <script type="module">
const element = document.querySelector('#laporan-penilai-jaminan-table'); const element = document.querySelector('#laporan-penilai-jaminan-table');
const searchInput = document.getElementById('search');;
const searchInput = document.getElementById('search');
const startDateInput = document.getElementById('start_date'); const startDateInput = document.getElementById('start_date');
const endDateInput = document.getElementById('end_date'); const endDateInput = document.getElementById('end_date');
const branchFilter = document.getElementById('branch_filter'); const branchFilter = document.getElementById('branch_filter');
@@ -227,7 +228,6 @@
const filterTanggalButton = document.getElementById('filter_tanggal'); const filterTanggalButton = document.getElementById('filter_tanggal');
const exportButton = document.getElementById('export-btn'); const exportButton = document.getElementById('export-btn');
const selectAllCheckbox = document.getElementById('check-all'); const selectAllCheckbox = document.getElementById('check-all');
const statusCheckboxes = document.querySelectorAll('.status-checkbox'); const statusCheckboxes = document.querySelectorAll('.status-checkbox');
@@ -242,6 +242,11 @@
const exportType = document.getElementById('export_type'); const exportType = document.getElementById('export_type');
const exportSearch = document.getElementById('export_search'); const exportSearch = document.getElementById('export_search');
const apiUrl = element.getAttribute('data-api-url'); const apiUrl = element.getAttribute('data-api-url');
// Simple pagination state management
let currentPage = 1;
let isReturningFromDetail = false;
const dataTableOptions = { const dataTableOptions = {
apiEndpoint: apiUrl, apiEndpoint: apiUrl,
pageSize: 5, pageSize: 5,
@@ -293,7 +298,6 @@
return data.debiture && data.debiture.name ? `${data.debiture.name}` : '-'; return data.debiture && data.debiture.name ? `${data.debiture.name}` : '-';
}, },
}, },
tujuan_penilaian_id: { tujuan_penilaian_id: {
title: 'Tujuan Penilaian', title: 'Tujuan Penilaian',
render: (item, data) => { render: (item, data) => {
@@ -309,12 +313,10 @@
}).join(', '); }).join(', ');
}, },
}, },
laporan: { laporan: {
title: 'Status', title: 'Status',
render: (item, data) => { render: (item, data) => {
let badgeClass = ''; let badgeClass = '';
const statusLaporan = data.penilai?.type_penilai || '-'; const statusLaporan = data.penilai?.type_penilai || '-';
switch (statusLaporan.toLowerCase()) { switch (statusLaporan.toLowerCase()) {
@@ -343,7 +345,7 @@
actions: { actions: {
title: 'Action', title: 'Action',
render: (item, data) => { render: (item, data) => {
const status = data.status; // Anggap status berada di dalam objek data const status = data.status;
const dokumenjaminan = data.dokumenjaminan || []; const dokumenjaminan = data.dokumenjaminan || [];
return ` return `
@@ -352,29 +354,98 @@
['done'].includes(status) ? ['done'].includes(status) ?
dokumenjaminan.map(dokumen => { dokumenjaminan.map(dokumen => {
return ` return `
<a class="btn btn-sm btn-primary" href="surveyor/print-out-inspeksi/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}"> <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 <i class="ki-outline ki-printer"></i>Inspeksi
</a> </a>
<a class="btn btn-sm btn-info" href="laporan-penilai-jaminan/show/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}" > <a class="btn btn-sm btn-info detail-btn" href="laporan-penilai-jaminan/show/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}">
<i class="ki-filled ki-eye"></i>Lihat <i class="ki-filled ki-eye"></i>Lihat
</a> </a>
<a class="btn btn-sm btn-success" href="penilai/print-out-laporan/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}"> <a class="btn btn-sm btn-success" href="penilai/print-out-laporan/${data.id}/${dokumen.id}/${dokumen.jenis_jaminan_id}">
<i class="ki-filled ki-printer"></i>Laporan <i class="ki-filled ki-printer"></i>Laporan
</a> </a>
`;
`;
}).join('') : '' }).join('') : ''
} }
</div> </div>
`; `;
} }
} }
}, },
}; };
let dataTable = new KTDataTable(element, dataTableOptions); let dataTable = new KTDataTable(element, dataTableOptions);
const fromDetail = true;
if (fromDetail) {
isReturningFromDetail = true;
console.log('Returning from detail page');
// Remove the parameter from URL
window.history.replaceState({}, document.title, window.location.pathname);
setTimeout(() => {
restoreCurrentPage();
isReturningFromDetail = false;
}, 500);
}
function getCurrentPageFromDOM() {
const activePage = document.querySelector('.pagination .btn.active');
if (activePage) {
const pageText = activePage.textContent.trim();
const pageNum = parseInt(pageText);
return isNaN(pageNum) ? 1 : pageNum;
}
return 1;
}
function saveCurrentPage() {
const page = getCurrentPageFromDOM();
currentPage = page;
sessionStorage.setItem('currentTablePage', currentPage.toString());
}
function restoreCurrentPage() {
const savedPage = sessionStorage.getItem('currentTablePage');
if (savedPage && savedPage !== '1') {
currentPage = parseInt(savedPage);
console.log('Restoring to page:', currentPage);
// Use the goPage method to navigate to the saved page
dataTable.goPage(currentPage);
}
}
// Listen for pagination events to track current page
element.addEventListener('pagination', function(e) {
const page = e.detail.page;
currentPage = page;
console.log('Page changed to:', page);
});
// Alternative: Listen for pagination button clicks
document.addEventListener('click', function(e) {
if (e.target.matches('.pagination .btn') && !e.target.closest('.detail-btn')) {
setTimeout(() => {
currentPage = getCurrentPageFromDOM();
console.log('Current page updated to:', currentPage);
}, 100);
}
});
// Detail page redirection
document.addEventListener('click', function(e) {
if (e.target.closest('.detail-btn')) {
e.preventDefault();
// Save current page before navigating
const currentPageNum = getCurrentPageFromDOM();
currentPage = currentPageNum;
sessionStorage.setItem('currentTablePage', currentPage.toString());
console.log('Saving page before detail navigation:', currentPage);
const link = e.target.closest('.detail-btn');
const href = link.getAttribute('href');
window.location.href = href;
}
});
// Search functionality // Search functionality
searchInput.addEventListener('input', function() { searchInput.addEventListener('input', function() {
@@ -392,7 +463,6 @@
const branch = branchFilter.value; const branch = branchFilter.value;
const laporan = Array.from(laporanFilter.selectedOptions).map(option => option.value); const laporan = Array.from(laporanFilter.selectedOptions).map(option => option.value);
let filters = {}; let filters = {};
if (searchInput.value) { if (searchInput.value) {
filters.search = searchInput.value; filters.search = searchInput.value;
@@ -438,10 +508,8 @@
if (selectedStatuses.length === 0) { if (selectedStatuses.length === 0) {
dataTable.search(''); dataTable.search('');
console.log(selectedStatuses);
} else { } else {
dataTable.search(selectedStatuses.join(','), true); dataTable.search(selectedStatuses.join(','), true);
console.log(selectedStatuses);
} }
dataTable.reload(); dataTable.reload();
@@ -451,16 +519,13 @@
selectAllCheckbox.checked = allChecked; selectAllCheckbox.checked = allChecked;
} }
// Single export button functionality // Export functionality
exportButton.addEventListener('click', function(e) { exportButton.addEventListener('click', function(e) {
e.preventDefault(); e.preventDefault();
// Check if any rows are selected
const selectedIds = getSelectedRowIds(); const selectedIds = getSelectedRowIds();
// Determine export type based on context
if (selectedIds.length > 0) { if (selectedIds.length > 0) {
// If rows are selected, export those
exportData({ exportData({
selected_ids: selectedIds, selected_ids: selectedIds,
export_type: 'selected' export_type: 'selected'
@@ -476,14 +541,11 @@
export_type: 'filtered' export_type: 'filtered'
}); });
} else if (searchInput.value) { } else if (searchInput.value) {
// If only search is applied, export filtered results
exportData({ exportData({
search: searchInput.value, search: searchInput.value,
export_type: 'filtered' export_type: 'filtered'
}); });
} else { } else {
// If no selection and no filters, export all
exportData({ exportData({
export_type: 'all' export_type: 'all'
}); });
@@ -491,7 +553,6 @@
}); });
function exportData(filters = {}) { function exportData(filters = {}) {
// Set filter values in the hidden form
exportStartDate.value = filters.start_date || ''; exportStartDate.value = filters.start_date || '';
exportEndDate.value = filters.end_date || ''; exportEndDate.value = filters.end_date || '';
exportStatus.value = filters.status ? filters.status.join(',') : ''; exportStatus.value = filters.status ? filters.status.join(',') : '';
@@ -500,7 +561,6 @@
exportSelectedIds.value = filters.selected_ids ? filters.selected_ids.join(',') : ''; exportSelectedIds.value = filters.selected_ids ? filters.selected_ids.join(',') : '';
exportType.value = filters.export_type || 'all'; exportType.value = filters.export_type || 'all';
exportSearch.value = filters.search || ''; exportSearch.value = filters.search || '';
// Submit the form
exportForm.submit(); exportForm.submit();
} }
@@ -514,7 +574,12 @@
const checkboxes = document.querySelectorAll('[data-datatable-row-check="true"]:checked'); const checkboxes = document.querySelectorAll('[data-datatable-row-check="true"]:checked');
return Array.from(checkboxes).map(checkbox => checkbox.value); return Array.from(checkboxes).map(checkbox => checkbox.value);
} }
// Save page before leaving (only when not going to detail)
window.addEventListener('beforeunload', function() {
if (!isReturningFromDetail) {
saveCurrentPage();
}
});
</script> </script>
@endpush @endpush

View File

@@ -104,10 +104,6 @@
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span> <span class="sort"> <span class="sort-label"> Tujuan Penilaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="jenis_agunan">
<span class="sort"> <span class="sort-label"> Penilaian</span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_laporan"> <th class="min-w-[150px]" data-datatable-column="tanggal_laporan">
<span class="sort"> <span class="sort-label"> Tanggal Dokuemen </span> <span class="sort"> <span class="sort-label"> Tanggal Dokuemen </span>
@@ -199,20 +195,16 @@
tujuan_penilaian: { tujuan_penilaian: {
title: 'Tujuan Penilaian', title: 'Tujuan Penilaian',
}, },
jenis_agunan: {
title: 'Jenis Agunan',
},
tanggal_laporan: { tanggal_laporan: {
title: 'Tanggal Laporan', title: 'Tanggal Laporan',
render: (item, data) => { render: (item, data) => {
return data.tanggal_laporan ? window.formatTanggalIndonesia(data.tanggal_laporan) : '-'; return data.tanggal_laporan ? window.formatTanggalIndonesia(data.tanggal_laporan) : '-';
}, },
}, },
tanggal_review: { tanggal_approval: {
title: 'Tanggal Review', title: 'Tanggal Approval',
render: (item, data) => { render: (item, data) => {
return data.tanggal_review ? window.formatTanggalIndonesia(data.tanggal_review) : '-'; return data.tanggal_approval ? window.formatTanggalIndonesia(data.tanggal_approval) : '-';
}, },
}, },
tanggal_kunjungan: { tanggal_kunjungan: {
@@ -225,7 +217,7 @@
jangka_waktu: { jangka_waktu: {
title: 'Jangka Waktu', title: 'Jangka Waktu',
render: (item, data) => { render: (item, data) => {
return data.jangka_waktu ?? '3'; return data.jangka_waktu ?? '-';
}, },
}, },
keterangan: { keterangan: {

View File

@@ -6,63 +6,27 @@
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<!-- Filter Card -->
<div class="card border border-agi-100">
<div class="card-header bg-agi-50 py-5">
<h3 class="card-title"> Laporan User Pemohon</h3>
</div>
<div class="card-body grid gap-4">
<!-- Search field at the top, full width -->
<div class="flex flex-col w-full">
<label class="text-sm font-medium mb-1">Pencarian</label>
<label class="input input-sm">
<i class="ki-filled ki-magnifier"></i>
<input placeholder="Search Laporan User" id="search" type="text" value="">
</label>
</div>
<!-- Other filter fields in grid layout -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="flex flex-col">
<label class="text-base font-medium mb-1">Tanggal Awal</label>
<label class="input">
<input placeholder="Tanggal Awal" id="start_date" type="date">
</label>
</div>
<div class="flex flex-col">
<label class="text-base font-medium mb-1">Tanggal Akhir</label>
<label class="input">
<input placeholder="Tanggal Akhir" id="end_date" type="date">
</label>
</div>
<div class="flex flex-col">
<label class="text-base font-medium mb-1">User</label>
<select class="select tomselect" id="user_id" name="user_id">
</select>
</div>
</div>
<!-- Buttons row at the bottom -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-2">
<button class="btn btn-sm btn-primary" id="filter_tanggal">
<i class="ki-outline ki-filter fs-2 me-1"></i>
Terapkan Filter
</button>
<a class="btn btn-sm btn-light" href="{{ route('laporan-hasil-penilaian-jaminan-internal-external.export') }}" id="export-btn">
<i class="ki-outline ki-file-down fs-2 me-1"></i>
Export to Excel
</a>
</div>
</div>
</div>
<!-- Data Table Card --> <!-- Data Table Card -->
<div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="laporan-user-table" data-api-url="{{ route('laporan-user.datatables') }}"> <div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="laporan-user-table" data-api-url="{{ route('laporan-user.datatables') }}">
<div class="card-header bg-agi-50 py-5 flex-wrap"> <div class="card-header bg-agi-50 py-5 flex-wrap">
<h3 class="card-title"> <h3 class="card-title">
Laporan User Pemohon Laporan User
</h3> </h3>
<div class="flex flex-wrap gap-2 lg:gap-5">
<div class="flex flex-wrap gap-2 lg:gap-5">
<label class="input input-sm">
<i class="ki-filled ki-magnifier"></i>
<input placeholder="Search Laporan User" id="search" type="text" value="">
</label>
</div>
<a class="btn btn-sm btn-light" href="{{ route('laporan-user.export') }}" id="export-btn">
<i class="ki-outline ki-file-down fs-2 me-1"></i>
Export to Excel
</a>
</div>
</div> </div>
<div class="card-body"> <div class="card-body">
@@ -73,136 +37,20 @@
<th class="w-14"> <th class="w-14">
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/> <input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="nomor_registrasi"> <th class="min-w-[150px]" data-datatable-column="nik">
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span> <span class="sort"> <span class="sort-label"> NIK</span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_permohonan">
<span class="sort"> <span class="sort-label"> Tanggal Permohonan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="branch">
<span class="sort"> <span class="sort-label"> Cabang </span>
<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-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="cif">
<span class="sort"> <span class="sort-label"> CIF </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="name"> <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"> Nama User</span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="jenis_penilaian"> <th class="min-w-[150px]" data-datatable-column="level">
<span class="sort"> <span class="sort-label"> Jenis Penilaian </span> <span class="sort"> <span class="sort-label"> Level Group </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tujuan_penilaian"> <th class="min-w-[150px]" data-datatable-column="approval_limit">
<span class="sort"> <span class="sort-label"> Tujuan Penilaian </span> <span class="sort"> <span class="sort-label"> Approval Limit </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jenis_fasilitas_kredit">
<span class="sort"> <span class="sort-label"> Jenis Fasilitas Kredit </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jenis_agunan">
<span class="sort"> <span class="sort-label"> Jenis Agunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="alamat_agunan">
<span class="sort"> <span class="sort-label"> Alamat Agunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="bukti_kepemilikan">
<span class="sort"> <span class="sort-label"> Bukti Kepemilikan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_pemilik">
<span class="sort"> <span class="sort-label"> Nama Pemilik </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="luas_tanah">
<span class="sort"> <span class="sort-label"> Luas Tanah </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_tanah">
<span class="sort"> <span class="sort-label"> Nilai Tanah </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="luas_bangunan">
<span class="sort"> <span class="sort-label"> Luas Bangunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_bangunan">
<span class="sort"> <span class="sort-label"> Nilai Bangunan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_njop">
<span class="sort"> <span class="sort-label"> Nilai NJOP </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_pasar_wajar">
<span class="sort"> <span class="sort-label"> Nilai Pasar Wajar </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nilai_likuidasi">
<span class="sort"> <span class="sort-label"> Nilai Likuidasi </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_documen_diterima">
<span class="sort"> <span class="sort-label"> Tanggal Dokumen Diterima </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_spk">
<span class="sort"> <span class="sort-label"> Tanggal SPK </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nomor_spk">
<span class="sort"> <span class="sort-label"> Nomor SPK </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_rencana_kunjunagn">
<span class="sort"> <span class="sort-label"> Tanggal Rencana Kunjungan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_kunjungan">
<span class="sort"> <span class="sort-label"> Tanggal Kunjungan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="taggal_delivered">
<span class="sort"> <span class="sort-label"> Tanggal Delivered </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="jangka_waktu_sla">
<span class="sort"> <span class="sort-label"> Jangka Waktu SLA </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_laporan">
<span class="sort"> <span class="sort-label"> Tanggal Laporan </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="tanggal_review">
<span class="sort"> <span class="sort-label"> Tanggal Review </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_penilai">
<span class="sort"> <span class="sort-label"> Nama Penilai </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="nama_team_leader">
<span class="sort"> <span class="sort-label"> Nama Team Leader </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="saran">
<span class="sort"> <span class="sort-label"> Saran </span>
<span class="sort-icon"> </span> </span>
</th>
<th class="min-w-[150px]" data-datatable-column="catatan">
<span class="sort"> <span class="sort-label"> Catatan </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
</tr> </tr>
@@ -250,151 +98,21 @@
return checkbox.outerHTML.trim(); return checkbox.outerHTML.trim();
}, },
}, },
nomor_registrasi: { nik: {
title: 'Nomor Registrasi', title: 'Nomor Registrasi',
}, },
tanggal_permohonan: { name: {
title: 'Tanggal Permohonan', title: 'Nama',
},
level: {
title: 'level',
},
approval_limit: {
title: 'Approval Limit',
render: (item, data) => { render: (item, data) => {
return data.tanggal_permohonan ? window.formatTanggalIndonesia(data.tanggal_permohonan) : '-'; return data.tanggal_permohonan ? window.formatTanggalIndonesia(data.tanggal_permohonan) : '-';
}, },
}, },
branch: {
title: 'Cabang',
},
pemohon: {
title: 'Pemohon',
},
cif: {
title: 'CIF',
},
name: {
title: 'Nama Debitur',
},
jenis_penilaian: {
title: 'Jenis Penilaian',
},
tujuan_penilaian: {
title: 'Tujuan Penilaian',
},
jenis_fasilitas_kredit: {
title: 'Jenis Fasilitas Kredit',
},
jenis_agunan: {
title: 'Jenis Agunan',
},
alamat_agunan: {
title: 'Alamat Agunan',
},
bukti_kepemilikan: {
title: 'Bukti Kepemilikan',
render: (item, data) => {
if (data.bukti_kepemilikan) {
// Ganti karakter baris baru dengan tag <br> untuk HTML
return data.bukti_kepemilikan.split('\n').join('<br>');
}
return '-';
},
},
nama_pemilik: {
title: 'Nama Pemilik',
},
luas_tanah: {
title: 'Luas Tanah',
},
nilai_tanah: {
title: 'Nilai Tanah',
render: (item, data) => {
return data.nilai_tanah ?? '-';
},
},
luas_bangunan: {
title: 'Luas Bangunan',
},
nilai_bangunan: {
title: 'Nilai Bangunan',
render: (item, data) => {
return data.nilai_bangunan ?? '-';
},
},
nilai_njop: {
title: 'Nilai NJOP',
render: (item, data) => {
return data.nilai_njop ?? '-';
},
},
nilai_pasar_wajar: {
title: 'Nilai Pasar Wajar',
render: (item, data) => {
return data.nilai_pasar_wajar ?? '-';
},
},
nilai_likuidasi: {
title: 'Nilai Likuidasi',
render: (item, data) => {
return data.nilai_likuidasi ?? '-';
},
},
tanggal_documen_diterima: {
title: 'Tanggal Dokumen Diterima',
render: (item, data) => {
return data.tanggal_documen_diterima ? window.formatTanggalIndonesia(data.tanggal_documen_diterima) : '-';
},
},
tanggal_spk: {
title: 'Tanggal SPK',
render: (item, data) => {
return data.tanggal_spk ? window.formatTanggalIndonesia(data.tanggal_spk) : '-';
},
},
nomor_spk: {
title: 'Nomor SPK',
},
tanggal_rencana_kunjunagn: {
title: 'Tanggal Rencana Kunjungan',
render: (item, data) => {
return data.tanggal_rencana_kunjunagn ? window.formatTanggalIndonesia(data.tanggal_rencana_kunjunagn) : '-';
},
},
tanggal_kunjungan: {
title: 'Tanggal Kunjungan',
render: (item, data) => {
return data.tanggal_kunjungan ? window.formatTanggalIndonesia(data.tanggal_kunjungan) : '-';
},
},
taggal_delivered: {
title: 'Tanggal Delivered',
render: (item, data) => {
return data.taggal_delivered ? window.formatTanggalIndonesia(data.taggal_delivered) : '-';
},
},
jangka_waktu_sla: {
title: 'Jangka Waktu SLA',
},
tanggal_laporan: {
title: 'Tanggal Laporan',
render: (item, data) => {
return data.tanggal_laporan ? window.formatTanggalIndonesia(data.tanggal_laporan) : '-';
},
},
tanggal_review: {
title: 'Tanggal Review',
render: (item, data) => {
return data.tanggal_review ? window.formatTanggalIndonesia(data.tanggal_review) : '-';
},
},
nama_penilai: {
title: 'Nama Penilai',
},
nama_team_leader: {
title: 'Nama Team Leader',
},
saran: {
title: 'Saran',
},
catatan: {
title: 'Catatan',
}
} }
}; };
@@ -415,7 +133,6 @@
if (startDate) { if (startDate) {
filters.start_date = startDate; filters.start_date = startDate;
} }
if (endDate) { if (endDate) {
filters.end_date = endDate; filters.end_date = endDate;
} }
@@ -425,7 +142,6 @@
} }
dataTable.search(filters); dataTable.search(filters);
} }

View File

@@ -6,10 +6,10 @@
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="grid gap-5 mx-auto w-full lg:gap-7.5">
<div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" <div class="min-w-full border card border-agi-100 card-grid" data-datatable="false" data-datatable-page-size="10"
data-datatable-state-save="false" id="laporan-table" data-api-url="{{ route('laporan.datatables') }}"> data-datatable-state-save="false" id="laporan-table" data-api-url="{{ route('laporan.datatables') }}">
<div class="card-header bg-agi-50 py-5 flex-wrap"> <div class="flex-wrap py-5 card-header bg-agi-50">
<h3 class="card-title"> <h3 class="card-title">
Laporan Laporan
</h3> </h3>
@@ -28,7 +28,7 @@
<div class="card-body"> <div class="card-body">
<div class="scrollable-x-auto"> <div class="scrollable-x-auto">
<table class="table table-auto table-border align-middle text-gray-700 font-medium text-sm" <table class="table text-sm font-medium text-gray-700 align-middle table-auto table-border"
data-datatable-table="true"> data-datatable-table="true">
<thead> <thead>
<tr> <tr>
@@ -74,13 +74,13 @@
</table> </table>
</div> </div>
<div <div
class="card-footer justify-center md:justify-between flex-col md:flex-row gap-3 text-gray-600 text-2sm font-medium"> class="flex-col gap-3 justify-center font-medium text-gray-600 card-footer md:justify-between md:flex-row text-2sm">
<div class="flex items-center gap-2"> <div class="flex gap-2 items-center">
Show Show
<select class="select select-sm w-16" data-datatable-size="true" name="perpage"> </select> per <select class="w-16 select select-sm" data-datatable-size="true" name="perpage"> </select> per
page page
</div> </div>
<div class="flex items-center gap-4"> <div class="flex gap-4 items-center">
<span data-datatable-info="true"> </span> <span data-datatable-info="true"> </span>
<div class="pagination" data-datatable-pagination="true"> <div class="pagination" data-datatable-pagination="true">
</div> </div>
@@ -108,7 +108,7 @@
'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember' 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'
]; ];
return months[month - return months[month -
1]; 1];
} }
</script> </script>
<script type="module"> <script type="module">
@@ -151,7 +151,7 @@
user_id: { user_id: {
title: 'User Pemohon', title: 'User Pemohon',
render: (item, data) => { render: (item, data) => {
return `${data.user.name}`; return `${data.user?.name}`;
}, },
}, },
tujuan_penilaian_id: { tujuan_penilaian_id: {
@@ -180,16 +180,16 @@
jenis_fasilitas_kredit_id: { jenis_fasilitas_kredit_id: {
title: 'Fasilitas Kredit', title: 'Fasilitas Kredit',
render: (item, data) => { render: (item, data) => {
return `${data.jenis_fasilitas_kredit.name}`; return `${data.jenis_fasilitas_kredit?.name}`;
} }
}, },
tanggal_survei: { tanggal_survei: {
title: 'Tanggal Survei', title: 'Tanggal Survei',
render: (item, data) => { render: (item, data) => {
if(data.penilaian.waktu_penilaian){ if (data.penilaian?.waktu_penilaian) {
return `${formatDate(new Date(data.penilaian.waktu_penilaian))}`; return `${formatDate(new Date(data.penilaian?.waktu_penilaian))}`;
} }
return `${formatDate(new Date(data.penilaian.created_at))}`; return `${formatDate(new Date(data.penilaian?.created_at))}`;
}, },
}, },
due_date_sla: { due_date_sla: {
@@ -197,21 +197,21 @@
render: (item, data) => { render: (item, data) => {
const tujuan_penilaian = data.tujuan_penilaian.name; const tujuan_penilaian = data.tujuan_penilaian.name;
const tipe_laporan = data.penilai?.type; const tipe_laporan = data.penilai?.type;
const nilai_plafond = data.penilaian.nilaiPlafond?.name; const nilai_plafond = data.penilaian?.nilaiPlafond?.name;
let waktu_penilaian = new Date(data.penilaian.created_at); let waktu_penilaian = new Date(data.penilaian?.created_at);
if(data.penilaian.waktu_penilaian){ if (data.penilaian?.waktu_penilaian) {
waktu_penilaian = new Date(data.penilaian.waktu_penilaian); waktu_penilaian = new Date(data.penilaian?.waktu_penilaian);
} }
if(tujuan_penilaian.name==="RAP"){ if (tujuan_penilaian.name === "RAP") {
waktu_penilaian.setDate(waktu_penilaian.getDate() + 3); waktu_penilaian.setDate(waktu_penilaian.getDate() + 3);
} else { } else {
if(tipe_laporan==="sederhana"){ if (tipe_laporan === "sederhana") {
waktu_penilaian.setDate(waktu_penilaian.getDate() + 2); waktu_penilaian.setDate(waktu_penilaian.getDate() + 2);
} else if(tipe_laporan==="standar"){ } else if (tipe_laporan === "standar") {
if(nilai_plafond==="2 M - 5 M"){ if (nilai_plafond === "2 M - 5 M") {
waktu_penilaian.setDate(waktu_penilaian.getDate() + 3); waktu_penilaian.setDate(waktu_penilaian.getDate() + 3);
} else if(nilai_plafond==="< 2M"){ } else if (nilai_plafond === "< 2M") {
waktu_penilaian.setDate(waktu_penilaian.getDate() + 3); waktu_penilaian.setDate(waktu_penilaian.getDate() + 3);
} else { } else {
waktu_penilaian.setDate(waktu_penilaian.getDate() + 5); waktu_penilaian.setDate(waktu_penilaian.getDate() + 5);
@@ -224,7 +224,7 @@
status: { status: {
title: 'Status', title: 'Status',
render: (item, data) => { render: (item, data) => {
return `<span class="badge badge-sm badge-default uppercase flex justify-center">${data.status}</span>`; return `<span class="flex justify-center uppercase badge badge-sm badge-default">${data.status}</span>`;
} }
}, },
actions: { actions: {
@@ -240,31 +240,26 @@
let penyelesaian = ''; let penyelesaian = '';
if(data.noc) { if (data.noc) {
if (!data.noc?.tanggal_penyelesaian && !data.noc?.memo_penyelesaian) { if (!data.noc?.memo_penyelesaian) {
penyelesaian = ` penyelesaian = `
<a href="{{ route('noc.penyelesaian') }}?id=${data.noc.id}&permohonanId=${data.noc.permohonan_id}&persetujuanPenawaranId=${data.noc.persetujuan_penawaran_id}" class="btn btn-sm btn-warning"> <a href="{{ route('noc.index') }}/${data.noc.id}" class="btn btn-sm btn-warning">
Penyelesaian Penyelesaian
</a>`; </a>`;
} }
} }
if(data.penilai.resume) { if (data.penilai?.resume) {
resumeButton = ` resumeButton = `
<a href="penilai/print-out-laporan/${data.id}/${dokumenID}/${jenisJaminanID}" class="btn btn-sm btn-success"> <a href="penilai/print-out-laporan/${data.id}/${dokumenID}/${jenisJaminanID}" class="btn btn-sm btn-success">
Resume Resume
</a>`; </a>`;
} }
if(data.nilai_liquidasi==null) {
laporanButton = `
<a href="laporan/${data.id}" class="btn btn-sm btn-primary">
Laporan
</a>`;
}
if((data.status_bayar=="sudah_bayar" || data.status_bayar=="tidak_bayar") && data.nilai_liquidasi >0) {
if(data.penilai.type_penilai=='resume' && !data.penilai.resume){ if ((data.status_bayar == "sudah_bayar" || data.status_bayar == "tidak_bayar")) {
if (data.penilai?.type_penilai == 'resume' && !data.penilai?.resume) {
laporanButton = ` laporanButton = `
<a href="penilai/print-out-laporan/${data.id}/${dokumenID}/${jenisJaminanID}" class="btn btn-sm btn-primary"> <a href="penilai/print-out-laporan/${data.id}/${dokumenID}/${jenisJaminanID}" class="btn btn-sm btn-primary">
Laporan Laporan
@@ -279,7 +274,7 @@
} }
return `<div class="flex flex-wrap justify-end gap-1.5"> ${penyelesaian} ${resumeButton} ${laporanButton} </div>`; return `<div class="flex flex-wrap gap-1.5 justify-end"> ${penyelesaian} ${resumeButton} ${laporanButton} </div>`;
}, },
} }
}, },

View File

@@ -15,197 +15,236 @@
@endphp @endphp
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="grid gap-5 mx-auto w-full lg:gap-7.5">
<div class="card border border-agi-100 pb-2.5"> <div class="pb-2.5 border card border-agi-100">
<div class="card-header bg-agi-50" id="basic_settings"> <div class="card-header bg-agi-50" id="basic_settings">
<div class="card-title flex flex-row gap-1.5"> <div class="flex flex-row gap-1.5 card-title">
{{ $hasMemo ? 'Proses Penyelesaian NOC' : 'NOC' }} {{ $hasMemo ? 'Proses Penyelesaian NOC' : 'NOC' }}
</div> </div>
<div class="flex items-center gap-2"> <div class="flex gap-2 items-center">
<a href="{{ route('noc.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i> Back</a> <a href="{{ route('noc.index') }}" class="btn btn-xs btn-info"><i class="ki-filled ki-exit-left"></i>
Back</a>
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<form action="{{ !$hasMemo ? route('noc.store') : route('noc.update',$persetujuanPenawaran) }}" method="POST" class="grid gap-5" enctype="multipart/form-data"> <form action="{{ !$hasMemo ? route('noc.store') : route('noc.update', $persetujuanPenawaran) }}"
method="POST" class="grid gap-5" enctype="multipart/form-data">
@csrf @csrf
@if($hasMemo) @if ($hasMemo)
@method('PUT') @method('PUT')
@endif @endif
<input type="hidden" name="penawaran_id" value="{{ $persetujuanPenawaran->penawaran_id ?? old('penawaran_id') }}"> <input type="hidden" name="penawaran_id"
<input type="hidden" name="persetujuan_penawaran_id" value="{{ $persetujuanPenawaran->id ?? old('persetujuan_penawaran_id') }}"> value="{{ $persetujuanPenawaran->penawaran_id ?? old('penawaran_id') }}">
<input type="hidden" name="permohonan_id" value="{{ $persetujuanPenawaran->penawaran->permohonan->id ?? $persetujuanPenawaran->permohonan->id }}"> <input type="hidden" name="persetujuan_penawaran_id"
value="{{ $persetujuanPenawaran->id ?? old('persetujuan_penawaran_id') }}">
<input type="hidden" name="permohonan_id"
value="{{ $persetujuanPenawaran->penawaran->permohonan->id ?? $persetujuanPenawaran->permohonan->id }}">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Status Bayar Status Bayar
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<select class="input tomselect w-full @error('status_pembayar') border-danger bg-danger-light @enderror" name="status_pembayar" id="status_pembayar" {{ $hasMemo ? 'disabled' : '' }}> <select
class="input tomselect w-full @error('status_pembayar') border-danger bg-danger-light @enderror"
name="status_pembayar" id="status_pembayar" {{ $hasMemo ? 'disabled' : '' }}>
<option value="">Pilih Status Bayar</option> <option value="">Pilih Status Bayar</option>
<option value="sudah_bayar" {{ (old('status_pembayar') == 'sudah_bayar') || ($persetujuanPenawaran?->penawaran?->permohonan?->status_bayar == 'sudah_bayar') ? 'selected' : '' }}>Sudah Bayar</option> <option value="sudah_bayar"
<option value="belum_bayar" {{ (old('status_pembayar') == 'belum_bayar') || ($persetujuanPenawaran?->penawaran?->permohonan?->status_bayar == 'belum_bayar') ? 'selected' : '' }}>Belum Bayar</option> {{ old('status_pembayar') == 'sudah_bayar' || $persetujuanPenawaran?->penawaran?->permohonan?->status_bayar == 'sudah_bayar' ? 'selected' : '' }}>
Sudah Bayar</option>
<option value="belum_bayar"
{{ old('status_pembayar') == 'belum_bayar' || $persetujuanPenawaran?->penawaran?->permohonan?->status_bayar == 'belum_bayar' ? 'selected' : '' }}>
Belum Bayar</option>
</select> </select>
@error('status_bayar') @error('status_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Bukti Pembayaran Bukti Pembayaran
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@if(!empty($persetujuanPenawaran->bukti_bayar)) @if (!empty($persetujuanPenawaran->bukti_bayar))
<div class="mt-2 flex items-center"> <div class="flex items-center mt-2">
<a href="{{ Storage::url($persetujuanPenawaran->bukti_bayar) }}" target="_blank" class="badge badge-sm badge-outline badge-warning"> <a href="{{ Storage::url($persetujuanPenawaran->bukti_bayar) }}" target="_blank"
<i class="ki-filled ki-eye mr-2"></i> Lihat File class="badge badge-sm badge-outline badge-warning">
<i class="mr-2 ki-filled ki-eye"></i> Lihat File
</a> </a>
</div> </div>
@endif @endif
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Nominal Bayar Nominal Bayar
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="number" name="total_harus_bayar" id="total_harus_bayar" class="input w-full @error('total_harus_bayar') border-danger bg-danger-light @enderror" value="{{ old('total_harus_bayar', $persetujuanPenawaran->nominal_bayar ?? '') }}" readonly> <input type="number" name="total_harus_bayar" id="total_harus_bayar"
class="input w-full @error('total_harus_bayar') border-danger bg-danger-light @enderror"
value="{{ old('total_harus_bayar', $persetujuanPenawaran->nominal_bayar ?? '') }}"
readonly>
@error('total_harus_bayar') @error('total_harus_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Nominal Diterima Nominal Diterima
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="number" name="nominal_bayar" id="nominal_bayar" class="input w-full @error('nominal_bayar') border-danger bg-danger-light @enderror" value="{{ old('nominal_bayar', $persetujuanPenawaran->noc->nominal_bayar ?? '') }}" placeholder="Masukkan nominal bayar" {{ $hasMemo ? 'readonly' : '' }}> <input type="number" name="nominal_bayar" id="nominal_bayar"
class="input w-full @error('nominal_bayar') border-danger bg-danger-light @enderror"
value="{{ old('nominal_bayar', $persetujuanPenawaran->noc->nominal_bayar ?? '') }}"
placeholder="Masukkan nominal bayar" {{ $hasMemo ? 'readonly' : '' }}>
@error('nominal_bayar') @error('nominal_bayar')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Tanggal Pembayaran Tanggal Pembayaran
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="date" name="tanggal_pembayaran" id="tanggal_pembayaran" class="input w-full @error('tanggal_pembayaran') border-danger bg-danger-light @enderror" value="{{ old('tanggal_pembayaran', isset($persetujuanPenawaran->noc->tanggal_pembayaran) ? date('Y-m-d', strtotime($persetujuanPenawaran->noc->tanggal_pembayaran)) : '') }}" {{ $hasMemo ? 'readonly' : '' }}> <input type="date" name="tanggal_pembayaran" id="tanggal_pembayaran"
class="input w-full @error('tanggal_pembayaran') border-danger bg-danger-light @enderror"
value="{{ old('tanggal_pembayaran', isset($persetujuanPenawaran->noc->tanggal_pembayaran) ? date('Y-m-d', strtotime($persetujuanPenawaran->noc->tanggal_pembayaran)) : '') }}"
{{ $hasMemo ? 'readonly' : '' }}>
@error('tanggal_pembayaran') @error('tanggal_pembayaran')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Bukti KSL Bukti KSL
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@if(!$hasMemo) @if (!$hasMemo)
<input type="file" name="bukti_ksl" id="bukti_ksl" class="file-input w-full @error('bukti_ksl') border-danger bg-danger-light @enderror" accept=".pdf,.jpg,.jpeg,.png"> <input type="file" name="bukti_ksl" id="bukti_ksl"
class="file-input w-full @error('bukti_ksl') border-danger bg-danger-light @enderror"
accept=".pdf,.jpg,.jpeg,.png">
@error('bukti_ksl') @error('bukti_ksl')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
@endif @endif
@if(isset($persetujuanPenawaran->noc->bukti_ksl) && !empty($persetujuanPenawaran->noc->bukti_ksl)) @if (isset($persetujuanPenawaran->noc->bukti_ksl) && !empty($persetujuanPenawaran->noc->bukti_ksl))
<div class="mt-2 flex items-center"> <div class="flex items-center mt-2">
<a href="{{ Storage::url($persetujuanPenawaran->noc->bukti_ksl) }}" target="_blank" class="badge badge-sm badge-outline badge-warning"> <a href="{{ Storage::url($persetujuanPenawaran->noc->bukti_ksl) }}" target="_blank"
<i class="ki-filled ki-eye mr-2"></i> Lihat File class="badge badge-sm badge-outline badge-warning">
<i class="mr-2 ki-filled ki-eye"></i> Lihat File
</a> </a>
</div> </div>
@endif @endif
</div> </div>
</div> </div>
@if($hasMemo) @if ($hasMemo)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Memo Penyelesaian Memo Penyelesaian
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<div class="flex items-center"> <div class="flex items-center">
<a href="{{ Storage::url($persetujuanPenawaran->noc->memo_penyelesaian) }}" target="_blank" class="badge badge-sm badge-outline badge-warning"> <a href="{{ Storage::url($persetujuanPenawaran->noc->memo_penyelesaian) }}"
<i class="ki-filled ki-eye mr-2"></i> Lihat File target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="mr-2 ki-filled ki-eye"></i> Lihat File
</a> </a>
<input type="hidden" name="memo_penyelesaian_existing" value="{{ $persetujuanPenawaran->noc->memo_penyelesaian }}"> <input type="hidden" name="memo_penyelesaian_existing"
value="{{ $persetujuanPenawaran->noc->memo_penyelesaian }}">
</div> </div>
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Bukti Penyelesaian Bukti Penyelesaian
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="file" name="bukti_penyelesaian" id="bukti_penyelesaian" class="file-input w-full @error('bukti_penyelesaian') border-danger bg-danger-light @enderror" accept=".pdf,.jpg,.jpeg,.png"> <input type="file" name="bukti_penyelesaian" id="bukti_penyelesaian"
class="file-input w-full @error('bukti_penyelesaian') border-danger bg-danger-light @enderror"
accept=".pdf,.jpg,.jpeg,.png">
@error('bukti_penyelesaian') @error('bukti_penyelesaian')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
@if(isset($persetujuanPenawaran->noc->bukti_penyelesaian) && !empty($persetujuanPenawaran->noc->bukti_penyelesaian)) @if (isset($persetujuanPenawaran->noc->bukti_penyelesaian) && !empty($persetujuanPenawaran->noc->bukti_penyelesaian))
<div class="mt-2 flex items-center"> <div class="flex items-center mt-2">
<a href="{{ Storage::url($persetujuanPenawaran->noc->bukti_penyelesaian) }}" target="_blank" class="badge badge-sm badge-outline badge-warning"> <a href="{{ Storage::url($persetujuanPenawaran->noc->bukti_penyelesaian) }}"
<i class="ki-filled ki-eye mr-2"></i> Lihat File target="_blank" class="badge badge-sm badge-outline badge-warning">
<i class="mr-2 ki-filled ki-eye"></i> Lihat File
</a> </a>
<input type="hidden" name="bukti_penyelesaian_existing" value="{{ $persetujuanPenawaran->noc->bukti_penyelesaian }}"> <input type="hidden" name="bukti_penyelesaian_existing"
value="{{ $persetujuanPenawaran->noc->bukti_penyelesaian }}">
</div> </div>
@endif @endif
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Nominal Penyelesaian Nominal Penyelesaian
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="number" name="nominal_penyelesaian" id="nominal_penyelesaian" class="input w-full @error('nominal_penyelesaian') border-danger bg-danger-light @enderror" value="{{ old('nominal_penyelesaian', $persetujuanPenawaran->noc->nominal_penyelesaian ?? '') }}" placeholder="Masukkan nominal penyelesaian"> <input type="number" name="nominal_penyelesaian" id="nominal_penyelesaian"
class="input w-full @error('nominal_penyelesaian') border-danger bg-danger-light @enderror"
value="{{ old('nominal_penyelesaian', $persetujuanPenawaran->noc->nominal_penyelesaian ?? '') }}"
placeholder="Masukkan nominal penyelesaian">
@error('nominal_penyelesaian') @error('nominal_penyelesaian')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Tanggal Penyelesaian Tanggal Penyelesaian
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<input type="date" name="tanggal_penyelesaian" id="tanggal_penyelesaian" class="input w-full @error('tanggal_penyelesaian') border-danger bg-danger-light @enderror" value="{{ old('tanggal_penyelesaian', isset($persetujuanPenawaran->noc->tanggal_penyelesaian) ? date('Y-m-d', strtotime($persetujuanPenawaran->noc->tanggal_penyelesaian)) : '') }}"> <input type="date" name="tanggal_penyelesaian" id="tanggal_penyelesaian"
class="input w-full @error('tanggal_penyelesaian') border-danger bg-danger-light @enderror"
value="{{ old('tanggal_penyelesaian', isset($persetujuanPenawaran->noc->tanggal_penyelesaian) ? date('Y-m-d', strtotime($persetujuanPenawaran->noc->tanggal_penyelesaian)) : '') }}">
@error('tanggal_penyelesaian') @error('tanggal_penyelesaian')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
@endif @endif
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Catatan Catatan
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<textarea name="catatan" id="catatan" rows="4" class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" readonly placeholder="Masukkan catatan">{{ old('catatan', $persetujuanPenawaran->catatan ?? '') }}</textarea> <textarea name="catatan" id="catatan" rows="4"
class="textarea w-full @error('catatan') border-danger bg-danger-light @enderror" readonly
placeholder="Masukkan catatan">{{ old('catatan', $persetujuanPenawaran->catatan ?? '') }}</textarea>
@error('catatan') @error('catatan')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex flex-wrap gap-2.5 items-baseline lg:flex-nowrap">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Catatan NOC Catatan NOC
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<textarea name="catatan_noc" id="catatan_noc" rows="4" class="textarea w-full @error('catatan_noc') border-danger bg-danger-light @enderror" placeholder="Masukkan catatan noc">{{ old('catatan_noc', $persetujuanPenawaran->noc->catatan_noc ?? '') }}</textarea> <textarea name="catatan_noc" id="catatan_noc" rows="4"
class="textarea w-full @error('catatan_noc') border-danger bg-danger-light @enderror"
placeholder="Masukkan catatan noc">{{ old('catatan_noc', $persetujuanPenawaran->noc->catatan_noc ?? '') }}</textarea>
@error('catatan_noc') @error('catatan_noc')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="text-sm alert text-danger">{{ $message }}</em>
@enderror @enderror
</div> </div>
</div> </div>

View File

@@ -5,9 +5,10 @@
@endsection @endsection
@section('content') @section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <div class="grid gap-5 mx-auto w-full lg:gap-7.5">
<div class="card border border-agi-100 card-grid min-w-full" data-datatable="false" data-datatable-page-size="10" data-datatable-state-save="false" id="noc-table" data-api-url="{{ route('noc.datatables.pembayaran') }}"> <div class="min-w-full border card border-agi-100 card-grid" data-datatable="false" data-datatable-page-size="10"
<div class="card-header bg-agi-50 py-5 flex-wrap"> data-datatable-state-save="false" id="noc-table" data-api-url="{{ route('noc.datatables.pembayaran') }}">
<div class="flex-wrap py-5 card-header bg-agi-50">
<h3 class="card-title"> <h3 class="card-title">
Daftar NOC Pembayaran Daftar NOC Pembayaran
</h3> </h3>
@@ -27,61 +28,62 @@
<div class="card-body"> <div class="card-body">
<div class="scrollable-x-auto"> <div class="scrollable-x-auto">
<table class="table table-auto table-border align-middle text-gray-700 font-medium text-sm" data-datatable-table="true"> <table class="table text-sm font-medium text-gray-700 align-middle table-auto table-border"
data-datatable-table="true">
<thead> <thead>
<tr> <tr>
<th class="w-14"> <th class="w-14">
<input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox"/> <input class="checkbox checkbox-sm" data-datatable-check="true" type="checkbox" />
</th> </th>
<th class="min-w-[150px]" data-datatable-column="nomor_registrasi"> <th class="min-w-[150px]" data-datatable-column="nomor_registrasi">
<span class="sort"> <span class="sort-label"> Nomor Registrasi </span> <span class="sort"> <span class="sort-label"> Nomor Registrasi </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="nama_debitur"> <th class="min-w-[150px]" data-datatable-column="nama_debitur">
<span class="sort"> <span class="sort-label"> Nama Debitur </span> <span class="sort"> <span class="sort-label"> Nama Debitur </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="cabang"> <th class="min-w-[150px]" data-datatable-column="cabang">
<span class="sort"> <span class="sort-label"> Cabang </span> <span class="sort"> <span class="sort-label"> Cabang </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_setor"> <th class="min-w-[150px]" data-datatable-column="tanggal_setor">
<span class="sort"> <span class="sort-label"> Tanggal KSL </span> <span class="sort"> <span class="sort-label"> Tanggal KSL </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="nominal_bayar"> <th class="min-w-[150px]" data-datatable-column="nominal_bayar">
<span class="sort"> <span class="sort-label"> Nominal bayar </span> <span class="sort"> <span class="sort-label"> Nominal bayar </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="bukti_bayar"> <th class="min-w-[150px]" data-datatable-column="bukti_bayar">
<span class="sort"> <span class="sort-label"> Bukti Bayar </span> <span class="sort"> <span class="sort-label"> Bukti Bayar </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="nominal_diterima"> <th class="min-w-[150px]" data-datatable-column="nominal_diterima">
<span class="sort"> <span class="sort-label"> Nominal Diterima </span> <span class="sort"> <span class="sort-label"> Nominal Diterima </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="bukti_ksl"> <th class="min-w-[150px]" data-datatable-column="bukti_ksl">
<span class="sort"> <span class="sort-label"> Bukti KSL </span> <span class="sort"> <span class="sort-label"> Bukti KSL </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_pembayaran"> <th class="min-w-[150px]" data-datatable-column="tanggal_pembayaran">
<span class="sort"> <span class="sort-label"> Tanggal Pembayaran </span> <span class="sort"> <span class="sort-label"> Tanggal Pembayaran </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[50px] text-center" data-datatable-column="actions">Action</th> <th class="min-w-[50px] text-center" data-datatable-column="actions">Action</th>
</tr> </tr>
</thead> </thead>
</table> </table>
</div> </div>
<div <div
class="card-footer justify-center md:justify-between flex-col md:flex-row gap-3 text-gray-600 text-2sm font-medium"> class="flex-col gap-3 justify-center font-medium text-gray-600 card-footer md:justify-between md:flex-row text-2sm">
<div class="flex items-center gap-2"> <div class="flex gap-2 items-center">
Show Show
<select class="select select-sm w-16" data-datatable-size="true" name="perpage"> </select> per <select class="w-16 select select-sm" data-datatable-size="true" name="perpage"> </select> per
page page
</div> </div>
<div class="flex items-center gap-4"> <div class="flex gap-4 items-center">
<span data-datatable-info="true"> </span> <span data-datatable-info="true"> </span>
<div class="pagination" data-datatable-pagination="true"> <div class="pagination" data-datatable-pagination="true">
</div> </div>
@@ -89,110 +91,110 @@
</div> </div>
</div> </div>
</div> </div>
@endsection @endsection
@push('scripts') @push('scripts')
<script type="text/javascript"> <script type="text/javascript">
function prosesData(data) { function prosesData(data) {
Swal.fire({ Swal.fire({
title: 'NOC Pembayaran', title: 'NOC Pembayaran',
text: "Apakah Anda yakin ingin menyetujui pembayaran ini?", text: "Apakah Anda yakin ingin menyetujui pembayaran ini?",
icon: 'info', icon: 'info',
showCancelButton: true, showCancelButton: true,
confirmButtonColor: '#3085d6', confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33', cancelButtonColor: '#d33',
confirmButtonText: 'Ya', confirmButtonText: 'Ya',
cancelButtonText: 'Tidak' cancelButtonText: 'Tidak'
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
window.location.href = `noc/${data}/edit`; window.location.href = `noc/${data}/edit`;
} }
}) })
} }
</script> </script>
<script type="module"> <script type="module">
const element = document.querySelector('#noc-table'); const element = document.querySelector('#noc-table');
const searchInput = document.getElementById('search'); const searchInput = document.getElementById('search');
const apiUrl = element.getAttribute('data-api-url'); const apiUrl = element.getAttribute('data-api-url');
const dataTableOptions = { const dataTableOptions = {
apiEndpoint: apiUrl, apiEndpoint: apiUrl,
pageSize: 5, pageSize: 5,
columns: { columns: {
select: { select: {
render: (item, data, context) => { render: (item, data, context) => {
const checkbox = document.createElement('input'); const checkbox = document.createElement('input');
checkbox.className = 'checkbox checkbox-sm'; checkbox.className = 'checkbox checkbox-sm';
checkbox.type = 'checkbox'; checkbox.type = 'checkbox';
checkbox.value = data.id.toString(); checkbox.value = data.id.toString();
checkbox.setAttribute('data-datatable-row-check', 'true'); checkbox.setAttribute('data-datatable-row-check', 'true');
return checkbox.outerHTML.trim(); return checkbox.outerHTML.trim();
},
}, },
nomor_registrasi: { },
title: 'Nomor Registrasi' nomor_registrasi: {
}, title: 'Nomor Registrasi'
nama_debitur: { },
title: 'Nama Debitur', nama_debitur: {
}, title: 'Nama Debitur',
cabang: { },
title: 'Cabang', cabang: {
}, title: 'Cabang',
tanggal_setor: { },
title: 'Tanggal Setor', tanggal_setor: {
}, title: 'Tanggal KSL',
nominal_bayar: { },
title: 'Nominal Bayar', nominal_bayar: {
}, title: 'Nominal Bayar',
bukti_bayar: { },
title: 'Bukti KSL', bukti_bayar: {
render: (item, data) => { title: 'Bukti KSL',
if (data.bukti_bayar) { render: (item, data) => {
return `<a href="storage/${data.bukti_bayar}" download="storage/${data.bukti_bayar}" target="_blank" class="badge badge-sm badge-outline"> if (data.bukti_bayar) {
return `<a href="storage/${data.bukti_bayar}" download="storage/${data.bukti_bayar}" target="_blank" class="badge badge-sm badge-outline">
Download <i class="ki-filled ki-cloud-download"></i> Download <i class="ki-filled ki-cloud-download"></i>
</a>`; </a>`;
} else { } else {
return '-'; return '-';
} }
},
}, },
nominal_diterima: { },
title: 'Nominal Diterima', nominal_diterima: {
}, title: 'Nominal Diterima',
bukti_ksl: { },
title: 'Bukti KSL', bukti_ksl: {
render: (item, data) => { title: 'Bukti KSL',
if (data.bukti_ksl) { render: (item, data) => {
return `<a href="storage/${data.bukti_ksl}" download="storage/${data.bukti_ksl}" target="_blank" class="badge badge-sm badge-outline"> if (data.bukti_ksl) {
return `<a href="storage/${data.bukti_ksl}" download="storage/${data.bukti_ksl}" target="_blank" class="badge badge-sm badge-outline">
Download <i class="ki-filled ki-cloud-download"></i> Download <i class="ki-filled ki-cloud-download"></i>
</a>`; </a>`;
} else { } else {
return '-'; return '-';
} }
},
}, },
tanggal_pembayaran: { },
title: 'Tanggal Pembayaran', tanggal_pembayaran: {
}, title: 'Tanggal Pembayaran',
actions: { },
title: 'Action', actions: {
render: (item, data) => { title: 'Action',
return `<div class="flex flex-nowrap justify-center"> render: (item, data) => {
return `<div class="flex flex-nowrap justify-center">
<a class="btn btn-sm btn-outline btn-info" onclick="prosesData(${data.id})"> <a class="btn btn-sm btn-outline btn-info" onclick="prosesData(${data.id})">
<i class="ki-filled ki-double-check"></i> <i class="ki-filled ki-double-check"></i>
</a> </a>
</div>`; </div>`;
}, },
} }
}, },
}; };
let dataTable = new KTDataTable(element, dataTableOptions); let dataTable = new KTDataTable(element, dataTableOptions);
// Custom search functionality // Custom search functionality
searchInput.addEventListener('input', function () { searchInput.addEventListener('input', function() {
const searchValue = this.value.trim(); const searchValue = this.value.trim();
dataTable.search(searchValue, true); dataTable.search(searchValue, true);
}); });
</script> </script>
@endpush @endpush

View File

@@ -1,6 +1,57 @@
<div class="no-break"> <div class="no-break">
<table style="width: 100%"> <table style="width: 100%">
<tr> @if($permohonan->is_mig)
@if (!empty($forminspeksi['fakta']['keterangan']))
@foreach ($forminspeksi['fakta']['keterangan'] as $key => $item)
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
{{ $key }}
</td>
</tr>
</table>
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; text-align: left;">
@if (is_array($item))
@foreach ($item as $data_)
{!! nl2br(e($data_)) !!}<br>
@endforeach
@else
{!! nl2br(e($item)) !!}
@endif
</td>
</tr>
</table>
@endforeach
@endif
@if (!empty($forminspeksi['fakta']['saran']))
@foreach ($forminspeksi['fakta']['saran'] as $key => $item)
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
SARAN
</td>
</tr>
</table>
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; text-align: left;">
@if (is_array($item))
@foreach ($item as $data_)
{!! nl2br(e($data_)) !!}<br>
@endforeach
@else
{!! nl2br(e($item)) !!}
@endif
</td>
</tr>
</table>
@endforeach
@endif
@else
<tr>
<td width="25%" style="vertical-align: top;">Informasi Dinas Tata Ruang <td width="25%" style="vertical-align: top;">Informasi Dinas Tata Ruang
</td> </td>
<td width="1%" style="vertical-align: top;">:</td> <td width="1%" style="vertical-align: top;">:</td>
@@ -34,31 +85,6 @@
</td> </td>
</tr> </tr>
@if (!empty($forminspeksi['fakta']['keterangan']))
<tr>
<td width="25%" style="vertical-align: top;">Catatan yang Perlu
Diperhatikan</td>
<td width="1%" style="vertical-align: top;">:</td>
<td style="vertical-align: top;">
@php
$keterangan = $forminspeksi['fakta']['keterangan'] ?? '';
if (is_array($keterangan)) {
$keterangan = implode(', ', array_filter($keterangan));
}
@endphp
@if (!empty($keterangan))
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td>{!! nl2br(e($keterangan)) !!}</td>
</tr>
</table>
@endif
</td>
</tr>
@endif @endif
</table> </table>
</div> </div>

View File

@@ -39,18 +39,19 @@
]; ];
$customLabels = [ $customLabels = [
'upload_gs' => 'Gambar Situasi', 'upload_gs' => 'Gambar Situasi',
'foto_sentuh_tanahku' => 'Sentuh Tanahku', 'foto_sentuh_tanahku' => 'Sentuh Tanahku',
'foto_gistaru' => 'Gistaru', 'foto_gistaru' => 'Gistaru',
'foto_bhumi' => 'Bhumi', 'foto_bhumi' => 'Bhumi',
'foto_argis_region' => 'Blad Tata Ruang ', 'foto_argis_region' => 'Blad Tata Ruang ',
'foto_tempat' => 'Peta Lokasi', 'foto_tempat' => 'Peta Lokasi',
]; ];
// Memindahkan foto_tempat ke depan jika ada
if (($key = array_search('upload_gs', $fotoTypes)) !== false) { // Memindahkan foto_tempat ke depan jika ada
unset($fotoTypes[$key]); if (($key = array_search('upload_gs', $fotoTypes)) !== false) {
array_unshift($fotoTypes, 'upload_gs'); unset($fotoTypes[$key]);
} array_unshift($fotoTypes, 'upload_gs');
}
// Filter fotoTypes untuk memastikan hanya yang memiliki imagePath valid // Filter fotoTypes untuk memastikan hanya yang memiliki imagePath valid
$validPhotoTypes = array_filter($fotoTypes, function ($type) use ($forminspeksi) { $validPhotoTypes = array_filter($fotoTypes, function ($type) use ($forminspeksi) {
@@ -68,7 +69,7 @@
@endphp @endphp
@if ($imagePath && file_exists(storage_path('app/public/' . $imagePath))) @if ($imagePath && file_exists(storage_path('app/public/' . $imagePath)))
<tr> <tr>
<td style="width: 100%; vertical-align: top; text-align: center" class="photo-item border"> <td style="width: 100%; vertical-align: top; text-align: center" class="border photo-item">
<p style="margin: 0; font-size: 10px; text-align: center;"> <p style="margin: 0; font-size: 10px; text-align: center;">
{{ $customLabels[$type] ?? '' }} {{ $customLabels[$type] ?? '' }}
</p> </p>

View File

@@ -81,6 +81,32 @@
$groupedPhotos = collect($photos)->groupBy('category'); $groupedPhotos = collect($photos)->groupBy('category');
$mainPhotos = $groupedPhotos->filter(fn($_, $key) => strtolower($key) !== 'lainnya'); $mainPhotos = $groupedPhotos->filter(fn($_, $key) => strtolower($key) !== 'lainnya');
// Definisikan urutan yang diinginkan
$desiredOrder = [
'PETA LOKASI',
'GAMBAR SITUASI / SURAT UKUR',
'BLAD TATA KOTA',
'FOTO JAMINAN',
'DOKUMEN PENDUKUNG'
];
// Urutkan ulang $mainPhotos sesuai urutan yang diinginkan
$orderedMainPhotos = collect();
foreach ($desiredOrder as $category) {
if ($mainPhotos->has($category)) {
$orderedMainPhotos->put($category, $mainPhotos->get($category));
}
}
// Tambahkan kategori lain yang tidak ada dalam urutan yang diinginkan
foreach ($mainPhotos as $category => $photos) {
if (!in_array($category, $desiredOrder)) {
$orderedMainPhotos->put($category, $photos);
}
}
$mainPhotos = $orderedMainPhotos;
$otherPhotos = $groupedPhotos->get('lainnya', collect()); $otherPhotos = $groupedPhotos->get('lainnya', collect());
@endphp @endphp
@@ -88,6 +114,9 @@
<p class="text-gray-500">Tidak ada foto yang tersedia.</p> <p class="text-gray-500">Tidak ada foto yang tersedia.</p>
@else @else
@foreach ($mainPhotos as $category => $photos) @foreach ($mainPhotos as $category => $photos)
@if($category=='DOKUMEN PENDUKUNG')
@php continue; @endphp
@endif
@php @php
$groupedBySubcategory = $photos->groupBy('sub'); $groupedBySubcategory = $photos->groupBy('sub');
@endphp @endphp
@@ -95,16 +124,42 @@
@foreach ($groupedBySubcategory as $subcategory => $subPhotos) @foreach ($groupedBySubcategory as $subcategory => $subPhotos)
@if (count($subPhotos) > 0) @if (count($subPhotos) > 0)
@foreach ($subPhotos->chunk(2) as $chunkedPhotos) @foreach ($subPhotos->chunk(2) as $chunkedPhotos)
@if(!$loop->first)
<div class="page-break"></div>
@endif
<table width="100%" border="0" <table width="100%" border="0"
style="align-content: center; text-align: center; margin-bottom: 20px"> style="align-content: center; text-align: center; margin-bottom: 20px">
@foreach ($chunkedPhotos as $item) @foreach ($chunkedPhotos as $item)
@php @php
// Logika fallback untuk path file
$originalPath = $item['path'];
$fallbackPath = null;
// Jika file asli tidak ditemukan, buat fallback path
if ($statusLpj == 1) {
$fullOriginalPath = storage_path('app/public/' . $originalPath);
if (!file_exists($fullOriginalPath)) {
// Ekstrak bagian akhir path (contoh: 251051/251051_2_2.png)
$pathParts = explode('/', $originalPath);
if (count($pathParts) >= 2) {
$lastTwoParts = array_slice($pathParts, -2);
$fallbackPath = 'surveyor/001/' . implode('/', $lastTwoParts);
}
}
}
// Tentukan path yang akan digunakan
$pathToUse = ($fallbackPath && $statusLpj == 1 && file_exists(storage_path('app/public/' . $fallbackPath)))
? $fallbackPath
: $originalPath;
$filePath = $filePath =
$statusLpj == 1 $statusLpj == 1
? storage_path('app/public/' . $item['path']) ? storage_path('app/public/' . $pathToUse)
: asset('storage/' . $item['path']); : asset('storage/' . $pathToUse);
$extension = strtolower(pathinfo($item['path'], PATHINFO_EXTENSION)); $extension = strtolower(pathinfo($pathToUse, PATHINFO_EXTENSION));
$isImage = in_array($extension, [ $isImage = in_array($extension, [
'jpg', 'jpg',
'jpeg', 'jpeg',
@@ -118,10 +173,10 @@
$isPdf = $extension === 'pdf'; $isPdf = $extension === 'pdf';
@endphp @endphp
@if ($statusLpj == 1) @if ($statusLpj == 1)
@if ($isImage && $filePath) @if ($isImage && $filePath)
<tr> <tr>
<td style="width: 100%; padding: 10px; align-content: center; text-align: center" <td style="width: 100%; padding: 10px; align-content: center; text-align: center"
class="photo-item border"> class="border photo-item">
<p style="font-weight: medium; font-size: 10px">{{ $category }} - <p style="font-weight: medium; font-size: 10px">{{ $category }} -
@isset($subcategory) @isset($subcategory)
@if (trim($subcategory) !== '') @if (trim($subcategory) !== '')
@@ -130,7 +185,7 @@
@endisset @endisset
{{ $item['name'] ?? '' }} {{ $item['name'] ?? '' }}
</p> </p>
<img src="{{ $filePath }}" alt="{{ $item['path'] }}" class="photo-image" <img src="{{ $filePath }}" alt="{{ $pathToUse }}" class="photo-image"
style="align-content: center; text-align: center; max-width: 100%; height: auto;"> style="align-content: center; text-align: center; max-width: 100%; height: auto;">
</td> </td>
</tr> </tr>
@@ -138,7 +193,7 @@
@elseif ($statusLpj != 1) @elseif ($statusLpj != 1)
<tr> <tr>
<td style="width: 100%; padding: 10px; align-content: center; text-align: center" <td style="width: 100%; padding: 10px; align-content: center; text-align: center"
class="photo-item border "> class="border photo-item">
<p style="font-weight: medium; font-size: 10px">{{ $category }} - <p style="font-weight: medium; font-size: 10px">{{ $category }} -
@isset($subcategory) @isset($subcategory)
@@ -180,13 +235,13 @@
<tr style="width: 100%;"></tr> <tr style="width: 100%;"></tr>
@endif @endif
</table> </table>
<div class="page-break"></div>
@endforeach @endforeach
@endif @endif
@endforeach @endforeach
@endforeach @endforeach
@if (!$otherPhotos->isEmpty()) @if (!$otherPhotos->isEmpty())
@dd(!$otherPhotos->isEmpty())
@foreach ($otherPhotos->groupBy('sub') as $subcategory => $subPhotos) @foreach ($otherPhotos->groupBy('sub') as $subcategory => $subPhotos)
@if (count($subPhotos) > 0) @if (count($subPhotos) > 0)
@foreach ($subPhotos->chunk(2) as $chunkedPhotos) @foreach ($subPhotos->chunk(2) as $chunkedPhotos)
@@ -216,7 +271,7 @@
@if ($isImage && $filePath) @if ($isImage && $filePath)
<tr> <tr>
<td style="width: 100%; padding: 10px; align-content: center; text-align: center" <td style="width: 100%; padding: 10px; align-content: center; text-align: center"
class="photo-item border"> class="border photo-item">
<p style="font-weight: medium; font-size: 10px">{{ $category }} - <p style="font-weight: medium; font-size: 10px">{{ $category }} -
@isset($subcategory) @isset($subcategory)
@if (trim($subcategory) !== '') @if (trim($subcategory) !== '')
@@ -232,7 +287,7 @@
@endif @endif
@elseif ($statusLpj != 1) @elseif ($statusLpj != 1)
<tr> <tr>
<td style="width: 100%; padding: 10px;" class="photo-item border"> <td style="width: 100%; padding: 10px;" class="border photo-item">
<p style="font-weight: medium; font-size: 10px">Lainnya - <p style="font-weight: medium; font-size: 10px">Lainnya -
@isset($subcategory) @isset($subcategory)
@if (trim($subcategory) !== '') @if (trim($subcategory) !== '')

View File

@@ -47,7 +47,7 @@
<td style="width: 79%; padding: 2px;">{{ $rap['dari'] ?? '' }}</td> <td style="width: 79%; padding: 2px;">{{ $rap['dari'] ?? '' }}</td>
</tr> </tr>
<tr> <tr>
<td style="width: 25%; padding: 2px;">Tanggal Survey</td> <td style="width: 25%; padding: 2px;">Tanggal Penilaian</td>
<td style="width: 1%; padding: 2px;">:</td> <td style="width: 1%; padding: 2px;">:</td>
<td style="width: 79%; padding: 2px;"> <td style="width: 79%; padding: 2px;">
{{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) }}</td> {{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) }}</td>

View File

@@ -6,6 +6,9 @@
$jenisAset = $dokumen->jenisJaminan->name; $jenisAset = $dokumen->jenisJaminan->name;
} }
$data = rtrim($data, ', '); $data = rtrim($data, ', ');
$permohonan_migrasi = json_decode($permohonan->mig_permohonan);
@endphp @endphp
<main class="content"> <main class="content">
@@ -43,7 +46,7 @@
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Permintaan (AO)</td> <td style="padding: 2px; vertical-align: top;">Permintaan (AO)</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $permohonan->user->name ?? '-' }}</td> <td style="padding: 2px; vertical-align: top;">{{ $permohonan->user->name ?? $permohonan_migrasi->mig_mst_jaminan_nama_ao ?? '-' }}</td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">No Order</td> <td style="padding: 2px; vertical-align: top;">No Order</td>
@@ -57,18 +60,11 @@
{{ formatTanggalIndonesia($permohonan->tanggal_permohonan) }}</td> {{ formatTanggalIndonesia($permohonan->tanggal_permohonan) }}</td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Tanggal Survey</td> <td style="padding: 2px; vertical-align: top;">Tanggal Penilaian</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) }}</td> {{ formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) }}</td>
</tr> </tr>
<tr>
<td style="padding: 2px; vertical-align: top;">User</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $permohonan->user->name ?? '' }}</td>
</tr>
@php @php
$senior_officer = null; $senior_officer = null;
if ($permohonan->debiture && $permohonan->documents) { if ($permohonan->debiture && $permohonan->documents) {
@@ -97,7 +93,11 @@
} }
@endphp @endphp
<tr>
<td style="padding: 2px; vertical-align: top;">User</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $penilai->user->name ?? '' }}</td>
</tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Pemeriksa</td> <td style="padding: 2px; vertical-align: top;">Pemeriksa</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
@@ -108,17 +108,32 @@
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $permohonan->approveSo->name ?? '' }}</td> <td style="padding: 2px; vertical-align: top;">{{ $permohonan->approveSo->name ?? '' }}</td>
</tr> </tr>
@if($permohonan->is_mig)
<tr>
<td style="padding: 2px; vertical-align: top;">No Laporan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $permohonan_migrasi->mig_mst_lpj_nomor_lpj ?? '-' }}
</td>
</tr>
@endif
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Tanggal Laporan</td> <td style="padding: 2px; vertical-align: top;">Tanggal Laporan</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td style="padding: 2px; vertical-align: top;">
{{ formatTanggalIndonesia($tanggalLaporan) ?? '' }}</td> {{ formatTanggalIndonesia($tanggalLaporan) ?? '' }}
</td>
</tr> </tr>
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Waktu Penyelesaian</td> <td style="padding: 2px; vertical-align: top;">Waktu Penyelesaian</td>
<td style="padding: 2px; vertical-align: top;">:</td> <td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;"> <td>
{{ hitungHariKerja($permohonan->penilaian->tanggal_kunjungan, $tanggalLaporan) }}</td> @if($permohonan->is_mig)
{{ hitungHariKerja($permohonan->penilaian->tanggal_kunjungan, \Carbon\Carbon::createFromFormat('d/m/Y H:i:s', $permohonan_migrasi->mig_mst_jaminan_tgl_oto)->format('Y-m-d H:i:s'))-1 }}
@else
{{ hitungHariKerja($permohonan->penilaian->tanggal_kunjungan, $tanggalLaporan) }}
@endif
</td>
</tr> </tr>
</table> </table>
</td> </td>
@@ -142,66 +157,86 @@
<td style=" padding: 2px; vertical-align: top;">{{ $permohonan->tujuanPenilaian->name ?? '' }} <td style=" padding: 2px; vertical-align: top;">{{ $permohonan->tujuanPenilaian->name ?? '' }}
</td> </td>
</tr> </tr>
@if ($permohonan->is_mig == 1)
{{-- <table style="width: 100%; "> --}}
@if (@isset($dokumen))
@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>
</tr>
@endif
@if (isset($detail->details) && $detail->name == 'LOKASI JAMINAN') @if ($permohonan->is_mig)
@php @php
$details = json_decode($detail->details, true); $data = json_decode($inspeksi->mig_detail_data_jaminan, true);
@endphp @endphp
@include('lpj::component.detail-lokasi', ['details' => $details]) @foreach ($data as $key => $item)
@endif @if ($key == 'address')
@endforeach @php $key = 'Terletak di'; @endphp
@endif @endif
@else @php
<tr> // Remove suffix _2, _3, _4, _5 from key
<td style=" padding: 2px; vertical-align: top;">Terletak di</td> $key = preg_replace('/_([2-5])$/', '', $key);
<td style=" padding: 2px; vertical-align: top;">:</td> @endphp
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['address'] ?? '' }}</td> <tr>
</tr> <td style=" padding: 2px; vertical-align: top;">{{ $key }}</td>
<tr> <td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">Desa/Kelurahan</td> <td style=" padding: 2px; vertical-align: top;">{{ $item }}</td>
<td style=" padding: 2px; vertical-align: top;">:</td> </tr>
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['village_code'] ?? '' }}</td> @endforeach
</tr>
<tr> @else
<td style=" padding: 2px; vertical-align: top;">Kecamatan</td> @if (@isset($dokumen))
<td style=" padding: 2px; vertical-align: top;">:</td> @foreach ($dokumen->detail as $detail)
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['district_code'] ?? '' }}</td> @if (!empty($detail->name) && isset($detail->details) && !empty($detail->dokumen_jaminan))
</tr> <tr>
<tr> <td width="25%"><strong>{{ $detail->name ?? '' }}</strong></td>
<td style=" padding: 2px; vertical-align: top;">Kabupaten/Kota</td> </tr>
<td style=" padding: 2px; vertical-align: top;">:</td> @endif
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['city_code'] ?? '' }}</td>
</tr> @if (isset($detail->details) && $detail->name == 'LOKASI JAMINAN')
<tr> @php
<td style=" padding: 2px; vertical-align: top;">Provinsi</td> $details = json_decode($detail->details, true);
<td style=" padding: 2px; vertical-align: top;">:</td> @endphp
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['province_code'] ?? '' }}</td> @include('lpj::component.detail-lokasi', ['details' => $details])
</tr> @endif
@endforeach
@endif
<tr>
<td style=" padding: 2px; vertical-align: top;">Terletak di</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['address'] ?? '' }}</td>
</tr>
<tr>
<td style=" padding: 2px; vertical-align: top;">Desa/Kelurahan</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['village_code'] ?? '' }}</td>
</tr>
<tr>
<td style=" padding: 2px; vertical-align: top;">Kecamatan</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['district_code'] ?? '' }}</td>
</tr>
<tr>
<td style=" padding: 2px; vertical-align: top;">Kabupaten/Kota</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['city_code'] ?? '' }}</td>
</tr>
<tr>
<td style=" padding: 2px; vertical-align: top;">Provinsi</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $alamat['province_code'] ?? '' }}</td>
</tr>
@endif
@include('lpj::component.print-out-dokument') @include('lpj::component.print-out-dokument')
@if (isset($forminspeksi['asset']['nomor_nib'])) @if (isset($forminspeksi['asset']['nomor_nib']))
<tr>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">
{{ $forminspeksi['asset']['nomor_nib'] ?? '' }}</td>
</tr>
@endif
<tr> <tr>
<td style=" padding: 2px; vertical-align: top;">Atas Nama</td>
<td style=" padding: 2px; vertical-align: top;">:</td> <td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;"> <td style=" padding: 2px;">{{ $permohonan->debiture->name ?? '' }}</td>
{{ $forminspeksi['asset']['nomor_nib'] ?? '' }}</td>
</tr> </tr>
@endif @endif
<tr>
<td style=" padding: 2px; vertical-align: top;">Atas Nama</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px;">{{ $permohonan->debiture->name ?? '' }}</td>
</tr>
</table> </table>
</td> </td>
@@ -209,196 +244,238 @@
</table> </table>
<div class="no-break"> <div class="no-break">
@php $mig_detail_legalitas_jaminan = json_decode($inspeksi->mig_detail_legalitas_jaminan, true); @endphp
<table width="100%">
<tr>
<td style="width: 50%; border: 1px solid #000;">
STATUS KEPEMILIKAN, HUBUNGAN DAN PENGHUNI
</td>
<table width="100%"> <td style="width: 50%; border: 1px solid #000;">
<tr> SARANA PELENGKAP DAN LINGKUNGAN --
<td style="width: 50%; border: 1px solid #000;"> </td>
STATUS KEPEMILIKAN, HUBUNGAN DAN PENGHUNI </tr>
</td> <tr>
<td style="vertical-align: top;">
<td style="width: 50%; border: 1px solid #000;"> <table style="vertical-align: top;">
SARANA PELENGKAP DAN LINGKUNGAN
</td>
</tr>
<tr>
<td style="vertical-align: top;">
<table style="vertical-align: top;">
<tr>
@php
$cekHubDebitur = isset($forminspeksi['asset']['hub_cadeb']) &&
$forminspeksi['asset']['hub_cadeb'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$hubCadebDebitur = isset($forminspeksi['asset']['hub_cadeb'][$cekHubDebitur])
? $forminspeksi['asset']['hub_cadeb']['tidak sesuai']
: $forminspeksi['asset']['hub_cadeb']['sesuai'];
@endphp
<td style=" width:49%; padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan Debitur</td>
<td style=" width:1%; padding: 2px; vertical-align: top;">:</td>
<td style=" width:50%; padding: 2px; vertical-align: top;">{{ $hubCadebDebitur ?? '' }}</td>
</tr>
<tr>
@php
$cekHub =
isset($forminspeksi['asset']['hub_cadeb_penghuni']) &&
$forminspeksi['asset']['hub_cadeb_penghuni'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$hubCadeb = isset($forminspeksi['asset']['hub_cadeb_penghuni'][$cekHub])
? $forminspeksi['asset']['hub_cadeb_penghuni']['tidak sesuai']
: $forminspeksi['asset']['hub_cadeb_penghuni']['sesuai'];
@endphp
<td style=" padding: 2px; vertical-align: top;">Hubungan Penghuni Jaminan dengan Debitur</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td>
</tr>
</table>
</td>
<td style="width: 50%; vertical-align: top;">
<table>
@php
$lingkungan = $forminspeksi['lingkungan'];
$fasilitas = $lingkungan['fasilitas_dekat_object'] ?? [];
$fasilitasInput = $lingkungan['fasilitas_dekat_object_input'] ?? [];
@endphp
<tr>
<td style="padding: 2px; vertical-align: top;">Jarak Jalan Utama</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jarak_jalan_utama'] ?? '-' }} m
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Jalan Lingkungan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jalan_linkungan'] ?? '-' }} m
</td>
<tr>
<td style="padding: 2px; vertical-align: top;">Jarak CBD</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ $lingkungan['jarak_cbd_point'] ?? '-' }} m
({{ $lingkungan['nama_cbd_point'] ?? '-' }})</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Lebar Perkerasan Jalan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['lebar_perkerasan_jalan'] ?? '-' }} m</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Perkerasan Jalan</td>
<td style="padding: 2px; vertical-align: top;">:
</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['perkerasan_jalan']['perkerasan_jalan'] ?? $lingkungan['perkerasan_jalan'] ?? ['-']) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Lalu Lintas</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{
$lingkungan['lalu_lintas']
? (is_array($lingkungan['lalu_lintas'])
? implode(', ', $lingkungan['lalu_lintas'])
: $lingkungan['lalu_lintas'])
: '-'
}}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Golongan Masyarakat Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ implode(', ', $lingkungan['gol_mas_sekitar'] ?? $lingkungan['gol_mas_sekitar'] ?? ['-']) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Tingkat Keramaian</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['tingkat_keramaian']['tingkat_keramaian'] ?? $lingkungan['tingkat_keramaian'] ?? ['-']) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Terletak di Area</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['terletak_diarea']['terletak_diarea'] ?? $lingkungan['terletak_diarea'] ?? ['-']) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Kondisi Bangunan Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['kondisi_bagunan_disekitar_lokasi'] ?? '-' }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Sifat Bangunan Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['sifat_bagunan_disekitar_lokasi'] ?? '-' }}</td>
</tr>
@if ($lingkungan['dekat_makam'] == 'ya')
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Dekat Makam</td> @php
<td style="padding: 2px; vertical-align: top;">:</td> $cekHubDebitur =
<td style="padding: 2px; vertical-align: top;">Ya, Jarak isset($forminspeksi['asset']['hub_cadeb']) &&
{{ $lingkungan['jarak_makam'] ?? '-' }} m $forminspeksi['asset']['hub_cadeb'] === 'sesuai'
({{ $lingkungan['nama_makam'] ?? '-' }}) ? 'sesuai'
: 'tidak sesuai';
$hubCadebDebitur = isset($forminspeksi['asset']['hub_cadeb'][$cekHubDebitur])
? $forminspeksi['asset']['hub_cadeb']['tidak sesuai']
: (isset($forminspeksi['asset']['hub_cadeb']['sesuai']) ? $forminspeksi['asset']['hub_cadeb']['sesuai'] : '');
@endphp
<td style=" width:49%; padding: 2px; vertical-align: top;">Hubungan Pemilik Jaminan dengan
Debitur</td>
<td style=" width:1%; padding: 2px; vertical-align: top;">:</td>
<td style=" width:50%; padding: 2px; vertical-align: top;">{{ $cekHubDebitur =='tidak sesuai' ? 'Lain-lain, ' : '' }} {{ $hubCadebDebitur ?? '' }}
</td> </td>
</tr> </tr>
@endif
@if ($lingkungan['dekat_tps'] == 'ya')
<tr> <tr>
<td style="padding: 2px; vertical-align: top;">Dekat TPS</td> @php
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">Ya, Jarak $cekHub =
{{ $lingkungan['jarak_tps'] ?? '-' }} m isset($forminspeksi['asset']['hub_cadeb_penghuni']) &&
({{ $lingkungan['nama_tps'] ?? '-' }})</td> $forminspeksi['asset']['hub_cadeb_penghuni'] === 'sesuai'
? 'sesuai'
: 'tidak sesuai';
$hubCadeb = isset($forminspeksi['asset']['hub_cadeb_penghuni'][$cekHub])
? $forminspeksi['asset']['hub_cadeb_penghuni']['tidak sesuai']
: (isset($forminspeksi['asset']['hub_cadeb_penghuni']['sesuai']) ? $forminspeksi['asset']['hub_cadeb_penghuni']['sesuai'] : '');
@endphp
<td style=" padding: 2px; vertical-align: top;">Hubungan Penghuni Jaminan dengan Debitur
</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">{{ $hubCadeb ?? '' }}</td>
</tr> </tr>
@endif </table>
</td>
<tr> <td style="width: 50%; vertical-align: top;">
<td style="padding: 2px; vertical-align: top;">Daerah</td> @if ($permohonan->is_mig)
<td style="padding: 2px; vertical-align: top;">:</td> @if(isset($mig_detail_legalitas_jaminan['SARANA PELENGKAP DAN LINGKUNGAN']))
<td style="padding: 2px; vertical-align: top;"> <table>
{{ implode(', ', $lingkungan['merupakan_daerah'] ?? ['-']) }} @foreach ($mig_detail_legalitas_jaminan['SARANA PELENGKAP DAN LINGKUNGAN'] as $item)
</td> <tr>
</tr> <td style="padding: 2px; vertical-align: top;">{{ $item['label'] }}</td>
<td style="padding: 2px; vertical-align: top;">:</td>
@if (!empty($fasilitas)) <td style="padding: 2px; vertical-align: top;">{{ ltrim($item['value'], ',') }}</td>
<tr> </tr>
<td style="padding: 2px; vertical-align: top;">Fasilitas Dekat Objek</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@foreach ($fasilitas as $fas)
{{ $fas }}
@if (isset($fasilitasInput[$fas]))
({{ $fasilitasInput[$fas] }})
@endif
@if (!$loop->last)
,
@endif
@endforeach @endforeach
</td>
</tr>
@endif
</table>
</td>
</tr>
</table>
</div>
</table>
@endif
@else
<table>
@php
$lingkungan = $forminspeksi['lingkungan'];
$fasilitas = $lingkungan['fasilitas_dekat_object'] ?? [];
$fasilitasInput = $lingkungan['fasilitas_dekat_object_input'] ?? [];
@endphp
<tr>
<td style="padding: 2px; vertical-align: top;">Jarak Jalan Utama</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['jarak_jalan_utama'] ?? '-' }} m
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Jalan Lingkungan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['jalan_linkungan'] ?? '-' }}
m
</td>
<tr>
<td style="padding: 2px; vertical-align: top;">Jarak CBD</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['jarak_cbd_point'] ?? '-' }}
m
({{ $lingkungan['nama_cbd_point'] ?? '-' }})</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Lebar Perkerasan Jalan</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['lebar_perkerasan_jalan'] ?? '-' }} m</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Perkerasan Jalan</td>
<td style="padding: 2px; vertical-align: top;">:
</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['perkerasan_jalan']['perkerasan_jalan'] ?? ($lingkungan['perkerasan_jalan'] ?? ['-'])) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Lalu Lintas</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['lalu_lintas']
? (is_array($lingkungan['lalu_lintas'])
? implode(', ', $lingkungan['lalu_lintas'])
: $lingkungan['lalu_lintas'])
: '-' }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Golongan Masyarakat Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['gol_mas_sekitar'] ?? ($lingkungan['gol_mas_sekitar'] ?? ['-'])) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Tingkat Keramaian</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['tingkat_keramaian']['tingkat_keramaian'] ?? ($lingkungan['tingkat_keramaian'] ?? ['-'])) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Terletak di Area</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['terletak_diarea']['terletak_diarea'] ?? ($lingkungan['terletak_diarea'] ?? ['-'])) }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Kondisi Bangunan Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['kondisi_bagunan_disekitar_lokasi'] ?? '-' }}
</td>
</tr>
<tr>
<td style="padding: 2px; vertical-align: top;">Sifat Bangunan Sekitar</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $lingkungan['sifat_bagunan_disekitar_lokasi'] ?? '-' }}</td>
</tr>
@if ($lingkungan['dekat_makam'] == 'ya')
<tr>
<td style="padding: 2px; vertical-align: top;">Dekat Makam</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">Ya, Jarak
{{ $lingkungan['jarak_makam'] ?? '-' }} m
({{ $lingkungan['nama_makam'] ?? '-' }})
</td>
</tr>
@endif
@if ($lingkungan['dekat_tps'] == 'ya')
<tr>
<td style="padding: 2px; vertical-align: top;">Dekat TPS</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">Ya, Jarak
{{ $lingkungan['jarak_tps'] ?? '-' }} m
({{ $lingkungan['nama_tps'] ?? '-' }})</td>
</tr>
@endif
<tr>
<td style="padding: 2px; vertical-align: top;">Daerah</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ implode(', ', $lingkungan['merupakan_daerah'] ?? ['-']) }}
</td>
</tr>
@if (!empty($fasilitas))
<tr>
<td style="padding: 2px; vertical-align: top;">Fasilitas Dekat Objek</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
@foreach ($fasilitas as $fas)
{{ $fas }}
@if (isset($fasilitasInput[$fas]))
({{ $fasilitasInput[$fas] }})
@endif
@if (!$loop->last)
,
@endif
@endforeach
</td>
</tr>
@endif
</table>
@endif
</td>
</tr>
</table>
</div>
@if ($permohonan->is_mig)
@if(isset($mig_detail_legalitas_jaminan['ANALISA TANAH DAN BANGUNAN']))
<table width="100%">
<tr>
<td colspan="3" style="border: 1px solid #000;">
ANALISA TANAH DAN BANGUNAN
</td>
</tr>
@foreach ($mig_detail_legalitas_jaminan['ANALISA TANAH DAN BANGUNAN'] as $item)
<tr>
<td style="padding: 2px; vertical-align: top;">{{ $item['label'] }}</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ ltrim($item['value'], ',') }}</td>
</tr>
@endforeach
</table>
@endif
@endif
@foreach ($permohonan->documents as $dokumen) @foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan) @if ($dokumen->jenisJaminan)
@php @php
@@ -410,15 +487,16 @@
$kategoriUnik = array_unique($kategoriArray); $kategoriUnik = array_unique($kategoriArray);
@endphp @endphp
@foreach ($kategoriUnik as $kategori) @if(!$permohonan->is_mig)
@foreach ($kategoriUnik as $kategori)
@if ($kategori !== 'lingkungan') @include(
@include('lpj::penilai.components.analisa.' . str_replace('-', '-', $kategori), [ 'lpj::penilai.components.analisa.' . str_replace('-', '-', $kategori),
'dokumen' => $dokumen, [
]) 'dokumen' => $dokumen,
@endif ]
)
@endforeach @endforeach
@endif
@endif @endif
@endif @endif
@endforeach @endforeach
@@ -431,7 +509,9 @@
</td> </td>
</tr> </tr>
</table> </table>
@include('lpj::penilai.components.print-pembanding') @if(isset($dataPembanding))
@include('lpj::penilai.components.print-pembanding')
@endif
</div> </div>
<div class="no-break"> <div class="no-break">
<table style="width: 100%"> <table style="width: 100%">
@@ -445,11 +525,12 @@
<td style="padding: 8px; width: 100%;"> <td style="padding: 8px; width: 100%;">
<table style="width: 100%; border-collapse: collapse;"> <table style="width: 100%; border-collapse: collapse;">
<tr> <tr>
<td colspan="3" style="padding: 8px; text-align: left;"> <td colspan="6" style="padding: 8px; text-align: left;">
<strong>a. Total Nilai Pasar Wajar</strong> <strong>a. Total Nilai Pasar Wajar</strong>
</td> </td>
</tr> </tr>
@php @php
$totalNilaiPasarWajar = 0;
$labelNilai = [ $labelNilai = [
'bangunan' => 'Luas Bangunan', 'bangunan' => 'Luas Bangunan',
'tanah' => 'Luas Tanah', 'tanah' => 'Luas Tanah',
@@ -461,81 +542,71 @@
'kapal' => 'Luas Kapal', 'kapal' => 'Luas Kapal',
]; ];
if (strcasecmp($jenisAset, 'RUKO/RUKAN') === 0) { if (strcasecmp($jenisAset, 'RUKO/RUKAN') === 0) {
$labelNilai['bangunan'] = 'Luas Unit'; $labelNilai['bangunan'] = 'Luas Unit';
unset($labelNilai['tanah']); unset($labelNilai['tanah']);
} }
@endphp @endphp
@foreach ($labelNilai as $key => $label)
@if (isset($lpjData['luas_' . $key]))
<tr>
<td style="padding: 3px; text-align: right; width:30%; ">
{{ $label }} {{ $lpjData['luas_' . $key] ?? '' }} m<sup>2</sup>
</td>
<td style="padding: 3px; width:30%;">
<span style="padding-left:20px; padding-right: 20px">X</span> Rp
{{ $lpjData['nilai_' . $key . '_1'] ?? '' }}
</td>
<td style="padding: 3px; text-align: left; width:40%;">
<span style="padding-left:20px; padding-right: 20px"> = </span> Rp
{{ $lpjData['nilai_' . $key . '_2'] ?? '' }}
</td>
</tr>
@endif
@endforeach
@if (isset($lpjData['npw_tambahan'])) @if (isset($lpjData['npw_tambahan']))
@foreach ($lpjData['npw_tambahan'] as $npw) @foreach ($lpjData['npw_tambahan'] as $npw)
<tr> <tr>
<td style="padding: 3px; text-align: right;"> <td width="30%" style="padding: 3px; text-align: right;">
{{ $npw['name'] }} {{ $npw['luas'] }} m<sup>2</sup> {{ $npw['name'] }}</sup>
</td> </td>
<td style="padding: 3px;"> <td width="10%" style="padding: 3px; text-align: right;">
<span style="padding-left:20px; padding-right: 20px">X</span> Rp {{ $npw['luas'] }} m<sup>2</sup>
{{ $npw['nilai_1'] }}
</td> </td>
<td style="padding: 3px; text-align: left; width:40%"> <td width="5%" style="padding: 3px; text-align: center;">X</td>
<span style="padding-left:20px; padding-right: 20px"> = </span> Rp <td width="25%" style="padding: 3px; text-align:right">
{{ $npw['nilai_2'] }} {{ number_format($npw['nilai_1'], 0, ',', '.') ?? '' }}
</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, ',', '.') ?? '' }}
</td> </td>
</tr> </tr>
@php $totalNilaiPasarWajar += $npw['nilai_2']; @endphp
@endforeach @endforeach
@endif @endif
<tr> <tr>
<td style="padding: 3px; font-weight: bold; width:30%;">Total Nilai Pasar Wajar</td> <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: right; font-weight: bold; width:30%"></td> <td style="padding: 3px; text-align: center; width:5%;font-weight: bold;" >=</td>
<td style="padding: 3px; text-align: left; font-weight: bold; width: 40%;"> <td style="padding: 3px; text-align: right; font-weight: bold; width: 40%;">
<span style="padding-left: 20px; padding-right: 20px;">=</span>
<div style="display: inline-block; border-top: 1px solid black; padding-top: 3px;"> <div style="display: inline-block; border-top: 1px solid black; padding-top: 3px;">
Rp {{ $lpjData['total_nilai_pasar_wajar'] ?? '' }} {{ $lpjData['total_nilai_pasar_wajar'] ? number_format($lpjData['total_nilai_pasar_wajar'], 0, ',', '.') : number_format($totalNilaiPasarWajar, 0, ',', '.') ?? '' }}
</div> </div>
</td> </td>
</tr> </tr>
@if (isset($lpjData['likuidasi']) && $lpjData['likuidasi_nilai_2'] > 0) <tr>
<td colspan="6" style="padding: 8px; text-align: left; font-weight: bold;">
b. Total Nilai Likuidasi
<tr> </td>
<td colspan="3" style="padding: 8px; text-align: left; font-weight: bold;"> </tr>
b. Total Nilai Likuidasi <tr>
</td> <td style="padding: 3px; text-align: right;" colspan="4">
</tr> {{ $lpjData['likuidasi'] ?? '' }}% <span style="padding-left:20px; padding-right: 20px">X</span> Total Nilai Pasar
<tr> Wajar
<td style="padding: 3px; text-align: right; width:20%"> </td>
{{ $lpjData['likuidasi'] ?? '' }}% <td style="padding: 3px; text-align: center; font-weight: bold;">=</td>
</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: left; font-weight: bold; width:40%"> </td>
<span style="padding-left:20px; padding-right: 20px">X</span> Total Nilai Pasar Wajar </tr>
</td>
<td style="padding: 3px; text-align: left; width:40%;">
<span style="padding-left:20px; padding-right: 20px"> = </span> Rp
{{ $lpjData['likuidasi_nilai_2'] ?? '' }}
</td>
</tr>
@endif
</table> </table>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
@if($permohonan->is_mig)
@include(
'lpj::penilai.components.analisa.informasi',
[
'dokumen' => $dokumen,
]
)
@endif
<div class="no-break"> <div class="no-break">
<table style="width: 100%;"> <table style="width: 100%;">
<tr> <tr>
@@ -570,7 +641,7 @@
maupun ekstern</td> maupun ekstern</td>
</tr> </tr>
<tr> <tr>
@include('lpj::penilai.components.signature-approval') @include('lpj::penilai.components.signature-approval',['laporan' => 'sederhana','npw' => $totalNilaiPasarWajar])
</tr> </tr>
</table> </table>
</div> </div>

View File

@@ -9,6 +9,8 @@
$dokument = $dokumen; $dokument = $dokumen;
} }
$data = rtrim($data, ', '); $data = rtrim($data, ', ');
$permohonan_migrasi = json_decode($permohonan->mig_permohonan);
@endphp @endphp
<main class="content"> <main class="content">
@php @php
@@ -52,13 +54,19 @@
<td style="width: 25%; padding: 2px; vertical-align: top;">Cabang/Pemohon</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Cabang/Pemohon</td>
<td style="width: 1%; vertical-align: top;">:</td> <td style="width: 1%; vertical-align: top;">:</td>
<td style="vertical-align: top; vertical-align: top;"> <td style="vertical-align: top; vertical-align: top;">
{{ $permohonan->debiture->branch->name ?? '' }} {{ $permohonan->branch->name ?? '' }}
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="width: 25%; padding: 2px;">Tujuan Penilai</td> <td style="width: 25%; padding: 2px;">Tujuan Penilai</td>
<td style="width: 1%; padding: 2px;">:</td> <td style="width: 1%; padding: 2px;">:</td>
<td style="vertical-align: top; padding: 2px;"> <td style="vertical-align: top; padding: 2px;">
{{ $permohonan->tujuanPenilaian->name ?? '' }}</td>
</tr>
<tr>
<td style=" padding: 2px; vertical-align: top;">Fasilitas Kredit</td>
<td style=" padding: 2px; vertical-align: top;">:</td>
<td style=" padding: 2px; vertical-align: top;">
{{ $permohonan->jenisFasilitasKredit->name ?? '' }}</td> {{ $permohonan->jenisFasilitasKredit->name ?? '' }}</td>
</tr> </tr>
<tr> <tr>
@@ -77,7 +85,7 @@
{{ formatTanggalIndonesia($permohonan->tanggal_permohonan) }}</td> {{ formatTanggalIndonesia($permohonan->tanggal_permohonan) }}</td>
</tr> </tr>
<tr> <tr>
<td style="width: 25%; padding: 2px;">Tanggal Survey</td> <td style="width: 25%; padding: 2px;">Tanggal Penilaian</td>
<td style="vertical-align: top; width: 1%; padding: 2px;">:</td> <td style="vertical-align: top; width: 1%; padding: 2px;">:</td>
<td style="vertical-align: top; width: 79%;"> <td style="vertical-align: top; width: 79%;">
{{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) }} {{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) }}
@@ -103,6 +111,13 @@
<td style="width: 1%; vertical-align: top;">:</td> <td style="width: 1%; vertical-align: top;">:</td>
<td style="vertical-align: top; ">{{ $permohonan->debiture->name ?? '' }}</td> <td style="vertical-align: top; ">{{ $permohonan->debiture->name ?? '' }}</td>
</tr> </tr>
<tr>
<td>Alamat dan Telpon</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">
{{ $permohonan->debiture->address ?? '' }} {{ $permohonan->debiture->phone ?? '' }}
</td>
</tr>
<tr> <tr>
<td style="width: 25%; padding: 2px; vertical-align: top;">Debitur / Wakil Debitur</td> <td style="width: 25%; padding: 2px; vertical-align: top;">Debitur / Wakil Debitur</td>
<td style="width: 1%; vertical-align: top;">:</td> <td style="width: 1%; vertical-align: top;">:</td>
@@ -137,14 +152,20 @@
</td> </td>
</tr> </tr>
</table> </table>
@if ($permohonan->is_mig == 1) @if ($permohonan->is_mig == 1)
<table style="width: 100%; "> <table style="width: 100%; ">
@if (@isset($dokumen)) @if (isset($dokumen))
<tr>
<td width="25%">Jenis Jaminan</td>
<td width="1%">:</td>
<td>{{ $dokumen->jenisJaminan?->name ?? '' }}</td>
</tr>
@foreach ($dokumen->detail as $detail) @foreach ($dokumen->detail as $detail)
@if (!empty($detail->name) && isset($detail->details) && !empty($detail->dokumen_jaminan)) @if (!empty($detail->name) && isset($detail->details) && !empty($detail->dokumen_jaminan))
<tr> <!--<tr>
<td width="25%"><strong>{{ $detail->name ?? '' }}</strong></td> <td width="25%"><strong>{{ $detail->name ?? '' }}</strong></td>
</tr> </tr>-->
@endif @endif
@if (isset($detail->details) && $detail->name == 'LOKASI JAMINAN') @if (isset($detail->details) && $detail->name == 'LOKASI JAMINAN')
@@ -200,6 +221,7 @@
</table> </table>
{{-- </div> --}} {{-- </div> --}}
@if (!$permohonan->is_mig)
<div class="no-break"> <div class="no-break">
<table style="width: 100%; "> <table style="width: 100%; ">
<tr> <tr>
@@ -243,13 +265,45 @@
</tr> </tr>
</table> </table>
</div> </div>
@endif
@if ($permohonan->is_mig)
@php $mig_detail_legalitas_jaminan = json_decode($inspeksi->mig_detail_legalitas_jaminan, true); @endphp
@if($mig_detail_legalitas_jaminan)
@foreach($mig_detail_legalitas_jaminan as $key => $items)
<table width="100%">
<tr>
<td colspan="3" style="border: 1px solid #000; text-align: center;">
{{ $key }}
</td>
</tr>
@php $currentLabel=''; @endphp
@foreach ($items as $item)
<tr>
<td style="padding: 2px; vertical-align: top;">
@if ($currentLabel !== $item['label'])
{{ $item['label'] }}
@endif
@php
if ($currentLabel !== $item['label']) {
$currentLabel = $item['label'];
}
@endphp
</td>
<td style="padding: 2px; vertical-align: top;">:</td>
<td style="padding: 2px; vertical-align: top;">{{ ltrim($item['value'], ',') }}</td>
</tr>
@endforeach
</table>
@endforeach
@endif
@endif
@foreach ($permohonan->documents as $dokumen) @foreach ($permohonan->documents as $dokumen)
@if ($dokumen->jenisJaminan) @if ($dokumen->jenisJaminan)
@php @php
$formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true); $formKategori = json_decode($dokumen->jenisJaminan->form_kategori, true);
@endphp @endphp
@if(!$permohonan->is_mig)
@if (isset($formKategori) && $formKategori) @if (isset($formKategori) && $formKategori)
@php @php
$kategoriArray = is_array($formKategori) ? $formKategori : [$formKategori]; $kategoriArray = is_array($formKategori) ? $formKategori : [$formKategori];
@@ -262,6 +316,7 @@
]) ])
@endforeach @endforeach
@endif @endif
@endif
@endif @endif
@endforeach @endforeach
@@ -273,103 +328,93 @@
</td> </td>
</tr> </tr>
</table> </table>
@if(isset($dataPembanding))
@include('lpj::penilai.components.print-pembanding') @include('lpj::penilai.components.print-pembanding')
@endif
</div> </div>
<div class="no-break"> <div class="no-break">
<table style="width: 100%; "> <table style="width: 100%;">
<tr> <tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;"> <td style="width: 100%; border: 1px solid #000; text-align: center;">
TOTAL NILAI PASAR WAJAR TOTAL NILAI PASAR WAJAR
</td> </td>
</tr> </tr>
</table> </table>
<table> <table style="width: 100%;">
<tr> <tr>
<td colspan="3" style=" padding: 8px; text-align: left;">1. Total Nilai Pasar Wajar <td colspan="6" style=" padding: 8px; text-align: left;width:100%">1. Total Nilai Pasar Wajar
</td> </td>
</tr> </tr>
@php @php
$totalNilaiPasarWajar = 0;
$labelNilai = [ $labelNilai = [
'bangunan' => 'Luas Bangunan', 'bangunan' => 'Luas Bangunan',
'tanah' => 'Luas Tanah', 'tanah' => 'Luas Tanah',
'apartemen-kantor' => 'Luas Unit', 'apartemen-kantor' => 'Luas Unit',
'apartemen' => 'Luas Unit',
'alat-berat' => 'Luas Alat Berat', 'alat-berat' => 'Luas Alat Berat',
'mesin' => 'Luas Mesin', 'mesin' => 'Luas Mesin',
'kendaraan' => 'Luas Kendaraan', 'kendaraan' => 'Luas Kendaraan',
'pesawat' => 'Luas Pesawat', 'pesawat' => 'Luas Pesawat',
'kapal' => 'Luas Kapal', 'kapal' => 'Luas Kapal',
]; ];
if (strcasecmp($jenisAset, 'RUKO/RUKAN') === 0) { if (strcasecmp($jenisAset, 'RUKO/RUKAN') === 0) {
$labelNilai['bangunan'] = 'Luas Unit'; $labelNilai['bangunan'] = 'Luas Unit';
unset($labelNilai['tanah']); unset($labelNilai['tanah']);
}
if (strcasecmp($jenisAset, 'Apartemen') === 0) {
$labelNilai['tanah'] = 'Luas Unit';
} }
@endphp @endphp
@foreach ($labelNilai as $key => $label)
@if (isset($lpjData['luas_' . $key]))
<tr>
<td style="padding: 3px; text-align: right; width:45%; ">
{{ $label }} {{ $lpjData['luas_' . $key] ?? '' }} m<sup>2</sup>
</td>
<td style="padding: 3px; width:5%;">
<span style="padding-left:20px; padding-right: 20px">X</span> Rp
{{ $lpjData['nilai_' . $key . '_1'] ?? '' }}
</td>
<td style="padding: 3px; text-align: left; width:60%;">
<span style="padding-left:20px; padding-right: 20px"> = </span> Rp
{{ $lpjData['nilai_' . $key . '_2'] ?? '' }}
</td>
</tr>
@endif
@endforeach
@if (isset($lpjData['npw_tambahan'])) @if (isset($lpjData['npw_tambahan']))
@foreach ($lpjData['npw_tambahan'] as $npw) @foreach ($lpjData['npw_tambahan'] as $npw)
<tr> <tr>
<td style="padding: 3px; text-align: right;"> <td width="30%" style="padding: 3px; text-align: right;">
{{ $npw['name'] }} {{ $npw['luas'] }} m<sup>2</sup> {{ $npw['name'] }}</sup>
</td> </td>
<td style="padding: 3px;"> <td width="10%" style="padding: 3px; text-align: right;">
<span style="padding-left:20px; padding-right: 20px">X</span> Rp {{ $npw['luas'] }} m<sup>2</sup>
{{ $npw['nilai_1'] }}
</td> </td>
<td style="padding: 3px; text-align: left; width:70%"> <td width="5%" style="padding: 3px; text-align: center;">X</td>
<span style="padding-left:20px; padding-right: 20px"> = </span> Rp <td width="25%" style="padding: 3px; text-align:right">
{{ $npw['nilai_2'] }} {{ number_format($npw['nilai_1'], 0, ',', '.') ?? '' }}
</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, ',', '.') ?? '' }}
</td> </td>
</tr> </tr>
@php $totalNilaiPasarWajar += $npw['nilai_2']; @endphp
@endforeach @endforeach
@endif @endif
<tr> <tr>
<td style="padding: 3px; font-weight: bold; width:10%;">Total Nilai Pasar Wajar</td> <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: right; font-weight: bold; width:10%"></td> <td style="padding: 3px; text-align: center; width:5%;font-weight: bold;" >=</td>
<td style="padding: 3px; text-align: left; font-weight: bold; width: 70%;"> <td style="padding: 3px; text-align: right; font-weight: bold; width: 40%;">
<span style="padding-left: 20px; padding-right: 20px;">=</span>
<div style="display: inline-block; border-top: 1px solid black; padding-top: 3px;"> <div style="display: inline-block; border-top: 1px solid black; padding-top: 3px;">
Rp {{ $lpjData['total_nilai_pasar_wajar'] ?? '' }} {{ $lpjData['total_nilai_pasar_wajar'] ? number_format($lpjData['total_nilai_pasar_wajar'], 0, ',', '.') : number_format($totalNilaiPasarWajar, 0, ',', '.') ?? '' }}
</div> </div>
</td> </td>
</tr> </tr>
<!-- Total Nilai Likuidasi --> <!-- Total Nilai Likuidasi -->
@if (isset($lpjData['likuidasi']) && $lpjData['likuidasi_nilai_2'] > 0) @if (isset($permohonan_migrasi->mig_mst_lpj_tot_nilai_likuidasi) || isset($lpjData['likuidasi']) && $lpjData['likuidasi_nilai_2'] > 0)
<tr> <tr>
<td colspan="3" style="padding: 8px; text-align: left"> <td colspan="6" style="padding: 8px; text-align: left">
2. Total Nilai Likuidasi 2. Total Nilai Likuidasi
</td> </td>
</tr> </tr>
<tr> <tr>
<td style="padding: 3px; text-align: right; width:10%"> <td style="padding: 3px; text-align: right;" colspan="4">
{{ $lpjData['likuidasi'] ?? '' }}% {{ $lpjData['likuidasi'] ?? '' }}% <span style="padding-left:20px; padding-right: 20px">X</span> Total Nilai Pasar Wajar
</td> </td>
<td style="padding: 3px; text-align: left; font-weight: bold; width:10%"> <td style="padding: 3px; text-align: center; font-weight: bold;">=</td>
<span style="padding-left:20px; padding-right: 20px">X</span> Total Nilai Pasar Wajar <td style="padding: 3px; text-align: right;font-weight: bold;">{{ number_format($permohonan_migrasi->mig_mst_lpj_tot_nilai_likuidasi, 0, ',', '.') ?? '' }}
</td>
<td style="padding: 3px; text-align: left; width:70%;">
<span style="padding-left:20px; padding-right: 20px"> = </span> Rp
{{ $lpjData['likuidasi_nilai_2'] ?? '' }}
</td> </td>
</tr> </tr>
@endif @endif
@@ -381,6 +426,136 @@
$keterangan = implode(', ', array_filter($keterangan)); $keterangan = implode(', ', array_filter($keterangan));
} }
@endphp @endphp
@if($permohonan->is_mig)
@if (!empty($forminspeksi['fakta']['fakta_positif']))
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
FAKTOR POSITIF
</td>
</tr>
</table>
@foreach ($forminspeksi['fakta']['fakta_positif'] as $key => $item)
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; text-align: left;">
@if (is_array($item))
@foreach ($item as $data_)
{!! nl2br(e($data_)) !!}<br>
@endforeach
@else
{!! nl2br(e($item)) !!}
@endif
</td>
</tr>
</table>
@endforeach
@endif
@if (!empty($forminspeksi['fakta']['fakta_negatif']))
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
FAKTOR NEGATIF
</td>
</tr>
</table>
@foreach ($forminspeksi['fakta']['fakta_negatif'] as $key => $item)
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; text-align: left;">
@if (is_array($item))
@foreach ($item as $data_)
{!! nl2br(e($data_)) !!}<br>
@endforeach
@else
{!! nl2br(e($item)) !!}
@endif
</td>
</tr>
</table>
@endforeach
@endif
@if (!empty($forminspeksi['fakta']['informasi_dokument']))
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
LAIN - LAIN
</td>
</tr>
</table>
@foreach ($forminspeksi['fakta']['informasi_dokument'] as $key => $item)
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; text-align: left;">
@if (is_array($item))
@foreach ($item as $data_)
{!! nl2br(e($data_)) !!}<br>
@endforeach
@else
{!! nl2br(e($item)) !!}
@endif
</td>
</tr>
</table>
@endforeach
@endif
@if (!empty($forminspeksi['fakta']['keterangan']))
@foreach ($forminspeksi['fakta']['keterangan'] as $key => $item)
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
{{ $key }}
</td>
</tr>
</table>
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; text-align: left;">
@if (is_array($item))
@foreach ($item as $data_)
{!! nl2br(e($data_)) !!}<br>
@endforeach
@else
{!! nl2br(e($item)) !!}
@endif
</td>
</tr>
</table>
@endforeach
@endif
@if (!empty($forminspeksi['fakta']['saran']))
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; border: 1px solid #000; text-align: center;">
SARAN
</td>
</tr>
</table>
@foreach ($forminspeksi['fakta']['saran'] as $key => $item)
<table class="judul" style="width: 100%; ">
<tr>
<td style="width: 100%; text-align: left;">
<ul style="margin: 0px;padding-left: 10px;">
<li>
@if (is_array($item))
@foreach ($item as $data_)
{!! nl2br(e($data_)) !!}<br>
@endforeach
@else
{!! nl2br(e($item)) !!}
@endif
</li>
</ul>
</td>
</tr>
</table>
@endforeach
@endif
@endif
@if (!empty($keterangan)) @if (!empty($keterangan))
<table style="width: 100% margin-top: 20px"> <table style="width: 100% margin-top: 20px">
<tr> <tr>
@@ -395,7 +570,7 @@
</tr> </tr>
</table> </table>
@endif @endif
<div class="no-break"> <div class="no-break" style="margin-top:20px;">
<table style="width: 100%"> <table style="width: 100%">
<tr> <tr>
<td>Demikian laporan penilai jaminan ini di buat secara objektif, tanpa adanya pengaruh baik intern <td>Demikian laporan penilai jaminan ini di buat secara objektif, tanpa adanya pengaruh baik intern
@@ -403,7 +578,7 @@
</tr> </tr>
</table> </table>
@include('lpj::penilai.components.signature-approval') @include('lpj::penilai.components.signature-approval',['laporan' => 'standar','npw' => $totalNilaiPasarWajar])
</div> </div>
<hr /> <hr />
<table style="width: 100%; "> <table style="width: 100%; ">

View File

@@ -41,7 +41,7 @@
<td style="width: 33%; vertical-align: top;">Keterangan</td> <td style="width: 33%; vertical-align: top;">Keterangan</td>
<td style="width: 5%; vertical-align: top;">:</td> <td style="width: 5%; vertical-align: top;">:</td>
<td style="width: 62%;"> <td style="width: 62%;">
{{isset($data['keterangan']) ? parsePembandingMigration($data['keterangan']) : '' }} {!! isset($data['keterangan']) ? nl2br(e(parsePembandingMigration($data['keterangan']))) : '' !!}
</td> </td>
</tr> </tr>
@else @else

View File

@@ -95,7 +95,7 @@
<td>{{ $alamat['province_code'] ?? '' }}</td> <td>{{ $alamat['province_code'] ?? '' }}</td>
</tr> </tr>
<tr> <tr>
<td>Tanggal Survey</td> <td>Tanggal Penilaian</td>
<td>:</td> <td>:</td>
<td>{{ isset($permohonan->penilaian->tanggal_kunjungan) ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) : '' }} <td>{{ isset($permohonan->penilaian->tanggal_kunjungan) ? formatTanggalIndonesia($permohonan->penilaian->tanggal_kunjungan) : '' }}
</td> </td>

View File

@@ -1,21 +1,29 @@
<table style="width: 100%; border-collapse: collapse; text-align: center;"> <table style="width: 100%; border-collapse: collapse; text-align: center;" border="1">
@php @php
use Modules\Usermanagement\Models\User; use Modules\Usermanagement\Models\User;
$penilaiUser = User::where('id', $penilai->userPenilaiTeam->id)->first(); $laporan = $laporan ?? '';
$imagePathPenilai = storage_path( $penilaiUser = isset($penilai->userPenilaiTeam) ? $penilai->userPenilaiTeam : null;
'app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign, $imagePathPenilai = $penilaiUser && $penilaiUser->sign
); ? storage_path('app/public/signatures/' . $penilaiUser->id . '/' . $penilaiUser->sign)
: null;
$soUser = $permohonan->approval_so ? User::find($permohonan->approval_so) : null;
$imagePathSo = $soUser && $soUser->sign
? storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign)
: null;
$eoUser = $permohonan->approval_eo ? User::find($permohonan->approval_eo) : null;
$imagePathEO = $eoUser && $eoUser->sign
? storage_path('app/public/signatures/' . $eoUser->id . '/' . $eoUser->sign)
: null;
$ddUser = $permohonan->approval_dd ? User::find($permohonan->approval_dd) : null;
$imagePathDD = $ddUser && $ddUser->sign
? storage_path('app/public/signatures/' . $ddUser->id . '/' . $ddUser->sign)
: null;
$soUser = User::where('id', $senior_officer->id)->first();
$imagePathSo = storage_path('app/public/signatures/' . $soUser->id . '/' . $soUser->sign);
$imagePathEO = storage_path(
'app/public/signatures/' .
User::role('EO Appraisal')->first()->id .
'/' .
User::role('EO Appraisal')->first()->sign,
);
$imagePathDD = storage_path( $imagePathDD = storage_path(
'app/public/signatures/' . 'app/public/signatures/' .
@@ -25,81 +33,148 @@
); );
@endphp @endphp
<tr> <tr>
<td style=" padding: 4px;height: 50px"> <td style=" padding: 4px;height: 25px">
<b>Penilaian Dibuat</b>
</td>
@if($soUser->name==$eoUser->name)
@if ($permohonan->approval_so != null)
<td style=" padding: 4px;height: 25px">
<b>Diperiksa dan Menyetujui</b>
</td>
@endif
@else
@if ($permohonan->approval_so != null)
<td style=" padding: 4px;height: 25px">
<b>Diperiksa</b>
</td>
@endif
@if ($permohonan->approval_eo != null)
<td style=" padding: 4px;height: 25px">
<b>Menyetujui</b>
</td>
@endif
@endif
@if($permohonan->approval_dd!==$permohonan->approval_eo)
@if ($permohonan->approval_dd != null)
<td style=" padding: 4px;height: 25px">
<b>Menyetujui</b>
</td>
@endif
@endif
</tr>
<tr>
<td style=" padding: 4px;height: 75px">
@if (file_exists($imagePathPenilai)) @if (file_exists($imagePathPenilai))
<img src="{{ $imagePathPenilai }}" alt="{{ $imagePathPenilai }}" width="80px"> <img src="{{ $imagePathPenilai }}" alt="{{ $imagePathPenilai }}" width="80px">
@endif @endif
</td> </td>
@if ($permohonan->approval_so != null) @if($soUser->name==$eoUser->name)
<td style=" padding: 4px;height: 50px"> @if ($permohonan->approval_so != null)
@if (file_exists($imagePathSo)) <td style=" padding: 4px;height: 75px">
<img src="{{ $imagePathSo }}" alt="{{ $imagePathSo }}" width="80px"> @if (file_exists($imagePathSo))
@endif <img src="{{ $imagePathSo }}" alt="{{ $imagePathSo }}" width="80px">
</td> @endif
</td>
@endif
@else
@if ($permohonan->approval_so != null)
<td style=" padding: 4px;height: 75px">
@if (file_exists($imagePathSo))
<img src="{{ $imagePathSo }}" alt="{{ $imagePathSo }}" width="80px">
@endif
</td>
@endif
@if ($permohonan->approval_eo != null)
<td style=" padding: 4px;height: 75px">
@if (file_exists($imagePathEO))
<img src="{{ $imagePathEO }}" alt="{{ $imagePathEO }}" width="80px">
@endif
</td>
@endif
@endif @endif
@if ($permohonan->approval_eo != null) @if($permohonan->approval_dd!==$permohonan->approval_eo)
<td style=" padding: 4px;height: 50px"> @if ($permohonan->approval_dd != null)
@if (file_exists($imagePathEO)) <td style=" padding: 4px;height: 75px">
<img src="{{ $imagePathEO }}" alt="{{ $imagePathEO }}" width="80px"> @if (file_exists($imagePathDD))
@endif <img src="{{ $imagePathDD }}" alt="{{ $imagePathDD }}" width="80px">
</td> @endif
@endif </td>
@if ($permohonan->approval_dd != null) @endif
<td style=" padding: 4px;height: 50px">
@if (file_exists($imagePathDD))
<img src="{{ $imagePathDD }}" alt="{{ $imagePathDD }}" width="80px">
@endif
</td>
@endif @endif
</tr> </tr>
<tr> <tr>
<td style=" padding: 4px;">{{ $penilai->userPenilaiTeam->name ?? '' }}</br> <td style=" padding: 4px;">{{ $penilai->userPenilaiTeam->name ?? '' }}</br>
<span> <span>
{{ ucwords(strtolower('PENILAI')) }} <b>{{ ucwords(strtolower('PENILAI')) }}</b>
</span> </span>
</br> </br>
<span> <span>
{{ isset($penilai->updated_at) ? formatTanggalIndonesia($penilai->updated_at) : '' }} {{ $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)) : '') }}
</span> </span>
</td> </td>
@if ($permohonan->approval_so != null)
<td style=" padding: 4px;">
{{ $senior_officer->name ?? '' }}</br>
<span>
{{ ucwords(strtolower('SENIOR OFFICER')) }}
</span>
</br>
<span>
{{ isset($permohonan->approval_so_at) ? formatTanggalIndonesia($permohonan->approval_so_at) : '' }}
</span>
</td>
@endif
@if ($permohonan->approval_eo != null) @if($soUser->name==$eoUser->name)
<td style=" padding: 4px;"> @if ($permohonan->approval_so != null)
{{ User::role('EO Appraisal')->first()->name ?? '' }}</br> <td style=" padding: 4px;">
<span> {{ $soUser->name ?? $senior_officer->name ?? '' }}</br>
{{ ucwords(strtolower('EXECUTIVE OFFICER')) }} <span>
</span> @if($npw > 1000000000 && $npw < 5000000000)
</br> <b>{{ ucwords(strtolower('EXECUTIVE OFFICER')) }}</b>
<span> @else
{{ isset($permohonan->approval_eo_at) ? formatTanggalIndonesia($permohonan->approval_eo_at) : '' }} <b>{{ ucwords(strtolower('SENIOR OFFICER')) }}</b>
</span> @endif
</td> </span>
</br>
<span>
{{ isset($permohonan->approval_so_at) ? formatTanggalIndonesia($permohonan->approval_so_at) : '' }}
</span>
</td>
@endif
@else
@if ($permohonan->approval_so != null)
<td style=" padding: 4px;">
{{ $soUser->name ?? $senior_officer->name ?? '' }}</br>
<span>
<b>{{ ucwords(strtolower('SENIOR OFFICER')) }}</b>
</span>
</br>
<span>
{{ isset($permohonan->approval_so_at) ? formatTanggalIndonesia($permohonan->approval_so_at) : '' }}
</span>
</td>
@endif
@if ($permohonan->approval_eo != null)
<td style=" padding: 4px;">
{{ $eoUser->name ?? User::role('EO Appraisal')->first()->name ?? '' }}</br>
<span>
<b>{{ ucwords(strtolower('EXECUTIVE OFFICER')) }}</b>
</span>
</br>
<span>
{{ isset($permohonan->approval_eo_at) ? formatTanggalIndonesia($permohonan->approval_eo_at) : '' }}
</span>
</td>
@endif
@endif @endif
@if ($permohonan->approval_dd != null) @if($permohonan->approval_dd!==$permohonan->approval_eo)
<td style=" padding: 4px;"> @if ($permohonan->approval_dd != null)
{{ User::role('DD Appraisal')->first()->name ?? '' }}</br> <td style=" padding: 4px;">
<span> {{ $ddUser->name ?? User::role('DD Appraisal')->first()->name ?? '' }}</br>
{{ ucwords(strtolower('DEPUTY DIRECTOR')) }} <span>
</span> <b>{{ ucwords(strtolower('DEPUTY DIRECTOR')) }}</b>
</br> </span>
<span> </br>
{{ <span>
isset($permohonan->approval_dd_at) ? {{
formatTanggalIndonesia($permohonan->approval_dd_at) : '' }} isset($permohonan->approval_dd_at) ?
</span> formatTanggalIndonesia($permohonan->approval_dd_at) : '' }}
</td> </span>
</td>
@endif
@endif @endif
</tr> </tr>
</table> </table>

View File

@@ -65,7 +65,7 @@
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="tanggal_survei"> <th class="min-w-[150px]" data-datatable-column="tanggal_survei">
<span class="sort"> <span class="sort-label"> Tanggal Survei </span> <span class="sort"> <span class="sort-label"> Tanggal Penilaian </span>
<span class="sort-icon"> </span> </span> <span class="sort-icon"> </span> </span>
</th> </th>
<th class="min-w-[150px]" data-datatable-column="due_date_sla"> <th class="min-w-[150px]" data-datatable-column="due_date_sla">
@@ -183,7 +183,7 @@
}, },
}, },
tanggal_survei: { tanggal_survei: {
title: 'Tanggal Survei', title: 'Tanggal Penilaian',
render: (item, data) => { render: (item, data) => {
if (data.penilaian.waktu_penilaian) { if (data.penilaian.waktu_penilaian) {
return `${formatDate(new Date(data.penilaian.waktu_penilaian))}`; return `${formatDate(new Date(data.penilaian.waktu_penilaian))}`;

View File

@@ -95,7 +95,6 @@
{{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) ?? '' }}</p> {{ formatTanggalIndonesia($permohonan->penilaian->waktu_penilaian) ?? '' }}</p>
</div> </div>
@if (!in_array(strtolower($permohonan->tujuanPenilaian->name), ['penilaian ulang', 'asuransi', 'lelang'])) @if (!in_array(strtolower($permohonan->tujuanPenilaian->name), ['penilaian ulang', 'asuransi', 'lelang']))
<label class="form-label max-w-56 "> <label class="form-label max-w-56 ">
Status Bayar Status Bayar
</label> </label>
@@ -105,11 +104,10 @@
{{ str_replace('_', ' ', $permohonan->status_bayar) }} {{ str_replace('_', ' ', $permohonan->status_bayar) }}
</span> </span>
</div> </div>
@endif
@endif </div>
</div> </div>
</div> </div>
</div>
@foreach ($permohonan->documents as $dokumen) @foreach ($permohonan->documents as $dokumen)
@@ -164,7 +162,7 @@
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56"> <label class="form-label max-w-56">
Tanggal Survei Tanggal Penilaian
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<p class="flex w-full text-gray-600 font-medium text-sm"> <p class="flex w-full text-gray-600 font-medium text-sm">
@@ -220,116 +218,116 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full card-footer mt-2 "> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 w-full card-footer mt-2 ">
<div class="flex gap-5"> <div class="flex gap-5">
<a class="btn btn-primary" <a class="btn btn-primary"
href="{{ route('penilai.lampiran') }}?permohonanId={{ $permohonan->id }}&documentId={{ $dokumen->id }}&jaminanId={{ $dokumen->jenis_jaminan_id }}"> href="{{ route('penilai.lampiran') }}?permohonanId={{ $permohonan->id }}&documentId={{ $dokumen->id }}&jaminanId={{ $dokumen->jenis_jaminan_id }}">
Lampiran Foto dan Dokumen Lampiran Foto dan Dokumen
</a> </a>
@if ($permohonan->status != 'freeze') @if ($permohonan->status != 'freeze')
@if (strtolower($permohonan->tujuanPenilaian->name) != 'rap') @if (strtolower($permohonan->tujuanPenilaian->name) != 'rap')
<a class="btn btn-primary" data-modal-toggle="#modal_2"> <a class="btn btn-primary" data-modal-toggle="#modal_2">
Kertas Kerja Kertas Kerja
</a>
@endif
<a class="btn btn-primary"
onclick="paparan({{ $permohonan->id }}, {{ $dokumen->id }}, {{ $dokumen->jenis_jaminan_id }})">
Paparan
</a> </a>
@endif
<a class="btn btn-primary"
onclick="paparan({{ $permohonan->id }}, {{ $dokumen->id }}, {{ $dokumen->jenis_jaminan_id }})">
Paparan
</a>
<div class="dropdown" data-dropdown="true" data-dropdown-trigger="click"> <div class="dropdown" data-dropdown="true" data-dropdown-trigger="click">
<button class="dropdown-toggle btn btn-primary "> <button class="dropdown-toggle btn btn-primary ">
Pembuatan Laporan Pembuatan Laporan
</button> </button>
{{-- kios tanah bangunan kalo dalam mall ruko --}}
<div class="dropdown-content w-full max-w-56 py-2">
<div class="menu menu-default flex flex-col w-full">
@if (strtolower($permohonan->tujuanPenilaian->name) == 'rap')
<div class="menu-item">
<a class="menu-link"
onclick="rap('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})">
<span class="menu-icon">
<i class="ki-outline ki-message-programming">
</i>
</span>
<span class="menu-title">
RAP
</span>
</a>
</div>
@else
{{-- pendapingan kjjp leleang --}}
{{-- memo pendapingan lelang --}}
{{-- existing di --}}
<div class="menu-item">
<a class="menu-link"
onclick="memo('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})">
<span class="menu-icon">
<i class="ki-outline ki-badge">
</i>
</span>
<span class="menu-title">
MEMO
</span>
</a>
</div>
@if (!in_array(strtoupper($dokumen->jenisJaminan->name), $tanahBangunanTypes))
@if ($permohonan->status_bayar === 'belum_bayar')
<div class="menu-item">
<a class="menu-link"
onclick="resume('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})">
<span class="menu-icon">
<i class="ki-outline ki-profile-circle">
</i>
</span>
<span class="menu-title">
RESUME
</span>
</a>
</div>
@endif
{{-- untuk laporan standart itu non kerjasama tapi sederhanan in kerjasama --}}
{{-- kios tanah bangunan kalo dalam mall ruko --}}
<div class="dropdown-content w-full max-w-56 py-2">
<div class="menu menu-default flex flex-col w-full">
@if (strtolower($permohonan->tujuanPenilaian->name) == 'rap')
<div class="menu-item">
<a class="menu-link"
onclick="rap('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})">
<span class="menu-icon">
<i class="ki-outline ki-message-programming">
</i>
</span>
<span class="menu-title">
RAP
</span>
</a>
</div>
@else
{{-- pendapingan kjjp leleang --}}
{{-- memo pendapingan lelang --}}
{{-- existing di --}}
<div class="menu-item">
<a class="menu-link"
onclick="memo('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})">
<span class="menu-icon">
<i class="ki-outline ki-badge">
</i>
</span>
<span class="menu-title">
MEMO
</span>
</a>
</div>
@if (!in_array(strtoupper($dokumen->jenisJaminan->name), $tanahBangunanTypes))
@if ($permohonan->status_bayar === 'belum_bayar')
<div class="menu-item"> <div class="menu-item">
<a class="menu-link" <a class="menu-link"
onclick="resume('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})"> onclick="seletSederhanaStandart('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }}, '{{ $permohonan->jenisFasilitasKredit->name }}', '{{ $permohonan->status_bayar }}')">
<span class="menu-icon"> <span class="menu-icon">
<i class="ki-outline ki-profile-circle"> <i class="ki-outline ki-setting-2"></i>
</i>
</span>
<span class="menu-title">
RESUME
</span> </span>
<span class="menu-title">LPJ</span>
</a> </a>
</div> </div>
@endif @endif
{{-- untuk laporan standart itu non kerjasama tapi sederhanan in kerjasama --}}
<div class="menu-item"> <div class="menu-item">
<a class="menu-link" <a class="menu-link"
onclick="seletSederhanaStandart('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }}, '{{ $permohonan->jenisFasilitasKredit->name }}', '{{ $permohonan->status_bayar }}')"> onclick="callReport('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})">
<span class="menu-icon"> <span class="menu-icon">
<i class="ki-outline ki-setting-2"></i> <i class="ki-outline ki-profile-circle">
</i>
</span>
<span class="menu-title">
CALL REPORT
</span> </span>
<span class="menu-title">LPJ</span>
</a> </a>
</div> </div>
@endif @endif
<div class="menu-item">
<a class="menu-link"
onclick="callReport('{{ $permohonan->id }}', '{{ $dokumen->id }}', {{ $dokumen->jenis_jaminan_id }})">
<span class="menu-icon">
<i class="ki-outline ki-profile-circle">
</i>
</span>
<span class="menu-title">
CALL REPORT
</span>
</a>
</div>
@endif
{{-- @if ($permohonan->penilaian->jenis_penilaian_id == 2 && $permohonan->tujuanPenilaian->id == 4) --}} {{-- @if ($permohonan->penilaian->jenis_penilaian_id == 2 && $permohonan->tujuanPenilaian->id == 4) --}}
{{-- @endif --}} {{-- @endif --}}
</div>
</div> </div>
</div> </div>
</div>
{{-- @if($permohonan->jenisPenilaian->name=="Eksternal") {{-- @if ($permohonan->jenisPenilaian->name == 'Eksternal')
@if(isset($permohonan->laporanExternal->file_resume) || isset($permohonan->laporanExternal->file_laporan)) @if (isset($permohonan->laporanExternal->file_resume) || isset($permohonan->laporanExternal->file_laporan))
<div class="dropdown" data-dropdown="true" data-dropdown-trigger="click"> <div class="dropdown" data-dropdown="true" data-dropdown-trigger="click">
<button class="dropdown-toggle btn btn-primary"> <button class="dropdown-toggle btn btn-primary">
Laporan Eksternal Laporan Eksternal
</button> </button>
<div class="dropdown-content w-full max-w-56 py-2 !ml-[200px] !mt-[-20px]"> <div class="dropdown-content w-full max-w-56 py-2 !ml-[200px] !mt-[-20px]">
<div class="menu menu-default flex flex-col w-full"> <div class="menu menu-default flex flex-col w-full">
@if(isset($permohonan->laporanExternal->file_resume) && !empty($permohonan->laporanExternal->file_resume)) @if (isset($permohonan->laporanExternal->file_resume) && !empty($permohonan->laporanExternal->file_resume))
<div class="menu-item"> <div class="menu-item">
<a class="menu-link" onclick="viewPDF('{{ Storage::url($permohonan->laporanExternal->file_resume) }}')"> <a class="menu-link" onclick="viewPDF('{{ Storage::url($permohonan->laporanExternal->file_resume) }}')">
<span class="menu-icon"> <span class="menu-icon">
@@ -341,7 +339,7 @@
</a> </a>
</div> </div>
@endif @endif
@if(isset($permohonan->laporanExternal->file_laporan) && !empty($permohonan->laporanExternal->file_laporan)) @if (isset($permohonan->laporanExternal->file_laporan) && !empty($permohonan->laporanExternal->file_laporan))
<div class="menu-item"> <div class="menu-item">
<a class="menu-link" onclick="viewPDF('{{ Storage::url($permohonan->laporanExternal->file_laporan) }}')"> <a class="menu-link" onclick="viewPDF('{{ Storage::url($permohonan->laporanExternal->file_laporan) }}')">
@@ -365,18 +363,18 @@
<div class="flex justify-end gap-5"> <div class="flex justify-end gap-5">
<a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => $dokumen->id, 'jenis_jaminan_id' => $dokumen->jenis_jaminan_id]) }}" <a href="{{ route('surveyor.print_out_inspeksi', ['permohonan_id' => $permohonan->id, 'dokument_id' => $dokumen->id, 'jenis_jaminan_id' => $dokumen->jenis_jaminan_id]) }}"
class="btn btn-light"> class="btn btn-light">
<i class="ki-filled ki-printer"></i> Cetak Hasil Inspeksi <i class="ki-filled ki-printer"></i> Cetak Hasil Inspeksi
</a> </a>
<a class="btn btn-outline btn-info " <a class="btn btn-outline btn-info "
href="penilai/show-laporan-inspeksi/{{ $permohonan->id }}/{{ $dokumen->id }}/{{ $dokumen->jenis_jaminan_id }}"> href="penilai/show-laporan-inspeksi/{{ $permohonan->id }}/{{ $dokumen->id }}/{{ $dokumen->jenis_jaminan_id }}">
<i class="ki-filled ki-eye"></i> <i class="ki-filled ki-eye"></i>
Lihat Laporan Lihat Laporan
</a> </a>
<a class="btn btn-success" <a class="btn btn-success"
href="penilai/print-out-laporan/{{ $permohonan->id }}/{{ $dokumen->id }}/{{ $dokumen->jenis_jaminan_id }}?type=penilai"> href="penilai/print-out-laporan/{{ $permohonan->id }}/{{ $dokumen->id }}/{{ $dokumen->jenis_jaminan_id }}?type=penilai">
<i class="ki-filled ki-printer"></i> <i class="ki-filled ki-printer"></i>
Cetak Laporan Cetak Laporan
</a> </a>
@@ -385,19 +383,19 @@
</div> </div>
@endforeach @endforeach
@if ($permohonan->status != 'freeze') @if ($permohonan->status != 'freeze')
<div class="flex justify-start gap-5"> <div class="flex justify-start gap-5">
<a class="btn btn-success" onclick="savePenilai()"> <a class="btn btn-success" onclick="savePenilai()">
<i class="ki-filled ki-paper-plane"></i> <i class="ki-filled ki-paper-plane"></i>
REPORT REPORT
</a> </a>
<a class="btn btn-warning" <a class="btn btn-warning"
{{ $permohonan->status == 'proses-paparan' || $permohonan->status == 'proses-laporan' ? 'disabled' : '' }} {{ $permohonan->status == 'proses-paparan' || $permohonan->status == 'proses-laporan' ? 'disabled' : '' }}
onclick="revisiSurveyor('{{ $permohonan->id }}', '{{ $permohonan->debiture->name }}', '{{ $permohonan->nomor_registrasi }}')"> onclick="revisiSurveyor('{{ $permohonan->id }}', '{{ $permohonan->debiture->name }}', '{{ $permohonan->nomor_registrasi }}')">
<i class="ki-filled ki-arrow-circle-right"></i> <i class="ki-filled ki-arrow-circle-right"></i>
REVISI REVISI
</a> </a>
</div> </div>
@endif @endif
@@ -429,7 +427,6 @@
// Ambil ID inspeksi pertama (jika ada) // Ambil ID inspeksi pertama (jika ada)
// Ambil jenis jaminan jika ada // Ambil jenis jaminan jika ada
if ($firstDocument->jenisjaminan) { if ($firstDocument->jenisjaminan) {
$jenisJaminanId = $firstDocument->jenisjaminan->id; $jenisJaminanId = $firstDocument->jenisjaminan->id;
@@ -447,14 +444,14 @@
<div class="flex justify-center items-center gap-2"> <div class="flex justify-center items-center gap-2">
<input type="file" id="kertas_kerja" class="file-input"> <input type="file" id="kertas_kerja" class="file-input">
<button type="button" class="btn btn-outline btn-success" <button type="button" class="btn btn-outline btn-success"
onclick="uploadKertasKerja({{ $permohonan->id }}, '{{ $documentId }}', '{{ $jenisJaminanId }}')">Upload onclick="uploadKertasKerja({{ $permohonan->id }}, '{{ $documentId }}', '{{ $jenisJaminanId }}')">Upload
</button> </button>
</div> </div>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
@if (isset($permohonan->penilai) && isset($permohonan->penilai->kertas_kerja) && $permohonan->penilai->kertas_kerja) @if (isset($permohonan->penilai) && isset($permohonan->penilai->kertas_kerja) && $permohonan->penilai->kertas_kerja)
<span data-modal-dismiss="true" class="btn btn-warning btn-outline" <span data-modal-dismiss="true" class="btn btn-warning btn-outline"
onclick="viewPDF('{{ Storage::url($permohonan->penilai->kertas_kerja) }}')"><i onclick="viewPDF('{{ Storage::url($permohonan->penilai->kertas_kerja) }}')"><i
class="ki-filled ki-eye mr-2"></i>Lihat Kertas Kerja</span> class="ki-filled ki-eye mr-2"></i>Lihat Kertas Kerja</span>
@endif @endif
</div> </div>
@@ -479,13 +476,13 @@
confirmButtonText: 'Lanjutkan', confirmButtonText: 'Lanjutkan',
confirmButtonColor: '#3085d6', confirmButtonColor: '#3085d6',
}).then(() => { }).then(() => {
resume(permohonanId, documentId, jaminanId) resume(permohonanId, documentId, jaminanId)
}); });
} else { } else {
fetch( fetch(
`{{ url('/penilai/check-status-lpj') }}?permohonanId=${permohonanId}&documentId=${documentId}` `{{ url('/penilai/check-status-lpj') }}?permohonanId=${permohonanId}&documentId=${documentId}`
) )
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
if (data.status) { if (data.status) {
@@ -508,7 +505,7 @@
confirmButtonText: 'Lanjutkan', confirmButtonText: 'Lanjutkan',
confirmButtonColor: '#3085d6', confirmButtonColor: '#3085d6',
}).then(() => { }).then(() => {
saveStatusLpj(permohonanId, documentId, 'sederhana', jaminanId); saveStatusLpj(permohonanId, documentId, 'sederhana', jaminanId);
}); });
} else { } else {
Swal.fire({ Swal.fire({
@@ -523,10 +520,10 @@
denyButtonColor: '#d33', denyButtonColor: '#d33',
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
saveStatusLpj(permohonanId, documentId, 'standar', saveStatusLpj(permohonanId, documentId, 'standar',
jaminanId); jaminanId);
} else if (result.isDenied) { } else if (result.isDenied) {
saveStatusLpj(permohonanId, documentId, 'sederhana', saveStatusLpj(permohonanId, documentId, 'sederhana',
jaminanId); jaminanId);
} }
}); });
@@ -541,17 +538,17 @@
function saveStatusLpj(permohonanId, documentId, type, jaminanId) { function saveStatusLpj(permohonanId, documentId, type, jaminanId) {
fetch(`{{ url('/penilai/save-status-lpj') }}`, { fetch(`{{ url('/penilai/save-status-lpj') }}`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'X-CSRF-TOKEN': '{{ csrf_token() }}', 'X-CSRF-TOKEN': '{{ csrf_token() }}',
}, },
body: JSON.stringify({ body: JSON.stringify({
permohonan_id: permohonanId, permohonan_id: permohonanId,
document_id: documentId, document_id: documentId,
type: type, type: type,
}), }),
}).then(response => response.json()) }).then(response => response.json())
.then(data => { .then(data => {
if (data.success) { if (data.success) {
if (type === 'standar') { if (type === 'standar') {
@@ -566,7 +563,7 @@
} }
function uploadKertasKerja(permohonanId, documentId, jaminanId) { function uploadKertasKerja(permohonanId, documentId, jaminanId) {
const kertasKerjaInput = document.getElementById('kertas_kerja'); const kertasKerjaInput = document.getElementById('kertas_kerja');
if (!kertasKerjaInput.files.length) { if (!kertasKerjaInput.files.length) {
Swal.fire({ Swal.fire({
@@ -586,12 +583,12 @@
formData.append('kertas_kerja', kertasKerja); formData.append('kertas_kerja', kertasKerja);
fetch(`{{ url('/penilai/import/kertas-kerja') }}`, { fetch(`{{ url('/penilai/import/kertas-kerja') }}`, {
method: 'POST', method: 'POST',
headers: { headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}', 'X-CSRF-TOKEN': '{{ csrf_token() }}',
}, },
body: formData, body: formData,
}) })
.then(response => response.json()) // Pastikan respons diurai menjadi JSON .then(response => response.json()) // Pastikan respons diurai menjadi JSON
.then(data => { .then(data => {
if (data.success) { if (data.success) {
@@ -625,26 +622,26 @@
}); });
} }
function resume(permohonanId, documentId, jaminanId) { function resume(permohonanId, documentId, jaminanId) {
showLoadingSwal('Tunggu ...'); showLoadingSwal('Tunggu ...');
window.location.href = window.location.href =
`{{ route('penilai.resume') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`; `{{ route('penilai.resume') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`;
} }
function memo(permohonanId, documentId, jaminanId) { function memo(permohonanId, documentId, jaminanId) {
showLoadingSwal('Tunggu ...'); showLoadingSwal('Tunggu ...');
window.location.href = window.location.href =
`{{ route('penilai.memo') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`; `{{ route('penilai.memo') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`;
} }
function rap(permohonanId, documentId, jaminanId) { function rap(permohonanId, documentId, jaminanId) {
showLoadingSwal('Tunggu ...'); showLoadingSwal('Tunggu ...');
window.location.href = window.location.href =
`{{ route('penilai.rap') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`; `{{ route('penilai.rap') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`;
} }
function paparan(permohonanId, documentId, jaminanId) { function paparan(permohonanId, documentId, jaminanId) {
Swal.fire({ Swal.fire({
title: 'Apakah Kamu yakin ingin melakukan paparan', title: 'Apakah Kamu yakin ingin melakukan paparan',
icon: 'warning', icon: 'warning',
@@ -660,7 +657,7 @@
}); });
} }
function callReport(permohonanId, documentId, jaminanId) { function callReport(permohonanId, documentId, jaminanId) {
showLoadingSwal('Tunggu ...'); showLoadingSwal('Tunggu ...');
window.location.href = window.location.href =
`{{ route('penilai.call-report') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`; `{{ route('penilai.call-report') }}?permohonanId=${permohonanId}&documentId=${documentId}&jaminanId=${jaminanId}`;
@@ -675,7 +672,7 @@
headers: { headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}' 'X-CSRF-TOKEN': '{{ csrf_token() }}'
}, },
success: function (response) { success: function(response) {
if (response.success) { if (response.success) {
// window.location.reload(); // window.location.reload();
hideLoadingSwal(); hideLoadingSwal();
@@ -685,7 +682,7 @@
Swal.fire('Perhatian!', response.message, 'warning'); Swal.fire('Perhatian!', response.message, 'warning');
} }
}, },
error: function (xhr, status, error) { error: function(xhr, status, error) {
console.log('Error checking button status:', error, status, xhr); console.log('Error checking button status:', error, status, xhr);
if (xhr.responseJSON.message) { if (xhr.responseJSON.message) {
// window.location.reload(); // window.location.reload();

View File

@@ -673,6 +673,10 @@ Breadcrumbs::for('noc', function (BreadcrumbTrail $trail) {
$trail->push('NOC', route('noc.index')); $trail->push('NOC', route('noc.index'));
}); });
Breadcrumbs::for('noc.show', function (BreadcrumbTrail $trail) {
$trail->push('NOC', route('noc.index'));
});
Breadcrumbs::for('noc.pembayaran', function (BreadcrumbTrail $trail) { Breadcrumbs::for('noc.pembayaran', function (BreadcrumbTrail $trail) {
$trail->push('NOC Pembayaran', route('noc.pembayaran.index')); $trail->push('NOC Pembayaran', route('noc.pembayaran.index'));
}); });

View File

@@ -748,6 +748,7 @@ Route::middleware(['auth'])->group(function () {
// laporan user // laporan user
Route::prefix('laporan-user')->name('laporan-user.')->group(function () { Route::prefix('laporan-user')->name('laporan-user.')->group(function () {
Route::get('/', [LaporanUserController::class, 'index'])->name('index'); Route::get('/', [LaporanUserController::class, 'index'])->name('index');
Route::get('export', [LaporanUserController::class, 'export'])->name('export');
Route::get('api/user-pemohon', [LaporanUserController::class, 'searchUserPemohon'])->name('api.user-pemohon'); Route::get('api/user-pemohon', [LaporanUserController::class, 'searchUserPemohon'])->name('api.user-pemohon');
Route::get('datatables', [LaporanUserController::class, 'dataTableForUserPemohon'])->name('datatables'); Route::get('datatables', [LaporanUserController::class, 'dataTableForUserPemohon'])->name('datatables');
}); });