245 lines
7.7 KiB
Markdown
245 lines
7.7 KiB
Markdown
# 📱 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
|
|
<!-- Location Permissions -->
|
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
|
|
|
<!-- Camera Permission -->
|
|
<uses-permission android:name="android.permission.CAMERA"/>
|
|
|
|
<!-- Network Permission -->
|
|
<uses-permission android:name="android.permission.INTERNET"/>
|
|
```
|
|
|
|
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
|
|
|