Case Study · Mobile App & Fleet Integration
Setiap hari, 20 truk milik PT. Mada Wikri Tunggal berangkat ke pabrik-pabrik pelanggan untuk mengantar barang jadi. Tidak ada yang tahu secara real-time truk mana sudah tiba, mana yang masih di jalan, mana yang terlambat.
Tim logistik harus menelepon driver satu per satu untuk mendapat update. Driver menelepon balik untuk mengonfirmasi tiba. Surat Jalan — bukti serah terima barang — baru bisa divalidasi ketika driver kembali ke pabrik di sore hari membawa kertas yang sudah ditandatangan pelanggan. 8 jam penundaan antara barang diterima pelanggan dan sistem mencatatnya.
Ketika pelanggan mengklaim barang terlambat atau kurang, tidak ada timestamp digital yang bisa menjadi bukti bantahan. Perusahaan tidak punya data.
Setiap driver sudah membawa smartphone. Masalah bukan perangkat keras — masalahnya adalah tidak ada sistem yang memanfaatkannya. Jika driver bisa scan QR di gerbang pabrik pelanggan, GPS otomatis mencatat koordinat dan timestamp, dan backend memvalidasi bahwa posisi driver memang sesuai lokasi — maka seluruh proses konfirmasi manual menjadi tidak relevan.
Satu scan. Selesai. Data tersedia di sistem dalam 10 detik.
Tantangan teknis utama: bagaimana mencegah driver melakukan konfirmasi dari lokasi yang salah (spoofing GPS atau scan dari jarak jauh). Solusinya: validasi geofence dilakukan di backend, bukan di aplikasi client.
LocationAccuracy.high).
Validasi Haversine di backend adalah keputusan arsitektur yang disengaja — jika validasi ada di client (Flutter), driver bisa saja memanipulasi koordinat yang dikirim. Dengan validasi di server, tidak ada jalan untuk berbuat curang.
// Laravel — Haversine geofence validation (server-side, anti-spoofing)
function haversineDistance($lat1, $lng1, $lat2, $lng2): float
{
$R = 6371000; // Earth radius in meters
$φ1 = deg2rad($lat1); $φ2 = deg2rad($lat2);
$Δφ = deg2rad($lat2 - $lat1);
$Δλ = deg2rad($lng2 - $lng1);
$a = sin($Δφ/2)**2 + cos($φ1) * cos($φ2) * sin($Δλ/2)**2;
return $R * 2 * atan2(sqrt($a), sqrt(1-$a));
}
// Tolak konfirmasi jika driver > 200m dari lokasi pelanggan
if (haversineDistance($driverLat, $driverLng, $plantLat, $plantLng) > 200) {
return response()->json(['error' => 'Konfirmasi ditolak: posisi terlalu jauh dari lokasi tujuan.'], 422);
}
"Yang paling sering diabaikan dalam sistem logistics bukan kecepatan pengirimannya — tapi bukti bahwa pengiriman itu benar-benar terjadi. Aplikasi ini menyelesaikan keduanya."