9.1 KiB
📚 Fitur Mata Kuliah dan Absen Kehadiran
📋 Daftar Fitur yang Ditambahkan
Dokumentasi ini menjelaskan fitur baru yang telah ditambahkan ke aplikasi Absensi Akademik:
- Daftar Mata Kuliah - Menampilkan semua mata kuliah yang tersedia
- Pilihan Mata Kuliah - Memilih mata kuliah untuk absensi
- Riwayat Kehadiran - Melihat riwayat absensi per mata kuliah
- Laporan Kehadiran - Melihat statistik kehadiran per mata kuliah
🗂️ File-File yang Ditambahkan
1. Models (models/CourseModels.kt)
Berisi data class untuk:
-
Course: Merepresentasikan mata kuliahdata 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 kehadiranPRESENT- HadirLATE- TerlambatABSENT- Tidak hadirEXCUSED- IzinSICK- SakitPENDING- Menunggu validasiREJECTED- Ditolak
-
AttendanceReport: Laporan kehadiran per mata kuliahdata 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:
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 kuliahsaveAttendance(attendance): Simpan kehadirangetAttendancesByCourse(courseId): Dapatkan kehadiran per mata kuliahgenerateAttendanceReport(courseId): Buat laporan kehadiranhasAttendedToday(courseId): Cek sudah absen hari inigetCurrentDate(): Dapatkan tanggal hari iniformatTime(timestamp): Format waktuformatDate(dateString): Format tanggal
4. UI Components (ui/components/CourseComponents.kt)
Komponen Compose untuk menampilkan:
CourseCard: Kartu untuk menampilkan informasi mata kuliahCourseListSection: List dari semua mata kuliahAttendanceReportCard: Kartu laporan kehadiran dengan statistikStatisticItem: Item untuk menampilkan statistikAttendanceDetailCard: Kartu detail kehadiranAttendanceHistoryList: List riwayat kehadiran
5. Screens (ui/screens/CourseScreen.kt)
Layar untuk menampilkan data mata kuliah:
CourseListScreen: Menampilkan daftar semua mata kuliahCourseDetailScreen: 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:
{
"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:
{
"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():
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:
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
val courseService = CourseService(context)
val courses = courseService.getCourses()
Menyimpan Kehadiran
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
val report = courseService.generateAttendanceReport("COURSE_001")
println("Persentase: ${report.attendancePercentage}%")
println("Hadir: ${report.presentCount}/${report.totalSessions}")
Cek Sudah Absen Hari Ini
val hasAttended = courseService.hasAttendedToday("COURSE_001")
if (hasAttended) {
Toast.makeText(context, "Anda sudah absen hari ini", Toast.LENGTH_SHORT).show()
}
📝 Testing
Untuk testing fitur:
-
Test Mata Kuliah
- Buka aplikasi
- Lihat daftar mata kuliah
- Klik untuk melihat detail
- Cek riwayat kehadiran
-
Test Absensi dengan Mata Kuliah
- Pilih mata kuliah
- Ambil foto
- Klik tombol absensi
- Verifikasi data tersimpan
-
Test Laporan
- Buka detail mata kuliah
- Lihat statistik kehadiran
- Cek persentase kehadiran
📱 Dependency Baru
Tambahkan di build.gradle.kts:
implementation("com.google.code.gson:gson:2.10.1")
🔒 Catatan Keamanan
- Data Sensitif: Foto tidak disimpan langsung, hanya Base64 di memory
- Koordinat: Dapat disesuaikan dengan OFFSET di config untuk privasi
- Server: Semua data dikrim via HTTPS ke N8n webhook
- 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 syncatau 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