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

+39
View File
@@ -0,0 +1,39 @@
<%- include('partials/header') %>
<div style="display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px">
<div>
<h5 style="margin:0;font-weight:700"><%= t('tech.pool.title', 'Tiket Baru') %></h5>
<div class="muted" style="font-size:12px"><%= t('tech.pool.subtitle', 'Daftar keluhan yang belum ditangani') %></div>
</div>
<div style="width:42px;height:42px;border-radius:50%;background:var(--ddim);color:var(--danger);display:grid;place-items:center;font-weight:800;flex:0 0 auto"><%= tickets.length %></div>
</div>
<% if (tickets.length === 0) { %>
<div class="p-empty">
<i class="bi bi-clipboard-check"></i>
<p style="font-size:13px"><%= t('tech.pool.empty', 'Tidak ada keluhan baru saat ini.') %><br><%= t('tech.pool.empty_hint', 'Semua pelanggan berjalan normal.') %></p>
</div>
<% } else { %>
<% tickets.forEach(function(ticket){ %>
<div class="p-card" style="border-color:var(--danger-glow)">
<div style="display:flex;justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:8px">
<span class="badge-status badge-open"><i class="bi bi-exclamation-circle-fill"></i> <%= t('tech.ticket.open', 'Belum Ditangani') %></span>
<span class="muted" style="font-size:11px"><%= typeof formatDateLocal === 'function' ? formatDateLocal(ticket.created_at) : (ticket.created_at ? new Date(ticket.created_at).toLocaleString('id-ID', {day:'2-digit', month:'short', hour:'2-digit', minute:'2-digit'}) : '-') %></span>
</div>
<div style="font-weight:700;font-size:15px"><%= ticket.customer_name %></div>
<div class="muted" style="font-size:12px;margin:6px 0 0"><i class="bi bi-geo-alt-fill"></i> <%= ticket.customer_address || t('tech.ticket.no_address', 'Tidak ada alamat') %></div>
<div class="ticket-msg">
<div class="subj" style="color:var(--danger)"><%= ticket.subject %></div>
<div><%= ticket.message %></div>
</div>
<form method="POST" action="/tech/tickets/<%= ticket.id %>/take">
<button type="submit" class="p-btn primary" onclick="return confirm(<%- JSON.stringify(t('tech.pool.take_confirm', 'Ambil tiket ini untuk Anda kerjakan sekarang?')).split('<').join('\\u003c') %>)"><i class="bi bi-hand-index-thumb-fill"></i> <%= t('tech.pool.take_action', 'Ambil Tugas Ini') %></button>
</form>
</div>
<% }); %>
<% } %>
<%- include('partials/bottom_nav') %>