EAS-202310715274-DimasHendr.../LOCATION_TOLERANCE_GUIDE.md
2026-01-14 21:13:18 +07:00

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:

  1. Untuk menambah area valid:

    const val LOCATION_TOLERANCE_MARGIN = 75f  // Naikkan menjadi 75 meter
    
  2. Untuk mengurangi area valid:

    const val LOCATION_TOLERANCE_MARGIN = 25f  // Turunkan menjadi 25 meter
    
  3. 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:

  1. User di koordinat: -6.8950, 107.6090

    • Jarak: 85 meter
    • Status: ✓ DALAM_AREA (85m ≤ 100m)
    • Absensi: DITERIMA
  2. User di koordinat: -6.8945, 107.6080

    • Jarak: 125 meter
    • Status: ✓ DALAM_AREA_TOLERANSI (100m < 125m ≤ 150m)
    • Absensi: DITERIMA (dengan warning)
  3. 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:

  1. Menerima data lokasi dari aplikasi
  2. Validasi ulang dengan radius dari server
  3. Update status absensi (accepted/rejected)
  4. 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:

  1. Cek GPS status device
  2. Cek konfigurasi di config/AppConfig.kt
  3. Lihat logika di domain/usecase/LocationValidator.kt
  4. Pantau server logs di N8n dashboard

Last Updated: 14 Januari 2026
Version: 1.1.0