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

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:

  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

    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

    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:

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:

{
  "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:

  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:

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