6.4 KiB
📍 Panduan Location Tolerance & Validation
📌 Ringkasan
Aplikasi menggunakan sistem Location Tolerance untuk memberikan margin keamanan pada validasi lokasi absensi. Ini memastikan user yang berada di tepi area absensi tetap bisa melakukan absensi dengan baik.
🎯 Konsep Tolerance Margin
Radius Area Absensi
- Radius Utama: 100 meter
- Tolerance Margin: 50 meter
- Total Area Valid: 100m + 50m = 150 meter
Mengapa Perlu Tolerance?
GPS pada smartphone memiliki akurasi:
- Akurasi terbaik: ±5 meter
- Akurasi normal: ±10-20 meter
- Akurasi di area terbuka: ±5-10 meter
- Akurasi di area terbatas: ±20-50 meter
Tanpa tolerance margin, user yang berada di area tepat di tepi radius bisa ditolak meskipun sebenarnya sudah di area yang benar.
⚙️ Konfigurasi
File: config/AppConfig.kt
// Lokasi Kampus
const val CAMPUS_LATITUDE = -6.8961 // Latitude kampus
const val CAMPUS_LONGITUDE = 107.6100 // Longitude kampus
// Radius Area Absensi
const val ATTENDANCE_RADIUS_METERS = 100f // Radius utama (meter)
// Tolerance Margin
const val LOCATION_TOLERANCE_MARGIN = 50f // Margin tambahan (meter)
Cara Mengubah Nilai:
-
Untuk menambah area valid:
const val LOCATION_TOLERANCE_MARGIN = 75f // Naikkan menjadi 75 meter -
Untuk mengurangi area valid:
const val LOCATION_TOLERANCE_MARGIN = 25f // Turunkan menjadi 25 meter -
Untuk ketat penuh (tanpa tolerance):
const val LOCATION_TOLERANCE_MARGIN = 0f // Tolerance 0 meter
📊 Status Lokasi
Sistem membagi lokasi menjadi 3 status:
1. DALAM_AREA ✓ (Status Hijau)
- Jarak dari kampus: ≤ 100 meter
- Status: "✓ Berada dalam area absensi"
- Warna: Hijau (#4CAF50)
- Absensi: ✅ DITERIMA
2. DALAM_AREA_TOLERANSI ✓ (Status Hijau, Warning)
- Jarak dari kampus: 100m - 150 meter
- Status: "✓ Berada dalam area absensi (toleransi)"
- Info tambahan: "⚠️ Berada di tepi area (Xm dari batas)"
- Warna: Hijau (#4CAF50)
- Absensi: ✅ DITERIMA (dengan peringatan)
3. DI_LUAR_AREA ✗ (Status Merah)
- Jarak dari kampus: > 150 meter
- Status: "✗ Berada di luar area absensi"
- Warna: Merah (#f44336)
- Absensi: ❌ DITOLAK
🔍 Tampilan Status di Aplikasi
AttendanceScreen (Layar Utama)
┌─────────────────────────────────┐
│ 📍 Status Lokasi │
├─────────────────────────────────┤
│ Lat: -6.8961 │
│ Lon: 107.6100 │
│ Jarak: 85.2m │
│ │
│ ✓ Berada dalam area absensi │
│ │
│ ⚠️ Berada di tepi area (12m │
│ dari batas) │
│ │
│ ↻ Perbarui Lokasi │
└─────────────────────────────────┘
HistoryScreen (Riwayat)
Setiap record menampilkan:
- 📍 Koordinat saat absensi
- 📏 Jarak dari kampus dengan status (✓ atau ✗)
- 📅 Tanggal dan waktu
- Status: Diterima/Ditolak/Pending
🛠️ Logika Validasi
File: domain/usecase/LocationValidator.kt
fun isWithinRadius(
userLatitude: Double,
userLongitude: Double
): Boolean {
val distance = getDistanceFromCenter(userLatitude, userLongitude)
// Validasi dengan tolerance margin
return distance <= (100f + 50f) // = 150 meter
}
Contoh Perhitungan:
-
User di koordinat: -6.8950, 107.6090
- Jarak: 85 meter
- Status: ✓ DALAM_AREA (85m ≤ 100m)
- Absensi: DITERIMA
-
User di koordinat: -6.8945, 107.6080
- Jarak: 125 meter
- Status: ✓ DALAM_AREA_TOLERANSI (100m < 125m ≤ 150m)
- Absensi: DITERIMA (dengan warning)
-
User di koordinat: -6.8930, 107.6060
- Jarak: 160 meter
- Status: ✗ DI_LUAR_AREA (160m > 150m)
- Absensi: DITOLAK
🔧 Tips Troubleshooting
1. Lokasi Tidak Terdeteksi
- ✅ Pastikan GPS device aktif
- ✅ Pastikan izin lokasi diberikan
- ✅ Tunggu beberapa detik (GPS butuh waktu untuk akurat)
- ✅ Keluar dari ruangan jika memungkinkan
- ✅ Klik "Perbarui Lokasi" beberapa kali
2. Ditolak Padahal Seharusnya Diterima
- ✅ Toleransi margin: Increase LOCATION_TOLERANCE_MARGIN
- ✅ Cek GPS accuracy: Biasanya ±10-20 meter
- ✅ Pindah sedikit ke arah kampus
- ✅ Tunggu GPS stabil sebelum absen
3. Terlalu Ketat
- ✅ Decrease ATTENDANCE_RADIUS_METERS jika area terlalu luas
- ✅ Decrease LOCATION_TOLERANCE_MARGIN jika ingin lebih ketat
📈 Rekomendasi Pengaturan
Untuk Area Terbuka (Outdoor)
const val ATTENDANCE_RADIUS_METERS = 100f
const val LOCATION_TOLERANCE_MARGIN = 30f // GPS akurat ±5-10m
Untuk Area Standar (Kampus)
const val ATTENDANCE_RADIUS_METERS = 100f
const val LOCATION_TOLERANCE_MARGIN = 50f // GPS standar ±15-20m
Untuk Area Terbatas (Indoor/Urban)
const val ATTENDANCE_RADIUS_METERS = 100f
const val LOCATION_TOLERANCE_MARGIN = 75f // GPS kurang akurat ±30-50m
Untuk Keamanan Maksimal (Ketat)
const val ATTENDANCE_RADIUS_METERS = 100f
const val LOCATION_TOLERANCE_MARGIN = 0f // Tanpa margin
🔐 Server-Side Validation
Meskipun aplikasi sudah memberikan tolerance, server (N8n) juga melakukan validasi:
- Menerima data lokasi dari aplikasi
- Validasi ulang dengan radius dari server
- Update status absensi (accepted/rejected)
- Simpan log untuk audit trail
📝 Perubahan di Versi 1.1
- ✅ Menambahkan tolerance margin untuk GPS accuracy
- ✅ Menambahkan status detail lokasi (DALAM_AREA_TOLERANSI)
- ✅ Menampilkan warning saat berada di tepi area
- ✅ Membuat margin dapat dikonfigurasi di AppConfig
- ✅ Menambahkan perhitungan jarak detail di HistoryScreen
📞 Support
Jika ada pertanyaan atau masalah dengan validasi lokasi:
- Cek GPS status device
- Cek konfigurasi di
config/AppConfig.kt - Lihat logika di
domain/usecase/LocationValidator.kt - Pantau server logs di N8n dashboard
Last Updated: 14 Januari 2026
Version: 1.1.0