234 lines
6.4 KiB
Markdown
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
|
|
|