From 30e41c1cab1d2034c122b9f30543215d5b4820dc Mon Sep 17 00:00:00 2001 From: majid Date: Tue, 11 Feb 2025 11:55:42 +0700 Subject: [PATCH 1/3] fix(surveyor): perbaikan upload foto --- app/Http/Controllers/SurveyorController.php | 4 +- .../views/surveyor/components/foto.blade.php | 252 +++++++++--------- 2 files changed, 125 insertions(+), 131 deletions(-) diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index bdab1ad..db036e9 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -81,7 +81,7 @@ use Modules\Lpj\Http\Requests\SurveyorRequest; use Modules\Lpj\Http\Requests\FormSurveyorRequest; use Modules\Lpj\Emails\SendJadwalKunjunganEmail; use App\Helpers\Lpj; - +use Modules\Lpj\Models\Authorization; class SurveyorController extends Controller { public $user; @@ -366,7 +366,7 @@ class SurveyorController extends Controller return response()->json([ 'success' => true, 'message' => 'Data berhasil disimpan', - 'file' => $newFoto + 'path' => $newFoto[0]['path'], ], 200); } diff --git a/resources/views/surveyor/components/foto.blade.php b/resources/views/surveyor/components/foto.blade.php index 7f7a008..f18abbd 100644 --- a/resources/views/surveyor/components/foto.blade.php +++ b/resources/views/surveyor/components/foto.blade.php @@ -176,7 +176,7 @@ -
+

Upload Foto

