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

234 lines
6.4 KiB
Markdown

# 📍 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`
```kotlin
// 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:**
```kotlin
const val LOCATION_TOLERANCE_MARGIN = 75f // Naikkan menjadi 75 meter
```
2. **Untuk mengurangi area valid:**
```kotlin
const val LOCATION_TOLERANCE_MARGIN = 25f // Turunkan menjadi 25 meter
```
3. **Untuk ketat penuh (tanpa tolerance):**
```kotlin
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`**
```kotlin
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)**
```kotlin
const val ATTENDANCE_RADIUS_METERS = 100f
const val LOCATION_TOLERANCE_MARGIN = 30f // GPS akurat ±5-10m
```
### **Untuk Area Standar (Kampus)**
```kotlin
const val ATTENDANCE_RADIUS_METERS = 100f
const val LOCATION_TOLERANCE_MARGIN = 50f // GPS standar ±15-20m
```
### **Untuk Area Terbatas (Indoor/Urban)**
```kotlin
const val ATTENDANCE_RADIUS_METERS = 100f
const val LOCATION_TOLERANCE_MARGIN = 75f // GPS kurang akurat ±30-50m
```
### **Untuk Keamanan Maksimal (Ketat)**
```kotlin
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