# Analisis Sistem SIMKATMAWA
## Sistem Informasi Manajemen Kegiatan Kemahasiswaan

---

## Gambaran Umum

**SIMKATMAWA** adalah aplikasi berbasis Laravel yang berfungsi sebagai **Sistem Informasi Manajemen Kegiatan Kemahasiswaan** dengan fokus utama pada pengelolaan **SKPI (Surat Keterangan Pendamping Ijazah)**. Sistem ini mencatat, memvalidasi, dan melaporkan kegiatan prestasi mahasiswa di tingkat program studi hingga universitas.

---

## Fitur-Fitur Utama

### 1. 🔐 **Modul Autentikasi & Otorisasi**
| Fitur | Deskripsi |
|-------|-----------|
| Login Reguler | Autentikasi standar Laravel |
| OAuth Neosisdam | Single Sign-On dengan sistem kepegawaian |
| Role-Based Access Control | Menggunakan Spatie Laravel Permission |
| User Impersonation | Developer dapat meniru user lain untuk testing |

### 2. 👤 **Manajemen User (Developer Module)**
| Fitur | Deskripsi |
|-------|-----------|
| CRUD Users | Kelola pengguna sistem |
| CRUD Roles | Kelola peran (developer, admin, kaprodi, dll) |
| CRUD Permissions | Kelola hak akses granular |
| Permission Groups | Pengelompokan permission |
| User Akses Prodi | Assign user ke program studi tertentu |
| Integrasi Pegawai | Menghubungkan user dengan data pegawai |

### 3. 📚 **Master Data**

#### a. Nama Prestasi
Mengelola jenis-jenis prestasi yang dapat diraih mahasiswa (Juara 1, Juara 2, Peserta, dll).

#### b. Tingkat Kegiatan
Mengelola level/tingkatan kegiatan (Internasional, Nasional, Regional, Lokal).

#### c. Komponen Kegiatan
Mengelola kategori komponen kegiatan kemahasiswaan.

#### d. Kegiatan
Mengelola daftar kegiatan yang dapat diikuti mahasiswa, terhubung dengan komponen kegiatan.

#### e. Bobot Kegiatan
Mengelola sistem pembobotan nilai berdasarkan kombinasi:
- Jenis Kegiatan
- Tingkat Kegiatan
- Jenis Prestasi

#### f. Akreditasi Program Studi
Menampilkan informasi akreditasi program studi dengan sertifikat.

### 4. 📝 **Pencatatan Kegiatan Mahasiswa**
| Fitur | Deskripsi |
|-------|-----------|
| Input Kegiatan | Mencatat kegiatan prestasi mahasiswa |
| Detail Kegiatan | Deskripsi, penyelenggara, tahun akademik |
| Upload Sertifikat | Menyimpan file sertifikat |
| Multi-level Validasi | Validasi bertingkat (prodi → fakultas → universitas) |

### 5. ✅ **Modul Verifikasi SKPI**

#### a. Verifikasi Tingkat Program Studi
- Kaprodi memverifikasi kegiatan mahasiswa di prodinya
- Approve/Reject dengan keterangan

#### b. Verifikasi Tingkat Universitas
- Admin kemahasiswaan memverifikasi pengajuan SKPI
- Final approval untuk penerbitan SKPI

### 6. 📊 **Hasil Nilai Kegiatan Mahasiswa**
| Fitur | Deskripsi |
|-------|-----------|
| Rekapitulasi Skor | Perhitungan total skor kegiatan per mahasiswa |
| Export PDF SKPI | Generate dokumen SKPI dalam format PDF |
| QR Code Verifikasi | QR Code untuk validasi keaslian SKPI |
| Preview SKPI | Pratinjau dokumen sebelum cetak |

### 7. 📈 **Dashboard & Reporting**
| Fitur | Deskripsi |
|-------|-----------|
| Total Pengajuan SKPI | Statistik pengajuan |
| SKPI Belum Diperiksa | Antrian verifikasi |
| SKPI Disetujui | Statistik approved |
| SKPI Ditolak | Statistik rejected |
| Kegiatan Mhs Berprestasi | Rekap prestasi mahasiswa |

### 8. 🔍 **Verifikasi Keaslian SKPI**
Halaman publik untuk memverifikasi keaslian dokumen SKPI berdasarkan NIM.

---

## Arsitektur Multi-Database

