# FASE 1 — SETUP AWAL PROYEK

Anda bertindak sebagai senior PHP developer.

Kita akan membangun aplikasi skripsi:

**Aplikasi Usulan Perbaikan Inventaris  
Perwakilan BKKBN Provinsi Sumatera Utara**

Aplikasi dikembangkan secara bertahap dalam beberapa fase kecil.

Pada fase ini, fokus hanya pada setup awal proyek dan fondasi aplikasi.

Jangan mengerjakan autentikasi, tiket, inventaris, persetujuan, teknisi, laporan, atau fitur bisnis lainnya.

---

## 1. Teknologi

Gunakan:

- PHP Native 8.2 atau lebih baru
- MySQL atau MariaDB
- HTML5
- CSS3
- JavaScript sederhana
- Bootstrap 5 melalui CDN
- Composer
- PDO untuk koneksi database
- Apache melalui XAMPP atau Laragon
- Arsitektur MVC sederhana
- Tanpa Laravel atau CodeIgniter
- Tanpa Node.js
- Tanpa proses build frontend

Nama folder proyek:

```text
bkkbn_eticketing
```

URL lokal:

```text
http://localhost/bkkbn_eticketing/public
```

---

## 2. Tujuan Fase

Pada akhir fase ini, proyek harus memiliki:

1. Struktur folder MVC.
2. Composer dan autoload PSR-4.
3. Front controller melalui `public/index.php`.
4. Routing sederhana.
5. Konfigurasi `.env`.
6. Koneksi database menggunakan PDO.
7. Base Controller.
8. Base Model.
9. Halaman awal.
10. Halaman status koneksi database.
11. Halaman 404 dan 500.
12. Penanganan error dasar.
13. Logging sederhana.
14. Dokumentasi instalasi.
15. File SQL awal.

---

## 3. Struktur Folder

Buat struktur berikut:

```text
bkkbn_eticketing/
├── app/
│   ├── Config/
│   │   ├── App.php
│   │   └── Database.php
│   ├── Controllers/
│   │   ├── Controller.php
│   │   ├── HomeController.php
│   │   └── SystemController.php
│   ├── Core/
│   │   ├── App.php
│   │   ├── Router.php
│   │   ├── Request.php
│   │   ├── Response.php
│   │   ├── View.php
│   │   └── Database.php
│   ├── Exceptions/
│   │   └── Handler.php
│   ├── Helpers/
│   │   └── helpers.php
│   ├── Middleware/
│   │   └── Middleware.php
│   ├── Models/
│   │   └── Model.php
│   ├── Services/
│   │   └── Logger.php
│   └── Views/
│       ├── layouts/
│       │   └── main.php
│       ├── errors/
│       │   ├── 404.php
│       │   └── 500.php
│       ├── home/
│       │   └── index.php
│       └── system/
│           └── database.php
├── bootstrap/
│   └── app.php
├── config/
│   └── routes.php
├── database/
│   ├── migrations/
│   │   └── 001_create_migrations_table.sql
│   └── database.sql
├── public/
│   ├── assets/
│   │   ├── css/
│   │   │   └── app.css
│   │   ├── js/
│   │   │   └── app.js
│   │   └── images/
│   ├── .htaccess
│   └── index.php
├── storage/
│   ├── logs/
│   │   └── .gitkeep
│   ├── cache/
│   │   └── .gitkeep
│   └── uploads/
│       └── .gitkeep
├── .env.example
├── .gitignore
├── composer.json
└── README.md
```

Boleh menyederhanakan struktur apabila ada bagian yang belum diperlukan, tetapi tetap gunakan pola MVC yang jelas.

---

## 4. Composer

Buat `composer.json`:

```json
{
  "name": "renanda-nauval/bkkbn_eticketing",
  "description": "Aplikasi Usulan Perbaikan Inventaris BKKBN Sumatera Utara",
  "type": "project",
  "require": {
    "php": ">=8.2",
    "vlucas/phpdotenv": "^5.6"
  },
  "autoload": {
    "psr-4": {
      "App\\": "app/"
    },
    "files": [
      "app/Helpers/helpers.php"
    ]
  }
}
```

