diff --git a/locales/en.json b/locales/en.json
index c763e29..b72cbe7 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -932,7 +932,8 @@
"empty_cust": "No customer data yet.",
"empty_odp": "No ODP data yet.",
"view_port": "Click to view port visual",
- "port_err": "Failed to load port data."
+ "port_err": "Failed to load port data.",
+ "route_hint": "Drag the orange points to change the route. Click the button below to add a bend point."
},
"print_invoice": {
"title": "Print Invoice Receipt",
@@ -1116,7 +1117,8 @@
"run_prov": "Run Provisioning",
"add_server": "Add ACS Server",
"bind_lan": "Select the LAN Ports to bind:",
- "bind_ssid": "Select the WLAN (SSID) to bind:"
+ "bind_ssid": "Select the WLAN (SSID) to bind:",
+ "load_log": " to load logs."
},
"vd": {
"action": "Action",
@@ -1146,7 +1148,11 @@
"tab_templates": "Message Templates",
"tab_livechat": "Live Chat",
"tab_preview": "Message Preview",
- "ph_deviceid": "Device ID (optional)"
+ "ph_deviceid": "Device ID (optional)",
+ "selfhost": " or Self-Hosted Server URL)",
+ "fonnte_hint": " for Fonnte Cloud, or switch to your own server domain/IP when using ",
+ "qr_hint": "Click the button, then open WhatsApp → Linked Devices → Link a device, scan the QR. The QR is valid for ~30 seconds & refreshes automatically.",
+ "notif_only": " replies to commands anymore — WhatsApp is only for "
},
"automation": {
"title": "Automation",
@@ -1641,7 +1647,8 @@
"approve_invoice": "Approve & Create Invoice",
"modem_hint": "Customer modem login credentials for RADIUS & PPPoE.",
"reg_hint": "Automatically calculated on install/payment. Can be adjusted manually if needed.",
- "modem_hint_mt": "Customer modem login credentials for PPPoE MikroTik API."
+ "modem_hint_mt": "Customer modem login credentials for PPPoE MikroTik API.",
+ "reg_auto": " automatically: arrears "
},
"bill": {
"ph_note": "e.g. service credit for downtime",
@@ -1668,7 +1675,8 @@
"all_routers": "All Routers",
"all_collectors": "All Collectors",
"opt_percent": "Percent (%)",
- "opt_amount": "Amount (Rp)"
+ "opt_amount": "Amount (Rp)",
+ "pct_hint": " The percentage is calculated from the base price (before VAT/USO). The QRIS unique code will be regenerated."
},
"common": {
"keep_empty": "Leave empty to keep unchanged",
@@ -1820,7 +1828,8 @@
"alert_copied": "MikroTik & RADIUS Isolir setup script copied! Paste it into your MikroTik Terminal.",
"alert_copied2": "MikroTik script copied!",
"deactivate": "Deactivate",
- "activate": "Activate"
+ "activate": "Activate",
+ "rate_from_mt": "rate-limit & IP are taken from the PPP profile on MikroTik"
},
"set": {
"ew_log_realtime": "Realtime Log",
@@ -1921,7 +1930,21 @@
"office_coord_hint": "Office coordinates are used for employee attendance location validation (geofencing).",
"set_auto_moved": "Automation moved:",
"set_auto_list": "Auto-Deactivate, Auto-Delete, Auto-Warning & Auto-",
- "set_auto_now": "are now organized in the"
+ "set_auto_now": "are now organized in the",
+ "link_hint": "Used to build the customer login link sent via WhatsApp. Example: ",
+ "wa_numbers_hint": "Admin numbers receive system monitoring notifications. Technician numbers are taken automatically from ",
+ "logo_hint": "PNG/JPG/WebP, max 2MB. PNG/JPEG is auto-optimized. Used on the login page & customer portal.",
+ "pwa_icon_hint": "After upload, PWA icons (192/512/maskable/apple-touch) & favicon are regenerated from this image. A square image (1:1) is recommended.",
+ "hero_hint": "PNG/JPEG is automatically converted to ",
+ "speedtest_hint2": " (LibreSpeed / OpenSpeedTest self-hosted) or ",
+ "speedtest_hint3": ". If left empty, the customer dashboard shows ",
+ "speedtest_notset": "\"Speedtest not set up yet\"",
+ "speedtest_btn_hint": "On the customer page there are buttons ",
+ "repo_hint": "Used for the link ",
+ "uptime_hint": "Used for the button/redirect ",
+ "qris_unique_hint": " in the Billing menu to create a unique amount per invoice.",
+ "wh_hint": " = the URL above (secret already included), ",
+ "wh_amount_hint": "equal to the invoice unique amount"
},
"mt": {
"updating": "Updating...",
@@ -1954,7 +1977,8 @@
"selected": "selected",
"history": "Discount History (last 100)",
"th_note": "Note",
- "empty_cust": "No customers."
+ "empty_cust": "No customers.",
+ "unpaid": "unpaid"
},
"cpay": {
"title": "Collector Payment Approval",
@@ -2050,10 +2074,17 @@
"prorata_first": "First invoice proration (install date = billing month)",
"night_hint": "The system switches customers to this PPP profile between 00:00 - 06:00.",
"kalong_hint": "Check to configure (fields open automatically if this package uses Jam Kalong).",
- "fup_hint": "Check to configure (fields open automatically if this package uses FUP).",
+ "fup_hint": "). The same value is used for the MikroTik profile ",
"active_days_hint": "The customer stays active for X days since activation / payment.",
"ratelimit_hint": "Actual rate-limit (MikroTik & RADIUS):",
- "profile_hint2": "PPP profile + IP pool are created/updated automatically on MikroTik (MikroTik / RADIUS-profile mode). In RADIUS-attribute mode, IP & rate-limit come from RADIUS."
+ "profile_hint2": "PPP profile + IP pool are created/updated automatically on MikroTik (MikroTik / RADIUS-profile mode). In RADIUS-attribute mode, IP & rate-limit come from RADIUS.",
+ "radius_hint3": " — the values above are read from RADIUS settings. To change, open ",
+ "mt_hint3": " — the values above are read from the PPP profile on the router. To change, edit in ",
+ "profile_a": " The MikroTik PPP profile will be ",
+ "profile_b": "created/updated automatically",
+ "profile_c": " (RADIUS mode uses MikroTik profile)",
+ "prorata_a": "Invoice proration ",
+ "prorata_b": " if installed mid-month (proportion of remaining days; requires install date in customer data)"
},
"col": {
"title": "Collector Management",
@@ -2071,7 +2102,8 @@
"full_name": "Full Name",
"area_region": "Area / Assignment Region",
"opt_all_area": "-- All Areas / Unrestricted --",
- "empty": "No collector data yet."
+ "empty": "No collector data yet.",
+ "mode_hint": "` means the collector payment directly settles the invoice, while `"
},
"mon": {
"title": "System Monitoring",
@@ -2202,7 +2234,8 @@
"save": "Save Income",
"title": "Cash In",
"th_method": "Method",
- "empty": "No cash-in data yet."
+ "empty": "No cash-in data yet.",
+ "info": " This page is used to record cash-in / income "
},
"exp": {
"heading": "Expenses (Cash Out)",
@@ -2244,7 +2277,8 @@
"save": "Save Area",
"edit": "Edit Area Data",
"title": "Area Management",
- "th_name": "Area / Region Name"
+ "th_name": "Area / Region Name",
+ "create_area": " to create an area."
},
"rt": {
"list": "MikroTik Router List",
@@ -2275,7 +2309,10 @@
"delay_sec": "Delay (seconds)",
"stop": "Stop",
"moved": "Auto reminder moved:",
- "moved_desc": "schedule, template selection & reminder message settings are now in the"
+ "moved_desc": "schedule, template selection & reminder message settings are now in the",
+ "send_to": " Send to customers ",
+ "unpaid": "unpaid",
+ "on_date": " on the selected isolir date. Use "
},
"bk": {
"title": "Backup & Recovery",
@@ -2333,10 +2370,19 @@
},
"rep": {
"ppn_incl": "Yes — VAT already included",
- "tax_hint": "Corporate income tax, VAT, USO & BHP are calculated automatically from this value."
+ "tax_hint": "Corporate income tax, VAT, USO & BHP are calculated automatically from this value.",
+ "export_hint": "— export & print monthly",
+ "sum_hint": " = sum of each month; match with ",
+ "audit_hint": " (year) above for auditing.",
+ "calc_hint": "— calculated automatically"
},
"wlc": {
- "empty": "No messages with this customer yet. Type a message below and press Enter to start."
+ "empty": "No messages with this customer yet. Type a message below and press Enter to start.",
+ "loading": " Loading messages..."
+ },
+ "wp": {
+ "auto": "automatic message",
+ "sample": " with sample data — "
}
},
"tech": {
diff --git a/locales/id.json b/locales/id.json
index c2401a8..09d7e75 100644
--- a/locales/id.json
+++ b/locales/id.json
@@ -932,7 +932,8 @@
"empty_cust": "Belum ada data pelanggan.",
"empty_odp": "Belum ada data ODP.",
"view_port": "Klik untuk lihat visual port",
- "port_err": "Gagal memuat data port."
+ "port_err": "Gagal memuat data port.",
+ "route_hint": "Tarik titik oranye untuk mengubah jalur. Klik tombol di bawah untuk menambah titik lekukan."
},
"print_invoice": {
"title": "Cetak Struk Tagihan",
@@ -1116,7 +1117,8 @@
"run_prov": "Jalankan Provisioning",
"add_server": "Tambah Server ACS",
"bind_lan": "Pilih LAN Port yang akan di-bind:",
- "bind_ssid": "Pilih WLAN (SSID) yang akan di-bind:"
+ "bind_ssid": "Pilih WLAN (SSID) yang akan di-bind:",
+ "load_log": " untuk memuat log."
},
"vd": {
"action": "Aksi",
@@ -1146,7 +1148,11 @@
"tab_templates": "Template Pesan",
"tab_livechat": "Live Chat",
"tab_preview": "Preview Pesan",
- "ph_deviceid": "Device ID (opsional)"
+ "ph_deviceid": "Device ID (opsional)",
+ "selfhost": " atau URL Server Self-Hosted)",
+ "fonnte_hint": " untuk Fonnte Cloud, atau ubah ke domain/IP server mandiri jika menggunakan ",
+ "qr_hint": "Klik tombol, lalu buka WhatsApp → Perangkat Tertaut → Tautkan perangkat, scan QR. QR berlaku ~30 detik & diperbarui otomatis.",
+ "notif_only": " membalas perintah lagi — WhatsApp hanya untuk "
},
"automation": {
"title": "Otomatisasi",
@@ -1642,7 +1648,8 @@
"approve_invoice": "Setujui & Buat Tagihan",
"modem_hint": "Kredensial login modem pelanggan untuk RADIUS & PPPoE.",
"reg_hint": "Otomatis dihitung saat pasang/bayar. Bisa disesuaikan manual jika perlu.",
- "modem_hint_mt": "Kredensial login modem pelanggan untuk PPPoE MikroTik API."
+ "modem_hint_mt": "Kredensial login modem pelanggan untuk PPPoE MikroTik API.",
+ "reg_auto": " otomatis: menunggak "
},
"bill": {
"ph_note": "mis. kompensasi gangguan",
@@ -1669,7 +1676,8 @@
"all_routers": "Semua Router",
"all_collectors": "Semua Kolektor",
"opt_percent": "Persen (%)",
- "opt_amount": "Nominal (Rp)"
+ "opt_amount": "Nominal (Rp)",
+ "pct_hint": " Persen dihitung dari harga dasar (sebelum PPN/USO). Kode unik QRIS akan digenerate ulang."
},
"common": {
"keep_empty": "Biarkan kosong jika tidak diganti",
@@ -1821,7 +1829,8 @@
"alert_copied": "Script setup MikroTik & Isolir RADIUS berhasil disalin! Silakan tempelkan (paste) di Terminal MikroTik Anda.",
"alert_copied2": "Script MikroTik berhasil disalin!",
"deactivate": "Non-aktifkan",
- "activate": "Aktifkan"
+ "activate": "Aktifkan",
+ "rate_from_mt": "rate-limit & IP diambil dari profil PPP di MikroTik"
},
"set": {
"ew_log_realtime": "Log Realtime",
@@ -1922,7 +1931,21 @@
"office_coord_hint": "Koordinat kantor digunakan untuk validasi lokasi absensi karyawan (geofencing)",
"set_auto_moved": "Otomatisasi dipindah:",
"set_auto_list": "Auto-Nonaktif, Auto-Hapus, Auto-Peringatan & Auto-",
- "set_auto_now": "kini tertata di menu"
+ "set_auto_now": "kini tertata di menu",
+ "link_hint": "Digunakan untuk menyusun tautan login pelanggan yang dikirim via WhatsApp. Contoh: ",
+ "wa_numbers_hint": "Nomor admin akan menerima notifikasi monitoring sistem. Nomor teknisi diambil otomatis dari ",
+ "logo_hint": "PNG/JPG/WebP, maks 2MB. PNG/JPEG otomatis dioptimalkan. Dipakai di halaman login & portal pelanggan.",
+ "pwa_icon_hint": "Setelah upload, ikon PWA (192/512/maskable/apple-touch) & favicon otomatis dibuat ulang dari gambar ini. Sebaiknya gambar persegi (1:1).",
+ "hero_hint": "PNG/JPEG otomatis dikonversi ke ",
+ "speedtest_hint2": " (LibreSpeed / OpenSpeedTest self-hosted) atau ",
+ "speedtest_hint3": ". Jika dikosongkan, dashboard pelanggan menampilkan ",
+ "speedtest_notset": "\"Speedtest belum di setup\"",
+ "speedtest_btn_hint": "Di halaman pelanggan tersedia tombol ",
+ "repo_hint": "Dipakai untuk tautan ",
+ "uptime_hint": "Dipakai untuk tombol/redirect ",
+ "qris_unique_hint": " di menu Billing untuk membuat nominal unik per invoice.",
+ "wh_hint": " = URL di atas (secret sudah termasuk), ",
+ "wh_amount_hint": "sama dengan nominal unik tagihan"
},
"mt": {
"updating": "Memperbarui...",
@@ -1955,7 +1978,8 @@
"selected": "dipilih",
"history": "Riwayat Diskon (100 terakhir)",
"th_note": "Catatan",
- "empty_cust": "Tidak ada pelanggan."
+ "empty_cust": "Tidak ada pelanggan.",
+ "unpaid": "belum bayar"
},
"cpay": {
"title": "Approval Pembayaran Kolektor",
@@ -2051,10 +2075,17 @@
"prorata_first": "Prorata tagihan pertama (tanggal pasang = bulan tagihan)",
"night_hint": "Sistem akan ganti profile ppp pelanggan ke profile ini pada jam 00:00 - 06:00.",
"kalong_hint": "Centang untuk mengatur (kolom terbuka otomatis bila paket ini memakai Jam Kalong).",
- "fup_hint": "Centang untuk mengatur (kolom terbuka otomatis bila paket ini memakai FUP).",
+ "fup_hint": "). Nilai sama dipakai untuk profil MikroTik ",
"active_days_hint": "Pelanggan aktif selama X hari sejak aktivasi / pembayaran.",
"ratelimit_hint": "Rate-limit asli (MikroTik & RADIUS):",
- "profile_hint2": "Profil PPP + IP pool dibuat/diperbarui otomatis ke MikroTik (mode MikroTik / RADIUS profil). Pada mode RADIUS-atribut, IP & rate-limit dari RADIUS."
+ "profile_hint2": "Profil PPP + IP pool dibuat/diperbarui otomatis ke MikroTik (mode MikroTik / RADIUS profil). Pada mode RADIUS-atribut, IP & rate-limit dari RADIUS.",
+ "radius_hint3": " — nilai di atas dibaca dari pengaturan RADIUS. Untuk mengubah, buka ",
+ "mt_hint3": " — nilai di atas dibaca dari profil PPP di router. Untuk mengubah, edit di ",
+ "profile_a": " Profil PPP MikroTik akan ",
+ "profile_b": "dibuat/diperbarui otomatis",
+ "profile_c": " (mode RADIUS pakai profil MikroTik)",
+ "prorata_a": "Prorata tagihan ",
+ "prorata_b": " jika pasang di tengah bulan (proporsi sisa hari, perlu tanggal pasang di data pelanggan)"
},
"col": {
"title": "Manajemen Kolektor",
@@ -2072,7 +2103,8 @@
"full_name": "Nama Lengkap",
"area_region": "Area / Wilayah Tugas",
"opt_all_area": "-- Semua Area / Bebas --",
- "empty": "Belum ada data kolektor."
+ "empty": "Belum ada data kolektor.",
+ "mode_hint": "` berarti pembayaran dari kolektor langsung melunasi invoice, sedangkan `"
},
"mon": {
"title": "Monitoring Sistem",
@@ -2203,7 +2235,8 @@
"save": "Simpan Pemasukan",
"title": "Kas Masuk",
"th_method": "Metode",
- "empty": "Belum ada data kas masuk."
+ "empty": "Belum ada data kas masuk.",
+ "info": " Halaman ini digunakan untuk mencatat kas masuk / pemasukan "
},
"exp": {
"heading": "Pengeluaran (Cash Out)",
@@ -2245,7 +2278,8 @@
"save": "Simpan Area",
"edit": "Edit Data Area",
"title": "Manajemen Area",
- "th_name": "Nama Area / Wilayah"
+ "th_name": "Nama Area / Wilayah",
+ "create_area": " untuk membuat area."
},
"rt": {
"list": "Daftar Router MikroTik",
@@ -2276,7 +2310,10 @@
"delay_sec": "Jeda (detik)",
"stop": "Hentikan",
"moved": "Pengingat otomatis dipindah:",
- "moved_desc": "pengaturan jadwal, pemilihan template & isi pesan pengingat tagihan kini di menu"
+ "moved_desc": "pengaturan jadwal, pemilihan template & isi pesan pengingat tagihan kini di menu",
+ "send_to": " Kirim ke pelanggan ",
+ "unpaid": "belum bayar",
+ "on_date": " pada tanggal isolir terpilih. Gunakan "
},
"bk": {
"title": "Backup & Recovery",
@@ -2334,10 +2371,19 @@
},
"rep": {
"ppn_incl": "Ya — PPN sudah termasuk",
- "tax_hint": "PPh Badan, PPN, USO & BHP dihitung otomatis dari nilai ini."
+ "tax_hint": "PPh Badan, PPN, USO & BHP dihitung otomatis dari nilai ini.",
+ "export_hint": "— export & cetak tiap bulan",
+ "sum_hint": " = penjumlahan tiap bulan; cocokkan dengan ",
+ "audit_hint": " (tahun) di atas untuk audit.",
+ "calc_hint": "— dihitung otomatis"
},
"wlc": {
- "empty": "Belum ada pesan dengan pelanggan ini. Ketik pesan di bawah dan tekan Enter untuk memulai."
+ "empty": "Belum ada pesan dengan pelanggan ini. Ketik pesan di bawah dan tekan Enter untuk memulai.",
+ "loading": " Memuat pesan..."
+ },
+ "wp": {
+ "auto": "pesan otomatis",
+ "sample": " dengan data contoh — "
}
},
"tech": {
diff --git a/views/admin/acs.ejs b/views/admin/acs.ejs
index feb56ce..8fc8f31 100644
--- a/views/admin/acs.ejs
+++ b/views/admin/acs.ejs
@@ -266,7 +266,7 @@
Log diambil dari tiap ACS (Built-in: riwayat task; GenieACS: /faults).
-