diff --git a/locales/en.json b/locales/en.json index 5cfcb26..fff9db2 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1065,7 +1065,23 @@ "search_ph": "Search SN, Customer, PPPoE...", "optional": "Optional", "online": "Online", - "offline": "Offline" + "offline": "Offline", + "title": "GenieACS Monitoring Pro", + "sync_title": "Sync customer ONU tags from ACS device.id (based on PPPoE user)", + "tab_devices": "Devices", + "all_status": "All Status", + "all_vendor": "All Vendors", + "del_device": "Delete Device", + "all_server": "All Servers", + "del_server": "Delete Server", + "edit_default": "Edit Default ACS", + "reload": "Reload", + "prov_title": "All-in-One WAN Provisioning", + "ssid": "SSID (Wi-Fi Name)", + "wifi_pass": "Wi-Fi Password (WPA2)", + "loading": "Loading...", + "run_prov": "Run Provisioning", + "add_server": "Add ACS Server" }, "vd": { "action": "Action", @@ -1518,7 +1534,73 @@ "bulk_pick_one": "Select at least 1 customer to delete.", "bulk_confirm": "Are you sure you want to delete", "bulk_confirm2": "selected customer records?", - "bulk_confirm3": "NOTE: PPPoE user/secret data on MikroTik will NOT be deleted (stays safe)." + "bulk_confirm3": "NOTE: PPPoE user/secret data on MikroTik will NOT be deleted (stays safe).", + "total": "Total Customers:", + "all_area": "All Areas", + "all_router": "All Routers", + "all_pkg": "All Packages", + "all_collector": "All Collectors", + "all_olt": "All OLTs", + "all_conn": "All Connections", + "all_billing": "All Billing", + "paid": "Paid", + "reject_reg": "Reject Registrant", + "view_detail": "View Detail & MikroTik", + "copy_id": "Copy Customer ID", + "copy_ip": "Copy Customer IP", + "open_ip": "Open Customer IP", + "reset_promo": "Reset Promo Cycle", + "prorata_followup": "Prorated Follow-up Invoice", + "gen_pppoe": "Generate PPPoE Account", + "add_customer": "Add New Customer", + "auth_mode": "Customer Authentication Mode (Primary)", + "opt_mt_api": "MikroTik API (Local /ppp secret - Primary & Default)", + "opt_radius": "RADIUS Server (Billing Database Only)", + "nik_opt": "Identity No. (KTP/SIM/Passport) (Optional)", + "nik": "Identity No. (KTP/SIM/Passport)", + "pkg_req": "Internet Package *", + "pkg": "Internet Package", + "conn_method": "Connection Method", + "onu_tag": "ONU Tag (GenieACS)", + "pick_from_mt": "Pick from MikroTik (API)", + "cust_ip": "Customer IP Address", + "status_auto": "Account Status & Auto-Isolir", + "status": "Account Status", + "suspended": "Suspend / Isolate", + "inactive": "Inactive", + "install_date": "Installation Date", + "isolir_day": "Isolir Date (1-31)", + "isolir_day_pp": "Isolir Date (Postpaid)", + "validity_prepaid": "Validity / Expiry Date (Prepaid only)", + "isolir_profile": "Isolir Profile / Address List", + "olt_device": "OLT Device", + "odp_port": "ODP Port", + "mac_opt": "MAC Address (Optional)", + "save_customer": "Save Customer", + "pick_excel": "Select Excel File", + "start_import": "Start Import", + "full_name": "Full Name *", + "phone_req": "Phone / WA No. *", + "update_customer": "Update Customer", + "apply_network": "Apply to Network", + "pay_method": "Payment Method", + "pay_cash": "Cash", + "pay_transfer": "Bank Transfer", + "pay_other": "Other", + "pick_location": "Pick Customer Location", + "done": "Done", + "router_target": "Target Router", + "conn_type": "Connection Type", + "uptime_session": "Active Session Uptime", + "traffic_stats": "Data Traffic Statistics", + "fup_total": "Total Quota Used (FUP):", + "phone": "Phone / WhatsApp No.", + "validity": "Validity (Prepaid)", + "close": "Close", + "disconnect_mt": "Disconnect MikroTik Session", + "calc_reg": "Prorata Calculator — Approve Registrant", + "start_use": "Start Using", + "approve_invoice": "Approve & Create Invoice" }, "bill": { "ph_note": "e.g. service credit for downtime", diff --git a/locales/id.json b/locales/id.json index 645d04c..372d231 100644 --- a/locales/id.json +++ b/locales/id.json @@ -1065,7 +1065,23 @@ "search_ph": "Cari SN, Pelanggan, PPPoE...", "optional": "Opsional", "online": "Online", - "offline": "Offline" + "offline": "Offline", + "title": "GenieACS Monitoring Pro", + "sync_title": "Sinkron Tag ONU pelanggan dari device.id ACS (berdasarkan PPPoE user)", + "tab_devices": "Perangkat", + "all_status": "Semua Status", + "all_vendor": "Semua Vendor", + "del_device": "Hapus Perangkat", + "all_server": "Semua Server", + "del_server": "Hapus Server", + "edit_default": "Edit Default ACS", + "reload": "Muat Ulang", + "prov_title": "Provisioning All-in-One WAN", + "ssid": "SSID (Nama Wi-Fi)", + "wifi_pass": "Sandi Wi-Fi (WPA2)", + "loading": "Mengunduh...", + "run_prov": "Jalankan Provisioning", + "add_server": "Tambah Server ACS" }, "vd": { "action": "Aksi", @@ -1519,7 +1535,73 @@ "bulk_pick_one": "Pilih minimal 1 pelanggan untuk dihapus.", "bulk_confirm": "Yakin ingin menghapus", "bulk_confirm2": "data pelanggan terpilih?", - "bulk_confirm3": "CATATAN: Data user / secret PPPoE di MikroTik TIDAK akan dihapus (tetap aman)." + "bulk_confirm3": "CATATAN: Data user / secret PPPoE di MikroTik TIDAK akan dihapus (tetap aman).", + "total": "Total Pelanggan:", + "all_area": "Semua Area", + "all_router": "Semua Router", + "all_pkg": "Semua Paket", + "all_collector": "Semua Kolektor", + "all_olt": "Semua OLT", + "all_conn": "Semua Koneksi", + "all_billing": "Semua Tagihan", + "paid": "Lunas", + "reject_reg": "Tolak Pendaftar", + "view_detail": "Lihat Detail & MikroTik", + "copy_id": "Salin ID Pelanggan", + "copy_ip": "Salin IP Pelanggan", + "open_ip": "Masuk ke IP Pelanggan", + "reset_promo": "Reset Siklus Promo", + "prorata_followup": "Tagihan Susulan Prorata", + "gen_pppoe": "Generate Akun PPPoE", + "add_customer": "Tambah Pelanggan Baru", + "auth_mode": "Mode Autentikasi Pelanggan (Utama)", + "opt_mt_api": "MikroTik API (Lokal /ppp secret - Utama & Default)", + "opt_radius": "RADIUS Server (Billing Database Only)", + "nik_opt": "No. Identitas (KTP/SIM/Paspor) (Opsional)", + "nik": "No. Identitas (KTP/SIM/Paspor)", + "pkg_req": "Paket Internet *", + "pkg": "Paket Internet", + "conn_method": "Metode Koneksi", + "onu_tag": "Tag ONU (GenieACS)", + "pick_from_mt": "Pilih dari MikroTik (API)", + "cust_ip": "IP Address Pelanggan", + "status_auto": "Status Akun & Auto-Isolir", + "status": "Status Akun", + "suspended": "Suspend / Isolir", + "inactive": "Nonaktif", + "install_date": "Tanggal Pasang", + "isolir_day": "Tanggal Isolir (1-31)", + "isolir_day_pp": "Tanggal Isolir (Pascabayar)", + "validity_prepaid": "Masa Aktif / Expired Date (Khusus Prabayar)", + "isolir_profile": "Profile Isolir / Address List", + "olt_device": "Perangkat OLT", + "odp_port": "Port ODP", + "mac_opt": "MAC Address (Opsional)", + "save_customer": "Simpan Pelanggan", + "pick_excel": "Pilih File Excel", + "start_import": "Mulai Impor", + "full_name": "Nama Lengkap *", + "phone_req": "No. Telepon / WA *", + "update_customer": "Update Pelanggan", + "apply_network": "Terapkan ke Jaringan", + "pay_method": "Metode Bayar", + "pay_cash": "Tunai (Cash)", + "pay_transfer": "Transfer Bank", + "pay_other": "Lainnya", + "pick_location": "Pilih Lokasi Pelanggan", + "done": "Selesai", + "router_target": "Router Target", + "conn_type": "Tipe Koneksi", + "uptime_session": "Uptime Sesi Active", + "traffic_stats": "Statistik Trafik Data", + "fup_total": "Total Kuota Terpakai (FUP):", + "phone": "No. Telepon / WhatsApp", + "validity": "Masa Aktif (Prabayar)", + "close": "Tutup", + "disconnect_mt": "Putus Sesi MikroTik", + "calc_reg": "Kalkulator Prorata — Setujui Pendaftar", + "start_use": "Mulai Pakai", + "approve_invoice": "Setujui & Buat Tagihan" }, "bill": { "ph_note": "mis. kompensasi gangguan", diff --git a/views/admin/acs.ejs b/views/admin/acs.ejs index 1c07360..81d0bea 100644 --- a/views/admin/acs.ejs +++ b/views/admin/acs.ejs @@ -58,7 +58,7 @@ <%- include('partials/sidebar', { activePage: 'acs_pro', company }) %>
-
GenieACS Monitoring Pro
+
<%= t('admin.acs.title','GenieACS Monitoring Pro') %>
<%= company %> <%= (typeof session !== 'undefined' && session && session.isCashier) ? 'Kasir' : 'Admin' %> @@ -69,7 +69,7 @@

<%= t('admin.acs.monitoring','GenieACS Monitoring') %>

- +
@@ -115,12 +115,12 @@ <% }); %> @@ -144,7 +144,7 @@ - + @@ -190,7 +190,7 @@
- + @@ -204,7 +204,7 @@