Setelah itu jalankan:

```bash
composer install
composer dump-autoload
```

Jangan menambahkan dependensi yang belum diperlukan.

---

## 5. Environment

Buat `.env.example`:

```env
APP_NAME="Aplikasi Usulan Perbaikan Inventaris"
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost/bkkbn_eticketing/public
APP_TIMEZONE=Asia/Jakarta

DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_usulan_perbaikan
DB_USERNAME=root
DB_PASSWORD=

LOG_LEVEL=debug
```

Buat `.gitignore`:

```text
/vendor/
/.env
/storage/logs/*.log
/storage/cache/*
/storage/uploads/*
!.gitkeep
```

Aplikasi harus memberikan pesan konfigurasi yang jelas apabila `.env` belum tersedia.

---

## 6. Database

Gunakan database:

```text
db_usulan_perbaikan
```

Buat `database/database.sql`:

```sql
CREATE DATABASE IF NOT EXISTS db_usulan_perbaikan
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE db_usulan_perbaikan;

CREATE TABLE IF NOT EXISTS migrations (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    migration VARCHAR(255) NOT NULL UNIQUE,
    executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

Koneksi database harus:

- menggunakan PDO;
- membaca konfigurasi dari `.env`;
- memakai charset `utf8mb4`;
- memakai exception mode;
- menonaktifkan emulated prepare;
- memakai associative fetch mode;
- tidak menampilkan password pada error;
- menggunakan satu instance koneksi selama request berlangsung.

Gunakan opsi:

```php
[
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
]
```

---

## 7. Front Controller

Semua request masuk melalui:

```text
public/index.php
```

Tugas `public/index.php`:

1. Memuat autoload Composer.
2. Memuat bootstrap aplikasi.
3. Membuat instance aplikasi.
4. Menjalankan router.
5. Menangani exception terakhir.

Jangan menaruh logika bisnis di `public/index.php`.

---

## 8. Router

Buat router sederhana dengan route minimal:

```php
$router->get('/', [HomeController::class, 'index']);
$router->get('/system/database', [SystemController::class, 'database']);
```

Router harus mendukung:

- GET;
- POST untuk fase berikutnya;
- pencocokan path;
- pemanggilan controller;
- response;
- halaman 404;
- base path saat aplikasi berada di subfolder.

Belum perlu parameter route dinamis yang kompleks.

---

## 9. Base Controller

Buat base controller dengan method:

```php
protected function view(
    string $view,
    array $data = [],
    string $layout = 'main'
): void
```

Base controller tidak boleh berisi logika bisnis.

---

## 10. Base Model

Buat base model yang menyediakan koneksi PDO:

```php
abstract class Model
{
    protected PDO $db;

    public function __construct()
    {
        $this->db = Database::connection();
    }
}
```

Belum perlu model bisnis pada fase ini.

---

## 11. View dan Layout

Buat layout utama menggunakan Bootstrap 5 CDN.

Layout minimal berisi:

- navbar;
- nama aplikasi;
- area konten;
- footer;
- CSS aplikasi;
- JavaScript aplikasi.

Halaman utama menampilkan:

```text
Aplikasi Usulan Perbaikan Inventaris

Perwakilan BKKBN Provinsi Sumatera Utara

