EAS-202310715082-FAZRI-ABDU.../COURSE_ATTENDANCE_FEATURE.md

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