# πŸ—ΊοΈ ROADMAP & PRIORITAS PENGERJAAN > Status: **πŸ”΄ Belum dimulai** | **🟑 Sedang berjalan** | **🟒 Selesai** --- ## βœ… Sudah Selesai ### Microservice & Infrastruktur yang Sudah Running di Server (10.100.1.24) | Service | Domain | Keterangan | Terintegrasi ke Super Apps? | |---|---|---|---| | **my-portal** (Next.js) | `my.gisportal.id` | FE Super Apps | βœ… **Ya β€” ini super apps** | | **geonet-console** (Laravel) | `console.gisportal.id` | Backend API: auth, LDAP, permission | βœ… Ya β€” API utama | | **geonet-collector** (FastAPI) | `collector.gisportal.id` / `agent.gisportal.id` | Asset management, GeoNetAgent | βœ… Ya β€” asset management | | **Grafana + Loki + Promtail** | `grafana.gisportal.id` | Monitoring & log aggregation | οΏ½ Belum terintegrasi FE | | **Uptime Kuma** | `uptime.gisportal.id` | Service uptime monitoring | πŸ”Ά Belum terintegrasi FE | | **n8n** | `n8n.gisportal.id` | Workflow automation | πŸ”Ά Standalone | | **Node-RED** | `node-red.gisportal.id` | IoT/flow automation | πŸ”Ά Standalone | | **Dockge** | `dockge.gisportal.id` | Docker stack manager | πŸ”Ά Internal ops | | **Zabbix** | `zabbix.gisportal.id` | Network monitoring (10.100.1.42) | πŸ”Ά Belum terintegrasi FE | | **Gitea** | `git.gisportal.id` | Git server (10.100.1.41:3000) | πŸ”Ά Source control | | **Jira** | `jira.gisportal.id` | Project management (10.100.1.55) | πŸ”Ά Existing ticketing lama | | **PostgreSQL** (2x) | internal | DB untuk console & collector | βœ… Ya | | **QNAP OSS** | `file.gisportal.id` / `obj.gisportal.id` | S3 storage avatar & file | βœ… Ya | > **Catatan penting**: > - `jira.gisportal.id` β†’ sudah ada Jira di 10.100.1.55. Pertimbangkan apakah **Zammad** akan menggantikan atau paralel dengan Jira. > - `zabbix.gisportal.id` β†’ sudah ada monitoring. Integrasi alert Zabbix ke Push Notification bisa jadi prioritas di Fase 4. > - `grafana.gisportal.id` β†’ sudah ada, bisa digunakan untuk dashboard monitoring di FE super apps. ### Yang Sudah Dibangun di Super Apps (my.gisportal.id) | | Fitur | |---|---| | 🟒 | Auth (login LDAP, logout, session) | | 🟒 | Profile (edit, ganti password, avatar OSS, device card) | | 🟒 | Asset Management UI β€” list, detail, edit meta, assign owner | | 🟒 | Admin: LDAP User & Group management (phone, dept, title, dll) | | 🟒 | Admin: Permission management berbasis LDAP Group | | 🟒 | GeoNet Collector β€” agent, snapshot, asset read service + owner info | | 🟒 | Permission guard FE (sidebar, bottom-nav filter by permission) | --- ## πŸ”΄ Fase 1 β€” Content & Home Feed *(Mulai sekarang β€” tidak ada dependency)* > Dashboard home saat ini kosong. Content service adalah nilai tambah langsung terlihat user. | # | Tugas | Estimasi | |---|---|---| | **1** | **Backend `geonet-content`** β€” FastAPI, Post, Like, Comment, thumbnail OSS | 4-6 hari | | **2** | **FE Home Feed** β€” grid thumbnail di dashboard, Post Card (view/like/comment) | 2-3 hari | | **3** | **FE Post Detail** β€” halaman `/posts/:slug`, rich text, komentar bersarang | 1-2 hari | | **4** | **FE Admin: Create/Edit Post** β€” Tiptap editor, upload thumbnail, jadwal publish | 2-3 hari | | **5** | **FE Admin: Manage Posts** β€” reorder priority, bulk status, konfigurasi tampilan | 1-2 hari | --- ## πŸ”΄ Fase 2 β€” Mail Server *(Prerequisite Ticketing & Mail UI)* | # | Tugas | Estimasi | |---|---|---| | **6** | **Install Mailcow** β€” Docker, multi-domain (geonet.co.id, gegeo.my.id) | 2-3 hari | | **7** | **Konfigurasi LDAP Mailcow** β€” SSO ke AD 10.100.1.40 | 1 hari | | **8** | **Thunderbird** β€” konfigurasi IMAP, simpan data ke NAS | 1 hari | --- ## πŸ”΄ Fase 3 β€” Ticketing *(Butuh Mailcow untuk notif email)* | # | Tugas | Estimasi | |---|---|---| | **9** | **Install Zammad** β€” Docker, LDAP, kategori (Hardware/Software/ESRI/dll), SLA | 2-3 hari | | **10** | **Konfigurasi Zammad** β€” group mapping, webhook, auto-assign, public portal | 1 hari | | **11** | **FE Ticketing** β€” list, form buat tiket, detail+log timeline, dashboard IT | 3-5 hari | | **12** | **Integrasi Tiket ↔ Asset** β€” tiket bisa dikaitkan ke asset spesifik | 1 hari | --- ## πŸ”΄ Fase 4 β€” Push Notification *(Butuh Zammad webhook sebagai sumber event)* | # | Tugas | Estimasi | |---|---|---| | **13** | **Backend `geonet-push`** β€” FastAPI + VAPID, subscribe per user LDAP | 2-3 hari | | **14** | **FE Push** β€” Service Worker handler, permission UI, notif center navbar | 1-2 hari | | **15** | **Trigger**: Zammad β†’ push, Collector alert β†’ push, broadcast IT | 1 hari | --- ## πŸ”΄ Fase 5 β€” Gitea Integration *(Tidak ada dependency β€” bisa mulai kapanpun)* > Gitea v1.16.5 sudah running di git.gisportal.id (10.100.1.41:3000) dengan REST API aktif. | # | Tugas | Estimasi | |---|---|---| | **16** | **Setup OAuth2 Gitea** β€” daftarkan super apps sebagai OAuth client di Gitea | 0.5 hari | | **17** | **`src/lib/gitea-client.ts`** β€” API client (issues, repos, user) dengan token/OAuth | 1 hari | | **18** | **FE: Gitea Issues** β€” list issues per repo, form buat issue, detail+komentar | 2-3 hari | | **19** | **FE: Repo Explorer** β€” list repo milik user, branch, commit history, releases | 2-3 hari | | **20** | **Profile: Gitea Token** β€” simpan personal access token di profile (fallback jika tidak pakai OAuth) | 0.5 hari | --- ## πŸ”΄ Fase 6 β€” Mail UI & Monitoring *(Butuh Mailcow API)* | # | Tugas | Estimasi | |---|---|---| | **21** | **Mail UI** β€” Inbox, Sent, Draft, Contacts, Calendar, Tasks, Rules | 5-7 hari | | **22** | **Monitoring alert detail** dialog (standar UI ADR) | 1 hari | --- ## πŸ”΄ Fase 7 β€” Infrastruktur *(Bisa paralel kapanpun)* | # | Tugas | Estimasi | |---|---|---| | **23** | **Mikrotik** β€” PPP login via LDAP | 1 hari | | **24** | **Windows Server AD** β€” LDAP SSO + SAML | 2-3 hari | --- ## πŸ”΄ Fase 8 β€” KPI Dashboard *(Setelah semua service siap: Zammad, Gitea, Collector, Uptime Kuma)* > Butuh semua sumber data aktif agar metrik KPI akurat dan bermakna. | # | Tugas | Estimasi | |---|---|---| | **25** | **Backend `geonet-kpi`** β€” FastAPI aggregator, pull dari semua API, cache Redis/SQLite | 3-4 hari | | **26** | **Scheduler** β€” hitung KPI harian/mingguan/bulanan otomatis | 1 hari | | **27** | **FE: Dashboard KPI IT/Ops** β€” uptime, tiket, asset health, alert count (Recharts) | 2-3 hari | | **28** | **FE: Dashboard KPI Karyawan** β€” performa individu, tiket selesai, SLA, commit | 2-3 hari | | **29** | **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 `` dari `@/components/ui/dialog` (bukan Sheet/Drawer) - Ukuran: `sm:max-w-lg` (detail lebar) atau `sm:max-w-md` (form pendek) - Struktur wajib: 1. **Header berwarna** (gradient) β€” berisi ikon, judul, sub-judul 2. **Body** dengan `overflow-y-auto max-h-[65dvh]` β€” scrollable 3. **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 `` dari `@/components/ui/tabs` - Info 2-kolom: `grid grid-cols-[160px_1fr]` untuk label–value ## Referensi Implementasi - `src/app/(app)/profile/page.tsx` β€” `` Edit Profil & Ganti Password - `src/components/asset-management/asset-detail-dialog.tsx` β€” Dialog Asset (2 tab) ## Komponen yang Mengikuti Standar Ini - [x] Edit Profil (`/profile`) - [x] Ganti Password (`/profile`) - [x] Asset Detail & Edit (`/asset-management`) - [ ] Ticketing detail/edit - [ ] Monitoring alert detail - [ ] Mail compose --- # Ticketing Microservice ## Platform: Zammad (Rekomendasi Production) - Docker di server 10.100.1.24, domain: `zammad.gisportal.id` - LDAP Auth terintegrasi ke AD 10.100.1.40 - REST API digunakan oleh FE Next.js di `/ticketing` ## Setup Zammad - [ ] Install Zammad via Docker Compose - [ ] Konfigurasi LDAP Auth (10.100.1.40) - [ ] Mapping LDAP Group β†’ Zammad Role (IT-Admin, IT-Staff, Management, dll) - [ ] Konfigurasi email notifikasi via Mailcow - [ ] Setup SLA (response time & escalation) - [ ] Konfigurasi webhook/trigger: auto-assign by category β†’ group - [ ] Setup public customer portal (untuk end user eksternal) ## Kategori Tiket - Hardware: Komputer, Laptop, Printer, Server, Jaringan, dll - Software: - ESRI (ArcGIS Desktop, ArcGIS Pro, ArcGIS Online, ArcGIS Enterprise, Extension) - BlueMarble (Global Mapper, Geographic Calculator, dll) - DataEast (MapInfo, dll) - Microsoft (Office, Windows, Server, dll) - Lainnya (input bebas) - Asset Request (Pengadaan): Permohonan pembelian hardware/software baru - Issue Umum: Gangguan layanan, akses, dll ## Alur Tiket (Workflow) ``` Open β†’ In Progress β†’ Pending (menunggu user/pihak lain) β†’ Resolved β†’ Closed ↓ Escalate (jika SLA breach) ``` - Setiap transisi status tercatat di log timeline (audit trail) - Assignee: user LDAP atau group LDAP (IT-Admin/IT-Staff/divisi terkait) - Requester: user internal (SSO LDAP) atau guest publik (email + nama) ## FE Integration (`/ticketing` di my.gisportal.id) - [ ] Halaman list tiket (filter by status, kategori, assignee) - [ ] Form buat tiket baru (kategori β†’ sub-kategori hierarki software/hardware) - [ ] Detail tiket: info + log timeline + komentar (Dialog standar 2-tab) - [ ] Notifikasi real-time (websocket atau polling) - [ ] Dashboard ringkasan: open, in-progress, overdue (untuk IT Admin) - [ ] Integrasi dengan Asset Management: tiket bisa dikaitkan ke asset spesifik ## Zammad API Client (`src/lib/zammad-client.ts`) - [ ] Auth via token (per-user token dari Zammad) - [ ] GET /tickets, GET /tickets/:id - [ ] POST /tickets (buat tiket baru) - [ ] PUT /tickets/:id (update status, assignee) - [ ] GET /ticket_articles/:ticket_id (log/komentar) - [ ] POST /ticket_articles (tambah komentar/update) --- # Push Notification Microservice ## Arsitektur yang Disarankan: **Web Push (VAPID) + ntfy / Superstream** ### Opsi Backend | Platform | Protokol | Docker | PWA Support | LDAP | Nilai | |---|---|---|---|---|---| | **ntfy** | HTTP Push + WebSocket | βœ… | βœ… (Web Push) | via proxy | πŸ₯‡ Ringan & simpel | | **Webpush custom (FastAPI)** | Web Push VAPID | βœ… | βœ… | βœ… native | πŸ₯ˆ Full kontrol | | **Firebase FCM** | FCM | ❌ self-host | βœ… | ❌ | ❌ vendor lock-in | | **Apprise** | Multi-channel | βœ… | ❌ | ❌ | Sebagai relay saja | ### **Rekomendasi: Custom FastAPI Push Service + Web Push VAPID** - Self-hosted, no vendor lock-in - Compatible Web Push API β€” bekerja di browser (Chrome, Firefox, Edge, Safari iOS 16.4+) - PWA: Service Worker `push` event sudah didukung `@ducanh2912/next-pwa` - Subscription per-user (LDAP username) disimpan di DB - Trigger dari Zammad webhook, Collector alert, atau manual ### Alur Push Notification ``` Event (Zammad tiket baru / Asset alert / dll) β”‚ β–Ό Push Service API (FastAPI, port 17000) β”‚ β”œβ”€ Lookup subscription by user/group LDAP β”œβ”€ Web Push VAPID β†’ Browser/PWA Service Worker └─ (opsional) relay ke ntfy/email/webhook β”‚ β–Ό Browser / PWA Service Worker `push` event β”‚ β–Ό Notification (judul, body, icon, action button, url) ``` ## Setup Push Service - [ ] Buat `geonet-push` service (FastAPI + pywebpush) - [ ] Generate VAPID key pair (public/private) - [ ] Endpoint: `POST /subscribe` β€” simpan push subscription per user LDAP - [ ] Endpoint: `POST /unsubscribe` β€” hapus subscription - [ ] Endpoint: `POST /send` β€” kirim notif ke user/group (internal, pakai API key) - [ ] Docker Compose di 10.100.1.24, domain: `push.gisportal.id` (internal) - [ ] Simpan subscription di PostgreSQL/SQLite ## Sumber Event (Trigger) - [ ] **Zammad webhook** β†’ tiket baru, update status, assign ke user/group - [ ] **Collector / Asset Management** β†’ device offline, disk penuh, alert threshold - [ ] **Manual broadcast** β†’ pengumuman IT Admin ke semua user atau group tertentu - [ ] *(Future)* Monitoring alert (Zabbix webhook β†’ push service) ## FE Integration (Next.js PWA) - [ ] `src/lib/push-client.ts` β€” subscribe/unsubscribe, kirim VAPID public key ke browser - [ ] Service Worker handler `push` event (via `@ducanh2912/next-pwa` custom SW) - [ ] Permission request UI β€” tombol "Aktifkan Notifikasi" di halaman profile/settings - [ ] Notification payload: `{ title, body, icon, badge, url, tag }` - [ ] Action button pada notif: "Lihat Tiket", "Lihat Asset" - [ ] Notif center di navbar β€” in-app list notifikasi (polling atau WebSocket) ## Kategori Notifikasi - 🎫 **Ticketing**: tiket baru assigned, update status, komentar baru, SLA overdue - πŸ–₯️ **Asset Management**: device offline > X menit, disk usage > 90%, tiket asset baru - πŸ“’ **Broadcast IT**: pengumuman, maintenance, downtime - *(Future)* πŸ“Š Monitoring: alert Zabbix --- # Gitea Integration (`git.gisportal.id`) ## Status - Gitea v1.16.5 sudah running di `10.100.1.41:3000` β†’ domain `git.gisportal.id` - REST API aktif (`/api/v1/`) β€” tidak perlu install apapun, langsung integrasi - Swagger UI tersedia di `git.gisportal.id/api/swagger` ## Auth Strategy **Pilihan: OAuth2** (rekomendasi) - Daftarkan super apps sebagai OAuth Application di Gitea (Settings β†’ Applications β†’ OAuth2) - Callback URL: `https://my.gisportal.id/auth/gitea/callback` - 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 - [ ] Detail issue β€” info lengkap + thread komentar + tombol close/reopen - [ ] Badge count issue open di sidebar/navbar ### Halaman Repo Explorer (`/gitea/repos`) - [ ] Grid/list repo milik user + starred repos - [ ] Detail repo β€” README, branch list, commit history, releases - [ ] 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) - **Storage thumbnail/gambar**: QNAP OSS (S3 bucket `super-apps`, path `content/`) - **Rich text body**: simpan sebagai HTML atau Markdown (pakai Tiptap editor di FE) - **CDN/resize**: thumbnail di-generate otomatis via `Pillow` saat upload (multi-resolusi: 400px, 800px) ## Model Data ### Post ``` Post β”œβ”€β”€ id (UUID) β”œβ”€β”€ title (string) β”œβ”€β”€ slug (string, unique) β”œβ”€β”€ body (text β€” HTML/Markdown) β”œβ”€β”€ thumbnail_url (string β€” OSS path) β”œβ”€β”€ status (draft | published | archived) β”œβ”€β”€ priority (int β€” urutan manual oleh admin) β”œβ”€β”€ published_at (datetime | null) β”œβ”€β”€ created_by (ldap_username) β”œβ”€β”€ created_at / updated_at β”œβ”€β”€ tags[] (many-to-many) └── category (string: announcement | info | event | update | dll) PostEngagement (per post) β”œβ”€β”€ view_count (int, increment atomic) β”œβ”€β”€ like_count (int) └── comment_count (int β€” cached, sync dari PostComment) PostLike β”œβ”€β”€ post_id └── ldap_username (unique per post+user) PostComment β”œβ”€β”€ id β”œβ”€β”€ post_id β”œβ”€β”€ ldap_username β”œβ”€β”€ body (text) β”œβ”€β”€ created_at └── parent_id (null = top-level, isi = reply) ``` ## API Endpoints - `GET /posts` β€” list posting (filter: status, kategori, tag; sort: date/views/likes/comments/priority) - `GET /posts/:slug` β€” detail + increment view_count - `POST /posts` β€” buat posting (butuh permission `content.create`) - `PUT /posts/:id` β€” edit posting (butuh permission `content.edit` atau own post) - `DELETE /posts/:id` β€” hapus (butuh permission `content.manage`) - `POST /posts/:id/like` β€” toggle like (user LDAP) - `GET /posts/:id/comments` β€” list komentar + reply - `POST /posts/:id/comments` β€” tambah komentar - `PUT /admin/posts/reorder` β€” ubah urutan priority (butuh permission `content.manage`) - `POST /admin/posts/:id/thumbnail` β€” upload + resize thumbnail ke OSS ## Permission LDAP Group (tambah ke group_permissions) | Permission | Fungsi | |---|---| | `content.view` | Lihat posting (semua user default) | | `content.create` | Buat posting baru | | `content.edit` | Edit semua posting (moderator) | | `content.manage` | Kelola urutan, status, hapus, konfigurasi tampilan | ## Konfigurasi Tampilan (Admin Panel) - [ ] Jumlah thumbnail yang tampil di home (misal: 6, 9, 12) - [ ] Mode urutan default: `date_created` | `views` | `likes` | `comments` | `priority` - [ ] Tampilan grid: 2-kolom / 3-kolom / list - [ ] Auto-publish terjadwal (`published_at` di masa depan) - [ ] Pin post (selalu tampil di atas terlepas dari urutan) ## Setup Backend - [ ] Buat `geonet-content` service (FastAPI + SQLAlchemy + PostgreSQL) - [ ] Model: Post, PostLike, PostComment, PostTag, ContentConfig - [ ] Upload thumbnail β†’ resize via Pillow β†’ simpan ke OSS (`content/thumbnails/`) - [ ] Atomic view_count increment (pakai `UPDATE ... SET view_count = view_count + 1`) - [ ] Docker Compose di 10.100.1.24, akses via `content.gisportal.id` (internal) atau lewat `my.gisportal.id/api/content` - [ ] Permission check via header `X-LDAP-Username` + `X-LDAP-Groups` (diteruskan dari geonet-console) ## FE Integration (`/` home & `/posts`) - [ ] **Home Dashboard** β€” feed thumbnail posting (grid responsif, lazy load) - [ ] **Post Card**: thumbnail, judul, kategori, tanggal, ikon view/like/comment count - [ ] **Post Detail** β€” halaman `/posts/:slug` dengan body rich text, komentar bersarang - [ ] **Like button** β€” toggle, animasi, optimistic update - [ ] **Comment section** β€” list + form reply, pagination - [ ] **Admin: Create/Edit Post** β€” form dengan Tiptap rich text editor, upload thumbnail, jadwal publish - [ ] **Admin: Manage Posts** β€” tabel dengan drag-and-drop reorder (priority), bulk status change - [ ] **Admin: Config** β€” panel jumlah tampilan, mode urutan, layout grid ## Content API Client (`src/lib/content-client.ts`) - [ ] `getPosts(params)` β€” list dengan filter & sort - [ ] `getPost(slug)` β€” detail - [ ] `createPost(body)` / `updatePost(id, body)` - [ ] `toggleLike(postId)` - [ ] `getComments(postId)` / `addComment(postId, body)` - [ ] `reorderPosts(orderedIds)` - [ ] `uploadThumbnail(postId, file)` --- # FE my.gisportal.id β”‚ β”œβ”€ Dashboard β”œβ”€ Profile (Action : Edit Profile, Ganti Password, Test Email) β”œβ”€ Ticketing β”œβ”€ Asset Management β”œβ”€ GeoNetAgent β”œβ”€ Monitoring └─ Mail β”‚ β”œβ”€ Inbox β”œβ”€ Sent β”œβ”€ Draft β”œβ”€ Contacts β”œβ”€ Calendar β”œβ”€ Tasks └─ Rules # Microservices ## Mailserver (Mailcow) | Produk | Web UI | API | Multi Domain | Docker | Enterprise | Nilai | | ------------- | ------ | ----- | ------------ | ------ | ---------- | ----- | | Mailcow | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | βœ… | βœ… | ⭐⭐⭐⭐⭐ | πŸ₯‡ | | iRedMail | ⭐⭐⭐⭐ | ⭐⭐⭐ | βœ… | ⚠️ | ⭐⭐⭐⭐⭐ | πŸ₯ˆ | | Zimbra | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | βœ… | ❌ | ⭐⭐⭐⭐⭐ | πŸ₯‰ | | Modoboa | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | βœ… | ⚠️ | ⭐⭐⭐⭐ | ⭐⭐⭐ | | Stalwart Mail | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | βœ… | βœ… | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ## Setup - [ ] Install Mailcow (Docker) - [ ] Configure Mailcow - [ ] Configure Mailcow API - [ ] Configure Mailcow Web UI - [ ] 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 ``` ## Permission (tambah ke group_permissions) | Permission | Fungsi | |---|---| | `kpi.view_own` | Lihat KPI diri sendiri | | `kpi.view_team` | Lihat KPI semua karyawan (Manager/HR) | | `kpi.manage` | Konfigurasi target, bobot, export (IT-Admin, Management) | ## FE Tasks ### Dashboard KPI IT/Ops (`/kpi/ops`) - [ ] Card ringkasan: uptime %, tiket open, asset offline, alert aktif - [ ] Chart trend tiket (bar chart bulanan) - [ ] Chart uptime per service (line chart) - [ ] Tabel asset dengan status disk warning ### Dashboard KPI Karyawan (`/kpi/employee`) - [ ] Tabel performa per karyawan (filter: periode, divisi/group LDAP) - [ ] Detail individu: chart radar (tiket, SLA, commit, response time) - [ ] Perbandingan vs target (progress bar per metrik) - [ ] Trend bulan ke bulan (sparkline) ### Admin: KPI Config (`/admin/kpi`) - [ ] Form set target per metrik (misal: SLA target 95%, uptime target 99.5%) - [ ] Pilih periode laporan (mingguan / bulanan / kuartalan) - [ ] Trigger recalculate manual - [ ] Export laporan PDF/Excel ### Notifikasi KPI - [ ] Push notif ke Manager/IT-Admin jika KPI < target threshold - [ ] Weekly summary digest via email (Mailcow) ke stakeholder --- # Mikrotik - [ ] Setup PPP login via LDAP # Windows Server 2012 R2 Active Directory - [ ] Setup LDAP SSO - [ ] Setup LDAP SAML