Merge branch 'staging' into feature/senior-officer

This commit is contained in:
majid
2025-03-20 10:23:37 +07:00
3 changed files with 156 additions and 7 deletions

View File

@@ -6,6 +6,7 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Lpj\Http\Requests\BankDataRequest;
use Modules\Lpj\Models\BankData;
use Modules\Lpj\Models\Inspeksi;
use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Services\BankDataService;
use Modules\Location\Models\Province;
@@ -25,6 +26,64 @@ class BankDataController extends Controller
$provinces = Province::all();
$jenisJaminan = JenisJaminan::all();
//insert data pembanding
$inspeksi = Inspeksi::all();
foreach ($inspeksi as $item) {
if(isset($item->data_pembanding)){
$data_pembanding = json_decode($item->data_pembanding);
foreach ($data_pembanding->data_pembanding as $dataPembanding) {
$lat = trim($dataPembanding->kordinat_lat);
$lng = trim($dataPembanding->kordinat_lng);
if (!empty($lat) && !empty($lng)) {
$lat = floatval($lat);
$lng = floatval($lng);
if ($lat >= -90 && $lat <= 90 && $lng >= -180 && $lng <= 180) {
$data = [
'address' => $dataPembanding->address,
'village_code' => $dataPembanding->village_code,
'district_code' => $dataPembanding->district_code,
'city_code' => $dataPembanding->city_code,
'province_code' => $dataPembanding->province_code,
'tahun' => $dataPembanding->tahun,
'luas_tanah' => $dataPembanding->luas_tanah,
'luas_bangunan' => $dataPembanding->luas_bangunan,
'tahun_bangunan' => $dataPembanding->tahun_bangunan,
'status_nara_sumber' => $dataPembanding->status_nara_sumber,
'harga' => $dataPembanding->harga,
'harga_diskon' => $dataPembanding->harga_diskon,
'diskon' => str_replace(',','.',$dataPembanding->diskon),
'total' => $dataPembanding->total,
'nama_nara_sumber' => $dataPembanding->nama_nara_sumber,
'peruntukan' => $dataPembanding->peruntukan,
'penawaran' => $dataPembanding->penawaran,
'telepon' => $dataPembanding->telepon,
'hak_properti' => $dataPembanding->hak_properti,
'jenis_aset' => $dataPembanding->jenis_aset,
'foto_objek' => $dataPembanding->foto_objek,
'tanggal' => $dataPembanding->tanggal,
'harga_penawaran' => $dataPembanding->harga_penawaran,
];
BankData::updateOrCreate(
[
'kordinat_lat' => $lat,
'kordinat_lng' => $lng
],
$data
);
}
}else{
// Invalid coordinates
\Log::warning("Invalid coordinates: Lat: $lat, Lng: $lng");// Do something to handle this situation, such as logging an error or skipping the record
}
}
}
}
return view('lpj::bank-data.index', compact('provinces', 'jenisJaminan' ));
}
@@ -101,7 +160,7 @@ class BankDataController extends Controller
}
if ($search['start_date'] && $search['end_date']) {
$query->betweenDates($request->start_date, $search['end_date']);
$query->betweenDates($search['start_date'], $search['end_date']);
}
} else{
$search = $request->get('search');
@@ -141,14 +200,15 @@ class BankDataController extends Controller
return [
'id' => $item->id,
'jenis_aset' => $item->jenis_aset,
'tanggal' => $item->tanggal->format('d-m-Y'),
'tanggal' => $item->tanggal ? $item->tanggal->format('d-m-Y') : '-',
'tahun' => $item->tahun,
'luas_tanah' => $item->luas_tanah,
'luas_bangunan' => $item->luas_bangunan,
'harga' => $item->harga,
'nilai_pasar' => $item->nilai_pasar,
'location' => $item->kordinat_lat . ', ' . $item->kordinat_lng,
'address' => formatAlamat($item)
'address' => formatAlamat($item),
'photos' => json_decode($item->foto_objek, true) ?: [$item->foto_objek],
// Add more fields as needed
];
});
@@ -159,6 +219,10 @@ class BankDataController extends Controller
// Calculate the current page number
$currentPage = $request->get('page', 1);
// Ensure current page doesn't exceed page count
$currentPage = min($currentPage, $pageCount);
// Return the response data as a JSON object
return response()->json([
'draw' => $request->get('draw'),

View File

@@ -166,6 +166,13 @@
</div>
</div>
</div>
<div id="imageModal" class="fixed inset-0 bg-black bg-opacity-50 hidden items-center justify-center z-50">
<div class="bg-white p-4 rounded-lg max-w-3xl max-h-[100vh] overflow-auto">
<img id="modalImage" src="" alt="Zoomed Image" class="max-w-full h-auto">
<button id="closeModal" class="mt-4 px-4 py-2 bg-red-300 text-gray-800 rounded hover:bg-red-400" onclick="closeImageModal()">Close</button>
</div>
</div>
@endsection
@push('scripts')
@@ -183,6 +190,26 @@
});
}
function openImageModal(src) {
const modal = document.getElementById('imageModal');
const modalImage = document.getElementById('modalImage');
modalImage.src = src;
modal.classList.remove('hidden');
modal.classList.add('flex');
}
function closeImageModal() {
const modal = document.getElementById('imageModal');
modal.classList.remove('flex');
modal.classList.add('hidden');
}
function changeMainPhoto(thumbnail, index) {
const mainPhoto = thumbnail.closest('.photo-gallery').querySelector('.main-photo img');
mainPhoto.src = thumbnail.src;
mainPhoto.alt = thumbnail.alt;
}
function updateMapMarkers(data) {
// Clear existing markers
markers.forEach(marker => marker.setMap(null));
@@ -218,7 +245,7 @@
// Create info window content
const contentString = `
<div id='content' style='width: 500px; max-width: 100%;'>
<div id='content' style='width: 550px; max-width: 100%;'>
<div id='siteNotice'></div>
<h2 class='card-title mb-5'>
${item.jenis_aset}
@@ -320,6 +347,29 @@
</span>
</div>
</div>
${item.photos && item.photos.length > 0 ? `
<div class="photo-gallery mb-5">
<div class="main-photo mb-2">
<img src="storage/${item.photos[0]}" alt="${item.jenis_aset}"
style="width: 100%; height: auto; object-fit: cover; cursor: pointer;"
onclick="openImageModal(this.src)">
</div>
<div class="thumbnail-container flex gap-2 overflow-x-auto">
${item.photos.map((photo, index) => `
<img src="storage/${photo}" alt="${item.jenis_aset} ${index + 1}"
class="thumbnail cursor-pointer"
style="width: 60px; height: 60px; object-fit: cover;"
onclick="changeMainPhoto(this, ${index})">
`).join('')}
</div>
</div>
` : ''}
<div class="border-t border-gray-300 border-dashed"></div>
<div class='flex justify-end mt-3'>
<button onclick="getDirections(${lat}, ${lng})" class='btn btn-sm btn-primary'>
Get Directions
</button>
</div>
</div>
</div>
`;
@@ -354,6 +404,26 @@
}
}
function getDirections(lat, lng) {
console.log('Getting directions to:', lat, lng);
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(position) => {
const origin = position.coords.latitude + ',' + position.coords.longitude;
const destination = lat + ',' + lng;
const url = `https://www.google.com/maps/dir/?api=1&origin=${origin}&destination=${destination}`;
window.open(url, '_blank');
},
() => {
alert('Unable to get your current location. Please enable location services.');
}
);
} else {
alert('Geolocation is not supported by your browser.');
}
}
function initializeDataTable() {
const element = document.querySelector('#bank-data-table');
const searchInput = document.getElementById('search');
@@ -422,6 +492,7 @@
dataTable.on('draw', () => {
const data = dataTable._data;
updateMapMarkers(data);
updatePagination(data);
})
// Custom search functionality
searchInput.addEventListener('input', function () {
@@ -445,6 +516,20 @@
dataTable.reload();
});
function updatePagination(response) {
const paginationInfo = document.querySelector('[data-datatable-info="true"]');
if (paginationInfo) {
if (response.recordsFiltered > 0) {
const start = (response.page - 1) * response.pageSize + 1;
const end = Math.min(start + response.pageSize - 1, response.recordsFiltered);
paginationInfo.textContent = `Showing ${start} to ${end} of ${response.recordsFiltered} entries`;
} else {
paginationInfo.textContent = 'No entries to show';
}
}
}
function initializeEverything() {
initMap();
initializeDataTable();

View File

@@ -162,7 +162,7 @@
href="{{ route('otorisator.view-laporan') }}?permohonanId={{ $permohonan->id }}&documentId={{ $documentId }}&jaminanId={{ $jenisJaminanId }}&statusLpj={{ true }}">
Lihat Laporan
</a>
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $permohonan->approval_so == null)
@if (Auth::user()->hasAnyRole(['administrator', 'senior-officer']) && $permohonan->approval_so == 0)
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">
<i class="ki-filled ki-double-check"></i>
Otorisator {{ $header ?? '' }}
@@ -171,7 +171,7 @@
@if (Auth::user()->hasAnyRole(['administrator', 'EO Appraisal']) &&
$permohonan->approval_so &&
$permohonan->approval_eo == null &&
$permohonan->approval_eo == 0 &&
in_array($permohonan->nilai_plafond_id, [1, 2]))
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">
<i class="ki-filled ki-double-check"></i>
@@ -181,7 +181,7 @@
@if (Auth::user()->hasAnyRole(['administrator', 'DD Appraisal']) &&
$permohonan->approval_eo &&
$permohonan->approval_dd == null &&
$permohonan->approval_dd == 0 &&
in_array($permohonan->nilai_plafond_id, [1, 2, 4]))
<button onclick="otorisatorData({{ $permohonan->id }})" type="button" class="btn btn-primary">
<i class="ki-filled ki-double-check"></i>