ACS Servers

- +
<%= t('admin.acs.device_id','Device ID / SN') %> <%= t('admin.acs.customer_name','Customer Name') %> IP Address
@@ -231,14 +231,14 @@
- +
<% } else { %>
- +
@@ -255,7 +255,7 @@

Log Aktivitas ACS

Hanya error / fault - + Log diambil dari tiap ACS (Built-in: riwayat task; GenieACS: /faults).
-
Pilih filter lalu klik "Muat Ulang" untuk memuat log.
+
Pilih filter lalu klik "<%= t('admin.acs.reload','Muat Ulang') %>" untuk memuat log.
@@ -279,7 +279,7 @@
- Provisioning All-in-One WAN + <%= t('admin.acs.prov_title','Provisioning All-in-One WAN') %>
@@ -365,11 +365,11 @@
Wi-Fi 2.4GHz
- - + +
- +
@@ -379,11 +379,11 @@
Wi-Fi 5GHz
- - + +
- +
@@ -443,7 +443,7 @@
@@ -453,7 +453,7 @@
- Add ACS Server + <%= t('admin.acs.add_server','Tambah Server ACS') %>
@@ -552,7 +552,7 @@ document.querySelectorAll('.mo').forEach(m => m.addEventListener('click', e => { })); function openAddServerModal() { - document.getElementById('acsServerModalTitle').innerHTML = ' Add ACS Server'; + document.getElementById('acsServerModalTitle').innerHTML = ' <%= t('admin.acs.add_server','Tambah Server ACS') %>'; document.getElementById('sId').value = ''; document.getElementById('sName').value = ''; document.getElementById('sUrl').value = ''; @@ -582,7 +582,7 @@ function openEditServerModal(btn) { } function openEditLegacyAcsModal() { - document.getElementById('acsServerModalTitle').innerHTML = ' Edit Default ACS'; + document.getElementById('acsServerModalTitle').innerHTML = ' <%= t('admin.acs.edit_default','Edit Default ACS') %>'; document.getElementById('sId').value = 'legacy'; document.getElementById('sName').value = 'Default ACS'; document.getElementById('sUrl').value = '<%= (typeof settings !== "undefined" && settings.genieacs_url) ? String(settings.genieacs_url) : "" %>'; @@ -1017,11 +1017,11 @@ function updateBulkPanel() { countSpan.textContent = checkboxes.length; } else { panel.style.display = 'none'; - document.getElementById('selectAllDevices').checked = false; + document.getElementById('selectAll<%= t('admin.acs.tab_devices','Perangkat') %>').checked = false; } } -function getSelectedDevices() { +function getSelected<%= t('admin.acs.tab_devices','Perangkat') %>() { const checkboxes = document.querySelectorAll('.device-checkbox:checked'); const devices = []; checkboxes.forEach(cb => { @@ -1034,7 +1034,7 @@ function getSelectedDevices() { } async function bulkSummon() { - const devices = getSelectedDevices(); + const devices = getSelected<%= t('admin.acs.tab_devices','Perangkat') %>(); if (devices.length === 0) return; if (!confirm(`Summon / Sinkronisasi ulang ${devices.length} perangkat?`)) return; @@ -1053,7 +1053,7 @@ async function bulkSummon() { } async function bulkDelete() { - const devices = getSelectedDevices(); + const devices = getSelected<%= t('admin.acs.tab_devices','Perangkat') %>(); if (devices.length === 0) return; if (!confirm(`HAPUS ${devices.length} perangkat dari database ACS?\n(Tindakan ini tidak dapat dibatalkan)`)) return; diff --git a/views/admin/customers.ejs b/views/admin/customers.ejs index a223fc9..f10d272 100644 --- a/views/admin/customers.ejs +++ b/views/admin/customers.ejs @@ -136,7 +136,7 @@
<%= t('admin.cust.printed_at','Dicetak:') %> <%= getNowLocal() %>
-
Total Pelanggan: <%= customers.length %> Orang
+
<%= t('admin.cust.total','Total Pelanggan:') %> <%= customers.length %> Orang
@@ -154,7 +154,7 @@ Stiker ONU <%= t('admin.customers.export_excel', 'Export Excel') %> - +
@@ -172,7 +172,7 @@ <% if (typeof routers !== 'undefined' && routers && routers.length > 0) { %> <% } %>
<% if (c.status==='active') { %><%= t('admin.customers.filter.active', 'Aktif') %> - <% } else if (c.status==='suspended') { %><% if (c.deactivate_cause==='auto_unpaid') { %> Nonaktif (auto)<% } else { %><%= t('admin.customers.filter.suspended', 'Suspend') %><% } %> + <% } else if (c.status==='suspended') { %><% if (c.deactivate_cause==='auto_unpaid') { %> <%= t('admin.cust.inactive','Nonaktif') %> (auto)<% } else { %><%= t('admin.customers.filter.suspended', 'Suspend') %><% } %> <% } else { %><%= t('admin.customers.filter.inactive', 'Nonaktif') %><% } %> <% if (c.status === 'inactive' && (c.reg_total || c.reg_due_date || c.reg_voucher_code)) { %>
@@ -360,27 +360,27 @@
<% if (c.status === 'inactive') { %> - +
<% } %> - +
- - - + + + Cetak Stiker ONU <% if (typeof session !== 'undefined' && session && !session.isCashier) { %> <% if (c.package_id && (c.package_promo_cycles || 0) > 0) { %> - + <% } %> <% if (c.package_id && c.install_date && c.package_prorate_first_invoice) { %> - + <% } %> <% } %> <% if (!c.pppoe_username) { %> - + <% } %>
@@ -402,7 +402,7 @@
-
Tambah Pelanggan Baru
+
<%= t('admin.cust.add_customer','Tambah Pelanggan Baru') %>
@@ -411,14 +411,14 @@
- Mode Autentikasi Pelanggan (Utama) + <%= t('admin.cust.auth_mode','Mode Autentikasi Pelanggan (Utama)') %> <%= t('admin.cust.f_mikrotik_api','Diutamakan MikroTik API') %>
Mode MikroTik API mengelola kredensial PPP langsung di menu /ppp secret RouterOS MikroTik. @@ -434,12 +434,12 @@
<%= t('admin.cust.sec_personal','Informasi Pribadi Pelanggan') %>
-
-
+
+
- +
@@ -469,7 +469,7 @@
Paket & Akses Jaringan (MikroTik / RADIUS)
- + @@ -500,7 +500,7 @@
- +
@@ -514,7 +514,7 @@
@@ -690,13 +690,13 @@ Unduh format excel

- +
- +
@@ -713,14 +713,14 @@
- Mode Autentikasi Pelanggan (Utama) + <%= t('admin.cust.auth_mode','Mode Autentikasi Pelanggan (Utama)') %> <%= t('admin.cust.f_mikrotik_api','Diutamakan MikroTik API') %>
Mode MikroTik API mengelola kredensial PPP langsung di menu /ppp secret RouterOS MikroTik. @@ -736,12 +736,12 @@
<%= t('admin.cust.sec_personal','Informasi Pribadi Pelanggan') %>
-
-
+
+
- +
@@ -771,7 +771,7 @@
Paket & Akses Jaringan (MikroTik / RADIUS)
- + @@ -802,7 +802,7 @@
- +
@@ -827,7 +827,7 @@ @@ -857,17 +857,17 @@
-
Penagihan, Kolektor, & Status Akun
+
Penagihan, Kolektor, & <%= t('admin.cust.status','Status Akun') %>
- +
-
+
@@ -878,13 +878,13 @@
- +
- + Otomatis dihitung saat pasang/bayar. Bisa disesuaikan manual jika perlu.
@@ -902,7 +902,7 @@
- + @@ -915,7 +915,7 @@
Infrastruktur (OLT, ODP, & Peta)
- +
@@ -961,9 +961,9 @@
- + - +
@@ -1050,8 +1050,8 @@
- - + +
@@ -1077,7 +1077,7 @@
-
Pilih Lokasi Pelanggan
+
<%= t('admin.cust.pick_location','Pilih Lokasi Pelanggan') %>
@@ -1085,7 +1085,7 @@
- +
@@ -1104,7 +1104,7 @@
-
<%= t('admin.cust.lbl_cust_id','ID Pelanggan:') %> - - +
@@ -1118,15 +1118,15 @@
Password PPPoE / Hotspot-
IP Address (Sesi / Static)-
MAC Address / Caller-ID-
-
Router Target-
-
Tipe Koneksi-
-
Uptime Sesi Active-
+
<%= t('admin.cust.router_target','Router Target') %>-
+
<%= t('admin.cust.conn_type','Tipe Koneksi') %>-
+
<%= t('admin.cust.uptime_session','Uptime Sesi Active') %>-
-
Statistik Trafik Data
+
<%= t('admin.cust.traffic_stats','Statistik Trafik Data') %>
@@ -1140,7 +1140,7 @@
0 Bytes
-
Total Kuota Terpakai (FUP): 0 GB
+
<%= t('admin.cust.fup_total','Total Kuota Terpakai (FUP):') %> 0 GB
@@ -1148,20 +1148,20 @@
<%= t('admin.cust.sec_info','Informasi Pelanggan') %>
-
No. Identitas (KTP/SIM/Paspor)-
-
No. Telepon / WhatsApp-
+
<%= t('admin.cust.nik','No. Identitas (KTP/SIM/Paspor)') %>-
+
<%= t('admin.cust.phone','No. Telepon / WhatsApp') %>-
<%= t('admin.cust.sec_addr_area','Alamat & Area') %>-
-
Paket Internet-
-
Masa Aktif (Prabayar)-
-
Tag ONU (GenieACS)-
-
Status Akun & Auto-Isolir-
+
<%= t('admin.cust.pkg','Paket Internet') %>-
+
<%= t('admin.cust.validity','Masa Aktif (Prabayar)') %>-
+
<%= t('admin.cust.onu_tag','Tag ONU (GenieACS)') %>-
+
<%- t('admin.cust.status_auto','Status Akun & Auto-Isolir') %>-
- +
- +
@@ -1170,7 +1170,7 @@
-
Kalkulator Prorata — Setujui Pendaftar
+
<%- t('admin.cust.calc_reg','Kalkulator Prorata — Setujui Pendaftar') %>
@@ -1179,7 +1179,7 @@
-
+
@@ -1200,7 +1200,7 @@
- +
@@ -1282,8 +1282,8 @@ function copyCustCode(){ var el = document.getElementById('v_cust_id'); if(!el) return; var val = (el.textContent || '').trim(); if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard.writeText(val).then(function(){ alert('ID Pelanggan disalin: ' + val); }).catch(function(){ prompt('Salin ID Pelanggan:', val); }); - } else { prompt('Salin ID Pelanggan:', val); } + navigator.clipboard.writeText(val).then(function(){ alert('ID Pelanggan disalin: ' + val); }).catch(function(){ prompt('<%= t('admin.cust.copy_id','Salin ID Pelanggan') %>:', val); }); + } else { prompt('<%= t('admin.cust.copy_id','Salin ID Pelanggan') %>:', val); } } // ── Aksi cepat per-pelanggan (dropdown): salin ID, salin IP, masuk ke IP ── @@ -1299,15 +1299,15 @@ function copyCustId(idx) { var code = c.customer_code || (c.id ? String(c.id) : ''); if (!code) { _custToast(false, 'ID Pelanggan tidak tersedia.'); return; } if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard.writeText(code).then(function () { _custToast(true, 'ID Pelanggan disalin: ' + code); }).catch(function () { prompt('Salin ID Pelanggan:', code); }); - } else { prompt('Salin ID Pelanggan:', code); } + navigator.clipboard.writeText(code).then(function () { _custToast(true, 'ID Pelanggan disalin: ' + code); }).catch(function () { prompt('<%= t('admin.cust.copy_id','Salin ID Pelanggan') %>:', code); }); + } else { prompt('<%= t('admin.cust.copy_id','Salin ID Pelanggan') %>:', code); } } function copyCustIp(idx) { var ip = _custSessionIp(idx); if (!ip) { _custToast(false, 'IP pelanggan tidak tersedia (offline / belum ada IP).'); return; } if (navigator.clipboard && navigator.clipboard.writeText) { - navigator.clipboard.writeText(ip).then(function () { _custToast(true, 'IP pelanggan disalin: ' + ip); }).catch(function () { prompt('Salin IP Pelanggan:', ip); }); - } else { prompt('Salin IP Pelanggan:', ip); } + navigator.clipboard.writeText(ip).then(function () { _custToast(true, 'IP pelanggan disalin: ' + ip); }).catch(function () { prompt('<%= t('admin.cust.copy_ip','Salin IP Pelanggan') %>:', ip); }); + } else { prompt('<%= t('admin.cust.copy_ip','Salin IP Pelanggan') %>:', ip); } } function openCustIp(idx) { var ip = _custSessionIp(idx); @@ -1389,7 +1389,7 @@ function viewCustDetail(idx) { } } if (document.getElementById('v_genieacs')) document.getElementById('v_genieacs').textContent = c.genieacs_tag || '-'; - if (document.getElementById('v_status_account')) document.getElementById('v_status_account').textContent = `Status: ${c.status || 'active'} | Auto Isolir: ${c.auto_isolate === 0 ? 'Nonaktif' : 'Aktif (Tgl ' + (c.isolate_day || '-') + ')'}`; + if (document.getElementById('v_status_account')) document.getElementById('v_status_account').textContent = `Status: ${c.status || 'active'} | Auto Isolir: ${c.auto_isolate === 0 ? '<%= t('admin.cust.inactive','Nonaktif') %>' : 'Aktif (Tgl ' + (c.isolate_day || '-') + ')'}`; if (document.getElementById('v_disconnect_form')) { document.getElementById('v_disconnect_form').action = '/admin/customers/' + c.id + '/disconnect';