# Dokumentasi Arsitektur Database: teknik_ketenagalistrikan

Dokumen ini menjelaskan rancangan, alur sistem, dan spesifikasi teknis database untuk sistem informasi Teknik Ketenagalistrikan SMKN 1 Cirebon.

## 1. Informasi Umum
* **Nama Database**: `teknik_ketenagalistrikan`
* **Naming Convention**: Singular (Tunggal)
* **Engine**: MySQL (InnoDB)
* **Charset**: `utf8mb4_unicode_ci` (Mendukung emoji dan karakter internasional)

---

## 2. Arsitektur & Spesifikasi Tabel

### A. Tabel `users` (Sentral Autentikasi)
Digunakan untuk mengelola akses masuk (login) semua pengguna (Admin, Guru, Siswa).

| Field | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | BIGINT (PK) | Auto Increment |
| `name` | VARCHAR(255) | Nama tampilan (Bawaan Breeze) |
| `username` | VARCHAR(50) | NIS untuk siswa / NIP untuk guru (Unique) |
| `email` | VARCHAR(255) | Alamat email (Unique, Nullable) |
| `password` | VARCHAR(255) | Kata sandi terenkripsi (Hash) |
| `role` | ENUM | Hak akses: `admin`, `guru`, `siswa` |
| `created_at` | TIMESTAMP | Waktu pembuatan |
| `updated_at` | TIMESTAMP | Waktu pembaruan terakhir |

### B. Tabel `guru` (Profil Pengajar)
Menyimpan identitas profesional tenaga pendidik.

| Field | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | BIGINT (PK) | Auto Increment |
| `user_id` | BIGINT (FK) | Relasi ke `users.id` (Cascade) |
| `nip` | VARCHAR(20) | Nomor Induk Pegawai (Unique) |
| `nama_lengkap`| VARCHAR(100) | Nama lengkap beserta gelar |
| `foto` | VARCHAR(255) | Path file pas foto guru |
| `deleted_at` | TIMESTAMP | Soft delete untuk menjaga riwayat data |

### C. Tabel `kelas` (Rombongan Belajar)
Wadah pengelompokan siswa dan dasar penyusunan jadwal.

| Field | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | BIGINT (PK) | Auto Increment |
| `nama_kelas` | VARCHAR(50) | Nama kelas (Indexed) |
| `wali_kelas_id`| BIGINT (FK) | Relasi ke `guru.id` (Set Null on Delete) |

### D. Tabel `siswa` (Profil Peserta Didik)
Menyimpan identitas lengkap siswa yang terdaftar.

| Field | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | BIGINT (PK) | Auto Increment |
| `user_id` | BIGINT (FK) | Relasi ke `users.id` (Cascade) |
| `kelas_id` | BIGINT (FK) | Relasi ke `kelas.id` (Cascade) |
| `nis` | VARCHAR(20) | Nomor Induk Siswa (Unique) |
| `nama_lengkap`| VARCHAR(100) | Nama lengkap peserta didik |
| `foto` | VARCHAR(255) | Path file pas foto siswa |
| `deleted_at` | TIMESTAMP | Soft delete |

### E. Tabel `mata_pelajaran` (Katalog Kurikulum)
Daftar mata pelajaran yang diajarkan di jurusan.

| Field | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | BIGINT (PK) | Auto Increment |
| `kode_mapel` | VARCHAR(10) | Kode kurikulum unik |
| `nama_mapel` | VARCHAR(100) | Nama mata pelajaran |

### F. Tabel `jadwal` (Jantung Operasional)
Menghubungkan Kelas, Mata Pelajaran, dan Guru dalam satu waktu.

| Field | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | BIGINT (PK) | Auto Increment |
| `kelas_id` | BIGINT (FK) | Relasi ke `kelas.id` |
| `mapel_id` | BIGINT (FK) | Relasi ke `mata_pelajaran.id` |
| `guru_id` | BIGINT (FK) | Relasi ke `guru.id` |
| `hari` | TINYINT | Indeks hari (1=Senin, 6=Sabtu) |
| `jam_mulai` | TIME | Waktu mulai pelajaran |
| `jam_selesai` | TIME | Waktu berakhir pelajaran |

*Note: Terdapat **Composite Index** pada (`kelas_id`, `hari`) untuk mempercepat query.*

### G. Tabel `berita` (CMS & Galeri)
Manajemen konten untuk Landing Page (Lensa Industri).

| Field | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | BIGINT (PK) | Auto Increment |
| `judul` | VARCHAR(255) | Judul artikel |
| `konten` | LONGTEXT | Isi artikel (Mendukung HTML) |
| `kategori` | VARCHAR(50) | Kategori berita (Indexed) |
| `thumbnail` | VARCHAR(255) | Path file gambar sampul |
| `author_id` | BIGINT (FK) | Relasi ke `users.id` (Admin pembuat) |

---

## 3. Alur Sistem (Logic Flow)

1.  **Proses Login**: Pengguna memasukkan `username` (NIS/NIP) dan password. Sistem memverifikasi di tabel `users`.
2.  **Otorisasi Role**:
    * Jika `role` = **admin**, pengguna memiliki akses CRUD ke semua tabel.
    * Jika `role` = **guru**, pengguna dapat melihat jadwal pribadinya dan daftar siswa di kelas binaannya.
    * Jika `role` = **siswa**, pengguna hanya dapat melihat jadwal pelajaran kelasnya sendiri.
3.  **Relasi Jadwal**: Tabel `jadwal` berfungsi sebagai jembatan informasi. Saat aplikasi memanggil halaman jadwal, database melakukan JOIN antara `jadwal`, `guru`, `kelas`, dan `mata_pelajaran` untuk menampilkan data yang manusiawi.
4.  **Integritas Data**: Menggunakan *Foreign Key Constraints* (Cascade/Set Null) untuk memastikan tidak ada data "sampah" atau yatim (*orphan records*) jika salah satu entitas induk dihapus.

---

## 4. Best Practices yang Diterapkan
* **Indexing**: Digunakan pada kolom yang sering dicari (`nama_kelas`, `kategori`, dan composite index pada `jadwal`).
* **Soft Deletes**: Diterapkan pada tabel `guru` dan `siswa` untuk menjaga integritas data riwayat akademik.
* **Security**: Penggunaan *Prepared Statements* melalui Eloquent ORM Laravel untuk mencegah SQL Injection.
* **Scalability**: Tipe data ID menggunakan `BIGINT` untuk menampung volume data besar di masa depan.
