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" - } - } - + }