# 📚 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 ) ``` --- ### 2. **Config** (`config/CourseConfig.kt`) File konfigurasi untuk mata kuliah: ```kotlin object CourseConfig { // Data sample mata kuliah fun getSampleCourses(): List // 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 (JSON) ├── attendance_list: List (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