๐Ÿ—„๏ธ Struktur Database

JSON file per tabel di API/database/*.json (driver json, bisa switch sqlite/mysql/pgsql via API/config/database.php). Kunci target notifikasi: tabel notification_nups (NUP-locked, JOIN saat fetch).

Diagram Relasi

erDiagram
    EMPLOYEES ||--o{ ATTENDANCES : "nup"
    EMPLOYEES ||--o{ DEVICE_NOTIFICATIONS : "token = device_id"
    NOTIFICATIONS ||--o{ DEVICE_NOTIFICATIONS : "notification_id"
    NOTIFICATIONS ||--o{ NOTIFICATION_NUPS : "id_notification"
    NOTIFICATION_NUPS }o--o{ EMPLOYEES : "target_nup = nup"
    DEVICES ||--o{ DEVICE_NOTIFICATIONS : "device_id"
    EMPLOYEES {
        int id PK
        string nama
        string nup "unik, kunci target"
        string email
        string unit_kerja
        string jabatan
        string status_pegawai
        string device_uuid "sesi device aktif"
        string token "auth per-pegawai"
    }
    ATTENDANCES {
        int id PK
        string nup FK
        string tanggal "YYYY-MM-DD, unik per nup"
        string jam_masuk "HH:MM"
        string jam_pulang "HH:MM nullable"
    }
    NOTIFICATIONS {
        int id PK
        string title
        string body
        string priority "low/normal/high"
        string link "lampiran nullable"
        string data "JSON opsional nullable"
        int is_broadcast "1 = semua device"
        string deleted_at "soft delete nullable"
    }
    NOTIFICATION_NUPS {
        int id PK
        int id_notification FK
        string target_nup "NUP tujuan, kunci"
    }
    DEVICE_NOTIFICATIONS {
        int id PK
        string device_id "token pegawai / device"
        int notification_id FK
        int acknowledged "0/1"
        string acknowledged_at "nullable"
    }
    DEVICES {
        int id PK
        string device_id
        string device_name
        string platform
    }

employees โ€” Data Pegawai

KolomTipeKeterangan
idint autoPrimary key
namastringNama lengkap (wajib)
nupstringNUP/NIP, unik โ€” kunci target notifikasi & absensi (wajib)
emailstringFallback cocokkan akun Keycloak
unit_kerjastringUnit kerja
jabatanstringJabatan
status_pegawaistringAktif/TETAP/PKWT/P2K/KONTRAK/Nonaktif
device_uuidstringDevice sesi aktif (binding 1 akun = 1 HP)
tokenstringAuth per-pegawai, auto bin2hex(random_bytes(16)), bisa regenerate

notifications โ€” Pesan

KolomTipeKeterangan
idint autoPrimary key
title / bodystringJudul & isi (wajib)
prioritystringlow/normal/high
linkstring|nullLink lampiran dokumen
dataJSON string|nullPayload opsional bebas
is_broadcast0/11 = semua device (tanpa target)
deleted_atdatetime|nullSoft delete โ€” tersembunyi dari device, tampil di admin + bisa restore

notification_nups โ€” Ikatan NOTIFICATIONS โ†” NUP

KolomTipeKeterangan
idint autoPrimary key
id_notificationintFK ke notifications โ€” kunci target
target_nupstringNUP/NIP tujuan, unik per notifikasi

Ditulis bulk 1x (insertMany) saat broadcast โ€” 501 baris 0,008 dtk. Fetch bangun peta id_notification โ†’ [target_nup] 1x per request + gabung fallback JSON legacy.

device_notifications โ€” Pengiriman & status baca

KolomTipeKeterangan
device_idstringToken pegawai / ID device
notification_idintFK ke notifications
acknowledged0/11 = sudah dibaca
acknowledged_atdatetime|nullWaktu dibaca

Baris hanya dibuat untuk target device eksplisit, broadcast semua, dan ack on-demand โ€” target NUP tak dibuatkan baris di sini melainkan di notification_nups (fetch cocokkan langsung, tulis O(1)).

attendances โ€” Absensi view-only

KolomTipeKeterangan
nup + tanggalstringUnik per pasangan (upsert)
jam_masuk / jam_pulangHH:MMPulang boleh null (belum absen pulang)

devices โ€” Perangkat terdaftar

KolomTipeKeterangan
device_idstringID unik perangkat
device_name / platform / last_seenstringInfo perangkat & terakhir terlihat

Catatan

App Notifikasi ยท struktur database