OPEN-ISP v0.5 (pickle-lime) — rilis open-source perdana

Aplikasi billing & manajemen ISP (fiber optic) — PWA pelanggan, portal teknisi & kolektor,
admin panel lengkap, multi-vendor OLT, RADIUS, WhatsApp/Telegram, pembayaran QRIS.

Kredit & lisensi (ISC):
- Base kode & repo: alijayanet/billing-rtrw oleh Alijaya Net — terima kasih banyak
  atas base kode dan repo yang bermanfaat.
- Add-on: GoWA, LibreSpeed/OpenSpeedTest, Uptime Kuma, notification-forwarder.
- Dikembangkan menjadi OPEN-ISP oleh oxpoe — https://github.com/oxpoe/open-isp
This commit is contained in:
oxpoe committed 2026-10-09 05:51:21 +07:00
commit eaf05f2811
280 files changed
+123975

No files matched your search

+176
View File
@@ -0,0 +1,176 @@
<!DOCTYPE html>
<html lang="<%= lang || 'id' %>">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Kas Masuk | <%= company %></title>
<link rel="stylesheet" href="/vendor/bootstrap-icons/bootstrap-icons.min.css">
<link rel="stylesheet" href="/css/admin.css">
<style>
.val-box { background: var(--bg2); padding: 16px; border-radius: 12px; border: 1px solid var(--border); display: flex; align-items: center; gap: 14px; }
.val-icon { width: 44px; height: 44px; border-radius: 10px; display: grid; place-items: center; font-size: 20px; }
.val-text { font-size: 13px; color: var(--muted); }
.val-num { font-size: 22px; font-weight: 700; color: var(--text); line-height: 1.2; }
</style>
</head>
<body>
<%- include('../partials/sidebar', { activePage: 'cash_in', company }) %>
<div class="mw">
<div class="topbar">
<div class="tb-title"><button class="hb-menu" onclick="toggleSidebar()"><i class="bi bi-list"></i></button><i class="bi bi-cash-stack"></i> Kas Masuk (Lain-lain)</div>
<div class="tb-right">
<span class="adm-badge" style="font-size:12px;opacity:0.7;"><%= company %></span>
<span class="adm-badge"><i class="bi bi-person-fill"></i> <%= (typeof session !== 'undefined' && session && session.isCashier) ? 'Kasir' : 'Admin' %></span>
<button class="btn btn-p btn-sm" onclick="openModal('addModal')"><i class="bi bi-plus-lg"></i> Tambah Kas Masuk</button>
</div>
</div>
<div class="page">
<% if (msg) { %>
<div class="alert alert-<%= msg.type==='success'?'s':'d' %>">
<i class="bi bi-<%= msg.type==='success'?'check-circle':'exclamation-circle' %>"></i> <%= msg.text %>
</div>
<% } %>
<div class="alert alert-w mb-3">
<i class="bi bi-info-circle-fill"></i> <strong>Informasi:</strong> Halaman ini digunakan untuk mencatat kas masuk / pemasukan <strong>selain</strong> dari pembayaran tagihan pelanggan (misal: modal awal, penjualan perangkat bekas, dll). Pendapatan tagihan pelanggan sudah otomatis dicatat di laporan.
</div>
<%
const totalThisMonth = cashIn.filter(e => e.date.startsWith(getNowLocal().substring(0,7))).reduce((a,b)=>a+Number(b.amount), 0);
const totalAll = cashIn.reduce((a,b)=>a+Number(b.amount), 0);
%>
<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(280px,1fr));gap:16px;margin-bottom:20px">
<div class="val-box">
<div class="val-icon" style="background:rgba(16, 185, 129, 0.1);color:#10b981"><i class="bi bi-graph-up-arrow"></i></div>
<div>
<div class="val-text">Kas Masuk Bulan Ini</div>
<div class="val-num">Rp <%= totalThisMonth.toLocaleString('id-ID') %></div>
</div>
</div>
<div class="val-box">
<div class="val-icon" style="background:rgba(59, 130, 246, 0.1);color:#3b82f6"><i class="bi bi-piggy-bank-fill"></i></div>
<div>
<div class="val-text">Total Kas Masuk (Lainnya)</div>
<div class="val-num">Rp <%= totalAll.toLocaleString('id-ID') %></div>
</div>
</div>
</div>
<!-- Table -->
<div class="card">
<div class="card-hd"><h6><i class="bi bi-list-ul"></i> Riwayat Kas Masuk</h6></div>
<div class="tbl-wrap">
<table class="dtbl">
<thead>
<tr>
<th><%= t('common.date','Tanggal') %></th>
<th><%= t('common.category','Kategori') %></th>
<th><%= t('common.desc_note','Deskripsi / Catatan') %></th>
<th>Metode</th>
<th class="num"><%= t('common.amount_qty','Jumlah') %></th>
<th>Pencatat</th>
<th><%= t('common.actions','Aksi') %></th>
</tr>
</thead>
<tbody>
<% if (cashIn.length===0) { %>
<tr><td colspan="7" class="text-center text-muted" style="padding:32px">Belum ada data kas masuk.</td></tr>
<% } %>
<% cashIn.forEach((item)=>{ %>
<tr>
<td style="white-space:nowrap"><%= formatDateLocal(item.date) %></td>
<td><span class="badge bs"><%= item.category %></span></td>
<td style="max-width:300px;white-space:normal">
<strong><%= item.description %></strong>
<% if(item.receipt_number){ %><div style="font-size:11px;color:var(--muted);margin-top:2px"><i class="bi bi-receipt"></i> <%= item.receipt_number %></div><% } %>
</td>
<td>
<span class="badge bm"><%= String(item.payment_method).toUpperCase() %></span>
</td>
<td class="num fw6" style="color:#10b981">+ Rp <%= Number(item.amount).toLocaleString('id-ID') %></td>
<td style="font-size:12px"><%= item.recorded_by_name || 'Admin' %></td>
<td>
<form method="POST" action="/admin/finance/cash-in/<%= item.id %>/delete" style="display:inline" onsubmit="return confirm('Hapus data kas masuk ini?')">
<button class="btn btn-d btn-icon btn-sm" title="Hapus"><i class="bi bi-trash"></i></button>
</form>
</td>
</tr>
<% }) %>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Modal Add -->
<div class="mo" id="addModal">
<div class="mb">
<div class="mh"><span class="mt"><i class="bi bi-plus-circle"></i> Catat Kas Masuk</span><button type="button" class="mc" onclick="closeModal('addModal')">&times;</button></div>
<form method="POST" action="/admin/finance/cash-in">
<div class="mbody">
<div class="form-row">
<div class="fg">
<label class="fl"><%= t('common.date','Tanggal') %> <span class="text-danger">*</span></label>
<input type="date" class="fc" name="date" required value="<%= getNowLocal().substring(0,10) %>" max="<%= getNowLocal().substring(0,10) %>">
</div>
<div class="fg">
<label class="fl">Sumber / Kategori <span class="text-danger">*</span></label>
<select class="fc" name="category" required>
<option value="Modal Usaha">Modal Usaha / Suntikan Dana</option>
<option value="Penjualan Aset">Penjualan Aset/Barang Bekas</option>
<option value="Jasa Lainnya">Pendapatan Jasa Lainnya</option>
<option value="Lain-lain">Lain-lain</option>
</select>
</div>
</div>
<div class="fg">
<label class="fl">Jumlah / Nominal (Rp) <span class="text-danger">*</span></label>
<input type="text" class="fc" name="amount" id="amountInput" required placeholder="Contoh: 500.000" style="font-size:16px;font-weight:bold" autocomplete="off">
</div>
<div class="fg">
<label class="fl"><%= t('common.desc_note2','Deskripsi / Keterangan') %> <span class="text-danger">*</span></label>
<textarea class="fc" name="description" required placeholder="Suntikan modal dari owner..."></textarea>
</div>
<div class="form-row">
<div class="fg">
<label class="fl">Metode Penerimaan</label>
<select class="fc" name="payment_method">
<option value="cash">Tunai (Cash)</option>
<option value="transfer">Transfer Bank</option>
<option value="ewallet">E-Wallet (OVO/Dana/Gopay)</option>
</select>
</div>
<div class="fg">
<label class="fl">No. Referensi (Opsional)</label>
<input type="text" class="fc" name="receipt_number" placeholder="Bisa dikosongkan">
</div>
</div>
</div>
<div class="mf">
<button type="button" class="btn btn-g" onclick="closeModal('addModal')"><%= t('common.cancel','Batal') %></button>
<button type="submit" class="btn btn-p"><i class="bi bi-save"></i> Simpan Pemasukan</button>
</div>
</form>
</div>
</div>
<script>
function openModal(id){document.getElementById(id).classList.add('show')}
function closeModal(id){document.getElementById(id).classList.remove('show')}
document.querySelectorAll('.mo').forEach(m=>m.addEventListener('click',e=>{if(e.target===m)m.classList.remove('show')}));
setTimeout(()=>document.querySelectorAll('.alert').forEach(a=>a.style.display='none'),5000);
const amtInput = document.getElementById('amountInput');
if(amtInput){
amtInput.addEventListener('keyup', function(e) {
let val = this.value.replace(/[^0-9]/g, '');
if(val){
this.value = parseInt(val, 10).toLocaleString('id-ID');
} else {
this.value = '';
}
});
}
</script>
</body>
</html>
+121
View File
@@ -0,0 +1,121 @@
<!DOCTYPE html>
<html lang="<%= lang || 'id' %>">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Kategori Pengeluaran | <%= company %></title>
<link rel="stylesheet" href="/vendor/bootstrap-icons/bootstrap-icons.min.css">
<link rel="stylesheet" href="/css/admin.css">
<style>
.cat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; }
.cat-card { background: var(--bg2); border: 1px solid var(--border); border-radius: 12px; padding: 16px; display: flex; align-items: center; justify-content: space-between; transition: all 0.2s; }
.cat-card:hover { border-color: rgba(255,255,255,0.2); transform: translateY(-2px); }
.cat-info { display: flex; align-items: center; gap: 14px; }
.cat-icon { width: 42px; height: 42px; border-radius: 10px; display: grid; place-items: center; font-size: 18px; }
.cat-name { font-weight: 600; color: var(--text); font-size: 15px; margin-bottom: 2px; }
.cat-desc { font-size: 12px; color: var(--muted); line-height: 1.3; }
.icon-sel { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
.icon-sel label { cursor: pointer; }
.icon-sel input { display: none; }
.icon-box { width: 36px; height: 36px; border-radius: 8px; background: rgba(255,255,255,0.05); border: 1px solid transparent; display: grid; place-items: center; font-size: 16px; color: var(--muted); transition: 0.2s; }
.icon-sel input:checked + .icon-box { background: rgba(59, 130, 246, 0.2); color: #3b82f6; border-color: #3b82f6; }
</style>
</head>
<body>
<%- include('../partials/sidebar', { activePage: 'expense_categories', company }) %>
<div class="mw">
<div class="topbar">
<div class="tb-title"><button class="hb-menu" onclick="toggleSidebar()"><i class="bi bi-list"></i></button><i class="bi bi-tags"></i> Kategori Pengeluaran</div>
<div class="tb-right">
<span class="adm-badge" style="font-size:12px;opacity:0.7;"><%= company %></span>
<span class="adm-badge"><i class="bi bi-person-fill"></i> <%= (typeof session !== 'undefined' && session && session.isCashier) ? 'Kasir' : 'Admin' %></span>
<button class="btn btn-p btn-sm" onclick="openModal('addModal')"><i class="bi bi-plus-lg"></i> Tambah Kategori</button>
</div>
</div>
<div class="page">
<% if (msg) { %>
<div class="alert alert-<%= msg.type==='success'?'s':'d' %>">
<i class="bi bi-<%= msg.type==='success'?'check-circle':'exclamation-circle' %>"></i> <%= msg.text %>
</div>
<% } %>
<div class="alert alert-info mb-4" style="background:rgba(59,130,246,0.1); border:1px solid rgba(59,130,246,0.2); color:#bfdbfe;">
<i class="bi bi-lightbulb-fill"></i> Kategori ini digunakan untuk mengelompokkan jenis pengeluaran agar laporan laba rugi lebih mudah dibaca.
</div>
<div class="cat-grid">
<% categories.forEach(cat => { %>
<div class="cat-card">
<div class="cat-info">
<div class="cat-icon" <%- 'style="background: ' + cat.color + '20; color: ' + cat.color + ';"' %>>
<i class="<%= cat.icon || 'bi bi-tag' %>"></i>
</div>
<div>
<div class="cat-name"><%= cat.name %></div>
<div class="cat-desc"><%= cat.description || 'Tidak ada deskripsi' %></div>
</div>
</div>
<form method="POST" action="/admin/finance/expense-categories/<%= cat.id %>/delete" onsubmit="return confirm('Hapus kategori ini? (Pastikan tidak ada pengeluaran yang menggunakannya)')">
<button class="btn btn-d btn-icon btn-sm" style="opacity:0.7"><i class="bi bi-trash"></i></button>
</form>
</div>
<% }) %>
<% if(categories.length === 0) { %>
<div style="grid-column: 1/-1; padding: 40px; text-align:center; color:var(--muted); background:var(--bg2); border-radius:12px">
Belum ada kategori yang ditambahkan.
</div>
<% } %>
</div>
</div>
</div>
<!-- Modal Add -->
<div class="mo" id="addModal">
<div class="mb">
<div class="mh"><span class="mt"><i class="bi bi-plus-circle"></i> Tambah Kategori</span><button type="button" class="mc" onclick="closeModal('addModal')">&times;</button></div>
<form method="POST" action="/admin/finance/expense-categories">
<div class="mbody">
<div class="fg">
<label class="fl">Nama Kategori <span class="text-danger">*</span></label>
<input type="text" class="fc" name="name" required placeholder="Contoh: Bensin Kendaraan">
</div>
<div class="fg">
<label class="fl"><%= t('common.description','Deskripsi') %></label>
<textarea class="fc" name="description" placeholder="Beli Router Mikrotik RB750Gr3..."></textarea>
</div>
<div class="form-row mt-3">
<div class="fg">
<label class="fl">Pilih Ikon</label>
<div class="icon-sel">
<% const icons = ['bi-tag', 'bi-tools', 'bi-router', 'bi-wallet2', 'bi-lightning-charge', 'bi-car-front', 'bi-briefcase', 'bi-cup-hot', 'bi-house', 'bi-megaphone']; %>
<% icons.forEach((icon, i) => { %>
<label>
<input type="radio" name="icon" value="bi <%= icon %>" <%= i===0?'checked':'' %>>
<div class="icon-box"><i class="bi <%= icon %>"></i></div>
</label>
<% }) %>
</div>
</div>
<div class="fg" style="max-width: 120px;">
<label class="fl">Warna Label</label>
<input type="color" class="fc" name="color" value="#3b82f6" style="padding: 4px; height: 42px; cursor: pointer;">
</div>
</div>
</div>
<div class="mf">
<button type="button" class="btn btn-g" onclick="closeModal('addModal')"><%= t('common.cancel','Batal') %></button>
<button type="submit" class="btn btn-p">Simpan Kategori</button>
</div>
</form>
</div>
</div>
<script>
function openModal(id){document.getElementById(id).classList.add('show')}
function closeModal(id){document.getElementById(id).classList.remove('show')}
document.querySelectorAll('.mo').forEach(m=>m.addEventListener('click',e=>{if(e.target===m)m.classList.remove('show')}));
setTimeout(()=>document.querySelectorAll('.alert').forEach(a=>a.style.display='none'),5000);
</script>
</body>
</html>
+185
View File
@@ -0,0 +1,185 @@
<!DOCTYPE html>
<html lang="<%= lang || 'id' %>">
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Pengeluaran | <%= company %></title>
<link rel="stylesheet" href="/vendor/bootstrap-icons/bootstrap-icons.min.css">
<link rel="stylesheet" href="/css/admin.css">
<style>
.val-box { background: var(--bg2); padding: 16px; border-radius: 12px; border: 1px solid var(--border); display: flex; align-items: center; gap: 14px; }
.val-icon { width: 44px; height: 44px; border-radius: 10px; display: grid; place-items: center; font-size: 20px; }
.val-text { font-size: 13px; color: var(--muted); }
.val-num { font-size: 22px; font-weight: 700; color: var(--text); line-height: 1.2; }
.filter-bar{background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:14px 18px;margin-bottom:18px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}
</style>
</head>
<body>
<%- include('../partials/sidebar', { activePage: 'expenses', company }) %>
<div class="mw">
<div class="topbar">
<div class="tb-title"><button class="hb-menu" onclick="toggleSidebar()"><i class="bi bi-list"></i></button><i class="bi bi-wallet2"></i> Pengeluaran (Cash Out)</div>
<div class="tb-right">
<span class="adm-badge" style="font-size:12px;opacity:0.7;"><%= company %></span>
<span class="adm-badge"><i class="bi bi-person-fill"></i> <%= (typeof session !== 'undefined' && session && session.isCashier) ? 'Kasir' : 'Admin' %></span>
<button class="btn btn-p btn-sm" onclick="openModal('addModal')"><i class="bi bi-plus-lg"></i> Catat Pengeluaran</button>
</div>
</div>
<div class="page">
<% if (msg) { %>
<div class="alert alert-<%= msg.type==='success'?'s':'d' %>">
<i class="bi bi-<%= msg.type==='success'?'check-circle':'exclamation-circle' %>"></i> <%= msg.text %>
</div>
<% } %>
<%
const totalThisMonth = expenses.filter(e => e.date.startsWith(getNowLocal().substring(0,7))).reduce((a,b)=>a+Number(b.amount), 0);
const totalAll = expenses.reduce((a,b)=>a+Number(b.amount), 0);
%>
<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(280px,1fr));gap:16px;margin-bottom:20px">
<div class="val-box">
<div class="val-icon" style="background:rgba(239, 68, 68, 0.1);color:#ef4444"><i class="bi bi-graph-down-arrow"></i></div>
<div>
<div class="val-text">Pengeluaran Bulan Ini</div>
<div class="val-num">Rp <%= totalThisMonth.toLocaleString('id-ID') %></div>
</div>
</div>
<div class="val-box">
<div class="val-icon" style="background:rgba(99, 102, 241, 0.1);color:#6366f1"><i class="bi bi-wallet-fill"></i></div>
<div>
<div class="val-text">Total Pengeluaran Dicatat</div>
<div class="val-num">Rp <%= totalAll.toLocaleString('id-ID') %></div>
</div>
</div>
</div>
<!-- Table -->
<div class="card">
<div class="card-hd"><h6><i class="bi bi-list-ul"></i> Riwayat Pengeluaran</h6></div>
<div class="tbl-wrap">
<table class="dtbl">
<thead>
<tr>
<th><%= t('common.date','Tanggal') %></th>
<th><%= t('common.category','Kategori') %></th>
<th><%= t('common.desc_note','Deskripsi / Catatan') %></th>
<th>Vendor/Toko</th>
<th>Metode</th>
<th class="num"><%= t('common.amount_qty','Jumlah') %></th>
<th>Pencatat</th>
<th><%= t('common.actions','Aksi') %></th>
</tr>
</thead>
<tbody>
<% if (expenses.length===0) { %>
<tr><td colspan="8" class="text-center text-muted" style="padding:32px">Belum ada data pengeluaran.</td></tr>
<% } %>
<% expenses.forEach((item)=>{ %>
<tr>
<td style="white-space:nowrap"><%= formatDateLocal(item.date) %></td>
<td>
<span class="badge" <%- 'style="background: ' + (item.category_color ? item.category_color+'20' : 'rgba(255,255,255,0.1)') + '; color: ' + (item.category_color || 'white') + '; border: 1px solid ' + (item.category_color ? item.category_color+'50' : 'rgba(255,255,255,0.2)') + ';"' %>>
<i class="<%= item.category_icon || 'bi bi-tag' %>"></i> <%= item.category %>
</span>
</td>
<td style="max-width:300px;white-space:normal">
<strong><%= item.description %></strong>
<% if(item.receipt_number){ %><div style="font-size:11px;color:var(--muted);margin-top:2px"><i class="bi bi-receipt"></i> <%= item.receipt_number %></div><% } %>
</td>
<td><%= item.vendor || '-' %></td>
<td>
<span class="badge bm"><%= String(item.payment_method).toUpperCase() %></span>
</td>
<td class="num fw6" style="color:#ef4444">- Rp <%= Number(item.amount).toLocaleString('id-ID') %></td>
<td style="font-size:12px"><%= item.recorded_by_name || 'Admin' %></td>
<td>
<form method="POST" action="/admin/finance/expenses/<%= item.id %>/delete" style="display:inline" onsubmit="return confirm('Hapus data pengeluaran ini?')">
<button class="btn btn-d btn-icon btn-sm" title="Hapus"><i class="bi bi-trash"></i></button>
</form>
</td>
</tr>
<% }) %>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Modal Add -->
<div class="mo" id="addModal">
<div class="mb">
<div class="mh"><span class="mt"><i class="bi bi-plus-circle"></i> Catat Pengeluaran Baru</span><button type="button" class="mc" onclick="closeModal('addModal')">&times;</button></div>
<form method="POST" action="/admin/finance/expenses">
<div class="mbody">
<div class="form-row">
<div class="fg">
<label class="fl">Tanggal Pengeluaran <span class="text-danger">*</span></label>
<input type="date" class="fc" name="date" required value="<%= getNowLocal().substring(0,10) %>" max="<%= getNowLocal().substring(0,10) %>">
</div>
<div class="fg">
<label class="fl"><%= t('common.category','Kategori') %> <span class="text-danger">*</span></label>
<select class="fc" name="category" required>
<option value="">-- Pilih Kategori --</option>
<% categories.forEach(c => { %>
<option value="<%= c.name %>"><%= c.name %></option>
<% }) %>
</select>
</div>
</div>
<div class="fg">
<label class="fl">Jumlah / Nominal (Rp) <span class="text-danger">*</span></label>
<input type="text" class="fc" name="amount" id="amountInput" required placeholder="Contoh: 150.000" style="font-size:16px;font-weight:bold" autocomplete="off">
</div>
<div class="fg">
<label class="fl"><%= t('common.desc_note2','Deskripsi / Keterangan') %> <span class="text-danger">*</span></label>
<textarea class="fc" name="description" required placeholder="Beli Router Mikrotik RB750Gr3..."></textarea>
</div>
<div class="form-row">
<div class="fg">
<label class="fl">Nama Toko/Vendor (Opsional)</label>
<input type="text" class="fc" name="vendor" placeholder="Misal: Tokopedia / Toko Komputer X">
</div>
<div class="fg">
<label class="fl">No. Nota / Kwitansi (Opsional)</label>
<input type="text" class="fc" name="receipt_number" placeholder="INV-123456">
</div>
</div>
<div class="fg">
<label class="fl">Metode Pembayaran</label>
<select class="fc" name="payment_method">
<option value="cash">Tunai (Cash)</option>
<option value="transfer">Transfer Bank</option>
<option value="ewallet">E-Wallet (OVO/Dana/Gopay)</option>
<option value="credit">Kredit / Paylater</option>
</select>
</div>
</div>
<div class="mf">
<button type="button" class="btn btn-g" onclick="closeModal('addModal')"><%= t('common.cancel','Batal') %></button>
<button type="submit" class="btn btn-p"><i class="bi bi-save"></i> Simpan Pengeluaran</button>
</div>
</form>
</div>
</div>
<script>
function openModal(id){document.getElementById(id).classList.add('show')}
function closeModal(id){document.getElementById(id).classList.remove('show')}
document.querySelectorAll('.mo').forEach(m=>m.addEventListener('click',e=>{if(e.target===m)m.classList.remove('show')}));
setTimeout(()=>document.querySelectorAll('.alert').forEach(a=>a.style.display='none'),5000);
// Format Rupiah Input
const amtInput = document.getElementById('amountInput');
if(amtInput){
amtInput.addEventListener('keyup', function(e) {
let val = this.value.replace(/[^0-9]/g, '');
if(val){
this.value = parseInt(val, 10).toLocaleString('id-ID');
} else {
this.value = '';
}
});
}
</script>
</body>
</html>