================================================================
  PRESENSI KAMPUS — SISTEM ABSENSI GEOFENCING BERBASIS REST API
  Dokumentasi Teknis untuk Presentasi Dosen
================================================================

NAMA SISTEM : Presensi Kampus
TEKNOLOGI   : PHP, MySQL, HTML, CSS (Tailwind), JavaScript
FITUR UTAMA : GPS Geofencing, REST API, Notifikasi (SweetAlert2)
              CRUD lengkap, Login multi-role, Dashboard

================================================================
  A. PEMENUHAN RULES / KETENTUAN DOSEN
================================================================

  [✓] MySQL dengan minimal 4 tabel + relasi + foreign key
      → Tabel: users, kelas, jadwal, absensi, banding, settings
      → Relasi: kelas → users (dosen), jadwal → kelas,
                absensi → users + jadwal, banding → absensi + users

  [✓] HTML + CSS
      → Semua halaman menggunakan HTML dengan Tailwind CSS
      → CSS kustom di assets/css/ (style.css, login.css, dashboard.css)

  [✓] JavaScript + Notifikasi
      → SweetAlert2 untuk notifikasi popup (berhasil/gagal/konfirmasi)
      → JS untuk geolocation real-time, kamera swafoto, animasi UI

  [✓] PHP
      → Seluruh backend menggunakan PHP (PDO + prepared statements)
      → Sistem session PHP untuk autentikasi multi-role

  [✓] REST API (buatan sendiri)
      → Endpoint lengkap di folder /api/
      → Mendukung GET, POST, PUT, DELETE
      → Response format JSON standar
      → API Waktu (time) & Lokasi (location) terintegrasi

  [✓] CRUD dalam sistem
      → Absensi : Create, Read, Update, Delete
      → Users   : Create, Read, Update, Delete
      → Kelas   : Create, Read, Update, Delete
      → Banding : Read, Update (approve/reject)

  [✓] Halaman utama, Login, Dashboard
      → index.php      : Halaman utama / landing page
      → login.php      : Halaman login
      → dashboard.php  : Dashboard berbeda sesuai role (Admin/Dosen/Mahasiswa)


================================================================
  B. STRUKTUR FOLDER & FUNGSI TIAP FILE
================================================================

