# Changelog Perubahan Kode — Billing RTRW Project : `/opt/billing-rtrw` Host : `deneva` Service : `billing-rtrw` (systemd, port 3001) Owner : `billing:billing` > Project ini **belum memakai Git**, jadi file ini adalah satu-satunya catatan > perubahan. Setiap perubahan kode selalu disertai backup file asli (lihat > bagian *Rollback* pada tiap entri). Format: `## [versi] — tanggal` (terbaru di atas). --- ## [v1.9.7] — 2026-09-28 16:55 — Full UI/UX Modernization & Database Optimization (Gentelella Tiles, uiverse.io Effects & Google Fonts) ### 1. Modernisasi Lengkap Seluruh Halaman Utama Admin (Gentelella Admin Style) - **views/admin/dashboard.ejs**: Implementasi Tile KPI Stat horizontal (Total ONU, Online, Offline, Warning Redaman) dan Tile Keuangan (Pendapatan, Pelanggan Aktif, Tagihan Belum Bayar, Total Piutang) dengan indikator tren visual. - **views/admin/customers.ejs**: Mengubah stat-grid filter pelanggan menjadi Gentelella Tile Cards interaktif (Total, Aktif, Disuspend, Nonaktif/Baru) dengan highlight filter aktif dan angka monospaced. - **views/admin/billing.ejs**: Mengubah summary tagihan menjadi Gentelella Tile Cards (Total Tagihan, Sudah Bayar, Belum Bayar, Rasio Lunas). - **views/admin/monitoring.ejs & views/admin/olts.ejs**: Menambahkan Google Fonts universal (Inter + JetBrains Mono). ### 2. Harmonisasi Desain Portal Pelanggan & Login (uiverse.io Style) - **views/login.ejs**: Menyelaraskan seluruh palette warna dari hardcoded Indigo ke tema resmi Skyfiber (Teal #0d9488 & Cyan #06b6d4), menambahkan Google Fonts Plus Jakarta Sans, dan uiverse elevated glass card. - **views/dashboard.ejs**: Menambahkan Google Fonts JetBrains Mono untuk pembacaan parameter teknis (IP, MAC, redaman dBm) dan efek micro-animation tombol .btn-uiverse-glow. ### 3. Optimasi Database SQLite - Eksekusi PRAGMA integrity_check (hasil: ok). - Eksekusi PRAGMA optimize untuk query planner performa tinggi. ### File disentuh - public/css/admin.css - views/admin/dashboard.ejs - views/admin/customers.ejs - views/admin/billing.ejs - views/admin/monitoring.ejs - views/admin/olts.ejs - views/login.ejs - views/dashboard.ejs - views/isolated.ejs - update-code.md ### Rollback ```bash cp /opt/billing-rtrw/views/admin/customers.ejs.bak-gentelella /opt/billing-rtrw/views/admin/customers.ejs cp /opt/billing-rtrw/views/admin/billing.ejs.bak-gentelella /opt/billing-rtrw/views/admin/billing.ejs cp /opt/billing-rtrw/views/admin/dashboard.ejs.bak-gentelella /opt/billing-rtrw/views/admin/dashboard.ejs cp /opt/billing-rtrw/views/login.ejs.bak-plusjakarta /opt/billing-rtrw/views/login.ejs cp /opt/billing-rtrw/views/dashboard.ejs.bak-uiverse /opt/billing-rtrw/views/dashboard.ejs sudo systemctl restart billing-rtrw.service ``` --- ## [v1.9.6] — 2026-09-28 16:35 — Modernisasi UI/UX (Gentelella Admin Tiles, uiverse.io Effects & Google Fonts) + Matikan Service Biznet ### 1. Pematian Layanan di Server Biznet (Pencegahan Tabrakan Service) - Service `billing-rtrw.service` di host `biznet` di-stop dan di-disable (`sudo systemctl stop & disable`). - Process PM2 di `biznet` di-stop dan di-delete. - Hasil: Menghilangkan konflik 409 pada Telegram Bot dan mencegah duplikasi trigger cron isolir/tagihan antar-server. ### 2. Adopsi Desain Gentelella Admin (views/admin/dashboard.ejs & public/css/admin.css) - Mengganti grid metrik lama dengan modul **Gentelella Tile Stats (`.tile_count` & `.tile_stats_count`)**: - Border samping berwarna aksen (`tile-primary`, `tile-success`, `tile-danger`, `tile-warning`). - Label `count_top` uppercase dengan ikon jelas. - Nilai metrik `count` berbobot 800 dengan font monospaced tabular. - Sub-label `count_bottom` dengan indikator tren (`trend-up`, `trend-down`, `trend-warn`). - Menambahkan class kontainer `.x_panel` & `.x_title` dan soft badges (`.badge-soft-success`, `.badge-soft-danger`, dll). ### 3. Adopsi Desain uiverse.io (views/dashboard.ejs) - Menambahkan efek glassmorphism tingkat tinggi dengan border glow gradient dan shadow elevasi. - Menambahkan animasi tombol mikro-interaktif (`.btn-uiverse-glow`) dengan hover lift-up (`translateY(-2px)`) dan klik aktif responsif. ### 4. Standarisasi Google Fonts Universal - Mengintegrasikan **Inter** (antarmuka admin & tabel data), **Plus Jakarta Sans** (portal pelanggan & public landing), dan **JetBrains Mono** (data teknis IP, MAC, serial, dBm) melalui Google Fonts dengan koneksi teroptimasi (`preconnect` dan `display=swap`). ### File disentuh - public/css/admin.css - views/admin/dashboard.ejs - views/dashboard.ejs - update-code.md ### Rollback ```bash cp /opt/billing-rtrw/public/css/admin.css.bak-gentelella /opt/billing-rtrw/public/css/admin.css cp /opt/billing-rtrw/views/admin/dashboard.ejs.bak-gentelella /opt/billing-rtrw/views/admin/dashboard.ejs cp /opt/billing-rtrw/views/dashboard.ejs.bak-uiverse /opt/billing-rtrw/views/dashboard.ejs sudo systemctl restart billing-rtrw.service ``` --- ## [v1.9.5] — 2026-09-28 16:20 — Fix Telegram Polling Flood, Unifikasi Tipografi (Plus Jakarta Sans) & Harmonize Login UI ### 1. Perbaikan Telegram Bot Polling Error Flood (services/telegramBot.js) - Log server sebelumnya dibanjiri pesan error setiap 8 detik: error: Telegram Polling Error:. - Penyebab: Terdeteksi error code 409 Conflict dari API Telegram karena bot token yang sama masih aktif dijalankan di server lama (biznet/migrasi). - Solusi: 1. Menambahkan penanganan error detail (error?.response?.body?.description || error.message) agar terbaca jelas di logger. 2. Implementasi throttling logger (maksimal 1 log per 2 menit untuk error berulang yang sama). 3. Memisahkan level warning khusus bila terjadi 409 Conflict, sehingga journalctl bersih tanpa spam error. ### 2. Unifikasi Tipografi & Harmonisasi Desain (views/login.ejs & views/isolated.ejs) - Menyelaraskan seluruh font pada portal publik & login pelanggan ke **Plus Jakarta Sans** (Google Fonts). - Menyesuaikan palette warna primer & hover pada halaman login (views/login.ejs) menggunakan tema Teal/Cyan (#0d9488, #14b8a6, #2dd4bf) agar selaras dengan dashboard pelanggan. - Menambahkan **Plus Jakarta Sans** pada halaman terisolir (views/isolated.ejs). ### File disentuh - services/telegramBot.js - views/login.ejs - views/isolated.ejs - update-code.md ### Rollback ```bash cp /opt/billing-rtrw/services/telegramBot.js.bak-pollfix /opt/billing-rtrw/services/telegramBot.js cp /opt/billing-rtrw/views/login.ejs.bak-plusjakarta /opt/billing-rtrw/views/login.ejs cp /opt/billing-rtrw/views/isolated.ejs.bak-plusjakarta /opt/billing-rtrw/views/isolated.ejs sudo systemctl restart billing-rtrw.service ``` --- ## [v1.9.4] — 2026-09-27 18:35 — Fix Theme Toggle (Dark/Light Mode), FOUC Prevention & Light Theme Styling ### Masalah - Tombol toggle tema (#theme-icon di header dashboard pelanggan) tidak berfungsi sama sekali saat diklik. - Penyebab: 1. Logika Negasi Terbalik di toggleTheme(): Saat mode awal gelap, contains('light') bernilai false sehingga !false adalah true. Kode terus-menerus menyimpan dan menerapkan mode 'dark', tidak pernah beralih ke 'light'. 2. Class Collision pada : memiliki class 'dark' permanen. applyTheme lama hanya menambahkan class 'light' tanpa menghapus class 'dark'. Tailwind CSS (darkMode: 'class') tetap mengaktifkan semua style dark:... selama class 'dark' ada di . 3. FOUC saat reload: Tidak ada script sinkronisasi langsung di
, sehingga halaman sempat berkedip gelap sebelum DOMContentLoaded berjalan. 4. Missing data-theme: Tidak mengeset atribut data-theme='light'/'dark' yang diperlukan oleh theme.css. ### Solusi & Perbaikan 1. Perbaikan toggleTheme() & applyTheme(mode): - Menghapus class 'dark' dan menambahkan 'light' saat beralih ke mode terang, dan sebaliknya saat mode gelap. - Menetapkan atribut data-theme pada secara konsisten. - Sinkronisasi kedua key penyimpanan (skyfiber-customer-theme & app-theme). - Mengubah ikon toggle secara dinamis: fa-sun text-amber-500 pada mode terang, fa-moon text-amber-400 pada mode gelap. 2. Inline Script di : - Menambahkan skrip sinkronisasi tema instan di dalam sebelum browser merender body untuk mencegah kedip (FOUC). 3. Penyempurnaan Styling Mode Terang (Light Mode): - Floating glass dock disesuaikan dengan latar frosted transparan putih dan sliding pill bergradasi lembut. - Penyesuaian kontras input form, teks judul, card modal, dan gradien banner (tagihan lunas, tagihan aktif, info router). ### File disentuh - views/dashboard.ejs - update-code.md ### Rollback ```bash cp /opt/billing-rtrw/views/dashboard.ejs.bak-themefix-20260927183449 /opt/billing-rtrw/views/dashboard.ejs systemctl restart billing-rtrw.service ``` --- ## [v1.9.3] — 2026-09-27 18:30 — Fix PWA Auto-Login, Persistent Remember Token & Session Lifetime ### Masalah - Ketika PWA di-install di HP dan user login, saat aplikasi PWA di-kill atau ditutup, user terlempar ke halaman login lagi. - Penyebab utama: 1. `start_url` di `manifest.webmanifest` diset ke `/customer/login?source=pwa`. 2. Rute `/customer/login` dan `/` memeriksa `req.session.customer`, sementara rute login hanya menyimpan `req.session.phone` dan `req.session.pppoe_username` (`customer` selalu undefined), sehingga selalu merender form login ulang. 3. Masa berlaku cookie sesi bawaan hanya 24 jam dan disimpan di RAM (MemoryStore) tanpa token persistensi native. 4. Service worker (`public/sw.js`) melakukan fallback navigasi ke `/customer/login` saat jaringan lambat/offline. ### Solusi & Perbaikan 1. **PWA Start URL:** Mengubah `start_url` di `/manifest.webmanifest` menjadi `/customer/dashboard`. 2. **Persistent Auto-Login Token (90 Hari):** - Layanan baru `services/customerAuthTokenService.js` dengan tabel SQLite `customer_auth_tokens`. - Mengeluarkan cookie `customer_remember` (90 hari, httpOnly, secure, lax) saat login langsung maupun verifikasi OTP. - Middleware auto-login di `routes/customerPortal.js` yang secara otomatis memulihkan sesi pelanggan ketika aplikasi dibuka kembali. 3. **Penyelarasan Guard Sesi:** - Rute `/customer/` dan `/customer/login` kini memeriksa `req.session.phone || req.session.customer` sehingga pengguna yang sudah login langsung dialihkan ke `/customer/dashboard`. - Objek `req.session.customer` kini diisi lengkap pada direct login dan OTP. 4. **Masa Berlaku Cookie Sesi:** Ditingkatkan dari 24 jam menjadi 30 hari. 5. **Logout Bersih:** Rute `/customer/logout` (mendukung POST dan GET) mencabut token dari database dan menghapus cookie `customer_remember` serta `customer.sid`. 6. **Fallback Offline SW v6:** Navigasi offline dialihkan ke `/offline.html` dengan tombol "Coba Lagi", bukan ke halaman login. 7. **Penyimpanan Lokal Form:** Menyimpan ID pelanggan terakhir di `localStorage` pada `views/login.ejs`. ### File disentuh - `services/customerAuthTokenService.js` (file baru) - `app-customer.js` - `routes/customerPortal.js` - `public/sw.js` - `views/login.ejs` --- ## [v1.9.2] — 2026-09-27 18:15 — Multi-Vendor WiFi SSID & Password Changer (Huawei / Nokia / FiberHome / ZTE) ### Perbaikan Ganti SSID & Password WiFi Multi-Vendor - Mengatasi kegagalan ganti password TR-069 akibat penumpukan multiple parameter paths dalam satu payload SOAP atomik. - Menghindari pengiriman `PreSharedKey.1.PreSharedKey` (format hex 64 digit) bersamaan dengan `KeyPassphrase`, yang sebelumnya memicu SOAP fault 9007 (Invalid Parameter Value) di modem. - **Deteksi Vendor Otomatis (`HWTC`, `FiberHome`, `Nokia`, `ZTE`, `ZICG`, `CIOT`, `CDTC`):** - Huawei / FiberHome / Nokia: memprioritaskan `PreSharedKey.1.KeyPassphrase` (menghindari fault 9007 karena penolakan `KeyPassphrase` top-level). - ZTE / ZICG / CIOT: memprioritaskan `KeyPassphrase`. - **SSID 2.4G & 5G:** Mengirim path tunggal yang tepat untuk 2.4 GHz (`WLANConfiguration.1.SSID`) dan 5 GHz (`WLANConfiguration.5.SSID`) jika perangkat dual-band, tanpa menimpa interface guest/sekunder. - Fallback cerdas berbasis standar TR-098 per vendor. ### File disentuh - `services/customerDeviceService.js` ### Rollback ```bash cp /opt/billing-rtrw/services/customerDeviceService.js.bak-wififix /opt/billing-rtrw/services/customerDeviceService.js sudo systemctl restart billing-rtrw ``` --- ## [v1.9.1] — 2026-09-27 16:30 — 5-Tab Floating Dock, PPOB Soon, Profil Tiket & WhatsApp Anti-Ban ### 1. Floating Dock 5-Tab (Dashboard Pelanggan) - Menghilangkan tombol tengah (+) Aksi Cepat dan popup modal sheet. - Menjadikan navbar 5 tombol langsung: Beranda, Router, PPOB (badge gradient "Soon"), Tagihan (ping unread), dan Profil. - Pusat Bantuan & Pembuatan Tiket Kendala diintegrasikan ke dalam Tab Profil (`tab-profile`) dengan tombol cepat ke form pelaporan dan WhatsApp CS. - Ditambahkan tombol "Kembali ke Profil" di halaman tiket bantuan (`tab-bantuan`). - Banner "Layanan PPOB Segera Hadir" pada tab PPOB (`tab-ppob`). ### 2. Sinkronisasi Upstream & Fix Anti-Ban WhatsApp - Verifikasi repository upstream `alijayanet/billing-rtrw`: base commit `ffd3c62` sudah mencakup seluruh perbaikan OLT Hioso (gap-fill DDM, Buffer UTF-8 decoding, slow SNMP session) dan timezone midnight hourCycle h23. - Menambahkan proteksi anti-ban WhatsApp pada alert monitoring (`services/whatsappBot.mjs`): - Mematuhi toggle `genieacs_monitoring_enabled` (tidak kirim alert jika toggle OFF). - Jeda acak (8-20 detik) antar penerima saat kirim broadcast alert ke admin/teknisi. - Menjadwalkan pemeriksaan monitoring harian pada jam 07:00 pagi (`config/genieacs.js`) lewat `node-cron` untuk mencegah spam alert berulang. ### File disentuh - `views/dashboard.ejs` - `services/whatsappBot.mjs` - `config/genieacs.js` --- ## [v1.9.0] — 2026-09-26 22:55 — Floating Dock Navbar + CDN Pin + SW v5 Perubahan UI besar (navbar) sekaligus perbaikan regresi PWA/offline. ### Navbar: floating glass dock - Bottom nav lama (waterdrop, 6 tombol horizontal) diganti **floating glass dock** sesuai referensi `adaptive_glassmorphism_floating_dock.html`. - Struktur: 4 tombol langsung (**Beranda, Router, Tagihan, Profil**) + 1 tombol tengah `+` yang membuka **quick-action sheet** berisi **PPOB, Bantuan, Reconnect, Poll ONU**. PPOB & Bantuan sengaja dipindah ke sheet agar dock tidak terlalu padat. - ** keenam tab tetap bisa diakses**, `id="tab-*"` tidak berubah: `tab-beranda`, `tab-router`, `tab-ppob`, `tab-tagihan`, `tab-bantuan`, `tab-profile`. - CSS baru: `.dock-glass`, `.dock-pill` (sliding pill), `.dock-item`, `.dock-icon`, quick-sheet overlay. `safe-area-inset-bottom` untuk iPhone. - JS baru: `updatePillPosition()`, `toggleQuickSheet()`, `openQuickSheet()`, `closeQuickSheet()`, state `currentTab`, `isSheetOpen`. `switchTab()` sekarang menandai `.dock-item` aktif dan memindahkan pill. - Support keyboard: angka `1`–`6` pindah tab, `Escape` menutup sheet. - Ikon memakai **Lucide** (`data-lucide`) + `lucide.createIcons()`. - CSS `.waterdrop-active` yang tidak terpakai lagi dibuang. ### Perbaikan regresi offline/PWA - **Semua CDN dashboard kini di-pin ke versi tetap** (sebelumnya `@latest` / tanpa versi → bisa berubah atau break tanpa notice): ||Aset|URL| |---|---| |Lucide|`https://unpkg.com/lucide@1.48.0/dist/umd/lucide.min.js`| |Chart.js|`https://cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js`| |Tailwind|`https://cdn.tailwindcss.com/3.4.17`| `https://unpkg.com/lucide@latest` dan `https://cdn.tailwindcss.com` (tanpa versi) sama-sama **redirect 302** tiap load → di-pin ke URL final. - **Bug:** service worker hanya cache-first `cdn.jsdelivr.net`, sehingga Tailwind, FontAwesome, Google Fonts, dan Lucide **tidak tersedia saat offline** — layout PWA hancur. Sekarang `sw.js` punya array `CDN_HOSTS`: `cdn.jsdelivr.net`, `unpkg.com`, `cdnjs.cloudflare.com`, `cdn.tailwindcss.com`, `fonts.googleapis.com`, `fonts.gstatic.com`. - Cache bust: `CACHE_NAME` / `CDN_CACHE` `customer-pwa-v4` → **`-v5`**, plus 5 URL baru masuk `PRECACHE_URLS`. ### File disentuh - `views/dashboard.ejs` (1481 baris) - `public/sw.js` (173 baris) ### Verifikasi - Render EJS OK, `div` seimbang `160/160`. - Live `/customer/dashboard` HTTP 200, `div` seimbang `184/184`. - Semua CDN membalas 200 tanpa redirect. - `systemctl is-active billing-rtrw` = `active`, journal tanpa error. ### Rollback ```bash cd /opt/billing-rtrw cp views/dashboard.ejs.bak-twpin-225510 views/dashboard.ejs cp public/sw.js.bak-twpin-225510 public/sw.js sudo systemctl restart billing-rtrw ``` ### Catatan - Tampilan visual (sliding pill, animasi sheet, posisi icon) **belum dicek di browser sungguhan** — verifikasi di atas semuanya server-side. --- ## [v1.8.2] — 2026-09-26 22:30 — Fix flash message toast - `notif` dari server sebelumnya tidak tampil. Kini di-render sebagai variabel `FLASH` (`{ text, type }`) lalu dimunculkan lewat `#toast-container`. - Pemetaan tipe: `danger → error`, `warning → info`, selain itu `info`. - Render diproteksi dari injeksi `` via `.replace(/ Catatan: **tidak ada** route `/customer/poll-onu`. Tombol "Poll ONU" > memanggil `POST /customer/api/device/refresh`. --- ## TODO / tindak lanjut Detail lengkap ada di `/home/oxpoe/Documents/CATATAN-OPS-SKYFIBER.txt` section 11 (mode `600`, jangan dibagikan). ### Keamanan — perlu tindakan - [ ] Rotasi `telegram_bot_token` (via `@BotFather` → `/revoke`; token **baru** jangan dikirim ke chat mana pun). - [ ] Rotasi `admin_password`. - [ ] Rotasi `admin_api_key`. - [ ] Amankan backup `backups/settings_20260926_211113.json` (masih memuat token lama) atau hapus setelah rotasi. - [ ] Inisialisasi Git (`git init` + commit awal) supaya changelog berikutnya punya riwayat & diff. ### Fungsional - [ ] **Password WiFi pelanggan uji masih nilai sementara** dan harus dikembalikan ke nilai asli (nilai uji tercatat di notes section 11). - [ ] 3 perangkat belum punya CR credentials, akan provisioning otomatis saat online: - `001141-CL601-ZTEGCBBFB774` - `B4E46B-SIGMA Z99LX XPON-ZICG27766207` - `B4E46B-SIGMA Z99LX XPON-ZICG27766F6A` - [ ] Alur pembayaran belum diuji end-to-end (butuh invoice uji). - [ ] Cek visual floating dock di browser/HP sungguhan. - [ ] Test PWA mode offline (SW v5) — belum pernah diuji. - [ ] Keputusan: apakah FUP enforcement mengikuti isolate-day. - [ ] Parity peta admin desktop vs mobile. - [ ] Pemetaan kecepatan WiFi 2.4GHz vs 5GHz. --- ## Cara rollback umum ```bash cd /opt/billing-rtrw sudo systemctl stop billing-rtrw # salin backup yang dikehendali ke file aslinya sudo systemctl start billing-rtrw sudo journalctl -u billing-rtrw -n 50 --no-pager ``` Backup tersedia (format `.bak-