378 lines
9.1 KiB
Markdown
378 lines
9.1 KiB
Markdown
# 📚 Fitur Mata Kuliah dan Absen Kehadiran
|
|
|
|
## 📋 Daftar Fitur yang Ditambahkan
|
|
|
|
Dokumentasi ini menjelaskan fitur baru yang telah ditambahkan ke aplikasi Absensi Akademik:
|
|
1. **Daftar Mata Kuliah** - Menampilkan semua mata kuliah yang tersedia
|
|
2. **Pilihan Mata Kuliah** - Memilih mata kuliah untuk absensi
|
|
3. **Riwayat Kehadiran** - Melihat riwayat absensi per mata kuliah
|
|
4. **Laporan Kehadiran** - Melihat statistik kehadiran per mata kuliah
|
|
|
|
---
|
|
|
|
## 🗂️ File-File yang Ditambahkan
|
|
|
|
### 1. **Models** (`models/CourseModels.kt`)
|
|
|
|
Berisi data class untuk:
|
|
- **`Course`**: Merepresentasikan mata kuliah
|
|
```kotlin
|
|
data class Course(
|
|
val courseId: String,
|
|
val courseCode: String,
|
|
val courseName: String,
|
|
val lecturer: String,
|
|
val credits: Int,
|
|
val schedule: String,
|
|
val room: String,
|
|
val semester: Int,
|
|
val isActive: Boolean = true
|
|
)
|
|
```
|
|
|
|
- **`AttendanceStatus`**: Enum untuk status kehadiran
|
|
- `PRESENT` - Hadir
|
|
- `LATE` - Terlambat
|
|
- `ABSENT` - Tidak hadir
|
|
- `EXCUSED` - Izin
|
|
- `SICK` - Sakit
|
|
- `PENDING` - Menunggu validasi
|
|
- `REJECTED` - Ditolak
|
|
|
|
- **`AttendanceReport`**: Laporan kehadiran per mata kuliah
|
|
```kotlin
|
|
data class AttendanceReport(
|
|
val courseId: String,
|
|
val courseName: String,
|
|
val courseCode: String,
|
|
val totalSessions: Int,
|
|
val presentCount: Int,
|
|
val lateCount: Int,
|
|
val absentCount: Int,
|
|
val excusedCount: Int,
|
|
val attendancePercentage: Double,
|
|
val attendanceRecords: List<Attendance>
|
|
)
|
|
```
|
|
|
|
---
|
|
|
|
### 2. **Config** (`config/CourseConfig.kt`)
|
|
|
|
File konfigurasi untuk mata kuliah:
|
|
```kotlin
|
|
object CourseConfig {
|
|
// Data sample mata kuliah
|
|
fun getSampleCourses(): List<Course>
|
|
|
|
// Konfigurasi kehadiran
|
|
const val MINIMUM_ATTENDANCE_PERCENTAGE = 80.0
|
|
const val MAX_EXCUSED_ABSENCES = 3
|
|
const val MAX_SICK_LEAVE = 2
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 3. **Service** (`utils/CourseService.kt`)
|
|
|
|
Service untuk mengelola mata kuliah dan kehadiran menggunakan SharedPreferences:
|
|
|
|
**Method-method penting:**
|
|
- `getCourses()`: Dapatkan semua mata kuliah
|
|
- `saveAttendance(attendance)`: Simpan kehadiran
|
|
- `getAttendancesByCourse(courseId)`: Dapatkan kehadiran per mata kuliah
|
|
- `generateAttendanceReport(courseId)`: Buat laporan kehadiran
|
|
- `hasAttendedToday(courseId)`: Cek sudah absen hari ini
|
|
- `getCurrentDate()`: Dapatkan tanggal hari ini
|
|
- `formatTime(timestamp)`: Format waktu
|
|
- `formatDate(dateString)`: Format tanggal
|
|
|
|
---
|
|
|
|
### 4. **UI Components** (`ui/components/CourseComponents.kt`)
|
|
|
|
Komponen Compose untuk menampilkan:
|
|
- **`CourseCard`**: Kartu untuk menampilkan informasi mata kuliah
|
|
- **`CourseListSection`**: List dari semua mata kuliah
|
|
- **`AttendanceReportCard`**: Kartu laporan kehadiran dengan statistik
|
|
- **`StatisticItem`**: Item untuk menampilkan statistik
|
|
- **`AttendanceDetailCard`**: Kartu detail kehadiran
|
|
- **`AttendanceHistoryList`**: List riwayat kehadiran
|
|
|
|
---
|
|
|
|
### 5. **Screens** (`ui/screens/CourseScreen.kt`)
|
|
|
|
Layar untuk menampilkan data mata kuliah:
|
|
- **`CourseListScreen`**: Menampilkan daftar semua mata kuliah
|
|
- **`CourseDetailScreen`**: Menampilkan detail mata kuliah dan riwayat kehadiran
|
|
|
|
---
|
|
|
|
## 🔄 Alur Penggunaan
|
|
|
|
### Alur Absensi dengan Mata Kuliah
|
|
|
|
```
|
|
1. User login / buka aplikasi
|
|
↓
|
|
2. Aplikasi menampilkan daftar mata kuliah
|
|
↓
|
|
3. User memilih mata kuliah yang akan diabsen
|
|
↓
|
|
4. User mengambil foto
|
|
↓
|
|
5. Sistem mengambil lokasi GPS
|
|
↓
|
|
6. Sistem memvalidasi lokasi
|
|
↓
|
|
7. User klik "Kirim Absensi"
|
|
↓
|
|
8. Data dikirim ke server N8n dengan informasi:
|
|
- NPM & Nama
|
|
- Kode & Nama Mata Kuliah
|
|
- Latitude & Longitude
|
|
- Foto (Base64)
|
|
- Timestamp
|
|
↓
|
|
9. Data disimpan di database lokal (SharedPreferences)
|
|
↓
|
|
10. User dapat melihat riwayat kehadiran per mata kuliah
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Struktur Data Kehadiran
|
|
|
|
Setiap record kehadiran menyimpan:
|
|
```json
|
|
{
|
|
"npm": "202310715082",
|
|
"nama": "Fazri Abdurrahman",
|
|
"courseId": "COURSE_001",
|
|
"courseCode": "PBO2024",
|
|
"courseName": "Pemrograman Berorientasi Objek",
|
|
"latitude": -7.000123,
|
|
"longitude": 110.400456,
|
|
"date": "2025-01-14",
|
|
"time": "08:15:30",
|
|
"timestamp": 1705228530000,
|
|
"status": "PRESENT",
|
|
"isValid": true,
|
|
"fotoBase64": "[base64_encoded_image]",
|
|
"submissionResult": "Success: ✓ Absensi diterima server"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔌 Integrasi dengan N8n Webhook
|
|
|
|
Data kehadiran dikirim ke N8n dengan format:
|
|
```json
|
|
{
|
|
"npm": "202310715082",
|
|
"nama": "Fazri Abdurrahman",
|
|
"courseId": "COURSE_001",
|
|
"courseCode": "PBO2024",
|
|
"courseName": "Pemrograman Berorientasi Objek",
|
|
"latitude": -7.000123,
|
|
"longitude": 110.400456,
|
|
"timestamp": 1705228530000,
|
|
"foto_base64": "[base64_encoded_image]"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📈 Laporan Kehadiran
|
|
|
|
Fitur laporan menampilkan:
|
|
- **Total Sesi**: Jumlah total sesi perkuliahan
|
|
- **Hadir**: Jumlah kehadiran tepat waktu
|
|
- **Terlambat**: Jumlah kehadiran terlambat
|
|
- **Tidak Hadir**: Jumlah tidak hadir
|
|
- **Izin/Sakit**: Jumlah dengan izin atau sakit
|
|
- **Persentase Kehadiran**: Persentase kehadiran (Hadir + Terlambat) / Total
|
|
|
|
---
|
|
|
|
## 🎨 UI/UX Improvements
|
|
|
|
### 1. **Course Selection Card**
|
|
- Menampilkan mata kuliah yang dipilih
|
|
- Dialog selector untuk memilih dari daftar
|
|
- Menampilkan informasi dosen dan kode mata kuliah
|
|
|
|
### 2. **Course Detail View**
|
|
- Informasi lengkap mata kuliah
|
|
- Jadwal, ruang, SKS, dosen pengampu
|
|
- Riwayat kehadiran yang dapat discroll
|
|
|
|
### 3. **Attendance Statistics**
|
|
- Visual representation dengan warna:
|
|
- Hijau: ≥80% (Memuaskan)
|
|
- Orange: 70-79% (Cukup)
|
|
- Merah: <70% (Kurang)
|
|
|
|
---
|
|
|
|
## 💾 Penyimpanan Data
|
|
|
|
Data disimpan menggunakan **SharedPreferences** dengan Gson serialization:
|
|
|
|
```
|
|
SharedPreferences Key: "course_attendance_db"
|
|
├── courses_list: List<Course> (JSON)
|
|
├── attendance_list: List<Attendance> (JSON)
|
|
└── selected_course: Course (JSON)
|
|
```
|
|
|
|
---
|
|
|
|
## 🔧 Konfigurasi
|
|
|
|
### Menambahkan Mata Kuliah Baru
|
|
|
|
Edit `CourseConfig.kt` dan tambahkan di `getSampleCourses()`:
|
|
|
|
```kotlin
|
|
Course(
|
|
courseId = "COURSE_006",
|
|
courseCode = "NEWCODE2024",
|
|
courseName = "Nama Mata Kuliah",
|
|
lecturer = "Nama Dosen",
|
|
credits = 3,
|
|
schedule = "Hari HH:MM-HH:MM",
|
|
room = "Ruang Kelas",
|
|
semester = 4,
|
|
isActive = true
|
|
)
|
|
```
|
|
|
|
### Mengubah Threshold Kehadiran
|
|
|
|
Edit di `CourseConfig.kt`:
|
|
|
|
```kotlin
|
|
const val MINIMUM_ATTENDANCE_PERCENTAGE = 80.0 // Default 80%
|
|
const val MAX_EXCUSED_ABSENCES = 3 // Maksimal 3 izin
|
|
const val MAX_SICK_LEAVE = 2 // Maksimal 2 sakit
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Penggunaan API
|
|
|
|
### Mendapatkan Daftar Mata Kuliah
|
|
```kotlin
|
|
val courseService = CourseService(context)
|
|
val courses = courseService.getCourses()
|
|
```
|
|
|
|
### Menyimpan Kehadiran
|
|
```kotlin
|
|
val attendance = Attendance(
|
|
npm = "202310715082",
|
|
nama = "Fazri Abdurrahman",
|
|
courseId = "COURSE_001",
|
|
courseCode = "PBO2024",
|
|
courseName = "Pemrograman Berorientasi Objek",
|
|
latitude = -7.000123,
|
|
longitude = 110.400456,
|
|
timestamp = System.currentTimeMillis(),
|
|
date = courseService.getCurrentDate(),
|
|
time = courseService.formatTime(System.currentTimeMillis()),
|
|
status = AttendanceStatus.PRESENT,
|
|
isValid = true
|
|
)
|
|
courseService.saveAttendance(attendance)
|
|
```
|
|
|
|
### Membuat Laporan Kehadiran
|
|
```kotlin
|
|
val report = courseService.generateAttendanceReport("COURSE_001")
|
|
println("Persentase: ${report.attendancePercentage}%")
|
|
println("Hadir: ${report.presentCount}/${report.totalSessions}")
|
|
```
|
|
|
|
### Cek Sudah Absen Hari Ini
|
|
```kotlin
|
|
val hasAttended = courseService.hasAttendedToday("COURSE_001")
|
|
if (hasAttended) {
|
|
Toast.makeText(context, "Anda sudah absen hari ini", Toast.LENGTH_SHORT).show()
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Testing
|
|
|
|
Untuk testing fitur:
|
|
|
|
1. **Test Mata Kuliah**
|
|
- Buka aplikasi
|
|
- Lihat daftar mata kuliah
|
|
- Klik untuk melihat detail
|
|
- Cek riwayat kehadiran
|
|
|
|
2. **Test Absensi dengan Mata Kuliah**
|
|
- Pilih mata kuliah
|
|
- Ambil foto
|
|
- Klik tombol absensi
|
|
- Verifikasi data tersimpan
|
|
|
|
3. **Test Laporan**
|
|
- Buka detail mata kuliah
|
|
- Lihat statistik kehadiran
|
|
- Cek persentase kehadiran
|
|
|
|
---
|
|
|
|
## 📱 Dependency Baru
|
|
|
|
Tambahkan di `build.gradle.kts`:
|
|
```gradle
|
|
implementation("com.google.code.gson:gson:2.10.1")
|
|
```
|
|
|
|
---
|
|
|
|
## 🔒 Catatan Keamanan
|
|
|
|
1. **Data Sensitif**: Foto tidak disimpan langsung, hanya Base64 di memory
|
|
2. **Koordinat**: Dapat disesuaikan dengan OFFSET di config untuk privasi
|
|
3. **Server**: Semua data dikrim via HTTPS ke N8n webhook
|
|
4. **Local Storage**: Data disimpan di SharedPreferences yang aman
|
|
|
|
---
|
|
|
|
## 🆘 Troubleshooting
|
|
|
|
### Error: "Tidak ada mata kuliah"
|
|
- Pastikan `courseService.initializeSampleData()` dipanggil saat startup
|
|
- Periksa SharedPreferences di Android Studio Device Explorer
|
|
|
|
### Error: "Gson class not found"
|
|
- Pastikan gradle dependency sudah ditambahkan
|
|
- Run `gradle sync` atau rebuild project
|
|
|
|
### Kehadiran tidak tersimpan
|
|
- Periksa permissions untuk SharedPreferences
|
|
- Verifikasi format data Attendance
|
|
- Cek logcat untuk error messages
|
|
|
|
---
|
|
|
|
## 📌 Update Notes
|
|
|
|
**Version 1.0** (14 Januari 2025):
|
|
- ✅ Fitur daftar mata kuliah
|
|
- ✅ Pilihan mata kuliah saat absensi
|
|
- ✅ Penyimpanan kehadiran per mata kuliah
|
|
- ✅ Laporan kehadiran dan statistik
|
|
- ✅ Integrasi N8n dengan informasi mata kuliah
|
|
- ✅ Riwayat kehadiran per mata kuliah
|
|
|