presensi-kampus/
│
├── index.php                    ← Halaman utama (landing page publik)
│                                  Menampilkan info sistem & tombol login
│
├── login.php                    ← Halaman login dengan form username + password
│                                  Validasi via PHP session, redirect sesuai role
│
├── logout.php                   ← Proses logout, hapus session, redirect ke login
│
├── dashboard.php                ← Dashboard utama setelah login
│                                  Konten berbeda untuk Admin/Dosen/Mahasiswa
│                                  Menampilkan statistik & ringkasan data
│
│
├── ── api/  ──────────────────────────────────────────────────
│   │   (FOLDER REST API — dibuat khusus untuk tugas ini)
│   │
│   ├── index.php               ← ROUTER UTAMA REST API
│   │                             Menerima semua request ke /api/?endpoint=...
│   │                             Mendistribusikan ke handler yang sesuai
│   │                             Mendukung: GET, POST, PUT, DELETE, OPTIONS
│   │
│   └── handlers/               ← Folder berisi logika tiap endpoint
│       │
│       ├── time.php            ← ENDPOINT WAKTU (GET /api/?endpoint=time)
│       │                         Mengembalikan waktu server real-time WIB
│       │                         Termasuk: jam, tanggal Indo, hari, sesi (pagi/siang/sore/malam)
│       │                         Tidak perlu login — bisa diakses publik
│       │                         Digunakan oleh frontend untuk sinkronisasi waktu absensi
│       │
│       ├── location.php        ← ENDPOINT LOKASI (GET/POST/PUT /api/?endpoint=location)
│       │                         GET  : Ambil koordinat kampus & radius dari database
│       │                         POST : Kirim koordinat user, sistem validasi apakah
│       │                                user dalam radius kampus (Haversine formula)
│       │                         PUT  : Update koordinat kampus (Admin only)
│       │                         Tidak perlu login untuk GET & POST
│       │
│       ├── auth.php            ← ENDPOINT LOGIN & LOGOUT
│       │                         POST /api/?endpoint=login  → Verifikasi user, buat session
│       │                         POST /api/?endpoint=logout → Hapus session
│       │                         Mendukung plain-text password (dev) & password_hash (produksi)
│       │
│       ├── absensi.php         ← ENDPOINT ABSENSI — CRUD LENGKAP
│       │                         GET    : Ambil daftar absensi (filter by tanggal, jadwal, status)
│       │                                  Mahasiswa: hanya miliknya sendiri
│       │                                  Dosen: absensi kelas yang diajar
│       │                                  Admin: semua data
│       │                         POST   : Submit absensi baru (Mahasiswa)
│       │                                  Validasi: radius GPS, foto, duplikat, jadwal valid
│       │                         PUT    : Ubah status absensi (Dosen/Admin)
│       │                         DELETE : Hapus data absensi (Admin only)
│       │
│       ├── jadwal.php          ← ENDPOINT JADWAL (GET)
│       │                         Mengembalikan jadwal kuliah sesuai role:
│       │                         Mahasiswa: jadwal kelasnya
│       │                         Dosen: jadwal kelas yang diajar
│       │                         Admin: semua jadwal
│       │
│       ├── kelas.php           ← ENDPOINT KELAS — CRUD LENGKAP
│       │                         GET    : Daftar semua kelas + jumlah mahasiswa
│       │                         POST   : Tambah kelas baru (Admin/Dosen)
│       │                         PUT    : Edit kelas (Admin/Dosen)
│       │                         DELETE : Hapus kelas (Admin only)
│       │
│       ├── users.php           ← ENDPOINT USERS — CRUD LENGKAP (Admin)
│       │                         GET    : Daftar semua user (filter by role/kelas)
│       │                         POST   : Tambah user baru + hash password otomatis
│       │                         PUT    : Edit data user / ganti password
│       │                         DELETE : Hapus user (tidak bisa hapus diri sendiri)
│       │
│       ├── banding.php         ← ENDPOINT BANDING / APPEAL ABSENSI
│       │                         GET : Lihat daftar banding
│       │                              Mahasiswa: banding miliknya
│       │                              Dosen/Admin: semua banding
│       │                         PUT : Setujui (Approved) atau tolak (Rejected) banding
│       │                              Jika Approved → status absensi otomatis jadi Hadir
│       │
│       └── dashboard.php       ← ENDPOINT STATISTIK DASHBOARD
│                                  GET /api/?endpoint=dashboard
│                                  Mahasiswa: rekap hadir/izin/sakit/alpa + persentase
│                                  Dosen/Admin: total mahasiswa, kelas, absensi hari ini,
│                                               banding pending, rekapitulasi per status
│
│
├── ── admin/  ────────────────────────────────────────────────
│   ├── jadwal.php              ← Halaman kelola jadwal kuliah (CRUD via form)
│   ├── kelas.php               ← Halaman kelola kelas (CRUD via form)
│   ├── laporan.php             ← Laporan rekap kehadiran seluruh mahasiswa
│   └── users.php               ← Halaman kelola data user (CRUD via form)
│
│
├── ── dosen/  ────────────────────────────────────────────────
│   ├── absensi-kelas.php       ← Dosen lihat & edit absensi kelas yang diajar
│   ├── banding.php             ← Dosen review & setujui/tolak banding mahasiswa
│   └── revisi-absensi.php      ← Form revisi status absensi oleh dosen
│
│
├── ── mahasiswa/  ────────────────────────────────────────────
│   ├── absen.php               ← FORM ABSENSI UTAMA
│   │                             GPS geofencing real-time, upload swafoto,
│   │                             pilih jadwal, kirim absensi
│   ├── banding.php             ← Form pengajuan banding/keberatan absensi
│   ├── jadwal.php              ← Lihat jadwal kuliah mahasiswa
│   └── riwayat.php             ← Riwayat absensi mahasiswa
│
│
├── ── auth/  ─────────────────────────────────────────────────
│   ├── cek-login.php           ← Guard/middleware: cek session aktif
│   │                             Redirect ke login jika belum login
│   ├── proses-login.php        ← Proses validasi form login (form action)
│   └── rememberme.php          ← Fitur "ingat saya" via cookie
│
│
├── ── config/  ───────────────────────────────────────────────
│   ├── database.php            ← Koneksi PDO ke MySQL
│   │                             Host: localhost, DB: presensi_kampus
│   ├── helpers.php             ← Fungsi bantu: generateId() untuk ID unik
│   └── session.php             ← Manajemen session: getUser(), requireRole()
│
│
├── ── components/  ───────────────────────────────────────────
│   ├── header.php              ← HTML head: font, CDN (Tailwind, Lucide, SweetAlert2)
│   ├── navbar.php              ← Navbar atas dengan info user & tombol logout
│   ├── sidebar.php             ← Sidebar navigasi sesuai role
│   └── footer.php              ← Footer + inisialisasi Lucide icon
│
│
├── ── assets/  ───────────────────────────────────────────────
│   ├── css/
│   │   ├── style.css           ← Style global: glassmorphism, animasi, scrollbar
│   │   ├── dashboard.css       ← Style khusus halaman dashboard
│   │   └── login.css           ← Style khusus halaman login
│   │
│   ├── js/
│   │   ├── geolocation.js      ← Library GPS: Haversine formula, getUserCoordinates()
│   │   │                         Digunakan oleh semua halaman yang butuh lokasi
│   │   ├── app.js              ← Inisialisasi global: Lucide icons, utilitas umum
│   │   ├── dashboard.js        ← Logika interaktif dashboard (chart, animasi counter)
│   │   └── login.js            ← Animasi & validasi form login
│   │
│   └── uploads/
│       ├── izin/               ← Folder upload surat izin mahasiswa
│       └── banding/            ← Folder upload bukti banding
│
│
└── ── database/  ─────────────────────────────────────────────
    └── presensi.sql            ← Script SQL lengkap
                                  CREATE DATABASE, 6 tabel, foreign key,
                                  data sample (users, kelas, jadwal, absensi, banding)


