# PLTMG Sumbawa II · Portal Landing Page

## Original problem statement
Website landing page untuk PLTMG Sumbawa II — 30 MW yang dimiliki PT PLN (Persero), dikelola PT PLN Indonesia Power, dan dijalankan PT PLN Indonesia Power Services. 3 tab: Beranda, Galeri (CRUD foto), Dashboard (CRUD data kinerja: SFC, SLOC, Produksi kWh Netto, Konsumsi BBM, Beban rata-rata harian, Running Hours 3 mesin Wärtsilä 20V31DF). Ada hidden admin login. Backend siap SQL yang dapat diedit koneksinya.

## Architecture
- **Frontend**: React 19 + Tailwind + custom CSS (branding PLN IP gradasi navy → teal → hijau + aksen yellow).
- **Backend**: FastAPI + SQLAlchemy async (default SQLite `/app/backend/pltmg.db`; siap PostgreSQL via `DATABASE_URL`).
- **Auth**: Hidden admin (`#admin-login`), JWT HTTP-only cookie, bcrypt hashing, 5-strike email-keyed rate-limit.
- **Models**: `GalleryItem` (id, title, caption, image_url, category, created_at), `PerformanceLog` (id, date, sfc, sloc, net_kwh, fuel_consumption_liters, avg_daily_load_kw, running_hours_engine1..3).

## Implemented (23 Aug 2026)
- Beranda hero + section profil pembangkit + section Wärtsilä 20V31DF (efisiensi 50.2%, fast-start < 2 min, 24/7 readiness).
- Galeri CRUD dengan filter kategori (Mesin Wartsila, Control Room, Operasional) + upload lokal (base64) atau URL.
- Dashboard CRUD:
  - Metric cards: **SFC (liter/kWh), SLOC (ml/kWh), Produksi netto (kWh), Konsumsi BBM (liter), Beban rata-rata (kW)**.
  - Beban auto-derive server-side = `net_kwh / 24` (dibulatkan).
  - Running Hours tampil integer (tanpa desimal).
  - Log kinerja harian tabel + edit/hapus per baris.
- Hidden admin modal + JWT cookie session + logout.
- Branding lengkap PLN Indonesia Power (logo di navbar, gradasi warna, aksen yellow untuk highlight).
- Migrasi ke SQLAlchemy async — tinggal set `DATABASE_URL` untuk PostgreSQL (contoh sudah disediakan di `.env`).

## Test coverage
- `backend_test.py` (20/20 pytest pass) — auth, rate-limit, CRUD gallery & performance, persistensi SQLite lintas restart.
- Frontend e2e (testing agent iteration_2): logo, tema, unit label, beban auto-calc, running hours integer, admin flow, CRUD galeri & performance.

## Backlog (P1/P2)
- **P1**: Grafik tren harian (recharts) untuk SFC/SLOC/Beban.
- **P1**: Export CSV log kinerja untuk pelaporan bulanan.
- **P2**: Object storage untuk foto galeri (menggantikan base64).
- **P2**: Alembic migration untuk PostgreSQL production.
- **P2**: Unique constraint `date` di PerformanceLog (menghindari duplikat harian).
- **P2**: Wire `POST /api/gallery/upload` ke tombol upload frontend (saat ini gunakan FileReader).

## Credentials
Lihat `/app/memory/test_credentials.md`.

## PostgreSQL Migration (kapan siap)
Edit `/app/backend/.env`:
```
DATABASE_URL="postgresql+asyncpg://dimasrme_pltmg:C0g1nd0%23@YOUR_HOST:5432/dimasrme_pltmgsumbawa2"
```
Restart backend — tabel akan dibuat otomatis via `init_db()`.