Sistem ini menggunakan **3 koneksi database** untuk integrasi dengan sistem existing:

```mermaid
flowchart TD
    subgraph "Local Database (MySQL Default)"
        A[users]
        B[roles]
        C[permissions]
        D[permission_groups]
        E[user_akses_prodi]
        F[kegiatan_mhs_berprestasi]
    end
    
    subgraph "SIAK Database (mysql_siak)"
        G[mahasiswa]
        H[prodi]
        I[skpi_kegiatan]
        J[skpi_komp_kegiatan]
        K[skpi_bobot]
        L[skpi_tingkat]
        M[skpi_prestasi]
        N[skpi_kegiatan_mhs]
        O[akreditasi]
    end
    
    subgraph "Neosisdam Database (mysql_neosisdam)"
        P[pegawai]
        Q[unit_kerja]
        R[sub_unit_kerja]
        S[riwayat_homebase]
    end
    
    A --> P
    A --> E
    F --> G
    F --> P
```

---

## Desain Database (ERD)

### Database Lokal (SIMKATMAWA)

```mermaid
erDiagram
    USERS {
        bigint id PK
        string name
        string email UK
        string username
        string password
        string origin_uid
        string origin
        bigint pegawai_id FK
        timestamp email_verified_at
        string remember_token
        timestamps created_at
        timestamps updated_at
    }
    
    ROLES {
        bigint id PK
        string name
        string guard_name
        timestamps created_at
        timestamps updated_at
    }
    
    PERMISSIONS {
        bigint id PK
        string name
        string guard_name
        bigint permission_group_id FK
        timestamps created_at
        timestamps updated_at
    }
    
    PERMISSION_GROUPS {
        bigint id PK
        string name
        timestamps created_at
        timestamps updated_at
    }
    
    MODEL_HAS_ROLES {
        bigint role_id FK
        string model_type
        bigint model_id
    }
    
    MODEL_HAS_PERMISSIONS {
        bigint permission_id FK
        string model_type
        bigint model_id
    }
    
    ROLE_HAS_PERMISSIONS {
        bigint permission_id FK
        bigint role_id FK
    }
    
    USER_AKSES_PRODI {
        ulid id PK
        bigint user_id FK
        string kd_prodi FK
        timestamps created_at
        timestamps updated_at
    }
    
    KEGIATAN_MHS_BERPRESTASI {
        ulid id PK
        string thakad
        string nidn
        string kd_dosen
        integer unit_kerja_id FK
        integer sub_unit_kerja_id FK
        string nim FK
        date tanggal_awal_kegiatan
        date tanggal_akhir_kegiatan
        text nama_prestasi
        string level
        smallint tingkat_id FK
        string peringkat
        smallint prestasi_id FK
        decimal bobot
        string sertifikat_file_id
        string sertifikat_file_name
        string sertifikat_url
        timestamps created_at
        timestamps updated_at
    }
    
    USERS ||--o{ MODEL_HAS_ROLES : "has"
    USERS ||--o{ MODEL_HAS_PERMISSIONS : "has"
    USERS ||--o{ USER_AKSES_PRODI : "has"
    ROLES ||--o{ MODEL_HAS_ROLES : "assigned to"
    ROLES ||--o{ ROLE_HAS_PERMISSIONS : "has"
    PERMISSIONS ||--o{ MODEL_HAS_PERMISSIONS : "assigned to"
    PERMISSIONS ||--o{ ROLE_HAS_PERMISSIONS : "belongs to"
    PERMISSIONS }o--|| PERMISSION_GROUPS : "grouped in"
```

### Database SIAK (Akademik)

