← Back to Work

Case Study · Mobile App & Fleet Integration

Logistics Driver App

Client: PT. Mada Wikri Tunggal
Role: Lead Mobile Developer
Stack: Flutter, GetX, GPS, Laravel API
Adoption: 100% — 20/20 Drivers

The Situation

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.

The Insight

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.

The Architecture

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.

Flutter Client
Driver scan QR di gerbang. Geolocator package ambil koordinat GPS dengan akurasi tinggi (LocationAccuracy.high).
Laravel API
Terima payload: QR ID + lat/lng. Hitung jarak ke lokasi target dengan Haversine Formula.
Geofence Validation
Jika jarak > 200 meter dari lokasi pelanggan → konfirmasi ditolak. Anti-spoofing by design.
GPS Timestamp Log
Koordinat + timestamp disimpan permanen. Bukti digital yang bisa digunakan jika pelanggan mengajukan klaim.

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);
}

The Outcome

ΔT = (Tmanual − Tdigital) / Tmanual × 100%
ΔT = (28,800s − 10s) / 28,800s × 100% ≈ 99.9%
BEFORE
Konfirmasi pengiriman: 8 jam penundaan. Driver kembali sore hari dengan kertas fisik yang sudah ditandatangan
AFTER
10 detik setelah scan QR di gerbang pelanggan, data sudah ada di sistem. Timestamp dan koordinat GPS tersimpan permanen
ADOPTION
100% adoption — 20 dari 20 driver menggunakan aplikasi untuk seluruh operasional logistik harian
ACCOUNTABILITY
Klaim keterlambatan dari pelanggan kini bisa direspons dengan data GPS timestamp yang tidak bisa dipalsukan

"Yang paling sering diabaikan dalam sistem logistics bukan kecepatan pengirimannya — tapi bukti bahwa pengiriman itu benar-benar terjadi. Aplikasi ini menyelesaikan keduanya."