================================================================
  C. TABEL DATABASE & RELASINYA
================================================================

  settings      → Pengaturan GPS kampus (latitude, longitude, radius)
  users         → Data login semua role (Admin, Dosen, Mahasiswa)
  kelas         → Data kelas, FK: dosen_id → users.id
  jadwal        → Jadwal kuliah, FK: kelas_id → kelas.id
  absensi       → Data presensi, FK: user_id → users.id
                                     jadwal_id → jadwal.id
  banding       → Pengajuan keberatan, FK: absensi_id → absensi.id
                                            user_id → users.id


================================================================
  D. ALUR REST API (Cara Kerja)
================================================================

  1. Frontend (JS) memanggil endpoint API via fetch() / XMLHttpRequest
  2. Request masuk ke  api/index.php  (router)
  3. Router membaca parameter  ?endpoint=...  dan HTTP method
  4. Router memanggil file handler yang sesuai di  api/handlers/
  5. Handler memvalidasi: session/role, input, database
  6. Handler mengembalikan response JSON:
     {
       "success": true/false,
       "message": "Pesan keterangan",
       "data": { ... }
     }
  7. Frontend menerima JSON dan menampilkan notifikasi (SweetAlert2)


================================================================
  E. CONTOH PENGGUNAAN API (untuk demo ke dosen)
================================================================

  --- Ambil waktu server ---
  GET  /presensi-kampus/api/?endpoint=time

  --- Validasi lokasi user ---
  POST /presensi-kampus/api/?endpoint=location
  Body: { "latitude": -6.2090, "longitude": 106.8458 }

  --- Login ---
  POST /presensi-kampus/api/?endpoint=login
  Body: { "username": "admin", "password": "password" }

  --- Lihat daftar absensi ---
  GET  /presensi-kampus/api/?endpoint=absensi
  GET  /presensi-kampus/api/?endpoint=absensi&tanggal=2026-05-23

  --- Submit absensi baru ---
  POST /presensi-kampus/api/?endpoint=absensi
  Body: { "jadwal_id":"J01", "latitude":-6.2088, "longitude":106.8456,
          "status":"Hadir", "foto_bukti":"data:image/jpeg;base64,...",
          "keterangan":"Hadir tepat waktu" }

  --- Update status absensi (Dosen/Admin) ---
  PUT  /presensi-kampus/api/?endpoint=absensi&id=ABS123456
  Body: { "status": "Izin", "keterangan": "Sakit mendadak" }

  --- Hapus absensi (Admin) ---
  DELETE /presensi-kampus/api/?endpoint=absensi&id=ABS123456

  --- Tambah user baru (Admin) ---
  POST /presensi-kampus/api/?endpoint=users
  Body: { "nim_nip":"123999", "nama":"Budi Baru", "username":"budi99",
          "password":"secret123", "role":"Mahasiswa", "kelas_id":"K01" }

  --- Statistik dashboard ---
  GET  /presensi-kampus/api/?endpoint=dashboard


================================================================
  F. AKUN LOGIN BAWAAN (untuk testing)
================================================================

  Role      Username    Password    Keterangan
  --------  ----------  ----------  ---------------------------
  Admin     admin       password    Akses penuh semua fitur
  Dosen     dosen1      password    Prof. DR. Hermawan Prasetyo
  Dosen     dosen2      password    Dr. Sri Mulyani, M.T.
  Mahasiswa 123456      123457      Ahmad Maariz (Kelas IF-4A)
  Mahasiswa 123457      123456      Budi Santoso (Kelas IF-4A)
  Mahasiswa 123458      123456      Citra Wijaya (Kelas SI-3B)


================================================================
  G. CARA INSTALL / SETUP
================================================================

  1. Import database:
     Buka phpMyAdmin → Import → pilih database/presensi.sql
     → Klik Go

  2. Konfigurasi koneksi database (jika perlu):
     Edit file: config/database.php
     Sesuaikan: $host, $user, $pass

  3. Taruh folder di htdocs XAMPP:
     C:\xampp\htdocs\presensi-kampus\

  4. Buka browser:
     http://localhost/presensi-kampus/

  5. Login menggunakan akun di atas (bagian F)

  * Pastikan XAMPP Apache + MySQL aktif
  * Aktifkan GPS browser saat menggunakan fitur absensi


================================================================
  DIBUAT DENGAN PHP + MySQL + REST API + SweetAlert2 + Tailwind CSS
================================================================