```mermaid
erDiagram
    MAHASISWA {
        string nim PK
        string nama
        string kd_prodi FK
        string status
    }
    
    PRODI {
        string kd_prodi PK
        string kdpst_dikti
        string nama_prodi
        string jenjang
    }
    
    AKREDITASI {
        bigint id PK
        string kdpst_dikti FK
        string no_sk
        string peringkat
        string tahun_sk
        date tgl_kadarluarsa
        boolean is_active
        string sertfikat_file_id
        string sertifikat_file_name
        string sertifikat_url
    }
    
    STATUS_MAHASISWA {
        string nim FK
        string status
    }
    
    SKPI_KOMP_KEGIATAN {
        int komponen_id PK
        string komponen
        string kategori
    }
    
    SKPI_KEGIATAN {
        int kegiatan_id PK
        int komponen_id FK
        string kegiatan
        boolean is_active
    }
    
    SKPI_TINGKAT {
        smallint tingkat_id PK
        string tingkat
    }
    
    SKPI_PRESTASI {
        smallint prestasi_id PK
        string prestasi
        boolean is_active
    }
    
    SKPI_BOBOT {
        int bobot_id PK
        int kegiatan_id FK
        smallint tingkat_id FK
        smallint prestasi_id FK
        decimal nilai
        boolean status
    }
    
    SKPI_KEGIATAN_MHS {
        string id PK
        int bobot_id FK
        string thakad
        string nim FK
        text deskripsi
        string penyelengara_kegiatan
        boolean validasi_kemahasiswaan_universitas
        boolean validasikaprodi
        boolean validasi_kemahasiswaan_fakultas
        decimal bobot
        text keterangan_verifikasi
        timestamps created_at
        timestamps updated_at
    }
    
    MAHASISWA }o--|| PRODI : "belongs to"
    MAHASISWA ||--o| STATUS_MAHASISWA : "has"
    PRODI ||--o{ AKREDITASI : "has"
    SKPI_KOMP_KEGIATAN ||--o{ SKPI_KEGIATAN : "contains"
    SKPI_KEGIATAN ||--o{ SKPI_BOBOT : "has"
    SKPI_TINGKAT ||--o{ SKPI_BOBOT : "applies to"
    SKPI_PRESTASI ||--o{ SKPI_BOBOT : "for"
    SKPI_BOBOT ||--o{ SKPI_KEGIATAN_MHS : "used in"
    MAHASISWA ||--o{ SKPI_KEGIATAN_MHS : "participates"
```

### Database Neosisdam (Kepegawaian)

```mermaid
erDiagram
    PEGAWAI {
        ulid id PK
        string user_id
        string nip
        string nama
        string gelar_depan
        string gelar_belakang
        string kode_dosen
        string nidn
        string email
    }
    
    UNIT_KERJA {
        ulid id PK
        string nama_unit
        string kode_unit
    }
    
    SUB_UNIT_KERJA {
        ulid id PK
        ulid unit_kerja_id FK
        string nama_sub_unit
        string kode_sub_unit
    }
    
    RIWAYAT_HOMEBASE {
        ulid id PK
        ulid pegawai_id FK
        string homebase
        date mulai
        date selesai
        boolean is_active
    }
    
    PEGAWAI ||--o| RIWAYAT_HOMEBASE : "has"
    UNIT_KERJA ||--o{ SUB_UNIT_KERJA : "contains"
```

---

## Struktur Tabel Lengkap

### Tabel: `users` (Local)
| Kolom | Tipe | Constraint | Deskripsi |
|-------|------|------------|-----------|
| id | BIGINT | PK, AUTO_INCREMENT | Primary key |
| name | VARCHAR(255) | NOT NULL | Nama lengkap user |
| email | VARCHAR(255) | UNIQUE, NOT NULL | Email user |
| username | VARCHAR(255) | NULLABLE | Username untuk login |
| password | VARCHAR(255) | NOT NULL | Password hash |
| origin_uid | VARCHAR(255) | NULLABLE | ID dari sistem asal (SSO) |
| origin | VARCHAR(255) | NULLABLE | Asal sistem (neosisdam) |
| pegawai_id | BIGINT | NULLABLE, FK | Reference ke pegawai |
| email_verified_at | TIMESTAMP | NULLABLE | Waktu verifikasi email |
| remember_token | VARCHAR(100) | NULLABLE | Token remember me |
| created_at | TIMESTAMP | - | Waktu dibuat |
| updated_at | TIMESTAMP | - | Waktu diupdate |

### Tabel: `permission_groups` (Local)
| Kolom | Tipe | Constraint | Deskripsi |
|-------|------|------------|-----------|
| id | BIGINT | PK, AUTO_INCREMENT | Primary key |
| name | VARCHAR(255) | NOT NULL | Nama grup permission |
| created_at | TIMESTAMP | - | Waktu dibuat |
| updated_at | TIMESTAMP | - | Waktu diupdate |

