Admin: KPI Config — set target, bobot metrik, periode laporan
1-2 hari
30
Export PDF/Excel — laporan KPI per periode untuk manajemen
1-2 hari
31
Push Notif KPI Alert — notif jika KPI di bawah target ke Manager/IT Admin
1 hari
Urutan pengerjaan:
① Content/Home Feed → ② Mailcow → ③ Zammad+Ticketing → ④ Push Notif → ⑤ Gitea → ⑥ Mail UI → ⑦ Infra → ⑧ KPI Dashboard
(Gitea Fase 5 bisa dikerjakan paralel dengan Fase 2-4 karena tidak ada dependency)(KPI Fase 8 dikerjakan terakhir — butuh Zammad + Gitea + Collector + Uptime Kuma semua sudah running)
ADR — Standar Dialog Preview / Edit (UI Pattern)
Aturan Wajib
Semua dialog preview/edit WAJIB menggunakan <Dialog> dari @/components/ui/dialog (bukan Sheet/Drawer)
Ukuran: sm:max-w-lg (detail lebar) atau sm:max-w-md (form pendek)
Struktur wajib:
Header berwarna (gradient) — berisi ikon, judul, sub-judul
Body dengan overflow-y-auto max-h-[65dvh] — scrollable
Footer sticky dengan border-t bg-muted/30 — tombol Batal + Simpan
Untuk dialog yang punya preview DAN edit, gunakan 2 tab (tab "Detail" + tab "Edit")
Tab menggunakan komponen <Tabs> dari @/components/ui/tabs
Info 2-kolom: grid grid-cols-[160px_1fr] untuk label–value
Flow: user klik "Hubungkan Gitea" → redirect OAuth → dapat access token → simpan di session/DB
Fallback: user input Personal Access Token manual di halaman Profile
API Endpoint yang Digunakan
Auth:
GET /user — info user yang login
GET /users/{username} — profil user
Issues:
GET /repos/{owner}/{repo}/issues — list issues (filter: state, label, assignee)
POST /repos/{owner}/{repo}/issues — buat issue baru
GET /repos/{owner}/{repo}/issues/{index} — detail issue
PATCH /repos/{owner}/{repo}/issues/{index} — update (close, assign, label)
GET /repos/{owner}/{repo}/issues/{index}/comments — komentar
POST /repos/{owner}/{repo}/issues/{index}/comments — tambah komentar
GET /repos/{owner}/{repo}/labels — label/kategori tersedia
Repositories:
GET /user/repos — semua repo milik user
GET /repos/{owner}/{repo} — detail repo (stars, forks, size, last push)
GET /repos/{owner}/{repo}/branches — daftar branch
GET /repos/{owner}/{repo}/commits — commit history
GET /repos/{owner}/{repo}/releases — releases / tags
GET /repos/search?q=&topic= — search repo
FE Tasks
Setup & Auth
Daftarkan OAuth2 App di Gitea admin panel
src/lib/gitea-client.ts — wrapper API dengan Bearer token
Route GET /api/gitea/callback — handle OAuth callback, simpan token
Profile page: tombol "Hubungkan Akun Gitea" + status connected
Tambah gitea_token ke user session/store
Halaman Issues (/gitea/issues)
List issues dari semua repo yang diikuti user (filter: open/closed, label, repo)
Form buat issue — pilih repo, judul, body (Markdown), label, assignee
Link ke Gitea web untuk operasi lebih lanjut (clone, PR, dll)
Permission (tambah ke group_permissions)
Permission
Fungsi
gitea.view
Lihat issue & repo (semua user yang punya akun Gitea)
gitea.create_issue
Buat issue baru
gitea.manage
Admin Gitea (close issue, assign, label)
Catatan
Issue dari super apps dan Gitea web sinkron sempurna — data disimpan di Gitea, super apps hanya read/write via API
Tidak perlu database tambahan di super apps untuk Gitea — semua state di Gitea
Bisa jadi alternatif/pelengkap Zammad untuk bug tracking development (Zammad = IT helpdesk, Gitea = dev issues)
Content / Posting Microservice (geonet-content)
Saran Profesional
Gunakan pola Headless CMS + custom API — bukan CMS full seperti WordPress.
Ini memberi kontrol penuh atas schema, permission berbasis LDAP group, dan integrasi ke push notification.
Stack yang Disarankan
Backend: FastAPI + PostgreSQL (konsisten dengan Collector)
Configure Mailcow Multi Domain (geonet.co.id, gegeo.my.id)
Configure Mailcow Docker
Configure Mailcow Enterprise
Configure Mailcow Nilai
Configure Mailcow LDAP (10.100.1.40)
Install Thunderbird
Install Thunderbird
Configure Thunderbird
Configure Thunderbird for geonet.co.id
Configure Thunderbird for gegeo.my.id
Move Inbox from main geonet.co.id to geonet for mail server
save imap and pop3 file Thunderbird di NAS : untuk meringankan vm dan memastikan file tidak hilang
KPI Dashboard (geonet-kpi)
Dependency (semua harus sudah running)
✅ geonet-collector (asset & device data)
🔴 Zammad (tiket metrics)
🔴 Gitea (issue & commit metrics)
🔶 Uptime Kuma API (service uptime)
🔶 Zabbix API (network alert)
Arsitektur
Backend: geonet-kpi — FastAPI aggregator, bukan BI tool besar
Cache: Redis atau SQLite — hasil agregasi disimpan agar FE tidak hit semua API setiap request
Scheduler: APScheduler (built-in FastAPI) — hitung KPI otomatis tiap malam / per jam
Domain: kpi.gisportal.id (internal) atau lewat console.gisportal.id/api/kpi
Metrik KPI Karyawan
Metrik
Sumber
Cara Hitung
Tiket IT diselesaikan
Zammad
Count closed by assignee per periode
Rata-rata waktu resolve
Zammad
Avg(closed_at − created_at) per assignee
SLA compliance (%)
Zammad
% tiket selesai sebelum SLA deadline
Issue dev diselesaikan
Gitea
Count closed issues by assignee
Jumlah commit
Gitea
Count commits by author
Asset yang dikelola
geonet-collector
Count asset by owner
Login activity
geonet-console
Count login per bulan
Metrik KPI IT/Operasional
Metrik
Sumber
Cara Hitung
Uptime layanan (%)
Uptime Kuma
monitors → uptime ratio per service
Asset online vs offline
geonet-collector
online_count / total_count
Asset disk > 90%
geonet-collector
Count disk pct_used > 90
Tiket masuk vs selesai
Zammad
Open/Close ratio per periode
Avg first response time
Zammad
Time to first agent reply
Network alert count
Zabbix
Problem count by severity
Repo aktif
Gitea
Repo dengan commit dalam 30 hari terakhir
API Endpoints (geonet-kpi)
GET /kpi/summary — ringkasan KPI semua kategori (untuk dashboard)
GET /kpi/employee/{username} — KPI individu karyawan
GET /kpi/it-ops — KPI operasional IT
GET /kpi/history?period=monthly&months=6 — trend historis
GET /kpi/export?format=pdf|excel&period= — export laporan
POST /admin/kpi/config — set target & bobot per metrik
POST /admin/kpi/refresh — trigger recalculate manual