i18n (Phase C batch 4): settings.ejs bagian umum/mikrotik/admin/whatsapp ID/EN

This commit is contained in:
oxpoe committed 2026-10-09 07:13:40 +07:00
1 parent a94c740b16
commit 0920d44938
3 files changed
+117 -37

No files matched your search

+37 -37
View File
@@ -53,8 +53,8 @@
</style>
<% if (logsOnly) { %>
<div style="display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap">
<button type="button" class="btn btn-p btn-sm" id="ewtab-log" onclick="ewTab('log')"><i class="bi bi-broadcast"></i> Log Realtime</button>
<button type="button" class="btn btn-g btn-sm" id="ewtab-rekap" onclick="ewTab('rekap')"><i class="bi bi-check2-circle"></i> Rekap Auto-Lunas</button>
<button type="button" class="btn btn-p btn-sm" id="ewtab-log" onclick="ewTab('log')"><i class="bi bi-broadcast"></i> <%= t('admin.set.ew_log_realtime','Log Realtime') %></button>
<button type="button" class="btn btn-g btn-sm" id="ewtab-rekap" onclick="ewTab('rekap')"><i class="bi bi-check2-circle"></i> <%= t('admin.set.ew_rekap','Rekap Auto-Lunas') %></button>
</div>
<div id="ew-tab-log">
<div class="card mb16">
@@ -72,11 +72,11 @@
<div class="form-row" style="align-items:flex-end">
<div class="fg">
<label class="fl"><%= t('admin.settings.ewallet_logs.service', 'Service') %></label>
<input class="fc" id="ew_service" placeholder="DANA / Gojek / ShopeePay (opsional)">
<input class="fc" id="ew_service" placeholder="<%= t('admin.set.ph_ew_service','DANA / Gojek / ShopeePay (opsional)') %>">
</div>
<div class="fg" style="flex:2">
<label class="fl"><%= t('admin.settings.ewallet_logs.search', 'Cari') %></label>
<input class="fc" id="ew_q" placeholder="kata kunci (opsional)">
<input class="fc" id="ew_q" placeholder="<%= t('admin.set.ph_ew_keyword','kata kunci (opsional)') %>">
</div>
<div class="fg w160">
<label class="fl"><%= t('admin.settings.ewallet_logs.limit', 'Limit') %></label>
@@ -89,7 +89,7 @@
</div>
</div>
<div class="hint" style="margin-top:6px">
Endpoint MacroDroid: <span class="mono">POST /api/webhook/v1/payment-notif</span>
<%= t('admin.set.ew_endpoint','Endpoint MacroDroid:') %> <span class="mono">POST /api/webhook/v1/payment-notif</span>
</div>
<div class="hint" style="margin-top:6px" id="ew_notif_hint"></div>
<div class="tbl-wrap" style="margin-top:10px;max-height:420px;overflow:auto">
@@ -117,11 +117,11 @@
<div id="ew-tab-rekap" style="display:none">
<div class="card mb16">
<div class="card-hd" style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap">
<h6 style="margin:0"><i class="bi bi-check2-circle"></i> Rekap Auto-Lunas</h6>
<h6 style="margin:0"><i class="bi bi-check2-circle"></i> <%= t('admin.set.ew_rekap','Rekap Auto-Lunas') %></h6>
<form method="GET" action="/admin/ewallet-logs" style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">
<input class="fc" type="number" name="month" min="1" max="12" value="<%= (typeof alMonth!=='undefined'?alMonth:(new Date().getMonth()+1)) %>" style="width:70px">
<input class="fc" type="number" name="year" min="2000" max="3000" value="<%= (typeof alYear!=='undefined'?alYear:new Date().getFullYear()) %>" style="width:90px">
<button class="btn btn-p btn-sm"><i class="bi bi-funnel"></i> Tampilkan</button>
<button class="btn btn-p btn-sm"><i class="bi bi-funnel"></i> <%= t('admin.set.show','Tampilkan') %></button>
<a class="btn btn-g btn-sm" href="/admin/autolunas/export?month=<%= (typeof alMonth!=='undefined'?alMonth:(new Date().getMonth()+1)) %>&year=<%= (typeof alYear!=='undefined'?alYear:new Date().getFullYear()) %>"><i class="bi bi-download"></i> CSV</a>
</form>
</div>
@@ -144,7 +144,7 @@
<td class="muted"><%= r.paid_at||'-' %></td>
</tr>
<% }); %>
<% if (typeof alRows==='undefined' || !alRows.length) { %><tr><td colspan="6" class="text-center text-muted">Tidak ada auto-lunas pada periode ini.</td></tr><% } %>
<% if (typeof alRows==='undefined' || !alRows.length) { %><tr><td colspan="6" class="text-center text-muted"><%= t('admin.set.al_empty','Tidak ada auto-lunas pada periode ini.') %></td></tr><% } %>
</tbody>
</table>
</div>
@@ -158,7 +158,7 @@
<a class="btn btn-p btn-sm" href="/admin/ewallet-logs"><i class="bi bi-box-arrow-up-right"></i> <%= t('common.open', 'Buka') %></a>
</div>
<div class="card-bd">
<div class="hint">Log notifikasi e-wallet dipindah ke halaman khusus agar pengaturan tidak terdorong ke bawah.</div>
<div class="hint"><%= t('admin.set.ew_log_hint','Log notifikasi e-wallet dipindah ke halaman khusus agar pengaturan tidak terdorong ke bawah.') %></div>
</div>
</div>
<% } %>
@@ -220,17 +220,17 @@
<input class="fc" name="company_header" value="<%= settings.company_header || '' %>">
</div>
<div class="fg">
<label class="fl">URL Publik Aplikasi (Public Base URL)</label>
<label class="fl"><%= t('admin.set.public_url','URL Publik Aplikasi (Public Base URL)') %></label>
<input class="fc" name="public_base_url" value="<%= settings.public_base_url || '' %>" placeholder="https://portal.domain-anda.com">
<div style="font-size:10px; color:var(--muted); margin-top:4px">Digunakan untuk menyusun tautan login pelanggan yang dikirim via WhatsApp. Contoh: <span class="mono">https://portal.domain-anda.com</span></div>
</div>
<div class="fg">
<label class="fl">Prefix ID Pelanggan</label>
<label class="fl"><%= t('admin.set.id_prefix','Prefix ID Pelanggan') %></label>
<input class="fc" name="customer_id_prefix" value="<%= settings.customer_id_prefix || 'SKY' %>" placeholder="SKY" style="text-transform:uppercase" maxlength="12">
<div style="font-size:10px; color:var(--muted); margin-top:4px">Format ID Pelanggan: <span class="mono">PREFIX-angka</span> (contoh: <span class="mono"><%= (settings.customer_id_prefix || 'SKY') %>-48213</span>). Hanya angka setelah tanda hubung. ID <b>permanen</b> &amp; otomatis untuk pelanggan baru.</div>
</div>
<div class="fg">
<label class="fl">Jumlah Digit Angka ID Pelanggan</label>
<label class="fl"><%= t('admin.set.id_digits','Jumlah Digit Angka ID Pelanggan') %></label>
<input class="fc" type="number" name="customer_id_digits" value="<%= settings.customer_id_digits || 5 %>" min="4" max="10" step="1">
<div style="font-size:10px; color:var(--muted); margin-top:4px">Default 5 → contoh <span class="mono">SKY-48213</span>.</div>
</div>
@@ -274,8 +274,8 @@
<i class="bi bi-shield-check"></i> Geofencing Absensi
</label>
<select class="fs" name="attendance_geofencing">
<option value="true" <%= settings.attendance_geofencing === 'true' || settings.attendance_geofencing === true ? 'selected' : '' %>>Aktif (Validasi Lokasi)</option>
<option value="false" <%= settings.attendance_geofencing === 'false' || settings.attendance_geofencing === false ? 'selected' : '' %>>Nonaktif (Bebas)</option>
<option value="true" <%= settings.attendance_geofencing === 'true' || settings.attendance_geofencing === true ? 'selected' : '' %>><%= t('admin.set.att_geo_on','Aktif (Validasi Lokasi)') %></option>
<option value="false" <%= settings.attendance_geofencing === 'false' || settings.attendance_geofencing === false ? 'selected' : '' %>><%= t('admin.set.att_geo_off','Nonaktif (Bebas)') %></option>
</select>
</div>
<div class="fg">
@@ -286,7 +286,7 @@
</div>
</div>
<div class="hint" style="margin-top:6px;color:var(--warning)">
<i class="bi bi-exclamation-triangle"></i> <strong>Geofencing:</strong> Karyawan hanya bisa absen jika berada dalam radius yang ditentukan dari koordinat kantor. Nonaktifkan jika karyawan bekerja remote/lapangan.
<i class="bi bi-exclamation-triangle"></i> <strong><%= t('admin.set.geo_label','Geofencing:') %></strong> <%= t('admin.set.geo_desc','Karyawan hanya bisa absen jika berada dalam radius yang ditentukan dari koordinat kantor. Nonaktifkan jika karyawan bekerja remote/lapangan.') %>
</div>
</div>
<div class="fg">
@@ -301,9 +301,9 @@
<div class="fg">
<label class="fl"><%= t('admin.settings.timezone', 'Zona Waktu') %></label>
<select class="fs" name="timezone">
<option value="Asia/Jakarta" <%= settings.timezone === 'Asia/Jakarta' ? 'selected' : '' %>>WIB (Asia/Jakarta)</option>
<option value="Asia/Makassar" <%= settings.timezone === 'Asia/Makassar' ? 'selected' : '' %>>WITA (Asia/Makassar)</option>
<option value="Asia/Jayapura" <%= settings.timezone === 'Asia/Jayapura' ? 'selected' : '' %>>WIT (Asia/Jayapura)</option>
<option value="Asia/Jakarta" <%= settings.timezone === 'Asia/Jakarta' ? 'selected' : '' %>><%= t('admin.set.tz_wib','WIB (Asia/Jakarta)') %></option>
<option value="Asia/Makassar" <%= settings.timezone === 'Asia/Makassar' ? 'selected' : '' %>><%= t('admin.set.tz_wita','WITA (Asia/Makassar)') %></option>
<option value="Asia/Jayapura" <%= settings.timezone === 'Asia/Jayapura' ? 'selected' : '' %>><%= t('admin.set.tz_wit','WIT (Asia/Jayapura)') %></option>
</select>
</div>
<div class="fg">
@@ -318,7 +318,7 @@
<i class="bi bi-robot"></i> <strong>Otomatisasi dipindah:</strong> Auto-Nonaktif, Auto-Hapus, Auto-Peringatan &amp; Auto-Lunas kini tertata di menu <a href="/admin/automation" style="color:var(--primary);font-weight:800">Automation &rarr;</a>
</div>
<div class="hint" style="margin-top:6px;color:var(--warning)">
<i class="bi bi-info-circle"></i> <strong>Pembayaran Kolektor:</strong> Pengaturan approval pembayaran kolektor sekarang diatur per akun kolektor pada menu Manajemen Kolektor, bukan dari pengaturan global.
<i class="bi bi-info-circle"></i> <strong><%= t('admin.set.colpay_label','Pembayaran Kolektor:') %></strong> <%= t('admin.set.colpay_desc','Pengaturan approval pembayaran kolektor sekarang diatur per akun kolektor pada menu Manajemen Kolektor, bukan dari pengaturan global.') %>
</div>
</div>
@@ -348,16 +348,16 @@
<div id="genieacs_external_fields" <% if (settings.use_builtin_acs) { %>style="display:none;"<% } %>>
<div class="fg">
<label class="fl">GenieACS API URL</label>
<label class="fl"><%= t('admin.set.acs_url','GenieACS API URL') %></label>
<input class="fc" name="genieacs_url" value="<%= settings.genieacs_url || '' %>" placeholder="http://192.168.8.89:7557">
</div>
<div class="form-row">
<div class="fg">
<label class="fl">GenieACS Username</label>
<label class="fl"><%= t('admin.set.acs_user','GenieACS Username') %></label>
<input class="fc" name="genieacs_username" value="<%= settings.genieacs_username || '' %>">
</div>
<div class="fg">
<label class="fl">GenieACS Password</label>
<label class="fl"><%= t('admin.set.acs_pass','GenieACS Password') %></label>
<input class="fc" type="password" name="genieacs_password" value="<%= settings.genieacs_password || '' %>">
</div>
</div>
@@ -366,17 +366,17 @@
<!-- Multi-Router Mode Settings -->
<div class="form-row" style="margin-top:20px; background:rgba(34,197,94,0.08); padding:12px; border-radius:8px; border:1px dashed rgba(34,197,94,0.3);">
<div class="fg" style="flex:1">
<label class="fl"><i class="bi bi-shuffle"></i> Mode Multi-Router</label>
<label class="fl"><i class="bi bi-shuffle"></i> <%= t('admin.set.mr_mode','Mode Multi-Router') %></label>
<select class="fs" name="multi_router_mode" id="multi_router_mode_select" onchange="toggleMultiRouterUI()">
<option value="active" <%= (settings.multi_router_mode === 'active' || !settings.multi_router_mode) ? 'selected' : '' %>>Aktif (Multiple Router)</option>
<option value="disabled" <%= settings.multi_router_mode === 'disabled' ? 'selected' : '' %>>Nonaktif (Single Router Mode)</option>
<option value="active" <%= (settings.multi_router_mode === 'active' || !settings.multi_router_mode) ? 'selected' : '' %>><%= t('admin.set.mr_on','Aktif (Multiple Router)') %></option>
<option value="disabled" <%= settings.multi_router_mode === 'disabled' ? 'selected' : '' %>><%= t('admin.set.mr_off','Nonaktif (Single Router Mode)') %></option>
</select>
<div class="hint">Pilih mode operasional MikroTik: Aktif untuk multi-router, Nonaktif untuk single router dengan fallback otomatis</div>
<div class="hint"><%= t('admin.set.mr_hint','Pilih mode operasional MikroTik: Aktif untuk multi-router, Nonaktif untuk single router dengan fallback otomatis') %></div>
</div>
<div class="fg" id="default_router_div" style="flex:1; <%= (settings.multi_router_mode === 'disabled') ? '' : 'display:none' %>">
<label class="fl">Default Router ID <span style="color:var(--muted); font-weight:normal;">(Opsional)</span></label>
<input class="fc" type="number" name="default_router_id" id="default_router_id" value="<%= settings.default_router_id || '' %>" placeholder="Kosongkan untuk auto-detect" min="1">
<div class="hint">Opsional. Jika kosong, sistem auto-detect router pertama (ID terkecil). Jika diisi, gunakan nilai ini.</div>
<div class="hint"><%= t('admin.set.mr_default_hint','Opsional. Jika kosong, sistem auto-detect router pertama (ID terkecil). Jika diisi, gunakan nilai ini.') %></div>
</div>
</div>
@@ -392,21 +392,21 @@
<div class="form-row" style="margin-top:20px">
<div class="fg">
<label class="fl">MikroTik IP / Host</label>
<label class="fl"><%= t('admin.set.mt_ip','MikroTik IP / Host') %></label>
<input class="fc" name="mikrotik_host" value="<%= settings.mikrotik_host || '' %>" placeholder="192.168.1.1">
</div>
<div class="fg">
<label class="fl">MikroTik API Port</label>
<label class="fl"><%= t('admin.set.mt_port','MikroTik API Port') %></label>
<input class="fc" type="number" name="mikrotik_port" value="<%= settings.mikrotik_port || 8728 %>" placeholder="8728">
</div>
</div>
<div class="form-row">
<div class="fg">
<label class="fl">MikroTik API User</label>
<label class="fl"><%= t('admin.set.mt_user','MikroTik API User') %></label>
<input class="fc" name="mikrotik_user" value="<%= settings.mikrotik_user || '' %>">
</div>
<div class="fg">
<label class="fl">MikroTik API Password</label>
<label class="fl"><%= t('admin.set.mt_pass','MikroTik API Password') %></label>
<input class="fc" type="password" name="mikrotik_password" value="<%= settings.mikrotik_password || '' %>">
</div>
</div>
@@ -418,16 +418,16 @@
<h6 style="font-size:13px;color:var(--muted);margin-bottom:12px;text-transform:uppercase;letter-spacing:1px"><i class="bi bi-shield-lock"></i> Kredensial Admin</h6>
<div class="form-row">
<div class="fg">
<label class="fl">Username Admin</label>
<label class="fl"><%= t('admin.set.admin_user','Username Admin') %></label>
<input class="fc" name="admin_username" value="<%= settings.admin_username || '' %>">
</div>
<div class="fg">
<label class="fl">Password Admin</label>
<label class="fl"><%= t('admin.set.admin_pass','Password Admin') %></label>
<input class="fc" type="password" name="admin_password" value="<%= settings.admin_password || '' %>">
</div>
</div>
<div class="fg">
<label class="fl">Admin API Key (Untuk akses luar)</label>
<label class="fl"><%= t('admin.set.admin_key','Admin API Key (Untuk akses luar)') %></label>
<input class="fc" name="admin_api_key" value="<%= settings.admin_api_key || '' %>">
</div>
</div>
@@ -436,19 +436,19 @@
<div data-setcat="notif">
<h6 style="font-size:13px;color:var(--muted);margin-bottom:12px;text-transform:uppercase;letter-spacing:1px"><i class="bi bi-whatsapp"></i> Integrasi WhatsApp</h6>
<div class="fg">
<label class="fl">Enable WhatsApp Bot</label>
<label class="fl"><%= t('admin.set.wa_enable','Enable WhatsApp Bot') %></label>
<select class="fs" name="whatsapp_enabled">
<option value="true" <%= settings.whatsapp_enabled ? 'selected' : '' %>><%= t('common.active','Aktif') %></option>
<option value="false" <%= !settings.whatsapp_enabled ? 'selected' : '' %>><%= t('common.inactive','Nonaktif') %></option>
</select>
</div>
<div class="fg">
<label class="fl">Nomor Admin WA (Pisahkan dengan koma)</label>
<label class="fl"><%= t('admin.set.wa_numbers','Nomor Admin WA (Pisahkan dengan koma)') %></label>
<input class="fc" name="whatsapp_admin_numbers" value="<%= (settings.whatsapp_admin_numbers || []).join(', ') %>" placeholder="6281xxx, 6282xxx">
<div style="font-size:10px; color:var(--muted); margin-top:4px">Nomor admin akan menerima notifikasi monitoring sistem. Nomor teknisi diambil otomatis dari <a href="/admin/technicians" style="color:var(--brand);font-weight:600">Data Teknisi</a>.</div>
</div>
<div class="fg">
<label class="fl">Jeda Antar Pesan Broadcast (Detik)</label>
<label class="fl"><%= t('admin.set.wa_delay','Jeda Antar Pesan Broadcast (Detik)') %></label>
<input class="fc" type="number" name="whatsapp_broadcast_delay" value="<%= settings.whatsapp_broadcast_delay || 2 %>" min="1" max="60">
<div style="font-size:10px; color:var(--muted); margin-top:4px">Rekomendasi: Minimal 2 detik agar tidak terdeteksi spam oleh WhatsApp.</div>
</div>