### Tabel: `user_akses_prodi` (Local)
| Kolom | Tipe | Constraint | Deskripsi |
|-------|------|------------|-----------|
| id | ULID(26) | PK | Primary key |
| user_id | BIGINT | FK | Reference ke users |
| kd_prodi | VARCHAR(10) | FK | Kode program studi |
| created_at | TIMESTAMP | - | Waktu dibuat |
| updated_at | TIMESTAMP | - | Waktu diupdate |

### Tabel: `kegiatan_mhs_berprestasi` (Local)
| Kolom | Tipe | Constraint | Deskripsi |
|-------|------|------------|-----------|
| id | ULID(26) | PK | Primary key |
| thakad | VARCHAR(10) | NULLABLE | Tahun akademik |
| nidn | VARCHAR(10) | NULLABLE | NIDN dosen pembimbing |
| kd_dosen | VARCHAR(10) | NULLABLE | Kode dosen |
| unit_kerja_id | INTEGER | NULLABLE, FK | ID unit kerja |
| sub_unit_kerja_id | INTEGER | NULLABLE, FK | ID sub unit kerja |
| nim | VARCHAR(10) | NULLABLE, FK | NIM mahasiswa |
| tanggal_awal_kegiatan | DATE | NULLABLE | Tanggal mulai kegiatan |
| tanggal_akhir_kegiatan | DATE | NULLABLE | Tanggal akhir kegiatan |
| nama_prestasi | TEXT | NULLABLE | Nama/judul prestasi |
| level | VARCHAR(50) | NULLABLE | Level kompetisi |
| tingkat_id | SMALLINT | NULLABLE, FK | ID tingkat kegiatan |
| peringkat | VARCHAR(70) | NULLABLE | Peringkat yang diraih |
| prestasi_id | SMALLINT | NULLABLE, FK | ID jenis prestasi |
| bobot | DECIMAL(4,2) | NOT NULL | Nilai bobot |
| sertifikat_file_id | VARCHAR(255) | NULLABLE | ID file sertifikat |
| sertifikat_file_name | VARCHAR(255) | NULLABLE | Nama file sertifikat |
| sertifikat_url | VARCHAR(255) | NULLABLE | URL sertifikat |
| created_at | TIMESTAMP | - | Waktu dibuat |
| updated_at | TIMESTAMP | - | Waktu diupdate |

---

## Alur Proses Utama

```mermaid
flowchart TD
    A[Mahasiswa Mengikuti Kegiatan] --> B[Input Data Kegiatan & Upload Sertifikat]
    B --> C[Pencatatan oleh Admin/Staff]
    C --> D{Verifikasi Kaprodi}
    D -->|Ditolak| E[Revisi Data]
    E --> C
    D -->|Disetujui| F{Verifikasi Fakultas}
    F -->|Ditolak| E
    F -->|Disetujui| G{Verifikasi Universitas}
    G -->|Ditolak| E
    G -->|Disetujui| H[Hitung Total Skor SKPI]
    H --> I[Generate SKPI PDF + QR Code]
    I --> J[Mahasiswa Mengunduh SKPI]
```

---

## Role & Permission

### Role yang Umum Digunakan:
1. **Developer** - Akses penuh ke seluruh sistem
2. **Admin Universitas** - Verifikasi tingkat universitas
3. **Admin Fakultas** - Verifikasi tingkat fakultas
4. **Kaprodi** - Verifikasi tingkat program studi
5. **Staff/Operator** - Input dan pencatatan kegiatan

### Hierarki Akses:
```
Developer
├── Manajemen User & Role
├── Manajemen Permission
├── User Impersonation
└── Semua Fitur

Admin Universitas
├── Verifikasi SKPI Universitas
├── Dashboard Universitas
└── Lihat Semua Prodi

Admin Fakultas
├── Verifikasi SKPI Fakultas
├── Dashboard Fakultas
└── Lihat Prodi di Fakultasnya

Kaprodi
├── Verifikasi SKPI Prodi
├── Dashboard Prodi
└── Hanya Prodi Sendiri

Staff
├── Pencatatan Kegiatan
└── Lihat Laporan
```

---

## Teknologi yang Digunakan

| Komponen | Teknologi |
|----------|-----------|
| Framework | Laravel 11+ |
| Database | MySQL (Multi-connection) |
| Frontend | Blade Templates |
| Build Tool | Vite |
| Authentication | Laravel Breeze + OAuth |
| Authorization | Spatie Laravel Permission |
| PDF Generation | (Integration available) |
| QR Code | SimpleSoftwareIO/QrCode |