@@ -273,10 +273,11 @@ Dropzone.autoDiscover = false; document.addEventListener('DOMContentLoaded', function() { let myDropzone = null; + let uploadQueue = 0; + let uploadBatch = []; function initDropzone(selector, paramName) { try { - // Pastikan elemen ada sebelum membuat Dropzone const dropzoneElement = document.querySelector(selector); if (!dropzoneElement) { console.error(`Dropzone element not found: ${selector}`); @@ -286,7 +287,7 @@ myDropzone = new Dropzone(selector, { url: "{{ route('surveyor.storeFoto') }}", paramName: paramName, - maxFilesize: 10, + maxFilesize: 30, acceptedFiles: 'image/*', uploadMultiple: false, parallelUploads: 1, @@ -304,101 +305,41 @@ param_name: paramName, nomor_registrasi: '{{ $permohonan->nomor_registrasi ?? '' }}', }, - error: function(file, response) { - Swal.fire({ - icon: 'error', - title: 'Upload Gagal', - text: response.message || 'Error tidak diketahui' - }); + + addedfiles: function(files) { + uploadQueue += files.length; + uploadBatch = Array.from(files); + if (files.length > 0) showLoadingOverlay(); }, + error: function(file, response) { + handleUploadComplete(file, false, response.message); + }, success: function(file, response) { if (response.success) { - Swal.fire({ - icon: 'success', - title: 'Upload Berhasil', - toast: true, - position: 'top-end', - showConfirmButton: false, - timer: 1500 - }); - updatePhotoGallery(); + const fileData = { + path: response.path || file.path, + name: file.name, + description: '', + category: 'lainnya', + sub: '', + param_name: paramName + }; + + addEditAndDeleteButtons(file, fileData); + handleUploadComplete(file, true); + } else { + handleUploadComplete(file, false, response.message); } }, init: function() { // var myDropzone = this; - var loadingIndicator = $(` -
-
-
- `); - - var $dropzoneElement = $(selector); - $dropzoneElement.css('position', 'relative'); - $dropzoneElement.append(loadingIndicator); - - $.ajax({ - url: "{{ route('surveyor.getFoto') }}", - method: 'GET', - data: { - permohonan_id: {{ $permohonan->id ?? 0 }}, - dokument_id: '{{ request('dokument') ?? '' }}', - param_name: paramName - }, - headers: { - 'X-CSRF-TOKEN': '{{ csrf_token() }}' - }, - beforeSend: function() { - loadingIndicator.show(); - }, - success: function(response) { - if (response.fotos && response.fotos.length) { - response.fotos.forEach(function(foto) { - var mockFile = { - name: foto.name, - size: foto.size || 12345, - originalPath: foto.path - }; - - myDropzone.emit("addedfile", mockFile); - myDropzone.emit("thumbnail", mockFile, - foto.path); - myDropzone.emit("complete", mockFile); - addEditAndDeleteButtons(mockFile, { - path: foto.path, - name: foto.name, - description: foto - .description || '', - category: foto.category || - 'lainnya', - sub: foto.sub || '', - param_name: paramName - }); - }); - } - }, - error: function(xhr, status, error) { - console.error('Gagal memuat foto:', error); - }, - complete: function() { - loadingIndicator.hide(); - } - }); + loadExistingPhotos(this, paramName); } }); + return myDropzone; } catch (error) { console.error('Dropzone initialization error:', error); @@ -406,29 +347,8 @@ } } - function updatePhotoGallery() { - const gallery = document.querySelector('#upload-dropzone'); - - if (!myDropzone) { - console.error('Dropzone is not initialized'); - return; - } - - gallery.innerHTML = ` -
-
-
- `; + function loadExistingPhotos(dropzone, paramName) { + showLoadingOverlay(); $.ajax({ url: "{{ route('surveyor.getFoto') }}", @@ -436,15 +356,13 @@ data: { permohonan_id: {{ $permohonan->id ?? 0 }}, dokument_id: '{{ request('dokument') ?? '' }}', - param_name: 'upload_foto' + param_name: paramName }, headers: { 'X-CSRF-TOKEN': '{{ csrf_token() }}' }, success: function(response) { if (response.fotos && response.fotos.length) { - gallery.innerHTML = ''; - response.fotos.forEach(function(foto) { var mockFile = { name: foto.name, @@ -452,33 +370,113 @@ originalPath: foto.path }; - myDropzone.emit("addedfile", mockFile); - myDropzone.emit("thumbnail", mockFile, foto.path); - myDropzone.emit("complete", mockFile); + dropzone.emit("addedfile", mockFile); + dropzone.emit("thumbnail", mockFile, foto.path); + dropzone.emit("complete", mockFile); addEditAndDeleteButtons(mockFile, { path: foto.path, name: foto.name, description: foto.description || '', category: foto.category || 'lainnya', sub: foto.sub || '', - param_name: 'upload_foto' + param_name: paramName }); }); - } else { - gallery.innerHTML = '

Tidak ada foto yang ditemukan.

'; } }, error: function(xhr, status, error) { console.error('Gagal memuat foto:', error); - gallery.innerHTML = '

Gagal memuat foto. Silakan coba lagi.

'; + showErrorMessage('Gagal memuat foto yang ada'); }, complete: function() { - gallery.innerHTML = gallery.innerHTML.includes('loader') ? '' : gallery - .innerHTML; + hideLoadingOverlay(); } }); } + function handleUploadComplete(file, isSuccess, errorMessage = null) { + uploadQueue--; + const index = uploadBatch.indexOf(file); + if (index > -1) { + uploadBatch.splice(index, 1); + } + + // Show individual error if any + if (!isSuccess && errorMessage) { + showErrorMessage(errorMessage); + } + + // If all uploads are complete + if (uploadQueue === 0) { + hideLoadingOverlay(); + + // Show final status message + const totalFiles = uploadBatch.length + 1; // +1 for current file + if (totalFiles === 1) { + // Single file upload + if (isSuccess) { + showSuccessMessage('Foto berhasil diupload'); + } + } else { + // Multiple files upload + showSuccessMessage(`${totalFiles} foto berhasil diupload`); + } + + // Reset batch + uploadBatch = []; + } + } + + function showLoadingOverlay() { + const overlay = document.querySelector('.loading-overlay'); + if (!overlay) { + const dropzoneElement = document.querySelector('#upload-dropzone'); + const loadingOverlay = document.createElement('div'); + loadingOverlay.className = 'loading-overlay'; + loadingOverlay.style.cssText = ` + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(255,255,255,0.7); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + `; + loadingOverlay.innerHTML = '
'; + dropzoneElement.appendChild(loadingOverlay); + } else { + overlay.style.display = 'flex'; + } + } + + function hideLoadingOverlay() { + const overlay = document.querySelector('.loading-overlay'); + if (overlay) overlay.style.display = 'none'; + } + + function showSuccessMessage(message) { + Swal.fire({ + icon: 'success', + title: message, + toast: true, + position: 'top-end', + showConfirmButton: false, + timer: 1500 + }); + } + + function showErrorMessage(message) { + Swal.fire({ + icon: 'error', + title: 'Upload Gagal', + text: message || 'Error tidak diketahui' + }); + } + + // Inisialisasi Dropzone untuk elemen awal dengan pengecekan function safeInitDropzone(selector, paramName) { setTimeout(() => { @@ -492,15 +490,12 @@ // Inisialisasi dropzone untuk elemen awal safeInitDropzone('#upload-dropzone', 'upload_foto'); - - // Event listener untuk menambah lantai - }); let fotoObjekJaminan = @json($fotoObjekJaminan); // Fungsi untuk membuka modal dan mengatur data - function openEditDataModal(file, response) { + window.openEditDrawer = function(file, response) { // Mengisi data input berdasarkan respons document.getElementById('editDataFilePath').value = response.path || ''; document.getElementById('editDataName').value = response.name || ''; @@ -567,12 +562,10 @@ cssMaxHeight: 500 }); - - // openModal('editPhotoModal'); } - function addEditAndDeleteButtons(file, response) { + window.addEditAndDeleteButtons = function(file, response) { const filePreviewElement = file.previewElement; @@ -592,7 +585,8 @@ editButton.style.cursor = 'pointer'; editButton.setAttribute("data-drawer-toggle", "#drawer_2_2"); editButton.onclick = function() { - openEditDataModal(file, response); + // e.preventDefault(); + openEditDrawer(file, response); }; // Tombol Hapus From 7ba4b4b2b4082222ec1ac813ac712c45e49d9ce1 Mon Sep 17 00:00:00 2001 From: majid Date: Tue, 11 Feb 2025 15:28:48 +0700 Subject: [PATCH 2/3] fix(surveyorr): perbaikan upload foto dan pembanding --- app/Http/Controllers/SurveyorController.php | 17 +- .../components/analisa/tanah.blade.php | 21 +- .../penilai/components/foto-jaminan.blade.php | 4 +- .../components/informasi-pembanding.blade.php | 2 +- .../components/print-out-standard.blade.php | 2 +- .../components/data-pembanding.blade.php | 39 +- .../views/surveyor/components/foto.blade.php | 33 +- .../pembanding-tanah-bangunan-unit.blade.php | 2 +- resources/views/surveyor/js/utils.blade.php | 335 +++++++++--------- 9 files changed, 240 insertions(+), 215 deletions(-) diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index db036e9..c929a95 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -82,6 +82,7 @@ use Modules\Lpj\Http\Requests\FormSurveyorRequest; use Modules\Lpj\Emails\SendJadwalKunjunganEmail; use App\Helpers\Lpj; use Modules\Lpj\Models\Authorization; + class SurveyorController extends Controller { public $user; @@ -1073,7 +1074,12 @@ class SurveyorController extends Controller // Pastikan input adalah array dan index valid if (is_array($inputValue) && isset($inputValue[$index])) { - $pembanding[$field] = $inputValue[$index]; + $value = $inputValue[$index]; + // Format hanya untuk harga, harga_diskon, dan total + if (in_array($field, ['harga', 'harga_diskon', 'total'])) { + $value = preg_replace('/[^0-9]/', '', $value); // Hapus karakter non-angka + } + $pembanding[$field] = $value; } else { $pembanding[$field] = null; } @@ -1178,6 +1184,9 @@ class SurveyorController extends Controller if ($request->filled($field)) { $newValue = $request->input($field); + if (in_array($field, ['harga', 'harga_diskon', 'total'])) { + $newValue = preg_replace('/[^0-9]/', '', $newValue); + } // Fields untuk tanah if (in_array($field, ['luas_tanah'])) { // Pastikan struktur array ada sebelum diakses @@ -1327,7 +1336,9 @@ class SurveyorController extends Controller foreach ($fields as $field) { if ($request->filled($field)) { $newValue = $request->input($field); - + if (in_array($field, ['harga', 'harga_diskon', 'total'])) { + $newValue = preg_replace('/[^0-9]/', '', $newValue); + } // Fields untuk alamat dalam asset if (in_array($field, ['address', 'village_code', 'district_code', 'city_code', 'province_code'])) { @@ -3532,7 +3543,7 @@ class SurveyorController extends Controller : 'lpj::surveyor.components.print-out.main'; // Generate PDF - $pdf = PDF::loadView($templateView, compact('permohonan', 'basicData', 'forminspeksi','alamat')); + $pdf = PDF::loadView($templateView, compact('permohonan', 'basicData', 'forminspeksi', 'alamat')); $pdf->setPaper('A4', 'portrait'); // Tentukan nama file PDF diff --git a/resources/views/penilai/components/analisa/tanah.blade.php b/resources/views/penilai/components/analisa/tanah.blade.php index 980a755..6f17db4 100644 --- a/resources/views/penilai/components/analisa/tanah.blade.php +++ b/resources/views/penilai/components/analisa/tanah.blade.php @@ -42,11 +42,12 @@ : null; @endphp - {{ !empty($bentukTanah) ? implode(', ', $bentukTanah) : 'Data tidak tersedia' }} + {{ !empty($bentukTanah) ? implode(', ', $bentukTanah) : '' }} - @if (in_array('Lainnya', $bentukTanah) && $lainnya) + @if (!empty($bentukTanah) && in_array('Lainnya', $bentukTanah) && !is_null($lainnya)) ({{ $lainnya }}) @endif + @@ -97,19 +98,16 @@ : @php - $posisiKavling = isset($forminspeksi['tanah']['posisi_kavling']['posisi_kavling']) - ? $forminspeksi['tanah']['posisi_kavling']['posisi_kavling'] - : []; - $lainnya = isset($forminspeksi['tanah']['posisi_kavling']['lainnya']) - ? $forminspeksi['tanah']['posisi_kavling']['lainnya'] - : null; + $posisiKavling = $forminspeksi['tanah']['posisi_kavling']['posisi_kavling'] ?? []; + $lainnya = $forminspeksi['tanah']['posisi_kavling']['lainnya'] ?? null; @endphp {{ !empty($posisiKavling) ? implode(', ', $posisiKavling) : '' }} - @if (in_array('Lainnya', $posisiKavling) && $lainnya) + @if (!empty($posisiKavling) && in_array('Lainnya', $posisiKavling) && !empty($lainnya)) ({{ $lainnya }}) @endif + @@ -134,13 +132,14 @@ @php $kondisiFisikTanah = $forminspeksi['tanah']['kondisi_fisik_tanah']['kondisi_fisik_tanah'][0] ?? '-'; - $lainnya = $forminspeksi['tanah']['kondisi_fisik_tanah']['lainnya']; + $lainnya = $forminspeksi['tanah']['kondisi_fisik_tanah']['lainnya'] ?? null; @endphp {{ $kondisiFisikTanah }} - @if ($kondisiFisikTanah === 'Lainnya' && $lainnya) + @if ($kondisiFisikTanah === 'Lainnya' && !empty($lainnya)) ({{ $lainnya }}) @endif + diff --git a/resources/views/penilai/components/foto-jaminan.blade.php b/resources/views/penilai/components/foto-jaminan.blade.php index 1888478..49a26a0 100644 --- a/resources/views/penilai/components/foto-jaminan.blade.php +++ b/resources/views/penilai/components/foto-jaminan.blade.php @@ -182,7 +182,7 @@ @endphp -

{{ $category }} - +

Lainnya - @isset($subcategory) @if (trim($subcategory) !== '') @@ -206,7 +206,7 @@ $imagePath = storage_path('app/public/' . $item['path']); @endphp -

{{ $category }} - +

Lainnya - @isset($subcategory) @if (trim($subcategory) !== '') diff --git a/resources/views/penilai/components/informasi-pembanding.blade.php b/resources/views/penilai/components/informasi-pembanding.blade.php index c2f3feb..87a8896 100644 --- a/resources/views/penilai/components/informasi-pembanding.blade.php +++ b/resources/views/penilai/components/informasi-pembanding.blade.php @@ -30,7 +30,7 @@

- Rp. {{ $item['harga'] }} + {{ isset($item['harga']) ? formatRupiah($item['harga']) : '' }}
diff --git a/resources/views/penilai/components/print-out-standard.blade.php b/resources/views/penilai/components/print-out-standard.blade.php index 9f9ce38..22016d1 100644 --- a/resources/views/penilai/components/print-out-standard.blade.php +++ b/resources/views/penilai/components/print-out-standard.blade.php @@ -321,7 +321,7 @@ @if ($key == 'luas_tanah' || $key == 'luas_bangunan') {{ $data[$key] ?? '-' }} m² @elseif($key == 'harga' || $key == 'harga_diskon') - Rp. {{ $data[$key] ?? 0 }} + {{ formatRupiah($data[$key]) ?? 0 }} @elseif($key == 'kordinat') @php $lat = $data['kordinat_lat'] ?? null; diff --git a/resources/views/surveyor/components/data-pembanding.blade.php b/resources/views/surveyor/components/data-pembanding.blade.php index c589cec..a8e2898 100644 --- a/resources/views/surveyor/components/data-pembanding.blade.php +++ b/resources/views/surveyor/components/data-pembanding.blade.php @@ -125,8 +125,8 @@ } } else { // Format currency untuk input harga - if (name.includes('harga') || name.includes('total') || name.includes('diskon')) { - element.value = value ? value.toString() : '0'; + if (name.includes('diskon')) { + element.value = value || '0'; } else { element.value = value || ''; } @@ -364,16 +364,16 @@ input.value = ''; } - if (input.classList.contains('currency')) { + if (input.classList.contains('currency-format')) { input.addEventListener('input', function() { + handleCurrencyInput(this); - - // Special handling for price-related inputs + // Calculate prices if needed if (input.name.includes('harga_pembanding') || input.name.includes('diskon_pembanding')) { const inputs = document.getElementsByName(input.name); const index = Array.from(inputs).indexOf(this); - calculatePrices(index); + calculatePrices('pembanding', index); } }); } @@ -382,7 +382,7 @@ if (input.name.includes('diskon_pembanding')) { input.addEventListener('input', function() { let value = - this.value = value.toString(); + this.value = value.toString(); }); } }); @@ -394,7 +394,10 @@ } - + function handleCurrencyInput(input) { + const value = input.value.replace(/[^\d]/g, ''); + input.value = formatCurrency(value); + } function removeColumn() { if (columnCount > 1) { @@ -445,6 +448,13 @@ ensureLocationEventListeners(); } + function initializeCurrencyFormat() { + document.querySelectorAll('.currency-format').forEach(input => { + input.addEventListener('input', function() { + formatCurrency(this); + }); + }); + } function initializeFirstPembandingListeners() { const firstProvinceSelect = document.getElementById('province_code_pembanding'); @@ -658,5 +668,18 @@ } }); } + document.addEventListener('DOMContentLoaded', function() { + // Initialize currency format for existing inputs + document.querySelectorAll('.currency-format').forEach(input => { + input.addEventListener('input', function() { + handleCurrencyInput(this); + }); + + // Format initial values if they exist + if (input.value) { + input.value = formatCurrency(input.value); + } + }); + }); @endpush diff --git a/resources/views/surveyor/components/foto.blade.php b/resources/views/surveyor/components/foto.blade.php index f18abbd..b7ec091 100644 --- a/resources/views/surveyor/components/foto.blade.php +++ b/resources/views/surveyor/components/foto.blade.php @@ -291,7 +291,6 @@ acceptedFiles: 'image/*', uploadMultiple: false, parallelUploads: 1, - maxFiles: 10, autoProcessQueue: true, dictDefaultMessage: 'Seret foto atau klik untuk unggah', @@ -430,28 +429,34 @@ function showLoadingOverlay() { const overlay = document.querySelector('.loading-overlay'); if (!overlay) { - const dropzoneElement = document.querySelector('#upload-dropzone'); + // Buat elemen overlay const loadingOverlay = document.createElement('div'); loadingOverlay.className = 'loading-overlay'; loadingOverlay.style.cssText = ` - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(255,255,255,0.7); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; - `; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; + `; + + // Tambahkan loader di dalam overlay loadingOverlay.innerHTML = '
'; - dropzoneElement.appendChild(loadingOverlay); + + // Tambahkan overlay ke dalam + document.body.appendChild(loadingOverlay); } else { + // Tampilkan overlay jika sudah ada overlay.style.display = 'flex'; } } + function hideLoadingOverlay() { const overlay = document.querySelector('.loading-overlay'); if (overlay) overlay.style.display = 'none'; diff --git a/resources/views/surveyor/components/pembanding-tanah-bangunan-unit.blade.php b/resources/views/surveyor/components/pembanding-tanah-bangunan-unit.blade.php index d35a730..15b0ae7 100644 --- a/resources/views/surveyor/components/pembanding-tanah-bangunan-unit.blade.php +++ b/resources/views/surveyor/components/pembanding-tanah-bangunan-unit.blade.php @@ -391,7 +391,7 @@ value="{{ $inspectionData['asset']['harga'] ?? '' }}"> - + diff --git a/resources/views/surveyor/js/utils.blade.php b/resources/views/surveyor/js/utils.blade.php index c0b19f8..30c9ec6 100644 --- a/resources/views/surveyor/js/utils.blade.php +++ b/resources/views/surveyor/js/utils.blade.php @@ -34,35 +34,23 @@ function formatCurrency(value, isDiskon = false) { - // Konversi value ke string, pastikan bukan null/undefined - let stringValue = value === null || value === undefined ? '' : String(value); - - // Ganti koma dengan titik untuk memastikan parsing numerik - stringValue = stringValue.replace(/,/g, '.'); - - // Hapus karakter non-numerik kecuali titik - let numericValue = stringValue.replace(/[^\d.]/g, ''); - - // Parse nilai numerik - const parsedValue = parseFloat(numericValue); - - if (isDiskon) { - // Format untuk diskon - return isNaN(parsedValue) ? '' : parsedValue.toLocaleString('id-ID', { - minimumFractionDigits: 0, - maximumFractionDigits: 2 - }); - } else { - // Format untuk mata uang tanpa desimal - return isNaN(parsedValue) ? '' : parsedValue.toLocaleString('id-ID', { - minimumFractionDigits: 0, - maximumFractionDigits: 0 - }); + // Ensure the value is a valid number + const numericValue = parseFloat(value); + if (isNaN(numericValue)) { + return 0; } + + // Format the number with commas for thousands separators + const formattedValue = numericValue.toLocaleString('id-ID', { + style: 'currency', + currency: 'IDR', // Indonesian Rupiah + minimumFractionDigits: isDiskon ? 2 : 0, // Include decimals for discounts + maximumFractionDigits: isDiskon ? 2 : 0, + }); + + return formattedValue; } - - function previewImage(input, previewId) { if (input.files && input.files[0]) { var reader = new FileReader(); @@ -338,172 +326,171 @@ } function updateAnalisa(params) { - const inputMap = { - jenis_asset: 'jenis_asset_tidak_sesuai', - analisa_tanah: 'analisa_tanah_tidak_sesuai', - analisa_unit: 'analisa_luas_unit_tidak_sesuai', - analisa_bangunan: 'analisa_bangunan_tidak_sesuai', - }; + const inputMap = { + jenis_asset: 'jenis_asset_tidak_sesuai', + analisa_tanah: 'analisa_tanah_tidak_sesuai', + analisa_unit: 'analisa_luas_unit_tidak_sesuai', + analisa_bangunan: 'analisa_bangunan_tidak_sesuai', + }; - // Pastikan elemen ID ada di inputMap - if (!inputMap[params]) { - console.error('Parameter tidak valid:', params); - return; + // Pastikan elemen ID ada di inputMap + if (!inputMap[params]) { + console.error('Parameter tidak valid:', params); + return; + } + + // Ambil nilai berdasarkan parameter + const inputValue = document.getElementById(inputMap[params]).value; + const data = { + [params === 'jenis_asset' ? 'jenis_asset' : params.replace('analisa_', 'luas_')]: inputValue, + types: params + }; + + $.ajax({ + url: '{{ route('surveyor.update_analisa', ['id' => $permohonan->id]) }}', + type: 'POST', + data: data, + headers: { + 'X-CSRF-TOKEN': '{{ csrf_token() }}' + }, + success: function(response) { + console.log(response); + if (response.success) { + // window.location.href = + // '{{ route('surveyor.show', ['id' => $permohonan->id]) }}'; + toastrSuccessBuild(response.message); + } + }, + error: function(xhr, status, error) { + console.error('Terjadi error:', error); + console.log('Status:', status); + console.log('Response:', xhr.responseText); + if (xhr.responseJSON.message) { + toastrErrorBuild(xhr.responseJSON.message); + } else { + toastrErrorBuild('Terjadi kesalahan'); + } + } + }); + } + + function updateAlamatFields(status) { + // Ambil elemen formulir + const addressForm = document.getElementById('alamat_form'); + const inputs = addressForm.querySelectorAll('input, select'); + const addressInput = document.getElementById('address'); + + if (status === 'sesuai') { + addressInput.value = "{{ $dokumen->address ?? '' }}"; + inputs.forEach(element => { + if (element.tagName === 'INPUT') { + element.setAttribute('readonly', true); + } else if (element.tagName === 'SELECT') { + element.setAttribute('disabled', true); + element.classList.add('disabled-input') + } + }); + + addressForm.style.display = 'grid'; + addressForm.disabled = true; + addressForm.classList.add('disabled-input') + + + } else if (status === 'tidak sesuai') { + addressForm.style.display = 'grid'; + + addressForm.removeAttribute('disabled'); + addressForm.classList.remove('disabled-input') + const formInspeksi = @json($forminspeksi ?? ''); + const addressInput = document.getElementById('address'); + + if (formInspeksi && formInspeksi.asset && formInspeksi.asset.alamat) { + if (formInspeksi.asset.alamat['tidak sesuai'] && formInspeksi.asset.alamat['tidak sesuai'].address) { + addressInput.value = formInspeksi.asset.alamat['tidak sesuai'].address; + } else if (formInspeksi.asset.alamat['sesuai'] && formInspeksi.asset.alamat['sesuai'].address) { + addressInput.value = formInspeksi.asset.alamat['sesuai'].address; + } else { + addressInput.value = ""; + } } - // Ambil nilai berdasarkan parameter - const inputValue = document.getElementById(inputMap[params]).value; - const data = { - [params === 'jenis_asset' ? 'jenis_asset' : params.replace('analisa_', 'luas_')]: inputValue, - types: params - }; - - $.ajax({ - url: '{{ route('surveyor.update_analisa', ['id' => $permohonan->id]) }}', - type: 'POST', - data: data, - headers: { - 'X-CSRF-TOKEN': '{{ csrf_token() }}' - }, - success: function(response) { - console.log(response); - if (response.success) { - // window.location.href = - // '{{ route('surveyor.show', ['id' => $permohonan->id]) }}'; - toastrSuccessBuild(response.message); - } - }, - error: function(xhr, status, error) { - console.error('Terjadi error:', error); - console.log('Status:', status); - console.log('Response:', xhr.responseText); - if (xhr.responseJSON.message) { - toastrErrorBuild(xhr.responseJSON.message); - } else { - toastrErrorBuild('Terjadi kesalahan'); - } + inputs.forEach(element => { + if (element.tagName === 'INPUT') { + element.removeAttribute('readonly'); + } else if (element.tagName === 'SELECT') { + element.removeAttribute('disabled'); + element.classList.remove('disabled-input') } }); } + } - function updateAlamatFields(status) { - // Ambil elemen formulir - const addressForm = document.getElementById('alamat_form'); - const inputs = addressForm.querySelectorAll('input, select'); - const addressInput = document.getElementById('address'); + function toggleFieldVisibility(fieldName, inputId, visibleValues = []) { + const selectedValue = $(`[name="${fieldName}"]:checked`).val(); + const inputField = $(`#${inputId}`); - if (status === 'sesuai') { - addressInput.value = "{{ $dokumen->address ?? '' }}"; - inputs.forEach(element => { - if (element.tagName === 'INPUT') { - element.setAttribute('readonly', true); - } else if (element.tagName === 'SELECT') { - element.setAttribute('disabled', true); - element.classList.add('disabled-input') - } - }); - - addressForm.style.display = 'grid'; - addressForm.disabled = true; - addressForm.classList.add('disabled-input') - - - } else if (status === 'tidak sesuai') { - addressForm.style.display = 'grid'; - - addressForm.removeAttribute('disabled'); - addressForm.classList.remove('disabled-input') - const formInspeksi = @json($forminspeksi ?? ''); - const addressInput = document.getElementById('address'); - - if (formInspeksi && formInspeksi.asset && formInspeksi.asset.alamat) { - if (formInspeksi.asset.alamat['tidak sesuai'] && formInspeksi.asset.alamat['tidak sesuai'].address) { - addressInput.value = formInspeksi.asset.alamat['tidak sesuai'].address; - } else if (formInspeksi.asset.alamat['sesuai'] && formInspeksi.asset.alamat['sesuai'].address) { - addressInput.value = formInspeksi.asset.alamat['sesuai'].address; - } else { - addressInput.value = ""; - } - } - - inputs.forEach(element => { - if (element.tagName === 'INPUT') { - element.removeAttribute('readonly'); - } else if (element.tagName === 'SELECT') { - element.removeAttribute('disabled'); - element.classList.remove('disabled-input') - } - }); - } + if (visibleValues.includes(selectedValue)) { + inputField.show(); + } else { + inputField.hide().val(''); } + } - function toggleFieldVisibility(fieldName, inputId, visibleValues = []) { - const selectedValue = $(`[name="${fieldName}"]:checked`).val(); + + function toggleCheckboxVisibility(fieldName, inputId, visibleValues = []) { + const selectedValues = $(`[name="${fieldName}[]"]:checked`) + .map(function() { + return $(this).val().toLowerCase(); // Konversi nilai ke huruf kecil + }) + .get(); + + const inputField = $(`#${inputId}`); + + // Cek apakah salah satu nilai yang dipilih cocok dengan visibleValues + const shouldShow = visibleValues.some(value => selectedValues.includes(value.toLowerCase())); + + if (shouldShow) { + inputField.show(); + } else { + inputField.hide().val(''); + } + } + + + function toggleMultipleFields(fieldName, mappings) { + // Ambil semua nilai checkbox yang dicentang + const selectedValues = $(`[name="${fieldName}[]"]:checked`) + .map(function() { + return $(this).val().toLowerCase(); // Konversi nilai ke huruf kecil + }) + .get(); + + // Iterasi melalui setiap mapping + for (const [key, inputId] of Object.entries(mappings)) { const inputField = $(`#${inputId}`); - if (visibleValues.includes(selectedValue)) { + // Tampilkan input jika nilai yang relevan dipilih + if (selectedValues.includes(key.toLowerCase())) { inputField.show(); } else { - inputField.hide().val(''); + inputField.hide().val(''); // Sembunyikan dan reset nilai } } + } - function toggleCheckboxVisibility(fieldName, inputId, visibleValues = []) { - const selectedValues = $(`[name="${fieldName}[]"]:checked`) - .map(function() { - return $(this).val().toLowerCase(); // Konversi nilai ke huruf kecil - }) - .get(); + function toggleAlamatVisibility(idSesuai, idTidakSesuai, selectedValue) { + // Ambil elemen berdasarkan ID + const alamatSesuai = document.getElementById(idSesuai); + const alamatTidakSesuai = document.getElementById(idTidakSesuai); - const inputField = $(`#${inputId}`); - - // Cek apakah salah satu nilai yang dipilih cocok dengan visibleValues - const shouldShow = visibleValues.some(value => selectedValues.includes(value.toLowerCase())); - - if (shouldShow) { - inputField.show(); - } else { - inputField.hide().val(''); - } + // Periksa nilai yang dipilih dan tampilkan elemen yang sesuai + if (selectedValue === 'sesuai') { + alamatSesuai.style.display = 'grid'; // Tampilkan "Alamat Sesuai" + alamatTidakSesuai.style.display = 'none'; // Sembunyikan "Alamat Tidak Sesuai" + } else if (selectedValue === 'tidak sesuai') { + alamatSesuai.style.display = 'none'; // Sembunyikan "Alamat Sesuai" + alamatTidakSesuai.style.display = 'grid'; // Tampilkan "Alamat Tidak Sesuai" } - - - function toggleMultipleFields(fieldName, mappings) { - // Ambil semua nilai checkbox yang dicentang - const selectedValues = $(`[name="${fieldName}[]"]:checked`) - .map(function() { - return $(this).val().toLowerCase(); // Konversi nilai ke huruf kecil - }) - .get(); - - // Iterasi melalui setiap mapping - for (const [key, inputId] of Object.entries(mappings)) { - const inputField = $(`#${inputId}`); - - // Tampilkan input jika nilai yang relevan dipilih - if (selectedValues.includes(key.toLowerCase())) { - inputField.show(); - } else { - inputField.hide().val(''); // Sembunyikan dan reset nilai - } - } - } - - - function toggleAlamatVisibility(idSesuai, idTidakSesuai, selectedValue) { - // Ambil elemen berdasarkan ID - const alamatSesuai = document.getElementById(idSesuai); - const alamatTidakSesuai = document.getElementById(idTidakSesuai); - - // Periksa nilai yang dipilih dan tampilkan elemen yang sesuai - if (selectedValue === 'sesuai') { - alamatSesuai.style.display = 'grid'; // Tampilkan "Alamat Sesuai" - alamatTidakSesuai.style.display = 'none'; // Sembunyikan "Alamat Tidak Sesuai" - } else if (selectedValue === 'tidak sesuai') { - alamatSesuai.style.display = 'none'; // Sembunyikan "Alamat Sesuai" - alamatTidakSesuai.style.display = 'grid'; // Tampilkan "Alamat Tidak Sesuai" - } - } - + } From c860daa1d54b51a0fd52b5538ed28a0834dd9380 Mon Sep 17 00:00:00 2001 From: majid Date: Wed, 12 Feb 2025 18:03:05 +0700 Subject: [PATCH 3/3] feat(pemohon): menambahkan fitur reschedule jadwal kunjungan fix(surveyor): memperbaiki nama placeholder dan call report --- app/Http/Controllers/PenilaiController.php | 8 +- app/Http/Controllers/PermohonanController.php | 796 ++++++++++-------- app/Http/Controllers/SurveyorController.php | 151 +++- app/Models/Penilaian.php | 2 +- ...penilaian_table_add_reschedule_columns.php | 30 + .../penilai/components/call-report.blade.php | 110 +-- resources/views/permohonan/index.blade.php | 195 +++-- .../surveyor/components/bangunan.blade.php | 2 +- .../surveyor/components/header.blade.php | 27 +- .../surveyor/components/informasi.blade.php | 2 +- .../surveyor/components/lingkungan.blade.php | 6 +- .../views/surveyor/components/tanah.blade.php | 9 +- resources/views/surveyor/index.blade.php | 202 ++++- routes/web.php | 9 +- 14 files changed, 1009 insertions(+), 540 deletions(-) create mode 100644 database/migrations/2025_02_12_071426_update_penilaian_table_add_reschedule_columns.php diff --git a/app/Http/Controllers/PenilaiController.php b/app/Http/Controllers/PenilaiController.php index 130df75..02b983b 100644 --- a/app/Http/Controllers/PenilaiController.php +++ b/app/Http/Controllers/PenilaiController.php @@ -403,8 +403,8 @@ class PenilaiController extends Controller $jaminanId = $request->query('jaminanId'); $provinces = Province::all(); $permohonan = $this->surveyorController->getPermohonanJaminanId($permohonanId, $documentId, $jaminanId); - // $nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'rap'); - // $basicData = $this->surveyorController->getCommonData(); + $nomorLaporan = $this->generateNoLaporan($permohonan, $documentId, 'call-report'); + $basicData = $this->surveyorController->getCommonData(); // $inspeksi = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first(); // Penilai::updateOrCreate( // [ @@ -462,7 +462,7 @@ class PenilaiController extends Controller // return view('lpj::penilai.components.call-report', compact('permohonan', 'rap', 'provinces', 'cities', // 'districts', // 'villages','forminspeksi', 'noLpRAP', 'basicData','cekAlamat')); - return view('lpj::penilai.components.call-report', compact('permohonan')); + return view('lpj::penilai.components.call-report', compact('permohonan','basicData', 'nomorLaporan')); } /** @@ -1183,7 +1183,7 @@ class PenilaiController extends Controller public function generateNoLaporan($permohonan, $documentId, $type) { - $typeMapping = ['lpj' => 'LPJ', 'memo' => 'MAK', 'rap' => 'RAP']; + $typeMapping = ['lpj' => 'LPJ', 'memo' => 'MAK', 'rap' => 'RAP', 'call-report' => 'CR']; // Cek apakah data sudah ada $laporan = Laporan::where([ diff --git a/app/Http/Controllers/PermohonanController.php b/app/Http/Controllers/PermohonanController.php index 76f7ce3..51e6f0e 100644 --- a/app/Http/Controllers/PermohonanController.php +++ b/app/Http/Controllers/PermohonanController.php @@ -1,407 +1,481 @@ historyService = $historyService; + } - public function __construct(PermohonanHistoryService $historyService) - { - $this->historyService = $historyService; - } + public function index() + { + return view('lpj::permohonan.index'); + } - public function index() - { - return view('lpj::permohonan.index'); - } - - public function store(PermohonanRequest $request) - { - $validate = $request->validated(); - if ($validate) { - try { - // Process file upload - $filePath = null; - if ($request->hasFile('attachment')) { - $file = $request->file('attachment'); - $fileName = time() . '_' . $file->getClientOriginalName(); - $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public'); - } - - // Get keterangan if provided - $keterangan = $request->input('keterangan') ?? null; - - - // Save to database - $permohonan = Permohonan::create($validate); - - // Create history - $this->historyService->createHistory( - $permohonan, - $validate['status'], - $keterangan, - [], // beforeRequest is empty for new permohonan - $permohonan->toArray(), - $filePath, - ); - - $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); - if(count($documents)<1){ - return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id'=>$permohonan->id],['id'=> $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); - } - return redirect() - ->route('permohonan.index')->with('success', 'Permohonan created successfully'); - } catch (Exception $e) { - return redirect() - ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage()); + public function store(PermohonanRequest $request) + { + $validate = $request->validated(); + if ($validate) { + try { + // Process file upload + $filePath = null; + if ($request->hasFile('attachment')) { + $file = $request->file('attachment'); + $fileName = time() . '_' . $file->getClientOriginalName(); + $filePath = $file->storeAs('permohonan_attachments', $fileName, 'public'); + } + + // Get keterangan if provided + $keterangan = $request->input('keterangan') ?? null; + + + // Save to database + $permohonan = Permohonan::create($validate); + + // Create history + $this->historyService->createHistory( + $permohonan, + $validate['status'], + $keterangan, + [], // beforeRequest is empty for new permohonan + $permohonan->toArray(), + $filePath, + ); + + $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); + if (count($documents) < 1) { + return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); } - } else { return redirect() - ->route('permohonan.create')->with('success', 'error naon iye')->withInput(); + ->route('permohonan.index')->with('success', 'Permohonan created successfully'); + } catch (Exception $e) { + return redirect() + ->route('permohonan.create')->with('error', 'Failed to create permohonan' . $e->getMessage()); } + } else { + return redirect() + ->route('permohonan.create')->with('success', 'error naon iye')->withInput(); } + } - public function create() - { - return view('lpj::permohonan.create'); - } + public function create() + { + return view('lpj::permohonan.create'); + } - public function createPermohonan($debitur) - { - $branches = Branch::all(); - $debitur = Debiture::find($debitur); - $tujuanPenilaian = TujuanPenilaian::all(); - $status = StatusPermohonan::all(); - $fasilitasKredit = JenisFasilitasKredit::all(); - $plafond = NilaiPlafond::all(); + public function createPermohonan($debitur) + { + $branches = Branch::all(); + $debitur = Debiture::find($debitur); + $tujuanPenilaian = TujuanPenilaian::all(); + $status = StatusPermohonan::all(); + $fasilitasKredit = JenisFasilitasKredit::all(); + $plafond = NilaiPlafond::all(); - return view( - 'lpj::permohonan.form', - compact('branches', 'debitur', 'tujuanPenilaian', 'status', 'fasilitasKredit', 'plafond'), - ); - } + return view( + 'lpj::permohonan.form', + compact('branches', 'debitur', 'tujuanPenilaian', 'status', 'fasilitasKredit', 'plafond'), + ); + } - public function edit($id) - { - $permohonan = Permohonan::find($id); - $branches = Branch::all(); - $debitur = Debiture::find($permohonan->debiture_id); - $tujuanPenilaian = TujuanPenilaian::all(); - $status = StatusPermohonan::all(); - $provinces = Province::all(); - $cities = City::where('province_code', $debitur->province_code)->get(); - $districts = District::where('city_code', $debitur->city_code)->get(); - $villages = Village::where('district_code', $debitur->district_code)->get(); - $documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get(); + public function edit($id) + { + $permohonan = Permohonan::find($id); + $branches = Branch::all(); + $debitur = Debiture::find($permohonan->debiture_id); + $tujuanPenilaian = TujuanPenilaian::all(); + $status = StatusPermohonan::all(); + $provinces = Province::all(); + $cities = City::where('province_code', $debitur->province_code)->get(); + $districts = District::where('city_code', $debitur->city_code)->get(); + $villages = Village::where('district_code', $debitur->district_code)->get(); + $documents = DokumenJaminan::with('pemilik', 'detail')->where('debiture_id', $id)->get(); - $fasilitasKredit = JenisFasilitasKredit::all(); - $plafond = NilaiPlafond::all(); + $fasilitasKredit = JenisFasilitasKredit::all(); + $plafond = NilaiPlafond::all(); - return view( - 'lpj::permohonan.form', - compact( - 'permohonan', - 'branches', - 'debitur', - 'tujuanPenilaian', - 'status', - 'provinces', - 'cities', - 'districts', - 'villages', - 'documents', - 'fasilitasKredit', - 'plafond', - ), - ); - } + return view( + 'lpj::permohonan.form', + compact( + 'permohonan', + 'branches', + 'debitur', + 'tujuanPenilaian', + 'status', + 'provinces', + 'cities', + 'districts', + 'villages', + 'documents', + 'fasilitasKredit', + 'plafond', + ), + ); + } - public function update(PermohonanRequest $request, $id) - { - $permohonan = Permohonan::findOrFail($id); - $beforeRequest = $permohonan->toArray(); + public function update(PermohonanRequest $request, $id) + { + $permohonan = Permohonan::findOrFail($id); + $beforeRequest = $permohonan->toArray(); - $validate = $request->validated(); - if ($validate) { - try { - // Update in database + $validate = $request->validated(); + if ($validate) { + try { + // Update in database - if ($permohonan->status == 'revisi') { - $validate['status'] = 'order'; - } - $permohonan->update($validate); - - $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); - if(count($documents)<1){ - return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id'=>$permohonan->id],['id'=> $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); - } - - return redirect() - ->route('permohonan.index')->with('success', 'Permohonan updated successfully'); - } catch (Exception $e) { - return redirect() - ->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan'); + if ($permohonan->status == 'revisi') { + $validate['status'] = 'order'; } - } - } + $permohonan->update($validate); - public function destroy($id) - { - try { - // Delete from database - $permohonan = Permohonan::find($id); - $permohonan->delete(); + $documents = DokumenJaminan::where('permohonan_id', $permohonan->id)->get(); + if (count($documents) < 1) { + return redirect()->route('debitur.jaminan.create', array_merge(['permohonan_id' => $permohonan->id], ['id' => $permohonan->debiture->id]))->with('success', 'Permohonan created successfully, Lengkapi data jaminan terlebih dahulu'); + } - echo json_encode(['success' => true, 'message' => 'Permohonan deleted successfully']); + return redirect() + ->route('permohonan.index')->with('success', 'Permohonan updated successfully'); } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Failed to delete permohonan']); + return redirect() + ->route('permohonan.edit', $id)->with('error', 'Failed to update permohonan'); } } + } - public function dataForDatatables(Request $request) - { - if (is_null($this->user) || !$this->user->can('debitur.view')) { - //abort(403, 'Sorry! You are not allowed to view users.'); - } - - // Retrieve data from the database - $query = Permohonan::query(); - - if(!Auth::user()->hasAnyRole(['administrator'])) { - $query = $query->where('branch_id', Auth::user()->branch_id); - } - - $query = $query->orderBy('nomor_registrasi', 'desc'); - // Apply search filter if provided - if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('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('debiture', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhere('status', 'LIKE', '%' . $search . '%'); - }); - } - - // 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(); - $size = $request->get('size', 10); - if ($size == 0) { - $size = 10; - } - - // 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(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','documents'])->get(); - - // Calculate the page count - $pageCount = ceil($totalRecords / $size); - - // Calculate the current page number - $currentPage = max(1, $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, - ]); - } - - public function export() - { - return Excel::download(new PermohonanExport, 'permohonan.xlsx'); - } - - public function authorization() - { - return view('lpj::permohonan.authorization.index'); - } - - public function dataForAuthorization(Request $request) - { - if (is_null($this->user) || !$this->user->can('debitur.view')) { - //abort(403, 'Sorry! You are not allowed to view users.'); - } - - // Retrieve data from the database - $query = Permohonan::query()->with('documents')->has('documents', '>', 0)->where('status', '=', 'order'); - - // Apply search filter if provided - if ($request->has('search') && !empty($request->get('search'))) { - $search = $request->get('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('debiture', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); - $q->orWhere('status', 'LIKE', '%' . $search . '%'); - }); - } - - // 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(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get( - ); - - // Calculate the page count - $pageCount = ceil($totalRecords / $request->get('size')); - - // Calculate the current page number - $currentPage = 0 + 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, - ]); - } - - public function showAuthorization($id) - { + public function destroy($id) + { + try { + // Delete from database $permohonan = Permohonan::find($id); - return view('lpj::permohonan.authorization.show', compact('permohonan')); + $permohonan->delete(); + + echo json_encode(['success' => true, 'message' => 'Permohonan deleted successfully']); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Failed to delete permohonan']); + } + } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); } - public function updateAuthorization(Request $request, $id) - { + // Retrieve data from the database + $query = Permohonan::query(); + + if (!Auth::user()->hasAnyRole(['administrator'])) { + $query = $query->where('branch_id', Auth::user()->branch_id); + } + + $query = $query->orderBy('nomor_registrasi', 'desc'); + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('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('debiture', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search . '%'); + }); + } + + // 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(); + $size = $request->get('size', 10); + if ($size == 0) { + $size = 10; + } + + // 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(['user', 'debiture', 'branch', 'tujuanPenilaian', 'penilaian','documents'])->get(); + + // Calculate the page count + $pageCount = ceil($totalRecords / $size); + + // Calculate the current page number + $currentPage = max(1, $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, + ]); + } + + public function export() + { + return Excel::download(new PermohonanExport(), 'permohonan.xlsx'); + } + + public function authorization() + { + return view('lpj::permohonan.authorization.index'); + } + + public function dataForAuthorization(Request $request) + { + if (is_null($this->user) || !$this->user->can('debitur.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = Permohonan::query()->with('documents')->has('documents', '>', 0)->where('status', '=', 'order'); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('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('debiture', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); + $q->orWhere('status', 'LIKE', '%' . $search . '%'); + }); + } + + // 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(['user', 'debiture', 'branch', 'tujuanPenilaian'])->get( + ); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = 0 + 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, + ]); + } + + public function showAuthorization($id) + { + $permohonan = Permohonan::find($id); + return view('lpj::permohonan.authorization.show', compact('permohonan')); + } + + public function updateAuthorization(Request $request, $id) + { + try { + $permohonan = Permohonan::find($id); + $permohonan->status = $request->status; + $permohonan->keterangan = $request->keterangan; + $permohonan->save(); + } catch (Exception $e) { + return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan'); + } + + return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully'); + } + + public function show($id) + { + $permohonan = Permohonan::find($id); + + return view('lpj::permohonan.show', compact('permohonan')); + } + + public function print($id) + { + $permohonan = Permohonan::find($id); + return view('lpj::permohonan.print', compact('permohonan')); + + // $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan')); + // return $pdf->stream(); + } + + public function showPembatalan($id) + { + $permohonan = Permohonan::with(['pembatalan','debiture'])->findOrFail($id); + return view('lpj::permohonan.pembatalan-form', compact('permohonan')); + } + + + public function pembatalan(Request $request) + { + // Validate the request + $validatedData = $request->validate([ + 'permohonan_id' => 'required|exists:permohonan,id', + 'alasan_pembatalan' => 'required|string', + 'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048', + ]); + + // Handle file upload + if ($request->hasFile('file_pembatalan')) { + $file = $request->file('file_pembatalan'); + $filename = time() . '_' . $file->getClientOriginalName(); + $filePath = $file->storeAs('pembatalan', $filename, 'public'); + $validatedData['file_pembatalan'] = $filePath; + } + + // Add created_by + $validatedData['created_by'] = auth()->id(); + + // Create new PermohonanPembatalan + $pembatalan = PermohonanPembatalan::create($validatedData); + + return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval'); + } + + public function storeAproved(Request $request, $id): JsonResponse + { + $data = []; + if (request()->ajax()) { try { - $permohonan = Permohonan::find($id); - $permohonan->status = $request->status; - $permohonan->keterangan = $request->keterangan; - $permohonan->save(); - } catch (Exception $e) { - return redirect()->route('authorization.show', $id)->with('error', 'Failed to update permohonan'); + $penilaian = Penilaian::findOrFail($id); + $penilaian->update([ + 'authorized_status' => 1, + ]); + + $permohonan = Permohonan::findOrFail($request->permohonan_id); + + $permohonan->update([ + 'status' => 'proses-survey' + ]); + + $data['status'] = 'success'; + $data['message'] = 'Jadwal '.$request->noReg.' berhasil di aprove'; + } catch (\Exception $e) { + $data['status'] = 'error'; + $data['message'] = 'Gagal membuat jadwal: ' . $e->getMessage(); } - return redirect()->route('authorization.index')->with('success', 'Permohonan updated successfully'); + } else { + $data['status'] = 'error'; + $data['message'] = "no ajax request"; } - public function show($id) - { - $permohonan = Permohonan::find($id); - - return view('lpj::permohonan.show', compact('permohonan')); - } - - public function print($id) - { - $permohonan = Permohonan::find($id); - return view('lpj::permohonan.print', compact('permohonan')); - - // $pdf = Pdf::loadView('lpj::permohonan.print', compact('permohonan')); - // return $pdf->stream(); - } - - public function showPembatalan($id) - { - $permohonan = Permohonan::with(['pembatalan','debiture'])->findOrFail($id); - return view('lpj::permohonan.pembatalan-form', compact('permohonan')); - } + return response()->json($data); + } - public function pembatalan(Request $request) - { - // Validate the request + public function storeRescheduleSurvey(Request $request, $id) + { + try { $validatedData = $request->validate([ 'permohonan_id' => 'required|exists:permohonan,id', - 'alasan_pembatalan' => 'required|string', - 'file_pembatalan' => 'required|file|mimes:pdf,doc,docx|max:2048', + 'penilaian_id' => 'nullable', + 'nomor_registrasi' => 'required', + 'reschedule_note' => 'required', + 'reschedule_date' => 'required', ]); - // Handle file upload - if ($request->hasFile('file_pembatalan')) { - $file = $request->file('file_pembatalan'); - $filename = time() . '_' . $file->getClientOriginalName(); - $filePath = $file->storeAs('pembatalan', $filename, 'public'); - $validatedData['file_pembatalan'] = $filePath; - } + DB::beginTransaction(); - // Add created_by - $validatedData['created_by'] = auth()->id(); + $permohonan = Permohonan::findOrFail($request->permohonan_id); + $permohonan->update([ + 'status' => 'request-reschedule' + ]); - // Create new PermohonanPembatalan - $pembatalan = PermohonanPembatalan::create($validatedData); + $penilaian = Penilaian::findOrFail($id); - return redirect()->route('permohonan.index')->with('success', 'Pembatalan Permohonan Menunggu Approval'); + $penilaian->update([ + 'reschedule_date' => $request->reschedule_date, + 'reschedule_note' => $request->reschedule_note, + ]); + + DB::commit(); + return response()->json([ + 'status' => 'success', + 'message' => 'Proses request reschedule permohonan Nomor registrasi '.$request->nomor_registrasi.' berhasil', + ]); + } catch (\Exception $e) { + DB::rollBack(); + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal membuat request reschedule: ' . $e->getMessage(), + ]); } - } + +} diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index c929a95..0ab18e9 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -82,6 +82,7 @@ use Modules\Lpj\Http\Requests\FormSurveyorRequest; use Modules\Lpj\Emails\SendJadwalKunjunganEmail; use App\Helpers\Lpj; use Modules\Lpj\Models\Authorization; +use Illuminate\Support\Facades\Log; class SurveyorController extends Controller { @@ -929,46 +930,14 @@ class SurveyorController extends Controller ->route('surveyor.index') ->with('success', 'Jadwal berhasil dibuat.'); } catch (\Exception $e) { + \Log::error('Error sending email: ' . $e->getMessage()); return redirect() ->route('surveyor.index') - ->with('error', 'Tanggal dan catatan tidak boleh kosong'); + ->with('error', 'Internal Server Error: ' . $e->getMessage()); } } - - public function storeAproved(Request $request, $id): JsonResponse - { - $data = []; - if (request()->ajax()) { - try { - $penilaian = Penilaian::findOrFail($id); - $penilaian->update([ - 'authorized_status' => 1, - ]); - - $permohonan = Permohonan::findOrFail($request->permohonan_id); - - $permohonan->update([ - 'status' => 'survey' - ]); - - $data['status'] = 'success'; - $data['message'] = 'Jadwal '.$request->noReg.' berhasil di aprove'; - } catch (\Exception $e) { - $data['status'] = 'error'; - $data['message'] = 'Gagal membuat jadwal: ' . $e->getMessage(); - } - - } else { - $data['status'] = 'error'; - $data['message'] = "no ajax request"; - } - - return response()->json($data); - } - - public function storeFreeze($id, Request $request) { try { @@ -2048,7 +2017,7 @@ class SurveyorController extends Controller }); } - $query->whereRaw('LOWER(status) IN (?, ?)', ['assign', 'survey']); + $query->whereRaw('LOWER(status) IN (?, ?, ?, ?, ?, ? ,?)', ['assign', 'survey', 'proses-survey', 'request-reschedule', 'reschedule', 'rejected-reschedule', 'approved-reschedule' ]); if (!Auth::user()->hasRole('administrator')) { @@ -3553,5 +3522,117 @@ class SurveyorController extends Controller return $pdf->download($fileName); } + public function approveReschedule(Request $request, $id) + { + try { + // Validasi data yang diterima + $validatedData = $request->validate([ + 'permohonan_id' => 'required|exists:permohonan,id', + 'nomor_registrasi' => 'required' + ]); + // Memulai transaksi + DB::beginTransaction(); + + // Update status permohonan menjadi "reschedule" + $permohonan = Permohonan::findOrFail($validatedData['permohonan_id']); + $permohonan->update([ + 'status' => 'approved-reschedule', + ]); + + // Update data penilaian dengan waktu reschedule + $penilaian = Penilaian::findOrFail($id); + $penilaian->update([ + 'waktu_penilaian' => $penilaian->reschedule_date, + ]); + + // Commit transaksi + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Reschedule jadwal dengan nomor registrasi ' . $validatedData['nomor_registrasi'] . ' berhasil disetujui.', + ]); + } catch (\Exception $e) { + // Rollback jika ada error + DB::rollBack(); + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal menyetujui reschedule: ' . $e->getMessage(), + ], 500); + } + } + + /** + * Reject reschedule request. + */ + public function rejectReschedule(Request $request, $id) + { + try { + // Validasi data yang diterima + $validatedData = $request->validate([ + 'permohonan_id' => 'required|exists:permohonan,id', + 'rejected_note' => 'required|string|max:255', + 'nomor_registrasi' => 'required|string', + ]); + + // Memulai transaksi + DB::beginTransaction(); + + // Update status permohonan menjadi "rejected-reschedule" + $permohonan = Permohonan::findOrFail($validatedData['permohonan_id']); + $permohonan->update([ + 'status' => 'rejected-reschedule', + ]); + + // Update data penilaian dengan catatan penolakan + $penilaian = Penilaian::findOrFail($id); + $penilaian->update([ + 'rejected_note' => $validatedData['rejected_note'], + ]); + + // Commit transaksi + DB::commit(); + + return response()->json([ + 'status' => 'success', + 'message' => 'Reschedule jadwal dengan nomor registrasi ' . $validatedData['nomor_registrasi'] . ' berhasil ditolak dengan alasan: ' . $validatedData['rejected_note'], + ]); + } catch (\Exception $e) { + // Rollback jika ada error + DB::rollBack(); + return response()->json([ + 'status' => 'error', + 'message' => 'Gagal menolak reschedule: ' . $e->getMessage(), + ], 500); + } + } + + public function storeProsesSurvey(Request $request, $id) + { + try { + + $validated = $request->validate([ + 'permohonan_id' => 'required|integer|exists:permohonan,id', + ]); + + + $permohonan = Permohonan::findOrFail($id); + + $permohonan->status = 'survey'; + $permohonan->save(); + + // Berikan respons JSON + return response()->json([ + 'status' => 'success', + 'message' => 'Status permohonan berhasil diubah menjadi "survey".', + ]); + } catch (\Exception $e) { + // Tangani error + return response()->json([ + 'status' => 'error', + 'message' => $e->getMessage(), + ], 500); + } + } } diff --git a/app/Models/Penilaian.php b/app/Models/Penilaian.php index a3f02c5..7383245 100644 --- a/app/Models/Penilaian.php +++ b/app/Models/Penilaian.php @@ -19,7 +19,7 @@ class Penilaian extends Model protected $fillable = [ 'jenis_penilaian_id', 'penilaian_id', 'tanggal_kunjungan', 'keterangan','nomor_registrasi', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_at', - 'created_by', 'updated_at', 'updated_by', 'deleted_at', 'deleted_by','waktu_penilaian', 'deskripsi_penilaian' + 'created_by', 'updated_at', 'updated_by', 'deleted_at', 'deleted_by','waktu_penilaian', 'deskripsi_penilaian', 'reschedule_date','reschedule_note','rejected_note' ]; public function jenis_penilaian() diff --git a/database/migrations/2025_02_12_071426_update_penilaian_table_add_reschedule_columns.php b/database/migrations/2025_02_12_071426_update_penilaian_table_add_reschedule_columns.php new file mode 100644 index 0000000..d0db3ec --- /dev/null +++ b/database/migrations/2025_02_12_071426_update_penilaian_table_add_reschedule_columns.php @@ -0,0 +1,30 @@ +datetime('reschedule_date')->nullable()->after('waktu_penilaian'); + $table->text('reschedule_note')->nullable()->after('reschedule_date'); + $table->text('rejected_note')->nullable()->after('reschedule_note'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('penilaian', function (Blueprint $table) { + $table->dropColumn(['reschedule_date', 'reschedule_note', 'rejected_note']); + }); + } +}; diff --git a/resources/views/penilai/components/call-report.blade.php b/resources/views/penilai/components/call-report.blade.php index 6685408..f10797d 100644 --- a/resources/views/penilai/components/call-report.blade.php +++ b/resources/views/penilai/components/call-report.blade.php @@ -6,13 +6,15 @@ @section('content')
- @php + @php $senior_officer = null; + $jenisJaminan = null; if ($permohonan->debiture && $permohonan->documents) { foreach ($permohonan->documents as $dokumen) { $penilai = $permohonan->penilaian->userPenilai->where('role', 'penilai')->first(); $teams = $permohonan->region->teams; + $jenisJaminan = $dokumen->jenisJaminan->name; if ($teams) { foreach ($teams as $team) { $team_users = $team->teamsUsers; @@ -35,8 +37,8 @@ @endphp
@csrf - - + + @@ -62,7 +64,7 @@
+ value="{{ $callReport['dari'] ?? $permohonan->branch->name ?? "" }}">
@@ -92,11 +94,14 @@
+ +

Menindak lanjuti permintaan - {{$permohonan->tujuanPenilaian->name ?? ''}}, BAG CABang {{ $permohonan->branch->name }} - disampaikan hal sebagai berikut: + {{ $permohonan->tujuanPenilaian->name ?? '' }}, BAG CABang + {{ $permohonan->branch->name }} + disampaikan hal sebagai berikut:

@@ -105,72 +110,47 @@
- +
- +
- +
- +
- - +
-
- -
- -
-
-
- -
- -
-
-
- +
-
@@ -178,16 +158,14 @@
+ placeholder="Masukkan likuidasi" value="{{ old('likuidasi') }}">
- +
- +
@@ -202,7 +180,8 @@
-

Penilaian ke lokasi objek telah dilakukan oleh : +

Penilaian ke lokasi objek telah dilakukan oleh + :

@@ -215,7 +194,7 @@
+ value="{{ $penilai->userPenilaiTeam->name ?? '' }}" @readonly(true)>
@@ -224,24 +203,25 @@
+ value="{{$forminspeksi['signature']['kjjp']['name'] ?? ''}}" @readonly(true) placeholder="Masukkan Nama KJPP">
+ + placeholder="Masukkan Pihak Bag" value="{{ $permohonan->user->name ?? '' }} || {{ $permohonan->branch->name }}" + @readonly(true)>
- +
-
@@ -274,7 +254,8 @@ @else
-
@@ -302,7 +283,8 @@ @else
- diff --git a/resources/views/permohonan/index.blade.php b/resources/views/permohonan/index.blade.php index 4cf4a9c..38522d5 100644 --- a/resources/views/permohonan/index.blade.php +++ b/resources/views/permohonan/index.blade.php @@ -8,7 +8,7 @@
+ data-datatable-state-save="false" id="permohonan-table" data-api-url="{{ route('permohonan.datatables') }}">

Daftar Permohonan @@ -29,46 +29,46 @@
+ data-datatable-table="true"> - - - - - - - - - - - - + + + + + + + + + + + +
- - - Nomor Registrasi - - - Tanggal Permohonan - - - User Pemohon - - - Cabang Pemohon - - - Debitur - - - Tujuan Penilaian - - - Status - - - Keterangan - - Action
+ + + Nomor Registrasi + + + Tanggal Permohonan + + + User Pemohon + + + Cabang Pemohon + + + Debitur + + + Tujuan Penilaian + + + Status + + + Keterangan + + Action
@@ -189,7 +189,7 @@ title: 'Status', render: (item, data) => { console.log(data.documents.length); - if(data.documents.length > 0) { + if (data.documents.length > 0) { return `${data.status}`; } return `Lengkapi Aset Jaminan`; @@ -204,8 +204,15 @@ render: (item, data) => { let actionHtml = `
`; + if (data.status === 'proses-survey' || data.status == 'rejected-reschedule') { + actionHtml += ` + + + `; + } + if (data && data.penilaian && data.penilaian.waktu_penilaian !== null && data.status !== - 'done' && data.penilaian.authorized_status == null) { + 'done' && data.penilaian.authorized_status == null || data.status === 'approved-reschedule') { actionHtml += ` @@ -225,12 +232,15 @@ `; - if(data.status !== 'batal') { + if (data.status !== 'batal') { actionHtml += ` `; + } + + actionHtml += `
`; return actionHtml; @@ -241,14 +251,14 @@ let dataTable = new KTDataTable(element, dataTableOptions); // Custom search functionality - searchInput.addEventListener('input', function () { + searchInput.addEventListener('input', function() { const searchValue = this.value.trim(); dataTable.search(searchValue, true); }); @endpush diff --git a/resources/views/surveyor/components/bangunan.blade.php b/resources/views/surveyor/components/bangunan.blade.php index 0869965..7b2e2fa 100644 --- a/resources/views/surveyor/components/bangunan.blade.php +++ b/resources/views/surveyor/components/bangunan.blade.php @@ -16,7 +16,7 @@ $luas_bangunan = 'N/A'; if ($item->detail) { foreach ($item->detail as $luas) { - if (isset($luas->name) && $luas->name === 'IMB') { + if (isset($luas->name) && $luas->jenis_legalitas_jaminan_id === 10) { $details = json_decode($luas->details, true); $luas_bangunan = isset($details['luas_bangunan']) ? $details['luas_bangunan'] : 'N/A'; break; diff --git a/resources/views/surveyor/components/header.blade.php b/resources/views/surveyor/components/header.blade.php index 2c0a7ca..40d1c94 100644 --- a/resources/views/surveyor/components/header.blade.php +++ b/resources/views/surveyor/components/header.blade.php @@ -471,7 +471,7 @@
+ value="{{ isset($permohonan->debiture->city) ? strtolower($permohonan->debiture->city->name) : '' }}">
{ + // Ubah nama kota menjadi lowercase + const cityNameLowercase = city.name.toLowerCase(); + + // Tambahkan opsi ke dropdown + const option = document.createElement("option"); + option.value = city.code; + option.textContent = cityNameLowercase; // Nama dalam lowercase + citySelect.appendChild(option); + }); + } else { + console.error("Element with ID 'city_code' not found."); + } + } + document.addEventListener('DOMContentLoaded', () => { loadSavedLocationData(); + loadCities(); }); - // Fungsi untuk memuat data lokasi yang tersimpan + @include('lpj::surveyor.js.utils') diff --git a/resources/views/surveyor/components/informasi.blade.php b/resources/views/surveyor/components/informasi.blade.php index 1e0fdfd..3f837a8 100644 --- a/resources/views/surveyor/components/informasi.blade.php +++ b/resources/views/surveyor/components/informasi.blade.php @@ -217,7 +217,7 @@ } @endphp - Foto Tempat diff --git a/resources/views/surveyor/components/lingkungan.blade.php b/resources/views/surveyor/components/lingkungan.blade.php index dd62910..7119fde 100644 --- a/resources/views/surveyor/components/lingkungan.blade.php +++ b/resources/views/surveyor/components/lingkungan.blade.php @@ -23,12 +23,12 @@

-
-
@@ -40,7 +40,7 @@ $forminspeksi['lingkungan']['lebar_perkerasan_jalan'] ?? '', ); @endphp -
diff --git a/resources/views/surveyor/components/tanah.blade.php b/resources/views/surveyor/components/tanah.blade.php index a6cd298..8d132db 100644 --- a/resources/views/surveyor/components/tanah.blade.php +++ b/resources/views/surveyor/components/tanah.blade.php @@ -16,7 +16,7 @@ $luas_tanah = 'N/A'; if ($item->detail) { foreach ($item->detail as $luas) { - if (isset($luas->name) && $luas->name === 'Sertifikat') { + if (isset($luas->name) && $luas->jenis_legalitas_jaminan_id === 1) { $details = json_decode($luas->details, true); $luas_tanah = isset($details['luas_tanah']) ? $details['luas_tanah'] : 'N/A'; break; @@ -191,7 +191,7 @@ @elseif (strcasecmp($item->name, 'Lebih Rendah') == 0) @endif @@ -217,6 +217,11 @@ {{ old('kontur_jalan', isset($forminspeksi['tanah']['kontur_jalan']) ? $forminspeksi['tanah']['kontur_jalan'] : '') == 'rata' ? 'checked' : '' }}> Rata +
diff --git a/resources/views/surveyor/index.blade.php b/resources/views/surveyor/index.blade.php index c839cae..09b67fa 100644 --- a/resources/views/surveyor/index.blade.php +++ b/resources/views/surveyor/index.blade.php @@ -200,6 +200,149 @@ }); } + + function approveReschedule(penilaianId,permohonanId, noReg, debitur, reschedule_date, reschedule_note) { + Swal.fire({ + title: 'Konfirmasi', + html: ` +

Yakin akan Menyetujui atau Menolak Reschedule Jadwal Kunjungan ${noReg} untuk Debitur ${debitur} + pada waktu ${window.formatTanggalWaktuIndonesia(reschedule_date)}?

+

Catatan:
${reschedule_note}

+ `, + icon: 'warning', + showDenyButton: true, + showCancelButton: true, + confirmButtonColor: '#3085d6', + denyButtonColor: '#d33', + confirmButtonText: 'Approve', + denyButtonText: 'Reject' + }).then((result) => { + if (result.isConfirmed) { + // Approve action + let token = "{{ csrf_token() }}"; + let useURL = "{{ URL::to('/surveyor/store-approve-reschedule') }}" + "/" + penilaianId; + + var input_data = { + _token : token, + permohonan_id : permohonanId, + nomor_registrasi: noReg + } + $.ajax({ + url: useURL, + type: "PUT", + cache: false, + data: input_data, + success: function(response) { + console.log(response); + if ('success' == response.status) { + Swal.fire('Sukses!', response.message, 'success').then(() => { + location.reload(true); + }); + } else { + Swal.fire('Error!', response.message, 'error'); + } + }, + error: function(response, textStatus, errorThrown) { + console.log(response); + } + }); + } else if (result.isDenied) { + // Reject action + Swal.fire({ + title: 'Masukkan Keterangan', + input: 'textarea', + inputPlaceholder: 'Tuliskan alasan penolakan di sini...', + inputAttributes: { + 'aria-label': 'Tuliskan alasan penolakan di sini' + }, + showCancelButton: true, + confirmButtonText: 'Submit', + cancelButtonText: 'Batal' + }).then((rejectResult) => { + if (rejectResult.isConfirmed && rejectResult.value) { + let token = "{{ csrf_token() }}"; + let useURL = "{{ URL::to('/surveyor/store-rejected-reschedule') }}" + "/" + penilaianId; + + + var input_data = { + _token : token, + permohonan_id : permohonanId, + nomor_registrasi: noReg, + rejected_note : rejectResult.value + } + $.ajax({ + url: useURL, + type: "PUT", + cache: false, + data: input_data, + + success: function(response) { + console.log(response); + if ('success' == response.status) { + Swal.fire('Ditolak!', response.message, 'success').then(() => { + location.reload(true); + }); + } else { + Swal.fire('Error!', response.message, 'error'); + } + }, + error: function(response, textStatus, errorThrown) { + console.log(response); + } + }); + } else if (rejectResult.dismiss === Swal.DismissReason.cancel) { + Swal.fire('Dibatalkan', 'Aksi penolakan dibatalkan.', 'info'); + } + }); + } + }); +} + + +function prosesSurvey(permohonanId, nomor_registrasi) { + Swal.fire({ + title: 'Konfirmasi', + text: `Yakin akan Melakukan Inspeksi dengan nomor registrasi ${nomor_registrasi}?`, + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: 'Ya, Setujui', + cancelButtonText: 'Batal', + }).then((result) => { + if (result.isConfirmed) { + // Mendefinisikan URL dan data + let token = "{{ csrf_token() }}"; + let useURL = `{{ URL::to('/surveyor/store-proses-survey') }}/${permohonanId}`; + + let input_data = { + _token: token, + permohonan_id: permohonanId + }; + + // Melakukan AJAX request + $.ajax({ + url: useURL, + type: "PUT", + cache: false, + data: input_data, + dataType: "json", + success: function(response) { + if (response.status === 'success') { + // Arahkan langsung ke halaman inspeksi + window.location.href = `surveyor/${permohonanId}/show?form=inspeksi`; + } else { + Swal.fire('Error!', response.message, 'error'); + } + }, + error: function(response) { + const errorMessage = response.responseJSON?.message || 'Terjadi kesalahan saat memproses data.'; + Swal.fire('Error!', errorMessage, 'error'); + } + }); + } + }); +}