# Sistem Informasi Pendataan Pegawai Jabatan Fungsional Pemerintah Kabupaten Sukabumi

## 📋 Daftar Isi
- [Instalasi](#instalasi)
- [Konfigurasi Database](#konfigurasi-database)
- [Migrasi dan Seeding](#migrasi-dan-seeding)
- [Jalankan Aplikasi](#jalankan-aplikasi)
- [Struktur Proyek](#struktur-proyek)
- [Fitur Utama](#fitur-utama)
- [User Credentials](#user-credentials)
- [Troubleshooting](#troubleshooting)

## 🚀 Instalasi

### Prasyarat
- Laragon (Apache + PHP 8+ + MySQL)
- Composer sudah terinstall
- Visual Studio Code (optional)

### Langkah-Langkah Instalasi

#### 1. Klon/Copy ke Laragon
Proyek sudah berada di: `C:\laragon\www\Skripsi-M`

#### 2. Install Dependencies
Buka terminal di folder proyek dan jalankan:
```bash
composer install
```

#### 3. Setup Environment File
Copy file `.env.example` menjadi `.env`:
```bash
copy .env.example .env
```

Atau jika menggunakan PowerShell:
```powershell
Copy-Item .env.example .env
```

#### 4. Generate Application Key
```bash
php artisan key:generate
```

#### 5. Konfigurasi Database
Edit file `.env` dan sesuaikan setting database:

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=skripsi_pegawai
DB_USERNAME=root
DB_PASSWORD=
```

Atau buka phpMyAdmin dan buat database baru bernama `skripsi_pegawai`:
- Buka http://localhost/phpmyadmin
- Buat database baru: `CREATE DATABASE skripsi_pegawai CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`

#### 6. Configure Storage Link
Buat symbolic link untuk storage:
```bash
php artisan storage:link
```

## 🗄️ Konfigurasi Database

Database akan dikonfigurasi otomatis melalui migration. Berikut struktur tabel yang akan dibuat:

### Tabel: users
- id (PRIMARY KEY)
- name
- email (UNIQUE)
- email_verified_at
- password
- role (enum: 'admin')
- remember_token
- timestamps

### Tabel: jabatan_fungsional
- id (PRIMARY KEY)
- nama_jabatan
- kategori
- timestamps

### Tabel: pegawai
- id (PRIMARY KEY)
- nip (UNIQUE)
- nama_lengkap
- tempat_lahir
- tanggal_lahir
- jenis_kelamin
- alamat
- no_hp
- email
- unit_kerja
- pendidikan_terakhir
- jabatan_fungsional_id (FOREIGN KEY)
- tanggal_mulai_jabatan
- status_validasi (enum: 'pending', 'disetujui', 'ditolak')
- catatan_penolakan (nullable)
- timestamps

### Tabel: pegawai_files
- id (PRIMARY KEY)
- pegawai_id (FOREIGN KEY)
- nama_file
- tipe_file
- path
- timestamps

## 🔄 Migrasi dan Seeding

### Jalankan Migration
```bash
php artisan migrate
```

### Jalankan Seeder
```bash
php artisan db:seed
```

Atau jalankan keduanya sekaligus:
```bash
php artisan migrate:fresh --seed
```

**Output Seeding:**
- Admin User 1: Email `admin@sukabumi.gov.id` | Password: `admin123456`
- Admin User 2: Email `admin.test@example.com` | Password: `admin123456`
- Jabatan Fungsional: 8 jabatan default (Analis Kebijakan, Perancang Sistem Informasi, dll)

## ▶️ Jalankan Aplikasi

### Opsi 1: Menggunakan Laragon GUI
1. Buka Laragon
2. Pastikan Apache dan MySQL menyala (hijau)
3. Klik tombol "Start All" jika belum
4. Buka browser dan akses: http://Skripsi-M.test
   - Jika domain tidak terdaftar, gunakan: http://localhost/Skripsi-M/public

### Opsi 2: Menggunakan PHP Artisan Server
```bash
php artisan serve
```
Akses: http://127.0.0.1:8000

### Opsi 3: Konfigurasi Virtual Host di Laragon
1. Buka Laragon
2. Menu → Apache Conf → Extra → httpd-vhosts.conf
3. Tambahkan konfigurasi:
```apache
<VirtualHost *:80>
    ServerName skripsi-m.test
    DocumentRoot "C:/laragon/www/Skripsi-M/public"
    <Directory "C:/laragon/www/Skripsi-M/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```
4. Edit file hosts di `C:\Windows\System32\drivers\etc\hosts`:
```
127.0.0.1 skripsi-m.test
```
5. Restart Apache di Laragon
6. Akses: http://skripsi-m.test

## 📁 Struktur Proyek

```
Skripsi-M/
├── app/
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Auth/AuthenticatedSessionController.php
│   │   │   ├── PegawaiFormController.php (PUBLIC FORM)
│   │   │   ├── PegawaiController.php (ADMIN CRUD)
│   │   │   ├── JabatanFungsionalController.php
│   │   │   └── DashboardController.php
│   │   └── Middleware/
│   │       └── AdminMiddleware.php
│   └── Models/
│       ├── User.php
│       ├── Pegawai.php
│       ├── JabatanFungsional.php
│       └── PegawaiFile.php
├── database/
│   ├── migrations/
│   │   ├── 0001_01_01_000000_create_users_table.php
│   │   ├── 2025_05_12_000003_add_role_to_users_table.php
│   │   ├── 2025_05_12_000004_create_jabatan_fungsional_table.php
│   │   ├── 2025_05_12_000005_create_pegawai_table.php
│   │   └── 2025_05_12_000006_create_pegawai_files_table.php
│   └── seeders/
│       ├── DatabaseSeeder.php
│       ├── AdminSeeder.php
│       └── JabatanFungsionalSeeder.php
├── resources/
│   ├── views/
│   │   ├── layouts/
│   │   │   ├── app.blade.php (PUBLIC LAYOUT)
│   │   │   └── admin.blade.php (ADMIN LAYOUT)
│   │   ├── public/
│   │   │   ├── form.blade.php (FORMULIR PENDATAAN)
│   │   │   └── success.blade.php (HALAMAN SUKSES)
│   │   ├── admin/
│   │   │   ├── dashboard.blade.php
│   │   │   ├── pegawai/
│   │   │   │   ├── index.blade.php
│   │   │   │   ├── show.blade.php
│   │   │   │   ├── create.blade.php
│   │   │   │   └── edit.blade.php
│   │   │   └── jabatan/
│   │   │       ├── index.blade.php
│   │   │       ├── create.blade.php
│   │   │       └── edit.blade.php
│   │   └── auth/
│   │       └── login.blade.php
│   ├── css/app.css
│   └── js/app.js
├── routes/
│   ├── web.php (ROUTES UTAMA)
│   └── api.php
├── bootstrap/
│   └── app.php (MIDDLEWARE CONFIGURATION)
├── storage/
│   └── app/
│       ├── public/ (FILE UPLOAD DESTINATION)
│       └── private/
├── public/
│   └── storage/ (SYMBOLIC LINK)
├── .env (ENVIRONMENT VARIABLES)
├── composer.json
└── README.md
```

## ✨ Fitur Utama

### 1. Halaman Publik Form Pengisian Data Pegawai
- **URL:** http://skripsi-m.test/ atau http://skripsi-m.test/pendataan
- **Fitur:**
  - Form pengisian data pegawai lengkap
  - Data pribadi (NIP, nama, TTL, jenis kelamin, dll)
  - Data jabatan (unit kerja, jabatan fungsional, tanggal mulai)
  - Upload dokumen pendukung (PDF, JPG, PNG)
  - Validasi form (front-end dan back-end)
  - Halaman success setelah submit
  - Email verification (optional)

### 2. Admin Login
- **URL:** http://skripsi-m.test/login
- **Credentials:**
  - Email: admin@sukabumi.gov.id
  - Password: admin123456
  - Atau: admin.test@example.com / admin123456
- **Fitur:**
  - Remember me checkbox
  - Session management
  - Logout functionality

### 3. Admin Dashboard
- **URL:** http://skripsi-m.test/admin/dashboard (setelah login)
- **Statistik:**
  - Total pegawai
  - Pegawai menunggu validasi
  - Pegawai disetujui
  - Pegawai ditolak
  - Total jabatan fungsional
  - Pegawai per jabatan
- **Quick Actions:**
  - Link ke halaman manajemen pegawai
  - Link ke halaman manajemen jabatan

### 4. Manajemen Pegawai (Admin Only)
- **URL:** http://skripsi-m.test/admin/pegawai
- **Fitur:**
  - List semua pegawai dengan pagination
  - Search berdasarkan NIP, Nama, Email
  - Filter berdasarkan status validasi
  - Filter berdasarkan jabatan fungsional
  - Filter berdasarkan unit kerja
  - Lihat detail pegawai
  - Edit data pegawai
  - Hapus pegawai
  - **Validasi Pegawai:**
    - Setujui pegawai (ubah status menjadi "disetujui")
    - Tolak pegawai (ubah status menjadi "ditolak" + alasan)
  - Lihat dokumen/file pegawai

### 5. Manajemen Jabatan Fungsional (Admin Only)
- **URL:** http://skripsi-m.test/admin/jabatan
- **Fitur:**
  - CRUD jabatan fungsional
  - Tambah jabatan baru
  - Edit jabatan
  - Hapus jabatan (dengan proteksi jika masih ada pegawai)
  - Tampilkan jumlah pegawai per jabatan
  - Pagination

## 👤 User Credentials

### Admin Users
| Email | Password | Role |
|-------|----------|------|
| admin@sukabumi.gov.id | admin123456 | admin |
| admin.test@example.com | admin123456 | admin |

**⚠️ IMPORTANT:** Ubah password ini di production!

## 🔒 Autentikasi & Keamanan

### Fitur Keamanan:
- Password hashing menggunakan bcrypt
- CSRF protection
- Session management
- Admin middleware untuk proteksi admin routes
- Role-based access control (RBAC)

### Mengubah Password Admin:
1. Login ke admin panel
2. (Future feature: profile/password change page)

Atau via command:
```bash
php artisan tinker
>>> \App\Models\User::first()->update(['password' => \Illuminate\Support\Facades\Hash::make('new_password')])
>>> exit()
```

## 📤 Upload File

### Folder Tujuan Upload:
- **Path:** `storage/app/public/pegawai-files/`
- **Web Accessible:** `/storage/pegawai-files/`
- **Max File Size:** 5MB per file
- **Allowed Extensions:** PDF, JPG, JPEG, PNG

### Cara Mendownload File:
1. Buka detail pegawai
2. Lihat section "Dokumen Pendukung"
3. Klik link file untuk download

## 🔄 API Endpoint (Optional)

Endpoint API untuk integrasi:

### Public Form Submission
```
POST /api/pegawai
Content-Type: application/json

{
  "nip": "123456789",
  "nama_lengkap": "John Doe",
  "tempat_lahir": "Sukabumi",
  "tanggal_lahir": "1990-01-01",
  ...
}
```

## ⚙️ Konfigurasi Lanjutan

### Mengubah Direktori Upload
Edit file `.env`:
```env
FILESYSTEM_DISK=public
```

### Timeout/Performance
Edit file `.env` jika perlu:
```env
SESSION_LIFETIME=120
```

### Email Configuration (optional)
```env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_FROM_ADDRESS=your-email@gmail.com
```

## 🐛 Troubleshooting

### Error: "No application encryption key has been specified"
```bash
php artisan key:generate
```

### Error: "Base table or view not found"
```bash
php artisan migrate:fresh --seed
```

### Error: "Storage link already exists"
```bash
php artisan storage:link --force
```

### Halaman form tidak bisa diakses
- Pastikan route `web.php` sudah dikonfigurasi
- Restart Apache di Laragon

### Upload file tidak bisa diakses
- Pastikan storage link sudah dibuat: `php artisan storage:link`
- Check folder permissions: `storage/app/public/` harus writable

### Login tidak berhasil
- Pastikan database sudah di-seed: `php artisan db:seed`
- Check credentials di seeder file
- Pastikan password benar (case-sensitive)

### Session issue saat login
- Clear cache: `php artisan cache:clear`
- Clear config: `php artisan config:clear`
- Clear session: `php artisan session:clear`

## 📝 Default Jabatan Fungsional

Sistem sudah pre-loaded dengan 8 jabatan:

1. **Analis Kebijakan** - Kategori: Analisis
2. **Perancang Sistem Informasi** - Kategori: Teknologi Informasi
3. **Programmer** - Kategori: Teknologi Informasi
4. **Database Administrator** - Kategori: Teknologi Informasi
5. **Auditor** - Kategori: Audit
6. **Analis Keuangan** - Kategori: Keuangan
7. **Operator Komputer** - Kategori: Operasional
8. **Penerjemah** - Kategori: Administrasi

Anda dapat menambah, mengedit, atau menghapus jabatan melalui admin panel.

## 📊 Database Backup

### Backup Database
```bash
mysqldump -u root skripsi_pegawai > backup_skripsi.sql
```

### Restore Database
```bash
mysql -u root skripsi_pegawai < backup_skripsi.sql
```

## 🚀 Production Deployment

Saat deploy ke production:

1. **Update .env:**
   ```env
   APP_DEBUG=false
   APP_ENV=production
   ```

2. **Wajib ubah admin credentials** di seeder
3. **Set secure database password**
4. **Setup HTTPS/SSL certificate**
5. **Configure firewall properly**
6. **Setup automated backups**
7. **Setup log monitoring**

## 📞 Support & Documentation

### Laravel Documentation
- https://laravel.com/docs/11.x

### Bootstrap Documentation  
- https://getbootstrap.com/docs/5.3

### MySQL Documentation
- https://dev.mysql.com/doc/

## 📄 License

Private Project untuk Kabupaten Sukabumi

---

**Created:** 12 Mei 2025  
**Version:** 1.0.0  
**Status:** Production Ready
