update
This commit is contained in:
@ -178,10 +178,6 @@ class ReportsController extends Controller
|
||||
)
|
||||
SELECT
|
||||
t.*,
|
||||
ttll.start_latitude,
|
||||
ttll.start_longitude,
|
||||
ttll.finish_latitude,
|
||||
ttll.finish_longitude,
|
||||
tm.total_mileage,
|
||||
tm.total_trip,
|
||||
vt.name AS type_name,
|
||||
@ -193,7 +189,6 @@ class ReportsController extends Controller
|
||||
JOIN TotalMileage tm ON t.id = tm.id
|
||||
LEFT JOIN t_vehicles tvt ON tvt.id = t.vhc_id
|
||||
LEFT JOIN t_vehicles_cats vt ON vt.id = tvt.cat_id
|
||||
LEFT JOIN t_trips_latitude_longitude ttll ON t.id = ttll.tripsid
|
||||
WHERE
|
||||
t.start BETWEEN ? AND ?
|
||||
AND (? IS NULL OR t.id = ?)
|
||||
|
||||
@ -25,8 +25,8 @@
|
||||
@if ($user_role == \App\Models\Users::ROLE_VENDOR || $user_role == \App\Models\Users::ROLE_ADMIN)
|
||||
@can('vehicle.create')
|
||||
<!-- <div class="col text-end">
|
||||
<button id="btnMdlNewVhc" class="btn btn-sm btn-danger">Add New Vehicle</button>
|
||||
</div> -->
|
||||
<button id="btnMdlNewVhc" class="btn btn-sm btn-danger">Add New Vehicle</button>
|
||||
</div> -->
|
||||
@endcan
|
||||
|
||||
{{-- <div class="col-auto text-end ps-0">
|
||||
@ -129,73 +129,73 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- <tbody>
|
||||
<tr>
|
||||
<td>24-679</td>
|
||||
<td>24-679</td>
|
||||
<td>26</td>
|
||||
<td>442.3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>24-682</td>
|
||||
<td>24-682</td>
|
||||
<td>28</td>
|
||||
<td>312.7</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>24-877</td>
|
||||
<td>24-877</td>
|
||||
<td>15</td>
|
||||
<td>276.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>A.16-347</td>
|
||||
<td>A.16-347</td>
|
||||
<td>37</td>
|
||||
<td>543.2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>AL2025-B21</td>
|
||||
<td>AL2025-B21</td>
|
||||
<td>18</td>
|
||||
<td>295.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>B.16-542</td>
|
||||
<td>B.16-542</td>
|
||||
<td>32</td>
|
||||
<td>478.2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>B.24-264</td>
|
||||
<td>B.24-264</td>
|
||||
<td>24</td>
|
||||
<td>188.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>B.24-274</td>
|
||||
<td>B.24-274</td>
|
||||
<td>33</td>
|
||||
<td>440.1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ford Ranger</td>
|
||||
<td>26-199</td>
|
||||
<td>30</td>
|
||||
<td>631.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Nissan AD</td>
|
||||
<td>B.10-517</td>
|
||||
<td>27</td>
|
||||
<td>375.9</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Triton</td>
|
||||
<td>A.29-127</td>
|
||||
<td>26</td>
|
||||
<td>508.2</td>
|
||||
</tr>
|
||||
</tbody> -->
|
||||
<tr>
|
||||
<td>24-679</td>
|
||||
<td>24-679</td>
|
||||
<td>26</td>
|
||||
<td>442.3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>24-682</td>
|
||||
<td>24-682</td>
|
||||
<td>28</td>
|
||||
<td>312.7</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>24-877</td>
|
||||
<td>24-877</td>
|
||||
<td>15</td>
|
||||
<td>276.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>A.16-347</td>
|
||||
<td>A.16-347</td>
|
||||
<td>37</td>
|
||||
<td>543.2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>AL2025-B21</td>
|
||||
<td>AL2025-B21</td>
|
||||
<td>18</td>
|
||||
<td>295.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>B.16-542</td>
|
||||
<td>B.16-542</td>
|
||||
<td>32</td>
|
||||
<td>478.2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>B.24-264</td>
|
||||
<td>B.24-264</td>
|
||||
<td>24</td>
|
||||
<td>188.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>B.24-274</td>
|
||||
<td>B.24-274</td>
|
||||
<td>33</td>
|
||||
<td>440.1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Ford Ranger</td>
|
||||
<td>26-199</td>
|
||||
<td>30</td>
|
||||
<td>631.4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Nissan AD</td>
|
||||
<td>B.10-517</td>
|
||||
<td>27</td>
|
||||
<td>375.9</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Triton</td>
|
||||
<td>A.29-127</td>
|
||||
<td>26</td>
|
||||
<td>508.2</td>
|
||||
</tr>
|
||||
</tbody> -->
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@ -207,17 +207,17 @@
|
||||
<div class="modal fade" data-bs-backdrop="static" data-bs-keyboard="false" id="mdlDetailTrip"
|
||||
aria-labelledby="mdlDetailTripLabel" aria-hidden="true">
|
||||
<!-- <div class="modal-dialog modal-dialog modal-dialog-centered modal-dialog-scrollable modal-xl">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="mdlDetailTripLabel">-----</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="mdlDetailTripLabel">-----</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@ -321,6 +321,30 @@
|
||||
// Radius toleransi "berdekatan" dalam meter — sesuaikan sesuai kebutuhan
|
||||
const SITE_PROXIMITY_RADIUS_METERS = 500;
|
||||
|
||||
// Helper untuk parse string "lat, long" menjadi { lat, lng }
|
||||
function parseLatLong(latLongStr) {
|
||||
if (!latLongStr || typeof latLongStr !== 'string') {
|
||||
return {
|
||||
lat: null,
|
||||
lng: null
|
||||
};
|
||||
}
|
||||
|
||||
const parts = latLongStr.split(',').map(part => parseFloat(part.trim()));
|
||||
|
||||
if (parts.length !== 2 || isNaN(parts[0]) || isNaN(parts[1])) {
|
||||
return {
|
||||
lat: null,
|
||||
lng: null
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
lat: parts[0],
|
||||
lng: parts[1]
|
||||
};
|
||||
}
|
||||
|
||||
// Hitung jarak antara 2 koordinat (formula Haversine), hasil dalam meter
|
||||
function getDistanceMeters(lat1, lon1, lat2, lon2) {
|
||||
const R = 6371000; // radius bumi (meter)
|
||||
@ -470,12 +494,15 @@
|
||||
{
|
||||
data: 'start',
|
||||
render: (data, type, row, meta) => {
|
||||
// Parse start_lat_long -> { lat, lng }
|
||||
const {
|
||||
lat: startLat,
|
||||
lng: startLng
|
||||
} = parseLatLong(row.start_lat_long);
|
||||
|
||||
// saat export, hanya tampilkan lokasi tanpa tanggal/jam
|
||||
if (type === 'export') {
|
||||
const nearestSite = findNearestSite(
|
||||
row.start_latitude,
|
||||
row.start_longitude
|
||||
);
|
||||
const nearestSite = findNearestSite(startLat, startLng);
|
||||
|
||||
if (nearestSite) {
|
||||
return formatSiteLabel(nearestSite);
|
||||
@ -483,50 +510,30 @@
|
||||
return Helper.shortenText(decodeURIComponent(row.startLoc ||
|
||||
'address'), 255) || "-";
|
||||
}
|
||||
const nearestSite = findNearestSite(
|
||||
row.start_latitude,
|
||||
row.start_longitude
|
||||
);
|
||||
|
||||
const nearestSite = findNearestSite(startLat, startLng);
|
||||
|
||||
if (nearestSite) {
|
||||
return formatSiteLabel(nearestSite);
|
||||
}
|
||||
return `
|
||||
${moment.unix(data + AppState.TIMEFIX).format('DD MMM YYYY HH:mm:ss')}<br>
|
||||
${Helper.shortenText(decodeURIComponent(row.startLoc || 'address'), 255) || "-"}
|
||||
`;
|
||||
${moment.unix(data + AppState.TIMEFIX).format('DD MMM YYYY HH:mm:ss')}<br>
|
||||
${Helper.shortenText(decodeURIComponent(row.startLoc || 'address'), 255) || "-"}
|
||||
`;
|
||||
}
|
||||
},
|
||||
// {
|
||||
// data: 'finish',
|
||||
// render: (data, type, row, meta) => {
|
||||
// console.log(row)
|
||||
// // saat export, hanya tampilkan lokasi tanpa tanggal/jam
|
||||
// if (type === 'export') {
|
||||
// return Helper.shortenText(decodeURIComponent(row.finishLoc ||
|
||||
// 'address'), 255) || "-";
|
||||
// }
|
||||
// return `
|
||||
// ${moment.unix(data + AppState.TIMEFIX).format('DD MMM YYYY HH:mm:ss')}<br>
|
||||
// ${Helper.shortenText(decodeURIComponent(row.finishLoc || 'address'), 255) || "-"}
|
||||
// `;
|
||||
// }
|
||||
// },
|
||||
{
|
||||
data: 'finish',
|
||||
render: (data, type, row) => {
|
||||
// console.log(row.fulladdress);
|
||||
// console.log(row.latitude);
|
||||
// console.log(row.longitude);
|
||||
// console.log("End Loc : ",row.endLoc)
|
||||
// Parse finish_lat_long -> { lat, lng }
|
||||
const {
|
||||
lat: finishLat,
|
||||
lng: finishLng
|
||||
} = parseLatLong(row.finish_lat_long);
|
||||
|
||||
// Saat export Excel
|
||||
if (type === 'export') {
|
||||
|
||||
const nearestSite = findNearestSite(
|
||||
row.finish_latitude,
|
||||
row.finish_longitude
|
||||
);
|
||||
const nearestSite = findNearestSite(finishLat, finishLng);
|
||||
|
||||
if (nearestSite) {
|
||||
return formatSiteLabel(nearestSite);
|
||||
@ -538,10 +545,7 @@
|
||||
) || '-';
|
||||
}
|
||||
|
||||
const nearestSite = findNearestSite(
|
||||
row.finish_latitude,
|
||||
row.finish_longitude
|
||||
);
|
||||
const nearestSite = findNearestSite(finishLat, finishLng);
|
||||
|
||||
if (nearestSite) {
|
||||
return formatSiteLabel(nearestSite);
|
||||
@ -549,16 +553,16 @@
|
||||
|
||||
// Tampilan di tabel
|
||||
return `
|
||||
${moment.unix(data + AppState.TIMEFIX)
|
||||
.format('DD MMM YYYY HH:mm:ss')}
|
||||
<br>
|
||||
${
|
||||
Helper.shortenText(
|
||||
decodeURIComponent(row.finishLoc || 'address'),
|
||||
255
|
||||
) || '-'
|
||||
}
|
||||
`;
|
||||
${moment.unix(data + AppState.TIMEFIX)
|
||||
.format('DD MMM YYYY HH:mm:ss')}
|
||||
<br>
|
||||
${
|
||||
Helper.shortenText(
|
||||
decodeURIComponent(row.finishLoc || 'address'),
|
||||
255
|
||||
) || '-'
|
||||
}
|
||||
`;
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user