# π± Aplikasi Absensi Akademik Berbasis Koordinat dan Foto
## π Daftar Fitur yang Diimplementasikan
### β
Fitur Utama
- **π Login Screen** - Interface login untuk mahasiswa dengan input NPM dan Nama
- **π Validasi Lokasi (GPS)** - Menggunakan Fused Location Provider dari Google Play Services
- Menampilkan koordinat latitude dan longitude
- Validasi radius area (default: 100m dari titik kampus)
- Indikator visual status lokasi (hijau = dalam area, merah = di luar area)
- **πΈ Pengambilan Foto Selfie** - Integrase dengan kamera perangkat
- Menggunakan Camera Intent
- Validasi foto sebelum submit
- **π Pencatatan Waktu** - Otomatis mencatat timestamp saat absensi dikirim
- **π Riwayat Kehadiran** - History screen dengan daftar absensi
- Menampilkan tanggal, waktu, status (accepted/rejected), koordinat
- Sortir berdasarkan waktu terbaru
- **β οΈ Notifikasi Status** - Feedback real-time untuk user
- Success message ketika absensi berhasil
- Error message dengan penjelasan jika ditolak
- **π Integrasi N8n Webhook** - Mengirim data ke backend workflow automation
- URL: https://n8n.lab.ubharajaya.ac.id/webhook/23c6993d-1792-48fb-ad1c-ffc78a3e6254
- Data yang dikirim: npm, nama, latitude, longitude, timestamp, foto (base64)
## ποΈ Arsitektur Aplikasi
```
id.ac.ubharajaya.sistemakademik/
βββ data/
β βββ database/
β β βββ AppDatabase.kt # Room Database setup
β β βββ AttendanceDao.kt # Data Access Object
β βββ model/
β β βββ User.kt # User data class
β β βββ Attendance.kt # Attendance entity (Room)
β β βββ LocationConfig.kt # Campus location config
β βββ preferences/
β β βββ UserPreferences.kt # DataStore untuk session user
β βββ repository/
β βββ AttendanceRepository.kt # Abstraksi data access & N8n integration
βββ domain/
β βββ usecase/
β βββ LocationValidator.kt # Business logic untuk validasi lokasi
βββ presentation/
β βββ screens/
β β βββ LoginScreen.kt # Screen login
β β βββ AttendanceScreen.kt # Screen utama absensi
β β βββ HistoryScreen.kt # Screen riwayat kehadiran
β βββ viewmodel/
β βββ AttendanceViewModel.kt # ViewModel untuk state management
βββ ui/
β βββ theme/
β βββ Color.kt
β βββ Theme.kt
β βββ Type.kt
βββ MainActivity.kt # Activity utama dengan Navigation
```
## π§ Dependencies yang Digunakan
### Database & Local Storage
- **Room** - Local database untuk menyimpan riwayat absensi
- **DataStore Preferences** - Lightweight key-value storage untuk user session
### Navigation
- **Navigation Compose** - Screen routing dan state management
### Location Services
- **Google Play Services Location** - Fused Location Provider untuk GPS
### Async Processing
- **Coroutines** - Untuk async operations dan threading
## πΊοΈ Flow Aplikasi
### 1. **Login Flow**
```
LoginScreen β Validasi NPM & Nama β Save ke DataStore β Navigate to Attendance
```
### 2. **Attendance Flow**
```
AttendanceScreen
ββ Request Location Permission β Get GPS coordinates
ββ Validate Location (within 100m radius)
ββ Request Camera Permission β Take selfie photo
ββ Validate all data collected
ββ Send to N8n webhook (async)
ββ Save to local Room database
ββ Show status (success/error)
```
### 3. **History Flow**
```
HistoryScreen β Load from Room database β Display sorted by timestamp
```
### 4. **Logout Flow**
```
Logout button β Clear DataStore β Navigate to LoginScreen
```
## π Konfigurasi Lokasi
**File**: `data/model/LocationConfig.kt`
```kotlin
data class LocationConfig(
val latitude: Double = -6.8961, // Latitude kampus Ubharajaya
val longitude: Double = 107.6100, // Longitude kampus Ubharajaya
val radius: Float = 100f // Radius validasi dalam meter
)
```
**Catatan**: Koordinat dapat diubah sesuai lokasi kampus yang sebenarnya. Untuk privacy, koordinat dapat ditambah/kurangi dengan offset tertentu.
## π Permissions yang Diperlukan
**File**: `app/src/main/AndroidManifest.xml`
```xml
```
Request permission dilakukan secara runtime menggunakan `ActivityResultContracts`.
## π N8n Webhook Integration
### Endpoint
- **Production**: https://n8n.lab.ubharajaya.ac.id/webhook/23c6993d-1792-48fb-ad1c-ffc78a3e6254
- **Testing**: https://n8n.lab.ubharajaya.ac.id/webhook-test/23c6993d-1792-48fb-ad1c-ffc78a3e6254
### Request Format (JSON)
```json
{
"npm": "12345678",
"nama": "John Doe",
"latitude": -6.8961234,
"longitude": 107.6100567,
"timestamp": 1704067200000,
"foto_base64": "[base64 encoded image]"
}
```
### Response Handling
- **HTTP 200**: Absensi diterima (status = "accepted")
- **HTTP lainnya**: Absensi ditolak (status = "rejected")
## πΎ Database Schema
### Attendance Table
```sql
CREATE TABLE attendance (
id INTEGER PRIMARY KEY AUTOINCREMENT,
npm TEXT NOT NULL,
nama TEXT NOT NULL,
latitude REAL NOT NULL,
longitude REAL NOT NULL,
timestamp INTEGER NOT NULL,
fotoBase64 TEXT NOT NULL,
status TEXT DEFAULT 'pending', -- pending, accepted, rejected
message TEXT DEFAULT ''
)
```
## π£οΈ Navigation Routes
| Route | Screen | Purpose |
|-------|--------|---------|
| `login` | LoginScreen | Input NPM & Nama |
| `attendance` | AttendanceScreen | Main attendance interface |
| `history` | HistoryScreen | View attendance history |
## π Cara Menjalankan
### Prerequisites
- Android Studio (latest)
- Android SDK 28+ (minSdk)
- Target SDK 36
- Kotlin 2.0.21
### Build & Run
```bash
# Build project
./gradlew build
# Run on emulator/device
./gradlew installDebug
# Or dari Android Studio
- Click "Run" atau tekan Shift+F10
```
## π Notes & Future Enhancements
### Current Implementation
- β
Basic location validation dengan radius check
- β
Photo capture dari camera intent
- β
Local database dengan Room
- β
Session management dengan DataStore
- β
N8n webhook integration
- β
Responsive UI dengan Jetpack Compose
### Possible Improvements
1. **Location Tracking** - Real-time location updates selama proses absensi
2. **Image Compression** - Compress foto sebelum upload untuk efisiensi bandwidth
3. **Offline Mode** - Queue absensi jika offline, sync saat online
4. **Face Recognition** - Validasi foto dengan face detection
5. **Map Integration** - Google Maps untuk visualisasi area absensi
6. **Biometric Auth** - Fingerprint/Face unlock untuk login
7. **Export Data** - Export riwayat absensi ke format CSV/PDF
## π Troubleshooting
### Masalah Permission
- **Lokasi tidak tersedia**: Pastikan GPS device nyala dan permission diizinkan
- **Kamera tidak berfungsi**: Periksa izin camera di system settings
### Masalah Network
- **N8n webhook timeout**: Pastikan device terhubung internet
- **HTTPS error**: Webhook URL sudah benar (https, bukan http)
### Masalah Database
- **Error saat insert**: Pastikan Room migration sudah sesuai dengan schema
## π§ Support & Contact
- Dokumentasi: Lihat README ini
- Webhook Testing: https://ntfy.ubharajaya.ac.id/EAS
- Monitoring: https://docs.google.com/spreadsheets/d/1jH15MfnNgpPGuGeid0hYfY7fFUHCEFbCmg8afTyyLZs/
---
**Created**: 2025
**Version**: 1.0
**Status**: In Development