Fondasi aplikasi berhasil dijalankan.
```

Tambahkan informasi:

- status aplikasi;
- versi PHP;
- environment;
- zona waktu;
- status koneksi database.

Jangan membuat dashboard bisnis.

---

## 12. Halaman Status Database

Route:

```text
GET /system/database
```

Jika berhasil:

```text
Koneksi database berhasil.
Database: db_usulan_perbaikan
```

Jika gagal:

```text
Koneksi database gagal.
Periksa konfigurasi pada file .env.
```

Jangan tampilkan password, stack trace production, atau konfigurasi rahasia.

---

## 13. Error Handling dan Logging

Buat:

- halaman 404;
- halaman 500;
- global exception handler;
- logging error.

Saat `APP_DEBUG=true`, detail error boleh tampil terbatas.

Saat `APP_DEBUG=false`, tampilkan:

```text
Terjadi kesalahan pada sistem.
Silakan coba kembali.
```

Log error disimpan di:

```text
storage/logs/app.log
```

---

## 14. Helper

Buat helper minimal:

```php
env(string $key, mixed $default = null): mixed
base_url(string $path = ''): string
asset(string $path): string
view_path(string $path): string
escape(?string $value): string
redirect(string $path): never
```

Semua output variabel harus di-escape.

---

## 15. Apache Rewrite

Buat `public/.htaccess`:

```apache
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^ index.php [QSA,L]
```

Pastikan aplikasi berjalan pada subfolder:

```text
/bkkbn_eticketing/public
```

---

## 16. README

Buat `README.md` yang menjelaskan:

1. Persyaratan sistem.
2. Cara menjalankan `composer install`.
3. Cara membuat `.env`.
4. Cara membuat database.
5. Cara mengimpor `database.sql`.
6. Cara menjalankan melalui XAMPP atau Laragon.
7. URL aplikasi.
8. URL status database.
9. Struktur folder.
10. Kendala umum dan solusinya.

Contoh perintah Windows:

```cmd
composer install
copy .env.example .env
composer dump-autoload
```

---

## 17. Batasan Fase

Pada fase ini jangan membuat:

- login pengguna;
- logout pengguna;
- role;
- dashboard per role;
- CRUD pengguna;
- CRUD unit;
- CRUD inventaris;
- tiket;
- upload foto bisnis;
- persetujuan;
- penugasan teknisi;
- notifikasi bisnis;
- laporan;
- audit bisnis.

Hanya buat fondasi teknis.

---

## 18. Keamanan Dasar

Pastikan:

- password database tidak ditulis langsung di source code;
- `.env` tidak masuk Git;
- output HTML di-escape;
- error production tidak menampilkan stack trace;
- PDO menggunakan prepared statement;
- storage tidak dapat diakses langsung dari browser;
- konfigurasi rahasia tidak dikirim ke view;
- tidak menggunakan `eval`;
- tidak membuat query SQL dari gabungan input pengguna.

---

## 19. Urutan Pengerjaan

Kerjakan dengan urutan:

1. Periksa isi workspace.
2. Jangan menghapus file pengguna tanpa alasan.
3. Buat struktur folder.
4. Buat `composer.json`.
5. Pasang dependensi.
6. Buat konfigurasi `.env`.
7. Buat bootstrap aplikasi.
8. Buat koneksi database.
9. Buat Request, Response, Router, dan View.
10. Buat Base Controller dan Base Model.
11. Buat halaman utama.
12. Buat halaman status database.
13. Buat halaman 404 dan 500.
14. Buat logging.
15. Buat file SQL.
16. Buat README.
17. Berikan laporan hasil.

---

## 20. Acceptance Criteria

Fase 1 dianggap selesai apabila:

- [ ] Struktur MVC tersedia.
- [ ] Composer dan autoload tersedia.
- [ ] `.env.example` tersedia.
- [ ] `.env` tidak masuk Git.
- [ ] Front controller tersedia.
- [ ] Routing dasar tersedia.
- [ ] Halaman utama tersedia.
- [ ] Halaman status database tersedia.
- [ ] Halaman 404 dan 500 tersedia.
- [ ] Koneksi PDO tersedia.
- [ ] Logging tersedia.
- [ ] File SQL awal tersedia.
- [ ] README instalasi tersedia.
- [ ] Belum ada fitur bisnis yang dibuat.

---

## 21. Format Laporan Akhir

Setelah selesai, berikan laporan singkat:

### File yang dibuat

Tuliskan file utama yang dibuat atau diubah.

### Perintah yang dijalankan

Tuliskan perintah Composer atau setup yang dijalankan.

### Cara menjalankan

Tuliskan langkah singkat menjalankan proyek melalui XAMPP atau Laragon.

### Catatan Fase Berikutnya

Jelaskan fondasi yang sudah siap digunakan untuk autentikasi dan role-based access control.

Jangan melanjutkan ke fase berikutnya sebelum mendapat instruksi.
