Update Banyak
This commit is contained in:
+1
-51
@@ -51,57 +51,7 @@ $stmt = $pdo->prepare("SELECT
|
||||
FROM v_jumlah_transaksi_tahunan WHERE tahun = '$tahun' $SqlDataId");
|
||||
$stmt->execute();
|
||||
$jumtahun = $stmt->fetchAll();
|
||||
// if($SvId == '1') {
|
||||
// $stmt = $pdo->prepare("SELECT SUM(order_aktif) AS order_aktif FROM v_jumlah_order_list ");
|
||||
// $stmt->execute();
|
||||
// $data = $stmt->fetchAll();
|
||||
|
||||
// $stmt = $pdo->prepare("SELECT
|
||||
// SUM(user_regis) AS user_regis,
|
||||
// SUM(user_aktif) AS user_aktif,
|
||||
// SUM(user_tidak_aktif) AS user_tidak_aktif,
|
||||
// SUM(user_konek) AS user_konek,
|
||||
// SUM(user_diskonek) AS user_diskonek
|
||||
// FROM v_jumlah_pelanggan ");
|
||||
// $stmt->execute();
|
||||
// $datauser = $stmt->fetchAll();
|
||||
|
||||
// $stmt = $pdo->prepare("SELECT
|
||||
// SUM(pemasukan) AS pemasukan,
|
||||
// SUM(pengeluaran) AS pengeluaran,
|
||||
// SUM(saldo) AS saldo
|
||||
// FROM v_jumlah_transaksi_bulanan WHERE bulan = '$bulan' ");
|
||||
// $stmt->execute();
|
||||
// $jumbulan = $stmt->fetchAll();
|
||||
|
||||
// $stmt = $pdo->prepare("SELECT
|
||||
// SUM(pemasukan) AS pemasukan,
|
||||
// SUM(pengeluaran) AS pengeluaran,
|
||||
// SUM(saldo) AS saldo
|
||||
// FROM v_jumlah_transaksi_tahunan WHERE tahun = '$tahun' ");
|
||||
// $stmt->execute();
|
||||
// $jumtahun = $stmt->fetchAll();
|
||||
|
||||
// } else {
|
||||
// $stmt = $pdo->prepare("SELECT * FROM v_jumlah_order_list $SqlDataWHId");
|
||||
// $stmt->execute();
|
||||
// $data = $stmt->fetchAll();
|
||||
|
||||
// $stmt = $pdo->prepare("SELECT * FROM v_jumlah_pelanggan $SqlDataWHId");
|
||||
// $stmt->execute();
|
||||
// $datauser = $stmt->fetchAll();
|
||||
|
||||
// $stmt = $pdo->prepare("SELECT * FROM v_jumlah_transaksi_bulanan WHERE bulan = '$bulan' $SqlDataId");
|
||||
// $stmt->execute();
|
||||
// $jumbulan = $stmt->fetchAll();
|
||||
|
||||
// $stmt = $pdo->prepare("SELECT * FROM v_jumlah_transaksi_tahunan WHERE tahun = '$tahun' $SqlDataId");
|
||||
// $stmt->execute();
|
||||
// $jumtahun = $stmt->fetchAll();
|
||||
// }
|
||||
|
||||
// print_r($datauser);
|
||||
// print_r($_SESSION);
|
||||
?>
|
||||
<!-- Main content -->
|
||||
<section class="content">
|
||||
@@ -351,7 +301,7 @@ $stmt = $pdo->prepare("SELECT
|
||||
<div class="card-body">
|
||||
<div class="direct-chat-messages" style="height: 450px">
|
||||
<?php
|
||||
$stmt = $pdo->prepare("SELECT * FROM v_tiket_gangguan WHERE status = '1' $SqlDataId ORDER BY level ASC, start_time DESC");
|
||||
$stmt = $pdo->prepare("SELECT * FROM v_tiket_gangguan WHERE status = '1' $SqlDataId ORDER BY COALESCE(level, 999) ASC, start_time DESC");
|
||||
$stmt->execute();
|
||||
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
// Tentukan warna garis berdasarkan level
|
||||
|
||||
+96
-2
@@ -52,6 +52,7 @@
|
||||
<div class="col-sm-6">
|
||||
<ol class="float-sm-right mb-0">
|
||||
<!--<a type="button" class="btn btn-danger btn-sm" data-toggle="modal" data-target="#staticBackdrop">Tambah</a>-->
|
||||
<a type="button" class="btn btn-success btn-sm" data-toggle="modal" data-target="#modalpesan">Kirim Pemberitahuan</a>
|
||||
</ol>
|
||||
</div>
|
||||
<!-- Modal Tambah -->
|
||||
@@ -129,6 +130,97 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- END Modal Tambah -->
|
||||
<!-- Modal Pesan Pemberitahuan -->
|
||||
<div class="modal fade" id="modalpesan" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-xl">
|
||||
<div class="modal-content">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="staticBackdropLabel">Tambah Server Aplikasi</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<div class="card-body pb-0">
|
||||
<div class="form-group">
|
||||
<label>Status Server</label>
|
||||
<select class="form-control" name="jenisserver">
|
||||
<option value="0">All Server</option>
|
||||
<option value="1">Aktif</option>
|
||||
<option value="2">Tidak Aktif</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="card-body pb-0">
|
||||
<div class="form-group">
|
||||
<label>Isi Pesan WhatsApp</label>
|
||||
<textarea class="form-control" rows="10" name="isipesan"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
<input type="submit" name="kirimpesan" class="btn btn-primary" value="Tambah">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END Modal Tambah -->
|
||||
<?php
|
||||
|
||||
if (isset($_POST['kirimpesan'])) {
|
||||
$now = date('Y-m-d'); // Tahun 4 digit
|
||||
|
||||
// Tentukan kondisi WHERE
|
||||
if ($_POST['jenisserver'] == 0) {
|
||||
$wer = "WHERE id != 1";
|
||||
} elseif ($_POST['jenisserver'] == 1) {
|
||||
$wer = "WHERE id != 1 AND expaired_date > :now";
|
||||
} elseif ($_POST['jenisserver'] == 2) {
|
||||
$wer = "WHERE id != 1 AND expaired_date < :now";
|
||||
} else {
|
||||
$wer = "";
|
||||
}
|
||||
|
||||
// Query database (ambil semua nomor)
|
||||
$sql = "SELECT whatsApp FROM data_server $wer";
|
||||
$stm = $pdo->prepare($sql);
|
||||
|
||||
// Bind parameter jika ada kondisi tanggal
|
||||
if ($_POST['jenisserver'] == 1 || $_POST['jenisserver'] == 2) {
|
||||
$stm->bindParam(':now', $now);
|
||||
}
|
||||
|
||||
$stm->execute();
|
||||
$data = $stm->fetchAll(PDO::FETCH_COLUMN); // langsung array nomor
|
||||
|
||||
// Hapus nomor kosong & duplikat
|
||||
$nomorList = array_filter(array_unique($data));
|
||||
|
||||
if (!empty($nomorList)) {
|
||||
$message = $_POST['isipesan'];
|
||||
$APIwa = new PesanWA();
|
||||
|
||||
// Kirim semua nomor sekaligus (array)
|
||||
$APIwa->Send_Pesan(1, 'sendMessage', $nomorList, $message);
|
||||
|
||||
sweetAlert("Pesan akan segera dikirim ke ".count($nomorList)." nomor", "success");
|
||||
} else {
|
||||
sweetAlert("Data nomor WhatsApp tidak ditemukan", "error");
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-header -->
|
||||
@@ -138,6 +230,7 @@
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>Nama Server</th>
|
||||
<th>Saldo Voucher</th>
|
||||
<th>Alamat</th>
|
||||
<th>Nama Admin</th>
|
||||
<th>Nomor WhatsApp</th>
|
||||
@@ -150,16 +243,17 @@
|
||||
<tbody>
|
||||
<?php
|
||||
$no = 1;
|
||||
$aserver = mysqli_query($con,"SELECT * FROM data_server WHERE id !='1' ORDER BY expaired_date DESC");
|
||||
$aserver = mysqli_query($con,"SELECT * FROM data_server LEFT JOIN v_akumulasi_paygw ON data_server.id=v_akumulasi_paygw.id_data_server WHERE id !='1' ORDER BY expaired_date DESC");
|
||||
while ($server = mysqli_fetch_assoc($aserver))
|
||||
{
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo $no; ?></td>
|
||||
<td><?php echo $server['nama_server']; ?></td>
|
||||
<td>Rp. <?php echo number_format($server['tersedia']); ?></td>
|
||||
<td style="max-width : 130px;"><?php echo $server['alamat']; ?></td>
|
||||
<td><?php echo $server['nama_pemilik']; ?></td>
|
||||
<td style="max-width : 100px;"><?php echo $server['nomor_whatsapp']; ?></td>
|
||||
<td style="max-width : 100px;"><?php echo $server['whatsapp']; ?></td>
|
||||
<td>Rp. <?php echo number_format($server['harga_sewa']); ?></td>
|
||||
<td><?php
|
||||
if ($server['expaired_date'] >= date('Y-m-d')) { ?>
|
||||
|
||||
+380
-62
@@ -36,6 +36,12 @@ $nomor = $data[0]['nomor_whatsapp'];
|
||||
$username = $data[0]['username'];
|
||||
$email = $data[0]['email'];
|
||||
$profile = $data[0]['profile'];
|
||||
$rek_nomor = $data[0]['rekening_nomor'];
|
||||
$rek_nama = $data[0]['rekening_nama'];
|
||||
$rek_bank = $data[0]['rekening_bank'];
|
||||
$rek_status = $data[0]['rekening_status'];
|
||||
$nama_server = $data[0]['nama_server'];
|
||||
$whatsapp = $data[0]['whatsapp'];
|
||||
// echo "<pre>";
|
||||
// print_r($data);
|
||||
// echo "</pre>";
|
||||
@@ -57,23 +63,30 @@ $profile = $data[0]['profile'];
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-header -->
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5">
|
||||
<div class="card">
|
||||
<div class="card-body" style="margin-bottom: -40px;">
|
||||
<div class="card">
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<div class="card-body">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<table class="table table-borderless">
|
||||
<center>
|
||||
<label>Foto Profile</label>
|
||||
<div class="uploadImage" data-id="profile" style="width: 25%; zoom: 60%;">
|
||||
<span>Click to upload image</span>
|
||||
<img src="#" alt="Image preview">
|
||||
<div data-id="profile" style="width: 80%; zoom: 60%;">
|
||||
<img src="img/user/<?= $profile; ?>" style="width: 100%; margin-top: 20px;">
|
||||
<div class="progressContainer">
|
||||
<div class="progressBar"></div>
|
||||
</div>
|
||||
</div>
|
||||
</center>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card-body">
|
||||
<table class="table table-borderless">
|
||||
<center>
|
||||
<label>Detail Akun</label>
|
||||
</center>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="p-2">Nama</td>
|
||||
@@ -99,46 +112,10 @@ $profile = $data[0]['profile'];
|
||||
</table>
|
||||
<input type="submit" class="btn btn-sm btn-primary m-1" name="simpan" value="Simpan">
|
||||
</form>
|
||||
|
||||
<?php if (isset($_SESSION['user'])) { ?>
|
||||
|
||||
<button class="btn btn-primary btn-block text-center" id="absenButton" onclick="handleAbsen()">Loading...</button>
|
||||
<script>
|
||||
let absenStatus = 'belum'; // default
|
||||
|
||||
function updateButtonFromStatus() {
|
||||
absenStatus = AndroidInterface.getTrackingStatus();
|
||||
const btn = document.getElementById('absenButton');
|
||||
|
||||
if (absenStatus === 'masuk') {
|
||||
btn.innerText = 'Absen Keluar';
|
||||
} else {
|
||||
btn.innerText = 'Absen Masuk';
|
||||
}
|
||||
}
|
||||
|
||||
function handleAbsen() {
|
||||
const userId = '<?=$id?>';
|
||||
const btn = document.getElementById('absenButton');
|
||||
|
||||
if (absenStatus === 'masuk') {
|
||||
AndroidInterface.stopTracking();
|
||||
absenStatus = 'belum';
|
||||
btn.innerText = 'Absen Masuk';
|
||||
} else {
|
||||
AndroidInterface.startTracking(userId);
|
||||
absenStatus = 'masuk';
|
||||
btn.innerText = 'Absen Keluar';
|
||||
}
|
||||
}
|
||||
|
||||
window.onload = updateButtonFromStatus;
|
||||
</script>
|
||||
|
||||
<?php } ?>
|
||||
|
||||
|
||||
<hr>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card-body">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<table class="table table-borderless">
|
||||
<center>
|
||||
@@ -179,8 +156,182 @@ $profile = $data[0]['profile'];
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card-body">
|
||||
|
||||
<?php if($_SESSION['master']) {
|
||||
$readolny = ($rek_status != 'verificated' && $rek_status != 'onverification') ? '' : 'readonly disabled'; ?>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<table class="table table-borderless">
|
||||
<center>
|
||||
<label>Rekening Bank
|
||||
<?= ($rek_status == 'onverification')
|
||||
? '<span class="badge badge-warning p-2">On Verification</span>'
|
||||
: (($rek_status == 'verificated')
|
||||
? '<span class="badge badge-success p-2">Verificated</span>'
|
||||
: ''); ?>
|
||||
</label>
|
||||
</center>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="p-2">Bank</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-3">
|
||||
<select class="form-control" id="bank_code" name="bank_code" required <?= $readolny ?>>
|
||||
<option value="">-- PILIH BANK --</option>
|
||||
<option value="bca" <?= ($rek_bank=='bca' ? 'selected' : '') ?>>BCA</option>
|
||||
<option value="bni" <?= ($rek_bank=='bni' ? 'selected' : '') ?>>BNI</option>
|
||||
<option value="bri" <?= ($rek_bank=='bri' ? 'selected' : '') ?>>BRI</option>
|
||||
<option value="mandiri"<?= ($rek_bank=='mandiri' ? 'selected' : '') ?>>Mandiri</option>
|
||||
<option value="bjb" <?= ($rek_bank=='bjb' ? 'selected' : '') ?>>BJB</option>
|
||||
<option value="cimb" <?= ($rek_bank=='cimb' ? 'selected' : '') ?>>CIMB</option>
|
||||
<option value="danamon"<?= ($rek_bank=='danamon' ? 'selected' : '') ?>>Danamon</option>
|
||||
<option value="permata"<?= ($rek_bank=='permata' ? 'selected' : '') ?>>Permata</option>
|
||||
<option value="maybank"<?= ($rek_bank=='maybank' ? 'selected' : '') ?>>Maybank</option>
|
||||
<option value="btn" <?= ($rek_bank=='btn' ? 'selected' : '') ?>>BTN</option>
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="p-2">Nomor Rekening</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-3">
|
||||
<input class="form-control" type="text" id="account_number" name="account_number"
|
||||
value="<?= htmlspecialchars($rek_nomor ?? '') ?>" required <?= $readolny ?>>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="p-2">Nama Penerima</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-1">
|
||||
<input class="form-control" type="text" id="account_holder" name="account_holder"
|
||||
value="<?= htmlspecialchars($rek_nama ?? '') ?>" readonly>
|
||||
</div>
|
||||
<span id="testStatusCek"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<?= ($rek_status != 'verificated' && $rek_status != 'onverification')
|
||||
? '<input type="submit" class="btn btn-sm btn-primary m-1" name="simpanrekening" value="Simpan">'
|
||||
: ''; ?>
|
||||
<?= ($rek_status == 'onverification')
|
||||
? '<input type="submit" class="btn btn-sm btn-success m-1" name="verifikasirek" value="Verifikasi Rekening">'
|
||||
: ''; ?>
|
||||
|
||||
</form>
|
||||
|
||||
<?php
|
||||
// if (isset($_POST['simpanrekening'])) {
|
||||
// $SQLrek = "UPDATE data_server
|
||||
// SET rekening_bank = :rekening_bank,
|
||||
// rekening_nomor = :rekening_nomor,
|
||||
// rekening_nama = :rekening_nama,
|
||||
// rekening_status = 'onverification'
|
||||
// WHERE id = :iddatas";
|
||||
// $stmt = $pdo->prepare($SQLrek);
|
||||
|
||||
// // pakai bindValue (langsung ambil dari $_POST)
|
||||
// $stmt->bindValue(':rekening_bank', $_POST['bank_code']);
|
||||
// $stmt->bindValue(':rekening_nomor', $_POST['account_number']);
|
||||
// $stmt->bindValue(':rekening_nama', $_POST['account_holder']);
|
||||
// $stmt->bindValue(':iddatas', $id, PDO::PARAM_INT);
|
||||
|
||||
// if ($stmt->execute()) {
|
||||
// $Pesan = "*Permintaan Verifikasi Rekening*
|
||||
|
||||
// Server : " . $nama_server . "
|
||||
// BANK : " . strtoupper($_POST['bank_code']) . "
|
||||
// Rekening : *" . $_POST['account_number'] . "*
|
||||
// Nama Rek : " . strtoupper($_POST['account_holder']) . "
|
||||
|
||||
// status : _*On Verification*_
|
||||
|
||||
|
||||
// _# Manja ~ Notif_
|
||||
// ";
|
||||
// $nomorWA = ['6281298698422', '6285655548738'];
|
||||
// $APIwa = new PesanWA();
|
||||
// $APIwa->Send_Pesan('1','sendMessage',$nomorWA,$Pesan);
|
||||
|
||||
// sweetAlert("BERHASIL.! Rekening telah ditambahkan silahkan tunggu verifikasi", "success");
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
if (isset($_POST['verifikasirek'])) {
|
||||
$SQLrek = "UPDATE data_server
|
||||
SET rekening_status = 'verificated'
|
||||
WHERE id = :iddatas";
|
||||
$stmt = $pdo->prepare($SQLrek);
|
||||
|
||||
$stmt->bindValue(':iddatas', $id, PDO::PARAM_INT);
|
||||
|
||||
$stmt->execute();
|
||||
$Pesanwarek = "*Verifikasi Rekening Berhasil*
|
||||
|
||||
Server : " . $nama_server . "
|
||||
BANK : " . strtoupper($rek_bank) . "
|
||||
Rekening : *" . $rek_nomor . "*
|
||||
Nama Rek : " . $rek_nama . "
|
||||
|
||||
status : _*Verificated*_
|
||||
|
||||
|
||||
_# Manja ~ Notif_
|
||||
";
|
||||
$nomorWArek = ["$whatsapp", "6281298698422", "6285655548738"];
|
||||
$APIwa = new PesanWA();
|
||||
$APIwa->Send_Pesan('1','sendMessage',$nomorWArek,$Pesanwarek);
|
||||
|
||||
sweetAlert("BERHASIL.! Rekening telah di verifikasi", "success");
|
||||
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
|
||||
<?php } ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<center>
|
||||
<p>Riwayat Pencairan Dana</p>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
<table id="withdrawTable" class="table table-striped table-bordered" style="zoom: 90%; width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Server</th>
|
||||
<th>Dibuat</th>
|
||||
<th>Nominal</th>
|
||||
<th>User</th>
|
||||
<th>Status</th>
|
||||
<th>Diproses</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<?php $data1111 = "123"; if (isset($id) && $data1111 == "123") { ?>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
@@ -335,13 +486,12 @@ $profile = $data[0]['profile'];
|
||||
<th>Priode</th>
|
||||
<th>Nominal</th>
|
||||
<th>Status</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
// Query untuk mengambil data dari tabel apk_payment
|
||||
$stmt = $pdo->prepare("SELECT * FROM apk_payment WHERE id_data_server = :id ORDER BY waktu_transaksi");
|
||||
$stmt = $pdo->prepare("SELECT * FROM apk_payment WHERE id_data_server = :id AND jenis IS NULL ORDER BY waktu_transaksi");
|
||||
$stmt->bindParam(':id', $id);
|
||||
$stmt->execute();
|
||||
|
||||
@@ -355,17 +505,6 @@ $profile = $data[0]['profile'];
|
||||
<td><?php echo htmlspecialchars($row['keterangan']); ?></td>
|
||||
<td><?php echo number_format($row['nominal'], 0, ',', '.'); ?></td>
|
||||
<td><?php echo htmlspecialchars($row['status']); ?></td>
|
||||
<td>
|
||||
<form method="post">
|
||||
<?php if($row['status'] == 'PENDING' || $row['status'] == 'BELUM DIBAYAR') { ?>
|
||||
<a href="payment/paydisini/?order_id=<?php echo htmlspecialchars($row['order_id']); ?>" class="btn btn-sm btn-primary m-1">Bayar</a>
|
||||
<?php if($row['status'] == 'BELUM DIBAYAR') { ?>
|
||||
<input type="submit" name="hapus<?php echo $row['id']; ?>" class="btn btn-sm btn-danger m-1" value="Hapus" >
|
||||
<?php } } else { ?>
|
||||
<a href="payment/paydisini/?order_id=<?php echo htmlspecialchars($row['order_id']); ?>" class="btn btn-sm btn-secondary m-1">Detail</a>
|
||||
<?php } ?>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
if(isset($_POST['hapus'.$row['id']]))
|
||||
@@ -402,6 +541,75 @@ $profile = $data[0]['profile'];
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<!--START Modal WithDrow-->
|
||||
<div class="modal fade" id="editModal" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="editModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<form id="editForm" method="post" enctype="multipart/form-data">
|
||||
<div class="modal-header bg-primary text-white">
|
||||
<h5 class="modal-title" id="staticBackdropLabel">Upload Bukti Success</h5>
|
||||
<button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
<input type="hidden" name="id" id="editId">
|
||||
<div class="form-group text-center">
|
||||
<label class="form-label d-block">Upload Gambar</label>
|
||||
|
||||
<!-- klik gambar untuk upload -->
|
||||
<img id="previewImg"
|
||||
src="img/imgblank.jpg"
|
||||
class="img-fluid mb-2 rounded border"
|
||||
style="max-height:500px; cursor:pointer;"
|
||||
onclick="document.getElementById('bukti_success').click();">
|
||||
|
||||
<!-- hidden input file -->
|
||||
<input type="file"
|
||||
class="form-control mt-2 d-none"
|
||||
name="bukti_success"
|
||||
id="bukti_success"
|
||||
accept="image/*"
|
||||
required>
|
||||
|
||||
<!-- tampilkan nama file -->
|
||||
<div id="fileName" class="mt-2 text-muted"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
<button type="submit" class="btn btn-primary">Simpan</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--END Modal WithDrow-->
|
||||
<div class="modal fade" id="viewBuktiModal" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered" style="max-width: fit-content; margin: auto;">
|
||||
<div class="modal-content border-0 bg-transparent shadow-none" style="width: auto;">
|
||||
<div class="position-relative d-inline-block">
|
||||
|
||||
<!-- Tombol Close -->
|
||||
<button type="button" class="close text-white position-absolute"
|
||||
data-dismiss="modal" aria-label="Close"
|
||||
style="top: 10px; right: 10px; filter: invert(1); z-index: 10;">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
|
||||
<!-- Gambar dari JS -->
|
||||
<img id="viewBuktiImg" src=""
|
||||
class="img-fluid rounded shadow d-block"
|
||||
alt="Bukti Transaksi" style="max-height: 600px;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<?php
|
||||
// if (isset($_POST['simpanPassword'])) {
|
||||
// if ($_POST['password'] == $_POST['confirm_password']) {
|
||||
@@ -507,4 +715,114 @@ document.querySelectorAll('.toggle-password').forEach(function(toggle) {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#withdrawTable').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"responsive": true,
|
||||
"ajax": {
|
||||
"url": "controller/get_withdrow.php?i=<?= $id; ?>",
|
||||
"type": "POST"
|
||||
},
|
||||
"pageLength": 10,
|
||||
"columns": [
|
||||
{ "data": 0 }, // Server
|
||||
{ "data": 1 }, // Dibuat
|
||||
{ "data": 2 }, // Nominal
|
||||
{ "data": 3 }, // User
|
||||
{
|
||||
"data": 4, // Status
|
||||
"render": function(data, type, row, meta) {
|
||||
if (data === 'pending') {
|
||||
return `<span class="badge bg-primary p-2">${data.toUpperCase()}</span>`;
|
||||
} else {
|
||||
return `<span class="badge bg-success p-2">${data.toUpperCase()}</span>`;
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "data": 5 }, // Diproses
|
||||
{
|
||||
"data": 6, // id unik
|
||||
"render": function(data, type, row, meta) {
|
||||
let btn = "";
|
||||
|
||||
if (row[4] === 'pending') {
|
||||
btn += `<button class="btn btn-sm btn-warning me-1" onclick="editData('${data.id}')">Bayar</button>`;
|
||||
}
|
||||
|
||||
if (row[4] === 'success') {
|
||||
btn += `<button class="btn btn-sm btn-secondary me-1" onclick="viewBukti('${data.bukti_success}')">
|
||||
<i class="fa fa-image"></i>
|
||||
</button>`;
|
||||
}
|
||||
|
||||
return btn;
|
||||
}
|
||||
}
|
||||
],
|
||||
"order": [[1, "desc"]] // urut berdasarkan Dibuat
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// Preview gambar saat pilih file
|
||||
document.getElementById("bukti_success").addEventListener("change", function(event){
|
||||
const file = event.target.files[0];
|
||||
if(file){
|
||||
// preview gambar
|
||||
const reader = new FileReader();
|
||||
reader.onload = function(e){
|
||||
document.getElementById("previewImg").src = e.target.result;
|
||||
}
|
||||
reader.readAsDataURL(file);
|
||||
|
||||
// tampilkan nama file
|
||||
document.getElementById("fileName").innerText = file.name;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function editData(id) {
|
||||
$("#editId").val(id); // set hidden input
|
||||
$("#bukti_success").val(""); // reset file input
|
||||
$("#previewImg").attr("src", "img/imgblank.jpg"); // reset preview
|
||||
$("#editModal").modal("show"); // tampilkan modal
|
||||
}
|
||||
|
||||
function viewBukti(imgPath) {
|
||||
$("#viewBuktiImg").attr("src", imgPath);
|
||||
$("#viewBuktiModal").modal("show");
|
||||
}
|
||||
|
||||
|
||||
// submit form
|
||||
$("#editForm").on("submit", function(e){
|
||||
e.preventDefault();
|
||||
let formData = new FormData(this);
|
||||
|
||||
$.ajax({
|
||||
url: "controller/update_withdraw.php",
|
||||
type: "POST",
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
success: function(res){
|
||||
try {
|
||||
let json = JSON.parse(res);
|
||||
if(json.success){
|
||||
Swal.fire("Berhasil!", json.message, "success");
|
||||
$("#editModal").modal("hide");
|
||||
$('#withdrawTable').DataTable().ajax.reload(null, false);
|
||||
} else {
|
||||
Swal.fire("Gagal!", json.message, "error");
|
||||
}
|
||||
} catch(e){
|
||||
Swal.fire("Error!", "Response tidak valid: " + res, "error");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
+503
-123
@@ -1,3 +1,7 @@
|
||||
<?php
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
?>
|
||||
<!-- Main content -->
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
@@ -11,6 +15,7 @@
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="float-sm-right mb-0">
|
||||
<a type="button" class="btn btn-secondary btn-sm m-1" data-toggle="modal" data-target="#ModalScript">Ambil Script</a>
|
||||
<a type="button" class="btn btn-danger btn-sm m-1" data-toggle="modal" data-target="#staticBackdrop">Generate</a>
|
||||
</ol>
|
||||
</div>
|
||||
@@ -88,6 +93,7 @@
|
||||
</div>
|
||||
<?php
|
||||
if (isset($_POST['generate'])) {
|
||||
|
||||
try {
|
||||
// Mulai transaksi DB
|
||||
$pdo->beginTransaction();
|
||||
@@ -111,7 +117,7 @@ if (isset($_POST['generate'])) {
|
||||
$data = json_decode($paket['radius_data']);
|
||||
$kode = $data ? 'VR' : 'VM'; // VR = Radius, VM = MikroTik
|
||||
$jenis = $data ? 'sv-radius' : 'sv-mikrotik';
|
||||
$karakter = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm";
|
||||
$karakter = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890";
|
||||
$str = $paket['durasi'];
|
||||
$jumlah = intval($_POST['jumlah']);
|
||||
$date = date('Y-m-d H:i:s');
|
||||
@@ -162,7 +168,7 @@ if (isset($_POST['generate'])) {
|
||||
}
|
||||
} else {
|
||||
|
||||
require('router_api/routeros_api.class.php');
|
||||
// require('router_api/routeros_api.class.php');
|
||||
$API = new RouterosAPI();
|
||||
$API->debug = false;
|
||||
|
||||
@@ -221,15 +227,72 @@ if (isset($_POST['generate'])) {
|
||||
sweetAlert("$totalSuccess voucher berhasil dibuat. Gagal: $totalError", "success");
|
||||
} catch (Exception $e) {
|
||||
$pdo->rollBack();
|
||||
// sweetAlert("Gagal membuat voucher: " . $e->getMessage(), "error");
|
||||
sweetAlert("Gagal membuat voucher: " . $e->getMessage(), "error");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
|
||||
<!--START Modal Data Script-->
|
||||
<div class="modal fade" id="ModalScript" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="ModalScriptLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered modal-lg">
|
||||
<div class="modal-content">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<div class="modal-header bg-secondary">
|
||||
<h5 class="modal-title" id="staticBackdropLabel">Script Tambahan Login Page</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<?php
|
||||
// ambil data server untuk script
|
||||
$ListServer = new Listdata();
|
||||
$ListServer->set_list("setting_mikrotik", $SqlDataWHId);
|
||||
?>
|
||||
<div class="form-group">
|
||||
<label>Nama Server</label>
|
||||
<select class="form-control" name="idmscript" id="idmscript">
|
||||
<?php foreach ($ListServer->get_list() as $value):
|
||||
$radius_data = json_decode($value['radius_nas_data']);
|
||||
$nasgroupname = $radius_data->data->{'nasgroupname'} ?? '';
|
||||
$dataUrl = encrypt_url(json_encode([
|
||||
'board' => $value['board_id'],
|
||||
'nasgroupname' => $nasgroupname
|
||||
]));
|
||||
?>
|
||||
<option value="<?= htmlspecialchars($dataUrl) ?>">
|
||||
<?= htmlspecialchars($value['nama']) ?>
|
||||
</option>
|
||||
<?php endforeach ?>
|
||||
</select>
|
||||
</div>
|
||||
<h6 class="mt-2 mb-2">Login Page Script</h6>
|
||||
<div class="mb-3">
|
||||
<div class="text-right" style="margin-bottom: -33px; margin-right: 2px;">
|
||||
<a onclick="copyToClipboard('script-page')" class="btn btn-sm btn-light btn-icon" title="Copy">
|
||||
<i class="fa fa-copy"></i>
|
||||
</a>
|
||||
</div>
|
||||
<pre class="bg-light border rounded p-3 mb-2" id="script-page">
|
||||
Loading script...
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--END Modal Data Script-->
|
||||
|
||||
|
||||
<!-- /.card-header -->
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-7">
|
||||
<div class="col-md-5">
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-2">
|
||||
|
||||
@@ -246,7 +309,7 @@ if (isset($_POST['generate'])) {
|
||||
<div class="small-box bg-info" id="penjualanBox">
|
||||
<div class="inner">
|
||||
<h4 id="totalValue">0</h4>
|
||||
<p>Total Penjualan</p>
|
||||
<p><small>Total Penjualan</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
@@ -258,19 +321,19 @@ if (isset($_POST['generate'])) {
|
||||
<div class="small-box bg-danger" id="lunasBox">
|
||||
<div class="inner">
|
||||
<h4 id="ditahanValue">0</h4>
|
||||
<p>Saldo Ditahan</p>
|
||||
<p><small>Saldo Ditahan</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-6">
|
||||
<div class="col-lg-4 col-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" id="pendingBox">
|
||||
<div class="inner">
|
||||
<h4 id="tersediaValue">0</h4>
|
||||
<p>Saldo Tersedia</p>
|
||||
<p><small>Saldo Tersedia</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
@@ -279,40 +342,302 @@ if (isset($_POST['generate'])) {
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-5">
|
||||
<?php
|
||||
// Ambil semua data Mikrotik langsung
|
||||
$List = new Listdata();
|
||||
$List->set_list("setting_mikrotik", $SqlDataWHId);
|
||||
?>
|
||||
<h6 class="mt-2 mb-2">Mikrotik</h6>
|
||||
<select class="form-control" name="idmscript" id="idmscript">
|
||||
<?php foreach ($List->get_list() as $value):
|
||||
$radius_data = json_decode($value['radius_nas_data']);
|
||||
$nasgroupname = $radius_data->data->{'nasgroupname'} ?? '';
|
||||
$dataUrl = encrypt_url(json_encode([
|
||||
'board' => $value['board_id'],
|
||||
'nasgroupname' => $nasgroupname
|
||||
]));
|
||||
?>
|
||||
<option value="<?= htmlspecialchars($dataUrl) ?>">
|
||||
<?= htmlspecialchars($value['nama']) ?>
|
||||
</option>
|
||||
<?php endforeach ?>
|
||||
</select>
|
||||
<div class="col-md-6">
|
||||
|
||||
<h6 class="mt-2 mb-2">Login Page Script</h6>
|
||||
<div class="mb-3">
|
||||
<div class="text-right" style="margin-bottom: -33px; margin-right: 2px;">
|
||||
<a onclick="copyToClipboard('script-page')" class="btn btn-sm btn-light btn-icon" title="Copy">
|
||||
<i class="fa fa-copy"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-2">
|
||||
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<center>
|
||||
<p>Akumulasi Penjualan Voucher</p>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-2 col-4">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" id="boxgenerateSuccess">
|
||||
<div class="inner">
|
||||
<h4 id="generateSuccess">0</h4>
|
||||
<p><small>Transaksi Success</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-wifi"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-2 col-4">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info" id="boxgeneratePending">
|
||||
<div class="inner">
|
||||
<h4 id="generatePending">0</h4>
|
||||
<p><small>Transaksi Pending</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-wifi"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-2 col-4">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-warning" id="boxgenerateCancel">
|
||||
<div class="inner">
|
||||
<h4 id="generateCancel">0</h4>
|
||||
<p><small>Transaksi Cancel</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-wifi"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-2 col-4">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info" id="boxgenerateBelumaktif">
|
||||
<div class="inner">
|
||||
<h4 id="generateBelumaktif">0</h4>
|
||||
<p><small>Voucher Tersedia</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-wifi"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-2 col-4">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" id="boxgenerateAktif">
|
||||
<div class="inner">
|
||||
<h4 id="generateAktif">0</h4>
|
||||
<p><small>Voucher Active</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-wifi"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-2 col-4">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-danger" id="boxgenerateNonaktif">
|
||||
<div class="inner">
|
||||
<h4 id="generateNonaktif">0</h4>
|
||||
<p><small>Voucher Expired</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-wifi"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-5">
|
||||
<div class="row">
|
||||
<div class="col-md-9">
|
||||
<center>
|
||||
<p>Riwayat Pencairan Dana</p>
|
||||
</center>
|
||||
</div>
|
||||
<div class="col-md-3 mb-2 text-right">
|
||||
<a type="button" class="btn btn-primary btn-sm m-1" data-toggle="modal" data-target="#ModalPencairan">Pencairan Dana</a>
|
||||
</div>
|
||||
</div>
|
||||
<table id="withdrawTable" class="table table-striped table-bordered" style="zoom: 90%; width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Server</th>
|
||||
<th>Dibuat</th>
|
||||
<th>Nominal</th>
|
||||
<th>User</th>
|
||||
<th>Status</th>
|
||||
<th>Diproses</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<div class="row">
|
||||
<div class="col-md-9">
|
||||
<center>
|
||||
<p>Voucher List</p>
|
||||
</center>
|
||||
</div>
|
||||
<div class="col-md-3 mb-2">
|
||||
<select id="selectStatus" class="form-control form-select form-select-sm">
|
||||
<option value="LUNAS" selected>Lunas</option>
|
||||
<option value="BELUM BAYAR">Pending</option>
|
||||
<option value="CANCELED">Cancel</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<table id="voucherTable" class="table table-striped table-bordered" style="zoom: 90%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Server</th>
|
||||
<th>Voucher</th>
|
||||
<th>Harga</th>
|
||||
<th>Biaya</th>
|
||||
<th>Saldo</th>
|
||||
<th>Status</th>
|
||||
<th style="max-width: 100px;">Dibuat</th>
|
||||
<th style="max-width: 100px;">Aktif</th>
|
||||
<th style="max-width: 100px;">Expired</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--ISI KONTEN-->
|
||||
|
||||
<!--START Modal WithDrow-->
|
||||
<div class="modal fade" id="ModalPencairan" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="ModalPencairanLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<div class="modal-header bg-primary">
|
||||
<h5 class="modal-title" id="staticBackdropLabel">Pencairan Dana</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="card-body">
|
||||
<?php
|
||||
// ambil data server untuk script
|
||||
$ListServer = new Listdata();
|
||||
$ListServer->set_list("data_server", "WHERE id IN (" . $SvId . ")");
|
||||
?>
|
||||
<div class="form-group">
|
||||
<label>Nama Server</label>
|
||||
<select class="form-control" id="idgetSaldo" name="idgetSaldo">
|
||||
<option value="0">-- PILIH --</option>
|
||||
<?php foreach ($ListServer->get_list() as $value): ?>
|
||||
<option value="<?= htmlspecialchars($value['id']) ?>">
|
||||
<?= htmlspecialchars($value['nama_server']) ?>
|
||||
</option>
|
||||
<?php endforeach ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Saldo</label>
|
||||
<div id="saldoServer" class="mt-2 text-success font-weight-bold" style="font-size: 24px;">Rp. 0</div>
|
||||
</div>
|
||||
<div class="form-group" id="formNominal">
|
||||
<label>Nominal</label>
|
||||
<input type="text" class="form-control rupiah" id="rupiah0" placeholder="Rp. 0" name="nominal" disabled readonly>
|
||||
</div>
|
||||
<i class="text-danger">Dana bisa di cairkan jika Saldo lebih dari Rp 10.000</i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
<input type="submit" name="cairkan" class="btn btn-primary" value="Cairkan">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--END Modal WithDrow-->
|
||||
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</div>
|
||||
<!-- /.card -->
|
||||
</div>
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
<!-- /.row -->
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
</section>
|
||||
<!-- /.content -->
|
||||
|
||||
<?php
|
||||
if (isset($_POST['cairkan'])) {
|
||||
|
||||
$SQLCek = "SELECT nama_server, rekening_bank, rekening_nama, rekening_nomor, rekening_status
|
||||
FROM data_server WHERE id = :idsv";
|
||||
$stmt = $pdo->prepare($SQLCek);
|
||||
$stmt->execute([':idsv' => $_POST['idgetSaldo']]);
|
||||
$rek_data = $stmt->fetch(PDO::FETCH_ASSOC); // ✅ fetch single row
|
||||
|
||||
if (!empty($rek_data['rekening_nama'])) {
|
||||
if ($rek_data['rekening_status'] == 'verificated') {
|
||||
|
||||
$nominal = preg_replace("/[^0-9]/", "", $_POST['nominal']);
|
||||
|
||||
$SQLCarikan = "INSERT INTO transaksi_withdraw
|
||||
(id_data_server, start_time, nominal, user_create, status, jenis) VALUES
|
||||
(:id_data_server, :start_time, :nominal, :user_create, 'pending', 'hotspot_auto')";
|
||||
$stmt = $pdo->prepare($SQLCarikan);
|
||||
$stmt->bindValue(':id_data_server', $_POST['idgetSaldo'], PDO::PARAM_INT);
|
||||
$stmt->bindValue(':start_time', date('Y-m-d H:i:s')); // ✅ pakai bindValue
|
||||
$stmt->bindValue(':nominal', $nominal, PDO::PARAM_INT);
|
||||
$stmt->bindValue(':user_create', $SvNama, PDO::PARAM_STR); // pastikan $SvNama ada
|
||||
$stmt->execute();
|
||||
|
||||
$Pesanwarek = "*PERMINTAAN PENCAIRAN DANA*
|
||||
|
||||
Server : " . $rek_data['nama_server'] . "
|
||||
BANK : " . strtoupper($rek_data['rekening_bank']) . "
|
||||
Rekening : *" . $rek_data['rekening_nomor'] . "*
|
||||
Nama Rek : " . $rek_data['rekening_nama'] . "
|
||||
|
||||
Nominal : *" . $_POST['nominal'] . "*
|
||||
|
||||
|
||||
_# Manja ~ Notif_
|
||||
";
|
||||
$nomorWArek = ["6281298698422", "6285655548738"];
|
||||
$APIwa = new PesanWA();
|
||||
$APIwa->Send_Pesan('1','sendMessage',$nomorWArek,$Pesanwarek);
|
||||
|
||||
sweetAlert("BERHASIL.! Pencairan akan segera diproses, mohon tunggu.", "success");
|
||||
} else {
|
||||
sweetAlert("GAGAL.! Rekening anda sedang diverifikasi mohon ditunggu.", "error");
|
||||
}
|
||||
} else {
|
||||
sweetAlert("GAGAL.! Tidak ada rekening yang tersedia, silahkan isi rekening di Profile Master.", "error");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
<!--END Modal WithDrow-->
|
||||
<div class="modal fade" id="viewBuktiModal" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered" style="max-width: fit-content; margin: auto;">
|
||||
<div class="modal-content border-0 bg-transparent shadow-none" style="width: auto;">
|
||||
<div class="position-relative d-inline-block">
|
||||
|
||||
<!-- Tombol Close -->
|
||||
<button type="button" class="close text-white position-absolute"
|
||||
data-dismiss="modal" aria-label="Close"
|
||||
style="top: 10px; right: 10px; filter: invert(1); z-index: 10;">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
|
||||
<!-- Gambar dari JS -->
|
||||
<img id="viewBuktiImg" src=""
|
||||
class="img-fluid rounded shadow d-block"
|
||||
alt="Bukti Transaksi" style="max-height: 600px;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<pre class="bg-light border rounded p-3 mb-2" id="script-page">
|
||||
Loading script...
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
// Buat script HTML dengan escape karakter agar aman
|
||||
function generateScript(dataUrl) {
|
||||
@@ -344,78 +669,13 @@ function copyToClipboard(preId) {
|
||||
</script>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-5">
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-2">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<center>
|
||||
<p>Voucher List</p>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
<table id="voucherTable" class="table table-striped table-bordered" style="zoom: 90%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Server</th>
|
||||
<th>Voucher</th>
|
||||
<th>Harga</th>
|
||||
<th>Biaya</th>
|
||||
<th>Saldo</th>
|
||||
<th>Status</th>
|
||||
<th>Dibuat</th>
|
||||
<th>Aktif</th>
|
||||
<th>Expired</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--ISI KONTEN-->
|
||||
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</div>
|
||||
<!-- /.card -->
|
||||
</div>
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
<!-- /.row -->
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
</section>
|
||||
<!-- /.content -->
|
||||
|
||||
<script>
|
||||
// // Fungsi untuk menetapkan bulan saat ini sebagai nilai default di dropdown
|
||||
// function setDefaultMonth() {
|
||||
// // Dapatkan bulan dan tahun saat ini
|
||||
// var now = new Date();
|
||||
// var currentMonth = now.getMonth() + 1; // getMonth() menghasilkan bulan 0-11, jadi kita tambahkan 1
|
||||
// var currentYear = now.getFullYear();
|
||||
|
||||
// // Format bulan dalam format YYYY-MM
|
||||
// var currentMonthString = currentYear + '-' + (currentMonth < 10 ? '0' + currentMonth : currentMonth);
|
||||
|
||||
// // Atur nilai default pada dropdown
|
||||
// document.getElementById('pilihBulan').value = currentMonthString;
|
||||
|
||||
// // Panggil fungsi untuk mengambil data berdasarkan bulan saat ini
|
||||
// fetchDataAgen();
|
||||
// }
|
||||
|
||||
// Fungsi untuk mengambil data agen berdasarkan bulan yang dipilih
|
||||
function fetchDataAgen() {
|
||||
|
||||
// Ambil nilai ID dan generate_time dari server-side (misalnya dari halaman PHP sebelumnya)
|
||||
var idDataServer = <?php echo $SvId; ?>; // Ganti dengan ID yang sesuai atau ambil dari variabel PHP
|
||||
var idDataServer = "<?php echo encrypt_url($SvId); ?>"; // Ganti dengan ID yang sesuai atau ambil dari variabel PHP
|
||||
|
||||
// Buat request dengan menggunakan XMLHttpRequest
|
||||
var xhr = new XMLHttpRequest();
|
||||
@@ -437,10 +697,12 @@ function copyToClipboard(preId) {
|
||||
var total = parseFloat(data.total) || 0;
|
||||
var ditahan = parseFloat(data.ditahan) || 0;
|
||||
var tersedia = parseFloat(data.tersedia) || 0;
|
||||
// var jumlah_voucher = parseInt(data.total_voucher) || 0;
|
||||
// var jumlah_voucher_belum_aktif = parseInt(data.total_voucher_belum_aktif) || 0;
|
||||
// var jumlah_voucher_aktif = parseInt(data.total_voucher_aktif) || 0;
|
||||
// var jumlah_voucher_expaired = parseInt(data.total_voucher_expaired) || 0;
|
||||
var jum_lunas = parseInt(data.jum_lunas) || 0;
|
||||
var jum_pending = parseInt(data.jum_pending) || 0;
|
||||
var jum_cancel = parseInt(data.jum_cancel) || 0;
|
||||
var jum_belum_aktif = parseInt(data.jum_belum_aktif) || 0;
|
||||
var jum_aktif = parseInt(data.jum_aktif) || 0;
|
||||
var jum_nonaktif = parseInt(data.jum_nonaktif) || 0;
|
||||
|
||||
// Format angka dengan pemisah ribuan
|
||||
total = total.toLocaleString();
|
||||
@@ -451,10 +713,12 @@ function copyToClipboard(preId) {
|
||||
document.getElementById('totalValue').innerText = "Rp. "+total;
|
||||
document.getElementById('ditahanValue').innerText = "Rp. "+ditahan;
|
||||
document.getElementById('tersediaValue').innerText = "Rp. "+tersedia;
|
||||
// document.getElementById('jumtotalValue').innerText = jumlah_voucher.toLocaleString();
|
||||
// document.getElementById('jumbelumValue').innerText = jumlah_voucher_belum_aktif.toLocaleString();
|
||||
// document.getElementById('jumsedangValue').innerText = jumlah_voucher_aktif.toLocaleString();
|
||||
// document.getElementById('jumsudahValue').innerText = jumlah_voucher_expaired.toLocaleString();
|
||||
document.getElementById('generateSuccess').innerText = jum_lunas;
|
||||
document.getElementById('generatePending').innerText = jum_pending;
|
||||
document.getElementById('generateCancel').innerText = jum_cancel;
|
||||
document.getElementById('generateBelumaktif').innerText = jum_belum_aktif;
|
||||
document.getElementById('generateAktif').innerText = jum_aktif;
|
||||
document.getElementById('generateNonaktif').innerText = jum_nonaktif;
|
||||
} else {
|
||||
// Jika data tidak ditemukan atau kosong
|
||||
document.getElementById('result').innerHTML = "Tidak ada data untuk bulan yang dipilih.";
|
||||
@@ -476,31 +740,147 @@ function copyToClipboard(preId) {
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#voucherTable').DataTable({
|
||||
var defaultStatus = $('#selectStatus').val(); // ambil default (LUNAS)
|
||||
|
||||
var table = $('#voucherTable').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"responsive": true,
|
||||
"autoWidth": false,
|
||||
"ajax": {
|
||||
"url": "controller/voucher_auto.php?i=<?= $SvId; ?>",
|
||||
"url": "controller/voucher_auto.php?i=<?= $SvId; ?>&s=" + defaultStatus,
|
||||
"type": "GET"
|
||||
},
|
||||
"pageLength": 25,
|
||||
"pageLength": 10,
|
||||
"columns": [
|
||||
{ "data": 0 }, // create_time
|
||||
{ "data": 0 }, // server
|
||||
{ "data": 1 }, // voucher
|
||||
{ "data": 2 }, // harga
|
||||
{ "data": 3, "orderable": false }, // biaya (tidak bisa diurutkan)
|
||||
{ "data": 4, "orderable": false }, // saldo (tidak bisa diurutkan)
|
||||
{ "data": 5 }, // status_cek
|
||||
{ "data": 6 },
|
||||
{ "data": 7 }, // active_time
|
||||
{ "data": 8 } // expaired_time
|
||||
{ "data": 3, "orderable": false }, // biaya
|
||||
{ "data": 4, "orderable": false }, // saldo
|
||||
{ "data": 5 }, // status
|
||||
{ "data": 6 }, // dibuat
|
||||
{ "data": 7 }, // aktif
|
||||
{ "data": 8 } // expired
|
||||
],
|
||||
"order": [[0, "desc"]]
|
||||
});
|
||||
|
||||
// Reload data saat status berubah
|
||||
$('#selectStatus').on('change', function() {
|
||||
table.ajax.url("controller/voucher_auto.php?i=<?= $SvId; ?>&s=" + $(this).val()).load();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#withdrawTable').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"responsive": true,
|
||||
"ajax": {
|
||||
"url": "controller/get_withdrow.php?i=<?= $SvId; ?>&s=hotspot_auto",
|
||||
"type": "POST"
|
||||
},
|
||||
"pageLength": 10,
|
||||
"columns": [
|
||||
{ "data": 0 }, // Server
|
||||
{ "data": 1 }, // Dibuat
|
||||
{ "data": 2 }, // Nominal
|
||||
{ "data": 3 }, // User
|
||||
{
|
||||
"data": 4, // Status
|
||||
"render": function(data, type, row, meta) {
|
||||
if (data === 'pending') {
|
||||
return `<span class="badge bg-primary p-2">${data.toUpperCase()}</span>`;
|
||||
} else {
|
||||
return `<span class="badge bg-success p-2">${data.toUpperCase()}</span>`;
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "data": 5 }, // Diproses
|
||||
{
|
||||
"data": 6, // id unik
|
||||
"render": function(data, type, row, meta) {
|
||||
let btn = "";
|
||||
|
||||
if (row[4] === 'success') {
|
||||
btn += `<button class="btn btn-sm btn-secondary me-1" onclick="viewBukti('${data.bukti_success}')">
|
||||
<i class="fa fa-image"></i>
|
||||
</button>`;
|
||||
}
|
||||
|
||||
return btn;
|
||||
}
|
||||
}
|
||||
],
|
||||
"order": [[1, "desc"]] // urut berdasarkan Dibuat
|
||||
});
|
||||
});
|
||||
|
||||
// function viewBukti Transaksi
|
||||
function viewBukti(imgPath) {
|
||||
$("#viewBuktiImg").attr("src", imgPath);
|
||||
$("#viewBuktiModal").modal("show");
|
||||
}
|
||||
|
||||
$(document).ready(function(){
|
||||
var currentSaldo = 0; // simpan saldo terakhir
|
||||
|
||||
$("#idgetSaldo").on("change", function(){
|
||||
var serverId = $(this).val();
|
||||
var $nominalInput = $("#formNominal input");
|
||||
|
||||
if(serverId == 0){
|
||||
$("#saldoServer").html("Rp. 0");
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
currentSaldo = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "controller/get_saldo.php",
|
||||
type: "GET",
|
||||
data: { id: serverId },
|
||||
dataType: "json",
|
||||
success: function(res){
|
||||
if(res && res.saldo !== undefined){
|
||||
currentSaldo = parseInt(res.saldo) || 0;
|
||||
$("#saldoServer").html("Rp. " + new Intl.NumberFormat().format(currentSaldo));
|
||||
|
||||
if(currentSaldo < 10000){
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
} else {
|
||||
$nominalInput.prop("disabled", false).prop("readonly", false);
|
||||
}
|
||||
} else {
|
||||
$("#saldoServer").html("Rp. 0");
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
currentSaldo = 0;
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
$("#saldoServer").html("Gagal mengambil saldo");
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
currentSaldo = 0;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Cek saat user input nominal
|
||||
$("#formNominal input").on("input", function(){
|
||||
var val = parseInt($(this).val().replace(/\D/g, '')) || 0; // ambil angka aja
|
||||
if(val > currentSaldo){
|
||||
val = currentSaldo; // batasin maksimal saldo
|
||||
}
|
||||
$(this).val(val); // set kembali ke input
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@
|
||||
$db1 = mysqli_query($con,"SELECT SUBSTRING(nomor_invoice,-4) AS num FROM invoice WHERE id_data_server = '$pc2[id_data_server]' ORDER BY nomor_invoice DESC Limit 1");
|
||||
$pc1 = mysqli_fetch_assoc($db1);
|
||||
$urutan = $pc1['num'] + 1;
|
||||
$num = date('ym').'0000' + $urutan;
|
||||
$num = (date('ym').'0000') + $urutan;
|
||||
$nomorinv = "INV".$num;
|
||||
$input = mysqli_query($con,"INSERT INTO invoice (id_data_server, id_customer, nomor_invoice, tanggal_invoice, limit_invoice)
|
||||
VALUES ('$pc2[id_data_server]', '$_POST[id_customer]', '$nomorinv', '$_POST[tanggal_invoice]', '$_POST[limit_invoice]')");
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
$db1 = mysqli_query($con,"SELECT SUBSTRING(nomor_invoice,-4) AS num FROM invoice WHERE id_data_server = '$pc2[id_data_server]' ORDER BY nomor_invoice DESC Limit 1");
|
||||
$pc1 = mysqli_fetch_assoc($db1);
|
||||
$urutan = $pc1['num'] + 1;
|
||||
$num = date('ym').'0000' + $urutan;
|
||||
$num = (date('ym').'0000') + $urutan;
|
||||
$nomorinv = "INV".$num;
|
||||
$input = mysqli_query($con,"INSERT INTO invoice (id_data_server, id_customer, nomor_invoice, tanggal_invoice, limit_invoice)
|
||||
VALUES ('$pc2[id_data_server]', '$_POST[id_customer]', '$nomorinv', '$_POST[tanggal_invoice]', '$_POST[limit_invoice]')");
|
||||
|
||||
+1
-1
@@ -44,7 +44,7 @@
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<div class="dropdown dropright">
|
||||
<a href="excel/export.php" id="export-button" class="btn btn-success btn-sm mr-2">
|
||||
<a href="#" id="export-button" class="btn btn-success btn-sm mr-2">
|
||||
<i class="fas fa-file-excel mr-2"></i>Export
|
||||
</a>
|
||||
<!-- <button type="submit" class="btn btn-success btn-sm mr-2"><i class="fas fa-file-excel mr-2"></i>Export</button> -->
|
||||
|
||||
+16
-6
@@ -88,11 +88,11 @@
|
||||
</div>
|
||||
<!-- /.card-header -->
|
||||
<div class="card-body">
|
||||
<table id="example2" class="table table-bordered table-striped">
|
||||
<table id="example22" class="table table-bordered table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nama Server</th>
|
||||
<th>Waktu</th>
|
||||
<th>Nama Server</th>
|
||||
<th>Nomor</th>
|
||||
<th>Pesan</th>
|
||||
<th>Url Image</th>
|
||||
@@ -102,11 +102,12 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$apaket = mysqli_query($con, "SELECT * FROM master_pesan $SqlDataWHId ORDER BY waktu DESC, id DESC LIMIT 500");
|
||||
$apaket = mysqli_query($con, "SELECT * FROM master_pesan $SqlDataWHId ORDER BY waktu DESC LIMIT 500");
|
||||
while ($paket = mysqli_fetch_assoc($apaket))
|
||||
{
|
||||
?>
|
||||
<tr>
|
||||
<td style="max-width: 200px;"><?php echo $paket['waktu']; ?></td>
|
||||
<td>
|
||||
<?php
|
||||
$asv = mysqli_query($con,"SELECT nama_server FROM data_server WHERE id = '$paket[id_data_server]'");
|
||||
@@ -114,13 +115,12 @@
|
||||
echo $sv['nama_server'];
|
||||
?>
|
||||
</td>
|
||||
<td style="max-width: 200px;"><?php echo $paket['waktu']; ?></td>
|
||||
<td><?php echo $paket['nomor']; ?></td>
|
||||
<td style="max-width: 300px;"><?php echo $paket['pesan']; ?></td>
|
||||
<td style="max-width: 200px;"><?php echo $paket['url_file']; ?></td>
|
||||
<td><?php echo $paket['status']; ?></td>
|
||||
<td>
|
||||
<?php if($paket['status'] == 'GAGAL') { ?>
|
||||
<?php if($paket['status'] == 'GAGAL' || $paket['status'] == 'TERKIRIM') { ?>
|
||||
<form method="post">
|
||||
<input type="submit" name="ulangi<?php echo $paket['id']; ?>" class="btn btn-primary btn-sm" value="Ulangi">
|
||||
</a>
|
||||
@@ -149,4 +149,14 @@
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
</section>
|
||||
<!-- /.content -->
|
||||
<!-- /.content -->
|
||||
<script>
|
||||
$(function () {
|
||||
$("#example22").DataTable({
|
||||
"responsive": true,
|
||||
"autoWidth": false,
|
||||
"pageLength": 100,
|
||||
"order": [[0, "desc"]] // Kolom pertama urut DESC
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -27,63 +27,6 @@
|
||||
</section>
|
||||
|
||||
<script>
|
||||
let map; // Variabel untuk menyimpan peta
|
||||
const markers = []; // Array untuk menyimpan marker
|
||||
|
||||
function initMap() {
|
||||
// Inisialisasi peta dengan tipe hybrid
|
||||
map = new google.maps.Map(document.getElementById('map'), {
|
||||
center: { lat: -7.062083, lng: 106.797390 }, // Pusat peta
|
||||
zoom: 11,
|
||||
mapTypeId: 'hybrid' // Menentukan tipe peta menjadi hybrid
|
||||
});
|
||||
|
||||
// Fetch data dari PHP saat pertama kali
|
||||
fetchMarkers();
|
||||
|
||||
// Mengatur interval untuk memperbarui marker setiap 10 detik
|
||||
setInterval(fetchMarkers, 30000);
|
||||
}
|
||||
|
||||
function fetchMarkers() {
|
||||
fetch('load/maps_marker.php?i=<?php echo base64_encode($SqlDataWHIdM); ?>')
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Network response was not ok ' + response.statusText);
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(markersData => {
|
||||
// Hapus marker yang ada sebelumnya
|
||||
markers.forEach(marker => marker.setMap(null));
|
||||
markers.length = 0; // Kosongkan array marker
|
||||
|
||||
// Tambahkan marker baru ke peta
|
||||
markersData.forEach(markerData => {
|
||||
const markerInstance = new google.maps.Marker({
|
||||
position: { lat: markerData.lat, lng: markerData.lng },
|
||||
map: map,
|
||||
title: markerData.title,
|
||||
icon: {
|
||||
url: markerData.icon, // Menggunakan ikon dari data
|
||||
scaledSize: new google.maps.Size(30, 30) // Mengatur ukuran ikon
|
||||
}
|
||||
});
|
||||
|
||||
// Simpan marker ke array
|
||||
markers.push(markerInstance);
|
||||
|
||||
// Event listener untuk klik marker
|
||||
markerInstance.addListener('click', () => {
|
||||
const infoWindow = new google.maps.InfoWindow();
|
||||
infoWindow.setContent(markerData.content); // Set konten InfoWindow
|
||||
infoWindow.open(map, markerInstance); // Tampilkan InfoWindow
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(error => console.error('Error fetching markers:', error));
|
||||
}
|
||||
|
||||
// Inisialisasi peta saat halaman selesai dimuat
|
||||
window.onload = initMap;
|
||||
const topologiId = "<?php echo base64_encode($SqlDataWHIdM); ?>";
|
||||
</script>
|
||||
<script type="text/javascript" src="dist/js/mapsTopologi.js"></script>
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
<?php
|
||||
// ubah string jadi array
|
||||
$idArray = array_map('trim', explode(',', $SvId));
|
||||
|
||||
// buat placeholders (?, ?, ?)
|
||||
$placeholders = implode(',', array_fill(0, count($idArray), '?'));
|
||||
|
||||
$sql = "SELECT uuid FROM data_server WHERE id IN ($placeholders)";
|
||||
$stm = $pdo->prepare($sql);
|
||||
$stm->execute($idArray);
|
||||
|
||||
$uuids = $stm->fetchAll(PDO::FETCH_COLUMN); // ambil langsung kolom uuid
|
||||
$tenant_id = implode(',', $uuids); // gabungkan jadi string dipisah koma
|
||||
|
||||
// --- Panggil API pakai tenant_id ---
|
||||
$oltData = [];
|
||||
if ($tenant_id) {
|
||||
$apiUrl = "http://manjapro.net:20263/api/v1/olt/?tenant_id=" . $tenant_id;
|
||||
$ch = curl_init();
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => $apiUrl,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_HTTPHEADER => ["accept: application/json"]
|
||||
]);
|
||||
$response = curl_exec($ch);
|
||||
if (curl_errno($ch)) {
|
||||
$apiError = curl_error($ch);
|
||||
}
|
||||
curl_close($ch);
|
||||
$oltData = json_decode($response, true);
|
||||
}
|
||||
|
||||
$oltVendor = [];
|
||||
|
||||
$apiUrl = "http://manjapro.net:20263/api/v1/olt-vendor/";
|
||||
$ch = curl_init();
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => $apiUrl,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_HTTPHEADER => ["accept: application/json"]
|
||||
]);
|
||||
$resvendor = curl_exec($ch);
|
||||
if (curl_errno($ch)) {
|
||||
$apiError = curl_error($ch);
|
||||
}
|
||||
curl_close($ch);
|
||||
$oltVendor = json_decode($resvendor, true);
|
||||
|
||||
foreach ($oltVendor as $vendor) {
|
||||
$vendorMap[$vendor['id']] = $vendor['nama_vendor'] . " (" . $vendor['model'] . ")" ;
|
||||
}
|
||||
// print_r($oltVendor);
|
||||
|
||||
?>
|
||||
|
||||
<section class="content">
|
||||
<div class="container-fluid mt-4">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h3 class="card-title">List OLT</h3>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<ol class="float-sm-right mb-0">
|
||||
<button type="button" class="btn btn-danger btn-sm" data-toggle="modal" data-target="#modalTambah">Tambah</button>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<!--<h3 class="card-title">List OLT</h3>-->
|
||||
<!--<button type="button" class="btn btn-danger btn-sm" data-toggle="modal" data-target="#modalTambah">Tambah</button>-->
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<?php if (!empty($apiError)): ?>
|
||||
<div class="alert alert-danger">Gagal ambil data API: <?= htmlspecialchars($apiError) ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<table id="example2" class="table table-bordered table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>Nama Perangkat</th>
|
||||
<th>IP</th>
|
||||
<th>Lokasi</th>
|
||||
<th>Vendor</th>
|
||||
<th>Port SNMP</th>
|
||||
<th>Port Telnet</th>
|
||||
<th>Status</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if (!empty($oltData) && is_array($oltData)): ?>
|
||||
<?php $no=1; foreach($oltData as $olt): ?>
|
||||
<tr>
|
||||
<td><?= $no++; ?></td>
|
||||
<td><?= htmlspecialchars($olt['name'] ?? '-') ?></td>
|
||||
<td><?= htmlspecialchars($olt['ip'] ?? '-') ?></td>
|
||||
<td><?= htmlspecialchars($olt['location'] ?? '-') ?></td>
|
||||
<td><?= htmlspecialchars($vendorMap[$olt['vendor_id']] ?? '-') ?></td>
|
||||
<td><?= htmlspecialchars($olt['snmp_port'] ?? '-') ?></td>
|
||||
<td><?= htmlspecialchars($olt['telnet_port'] ?? '-') ?></td>
|
||||
<td>
|
||||
<?php if (($olt['status'] ?? '') === 'online'): ?>
|
||||
<span class="badge badge-success">Online</span>
|
||||
<?php elseif (($olt['status'] ?? '') === 'offline'): ?>
|
||||
<span class="badge badge-danger">Offline</span>
|
||||
<?php else: ?>
|
||||
<span class="badge badge-secondary"><?= htmlspecialchars($olt['status'] ?? '-') ?></span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<a href="#" class="btn btn-warning btn-sm">Edit</a>
|
||||
<a href="#" class="btn btn-danger btn-sm">Hapus</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php else: ?>
|
||||
<tr><td colspan="6" class="text-center">Data tidak tersedia</td></tr>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Modal Tambah -->
|
||||
<div class="modal fade" id="modalTambah" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<form method="post">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header bg-primary">
|
||||
<h5 class="modal-title">Tambah OLT</h5>
|
||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input type="hidden" name="tenant_id" value="<?= htmlspecialchars($tenant_id) ?>">
|
||||
<div class="form-group">
|
||||
<label>Nama</label>
|
||||
<input type="text" name="name" class="form-control" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>IP</label>
|
||||
<input type="text" name="ip" class="form-control" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Lokasi</label>
|
||||
<input type="text" name="location" class="form-control">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Nama Vendor</label>
|
||||
<select class="form-control">
|
||||
<option value="">--PILIH--</option>
|
||||
<?php foreach ($oltVendor as $row): ?>
|
||||
<option value="<?= $row['id'] ?>">
|
||||
<?= $row['nama_vendor'] ?> (<?= $row['model'] ?>)
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" name="tambah" class="btn btn-primary">Simpan</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
// === Handle Tambah Data (POST ke API) ===
|
||||
if (isset($_POST['tambah'])) {
|
||||
$postData = [
|
||||
"tenant_id" => $_POST['tenant_id'],
|
||||
"name" => trim($_POST['name']),
|
||||
"ip" => trim($_POST['ip']),
|
||||
"snmp_community" => "public",
|
||||
"telnet_user" => "root",
|
||||
"telnet_pass" => "admin",
|
||||
"vendor_id" => (int)$_POST['vendor_id'],
|
||||
"location" => trim($_POST['location']),
|
||||
"snmp_port" => 161,
|
||||
"telnet_port" => 23
|
||||
];
|
||||
$ch = curl_init("http://manjapro.net:20263/api/v1/olt/");
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
|
||||
CURLOPT_POSTFIELDS => json_encode($postData)
|
||||
]);
|
||||
$res = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
// setelah simpan redirect supaya tidak POST ulang
|
||||
header("Location: ".$_SERVER['PHP_SELF']."?id=".urlencode($SvId));
|
||||
exit;
|
||||
}
|
||||
?>
|
||||
@@ -159,3 +159,5 @@
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
|
||||
@@ -101,4 +101,6 @@ if (isset($_POST['edit'])) {
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
?>
|
||||
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
@@ -51,10 +51,13 @@
|
||||
<label>Nama</label>
|
||||
<input type="text" class="form-control" required="required" name="nama">
|
||||
</div>
|
||||
<div class="form-group m-1">
|
||||
<label>Email</label>
|
||||
<input type="email" class="form-control" required="required" name="email">
|
||||
</div>
|
||||
|
||||
<div class="form-group m-1">
|
||||
<label>Email</label>
|
||||
<input type="email" class="form-control" required="required" name="email" id="emailInput">
|
||||
<small id="emailError"></small>
|
||||
</div>
|
||||
|
||||
<div class="form-group m-1">
|
||||
<label>Nomor WhatsApp</label>
|
||||
<input type="text" class="form-control" required="required" name="nowa">
|
||||
@@ -149,3 +152,35 @@ if (isset($_POST['tambah'])) {
|
||||
}
|
||||
|
||||
?>
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
const emailInput = document.getElementById("emailInput");
|
||||
const emailError = document.getElementById("emailError");
|
||||
const gmailRegex = /^[a-z0-9._%+-]+@gmail\.com$/;
|
||||
|
||||
// Saat ngetik
|
||||
emailInput.addEventListener("input", function() {
|
||||
this.value = this.value.toLowerCase();
|
||||
|
||||
if (gmailRegex.test(this.value)) {
|
||||
emailError.textContent = "✅ Email valid";
|
||||
emailError.style.color = "green";
|
||||
} else {
|
||||
emailError.textContent = "❌ Email tidak valid (harus @gmail.com & huruf kecil)";
|
||||
emailError.style.color = "red";
|
||||
}
|
||||
});
|
||||
|
||||
// Saat submit
|
||||
emailInput.form.addEventListener("submit", function(e) {
|
||||
if (!gmailRegex.test(emailInput.value)) {
|
||||
e.preventDefault(); // stop submit
|
||||
emailError.textContent = "❌ Email tidak valid (harus @gmail.com & huruf kecil)";
|
||||
emailError.style.color = "red";
|
||||
emailInput.focus();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
@@ -155,4 +155,6 @@ if (isset($_POST['ubah'])) {
|
||||
|
||||
|
||||
|
||||
?>
|
||||
?>
|
||||
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
@@ -256,3 +256,5 @@ if (isset($_POST['ubah'])) {
|
||||
</div>
|
||||
</div>
|
||||
<!-- END Modal Batal -->
|
||||
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
|
||||
+490
-68
@@ -9,6 +9,18 @@ $apikey = $data[0]['apikey_payment_gateway'];
|
||||
$tokenkey = $data[0]['tokenkey_payment_gateway'];
|
||||
$enpoint = $data[0]['url_payment_gateway'];
|
||||
$status = $data[0]['status_payment_gateway'];
|
||||
$jenis = $data[0]['payment_gateway'];
|
||||
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT
|
||||
SUM(saldo) AS total_saldo,
|
||||
SUM(ditahan) AS total_ditahan,
|
||||
SUM(tersedia) AS total_tersedia
|
||||
FROM v_akumulasi_client_payment
|
||||
WHERE id_data_server IN ($SvId)
|
||||
");
|
||||
$stmt->execute();
|
||||
$saldo = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
?>
|
||||
<!-- Main content -->
|
||||
@@ -29,13 +41,10 @@ $status = $data[0]['status_payment_gateway'];
|
||||
<!-- /.card-header -->
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-5">
|
||||
<div class="col-md-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<center>
|
||||
<h3 class="text-danger">PERHATIAN..!</h3>
|
||||
<p>Untuk mengaktifkan payment gateway anda harus terlebih dahulu mempunyai akun FLIP BUSSINESS</p>
|
||||
<hr>
|
||||
<?php if($status == "ACTIVE"){ ?>
|
||||
<div class="card bg-success">
|
||||
<h5 class="text-light m-1">STATUS : <?php echo $status; ?></h5>
|
||||
@@ -49,36 +58,14 @@ $status = $data[0]['status_payment_gateway'];
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<div class="form-group">
|
||||
<label>Jenis Payment Gateway</label>
|
||||
<select class="form-control" name="jenis">
|
||||
<select class="form-control" name="jenis" id="getSelected">
|
||||
<option value="">Pilih Salah Satu</option>
|
||||
<option value="flip" <?php if($payment_gateway == 'flip'){ echo "selected"; } ?>>Flip Bussiness</option>
|
||||
<option value="paydisini" <?php if($payment_gateway == 'paydisini'){ echo "selected"; } ?>>Default ManjaPro (Paydisini)</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>ENDPOINT URL</label>
|
||||
<input class="form-control" type="text" name="enpoint" value="<?php echo $enpoint; ?>">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>API SECRET KEY</label>
|
||||
<div class="input-group">
|
||||
<input type="password" class="form-control password-input" id="password1" name="apikey" value="<?php echo $apikey; ?>">
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text password-toggle" data-target="password1">
|
||||
<span class="fas fa-eye"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>TOKEN VALIDASI</label>
|
||||
<div class="input-group">
|
||||
<input type="password" class="form-control password-input" id="password2" name="tokenkey" value="<?php echo $tokenkey; ?>">
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text password-toggle" data-target="password2">
|
||||
<span class="fas fa-eye"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="Paykategori mb-4">
|
||||
|
||||
</div>
|
||||
<input type="submit" class="btn btn-sm btn-primary m-1" name="simpan" value="Simpan Konfigurasi">
|
||||
<?php if($status == "ACTIVE"){ ?>
|
||||
@@ -90,12 +77,152 @@ $status = $data[0]['status_payment_gateway'];
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-7">
|
||||
<?php
|
||||
// echo "<pre>";
|
||||
// print_r($_SERVER);
|
||||
// echo "</pre>";
|
||||
?>
|
||||
<div class="col-md-8">
|
||||
<?php if($jenis == 'paydisini') { ?>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="row">
|
||||
<div class="col-md-3 mb-2">
|
||||
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<center>
|
||||
<p>Akumulasi Keuangan Tagihan Payment Gateway</p>
|
||||
</center>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-4 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-info" id="penjualanBox">
|
||||
<div class="inner">
|
||||
<h4><?= 'Rp. ' . number_format($saldo['total_saldo'], 0, ',', '.'); ?></h4>
|
||||
<p><small>Total Penjualan</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-6">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-danger" id="lunasBox">
|
||||
<div class="inner">
|
||||
<h4><?= 'Rp. ' . number_format($saldo['total_ditahan'], 0, ',', '.'); ?></h4>
|
||||
<p><small>Saldo Ditahan</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-12">
|
||||
<!-- small box -->
|
||||
<div class="small-box bg-success" id="pendingBox">
|
||||
<div class="inner">
|
||||
<h4><?= 'Rp. ' . number_format($saldo['total_tersedia'], 0, ',', '.'); ?></h4>
|
||||
<p><small>Saldo Tersedia</small></p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-card"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-10">
|
||||
<center>
|
||||
<p>Riwayat Pencairan Dana</p>
|
||||
</center>
|
||||
</div>
|
||||
<div class="col-md-2 mb-2 text-right">
|
||||
<a type="button" class="btn btn-primary btn-sm m-1" data-toggle="modal" data-target="#ModalPencairan">Pencairan Dana</a>
|
||||
</div>
|
||||
</div>
|
||||
<table id="withdrawTable" class="table table-striped table-bordered" style="zoom: 90%; width: 100%;">
|
||||
<thead class="text-center">
|
||||
<tr>
|
||||
<th>Server</th>
|
||||
<th>Dibuat</th>
|
||||
<th>Nominal</th>
|
||||
<th>User</th>
|
||||
<th>Status</th>
|
||||
<th>Diproses</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
<hr>
|
||||
<div class="row mt-2">
|
||||
<div class="col-md-10">
|
||||
<center>
|
||||
<p>Riwayat Transaksi</p>
|
||||
</center>
|
||||
</div>
|
||||
<div class="col-md-2 mb-2 text-right">
|
||||
<div class="form-group">
|
||||
<select class="form-control" id="selectStatus">
|
||||
<option value="SUCCESS">SUCCESS</option>
|
||||
<option value="PENDING">PENDING</option>
|
||||
<option value="CANCELED">CANCELED</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table id="transactionTable" class="table table-striped table-bordered" style="width: 100%;">
|
||||
<thead class="text-center">
|
||||
<tr>
|
||||
<th>Kode Unik</th>
|
||||
<th>Keterangan</th>
|
||||
<th>Nama</th>
|
||||
<th>Jumlah</th>
|
||||
<th>Saldo</th>
|
||||
<th>Biaya</th>
|
||||
<th>Status</th>
|
||||
<th>Jenis</th>
|
||||
<th>Waktu</th>
|
||||
<th>Waktu</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
var table = $('#transactionTable').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"responsive": true,
|
||||
"ajax": {
|
||||
"url": "controller/get_client_payment.php?i=<?= $SvId; ?>&s=" + $('#selectStatus').val(),
|
||||
"type": "POST"
|
||||
},
|
||||
"pageLength": 10,
|
||||
"columns": [
|
||||
{ "data": 0 },
|
||||
{ "data": 1 },
|
||||
{ "data": 2 },
|
||||
{ "data": 3 },
|
||||
{ "data": 4 },
|
||||
{ "data": 5 },
|
||||
{ "data": 6 },
|
||||
{ "data": 7 },
|
||||
{ "data": 8 },
|
||||
{ "data": 9 }
|
||||
],
|
||||
"order": [[1, "desc"]] // urut berdasarkan Dibuat
|
||||
});
|
||||
|
||||
// reload data saat selectStatus berubah
|
||||
$('#selectStatus').on('change', function() {
|
||||
var newStatus = $(this).val();
|
||||
table.ajax.url("controller/get_client_payment.php?i=<?= $SvId; ?>&s=" + newStatus).load();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php } ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -108,21 +235,149 @@ $status = $data[0]['status_payment_gateway'];
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!--START Modal WithDrow-->
|
||||
<div class="modal fade" id="ModalPencairan" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="ModalPencairanLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<div class="modal-header bg-primary">
|
||||
<h5 class="modal-title" id="staticBackdropLabel">Pencairan Dana</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="card-body">
|
||||
<?php
|
||||
// ambil data server untuk script
|
||||
$ListServer = new Listdata();
|
||||
$ListServer->set_list("data_server", "WHERE id IN (" . $SvId . ")");
|
||||
?>
|
||||
<div class="form-group">
|
||||
<label>Nama Server</label>
|
||||
<select class="form-control" id="idgetSaldo" name="idgetSaldo">
|
||||
<option value="0">-- PILIH --</option>
|
||||
<?php foreach ($ListServer->get_list() as $value): ?>
|
||||
<option value="<?= htmlspecialchars($value['id']) ?>">
|
||||
<?= htmlspecialchars($value['nama_server']) ?>
|
||||
</option>
|
||||
<?php endforeach ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Saldo</label>
|
||||
<div id="saldoServer" class="mt-2 text-success font-weight-bold" style="font-size: 24px;">Rp. 0</div>
|
||||
</div>
|
||||
<div class="form-group" id="formNominal">
|
||||
<label>Nominal</label>
|
||||
<input type="text" class="form-control rupiah" id="rupiah0" placeholder="Rp. 0" name="nominal" disabled readonly>
|
||||
</div>
|
||||
<i class="text-danger">Dana bisa di cairkan jika Saldo lebih dari Rp 10.000</i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
<input type="submit" name="cairkan" class="btn btn-primary" value="Cairkan">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--END Modal WithDrow-->
|
||||
|
||||
<!--END Modal WithDrow-->
|
||||
<div class="modal fade" id="viewBuktiModal" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered" style="max-width: fit-content; margin: auto;">
|
||||
<div class="modal-content border-0 bg-transparent shadow-none" style="width: auto;">
|
||||
<div class="position-relative d-inline-block">
|
||||
|
||||
<!-- Tombol Close -->
|
||||
<button type="button" class="close text-white position-absolute"
|
||||
data-dismiss="modal" aria-label="Close"
|
||||
style="top: 10px; right: 10px; filter: invert(1); z-index: 10;">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
|
||||
<!-- Gambar dari JS -->
|
||||
<img id="viewBuktiImg" src=""
|
||||
class="img-fluid rounded shadow d-block"
|
||||
alt="Bukti Transaksi" style="max-height: 600px;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
if (isset($_POST['cairkan'])) {
|
||||
|
||||
$SQLCek = "SELECT nama_server, rekening_bank, rekening_nama, rekening_nomor, rekening_status
|
||||
FROM data_server WHERE id = :idsv";
|
||||
$stmt = $pdo->prepare($SQLCek);
|
||||
$stmt->execute([':idsv' => $_POST['idgetSaldo']]);
|
||||
$rek_data = $stmt->fetch(PDO::FETCH_ASSOC); // ✅ fetch single row
|
||||
|
||||
if (!empty($rek_data['rekening_nama'])) {
|
||||
if ($rek_data['rekening_status'] == 'verificated') {
|
||||
|
||||
$nominal = preg_replace("/[^0-9]/", "", $_POST['nominal']);
|
||||
|
||||
$SQLCarikan = "INSERT INTO transaksi_withdraw
|
||||
(id_data_server, start_time, nominal, user_create, status, jenis) VALUES
|
||||
(:id_data_server, :start_time, :nominal, :user_create, 'pending', 'tagihan')";
|
||||
$stmt = $pdo->prepare($SQLCarikan);
|
||||
$stmt->bindValue(':id_data_server', $_POST['idgetSaldo'], PDO::PARAM_INT);
|
||||
$stmt->bindValue(':start_time', date('Y-m-d H:i:s')); // ✅ pakai bindValue
|
||||
$stmt->bindValue(':nominal', $nominal, PDO::PARAM_INT);
|
||||
$stmt->bindValue(':user_create', $SvNama, PDO::PARAM_STR); // pastikan $SvNama ada
|
||||
$stmt->execute();
|
||||
|
||||
$Pesanwarek = "*PERMINTAAN PENCAIRAN DANA*
|
||||
|
||||
Server : " . $rek_data['nama_server'] . "
|
||||
BANK : " . strtoupper($rek_data['rekening_bank']) . "
|
||||
Rekening : *" . $rek_data['rekening_nomor'] . "*
|
||||
Nama Rek : " . $rek_data['rekening_nama'] . "
|
||||
|
||||
Nominal : *" . $_POST['nominal'] . "*
|
||||
|
||||
|
||||
_# Manja ~ Notif_
|
||||
";
|
||||
$nomorWArek = ["6281298698422", "6285655548738"];
|
||||
$APIwa = new PesanWA();
|
||||
$APIwa->Send_Pesan('1','sendMessage',$nomorWArek,$Pesanwarek);
|
||||
|
||||
sweetAlert("BERHASIL.! Pencairan akan segera diproses, mohon tunggu.", "success");
|
||||
} else {
|
||||
sweetAlert("GAGAL.! Rekening anda sedang diverifikasi mohon ditunggu.", "error");
|
||||
}
|
||||
} else {
|
||||
sweetAlert("GAGAL.! Tidak ada rekening yang tersedia, silahkan isi rekening di Profile Master.", "error");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<?php
|
||||
//Aktifkan Payment Gateway
|
||||
if (isset($_POST['active'])) {
|
||||
try {
|
||||
if(!empty($apikey) || !empty($tokenkey) || !empty($enpoint) ) {
|
||||
$stmt = $pdo->prepare("UPDATE data_server SET status_payment_gateway = 'ACTIVE' WHERE id = :idtik");
|
||||
$stmt->bindParam(':idtik', $id, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
sweetAlert("Payment Gateway Telah Di Aktifkan", "success");
|
||||
}
|
||||
else {
|
||||
sweetAlert("Gagal : Silahkan isi dulu API paramenter", "error");
|
||||
}
|
||||
if ($_POST['jenis'] === 'flip') {
|
||||
if ($apikey && $tokenkey && $enpoint) {
|
||||
$stmt = $pdo->prepare("UPDATE data_server SET status_payment_gateway='ACTIVE' WHERE id=:id");
|
||||
$stmt->execute([':id' => $id]);
|
||||
sweetAlert("Payment Gateway Telah Di Aktifkan", "success");
|
||||
} else {
|
||||
sweetAlert("Gagal: Silahkan isi dulu API parameter", "error");
|
||||
}
|
||||
} elseif ($_POST['jenis'] === 'paydisini') {
|
||||
$stmt = $pdo->prepare("UPDATE data_server SET status_payment_gateway='ACTIVE' WHERE id=:id");
|
||||
$stmt->execute([':id' => $id]);
|
||||
sweetAlert("Payment Gateway Telah Di Aktifkan", "success");
|
||||
} else {
|
||||
sweetAlert("Gagal: Anda belum menyimpan jenis Payment Gateway", "error");
|
||||
}
|
||||
} catch (PDOException $e) {
|
||||
sweetAlert("Gagal: " . $e->getMessage(), "error");
|
||||
sweetAlert("Gagal: " . $e->getMessage(), "error");
|
||||
}
|
||||
}
|
||||
//Non Aktifkan Payment Gateway
|
||||
@@ -140,13 +395,23 @@ $status = $data[0]['status_payment_gateway'];
|
||||
//Simpan data Payment gateway
|
||||
if (isset($_POST['simpan'])) {
|
||||
try {
|
||||
$stmt = $pdo->prepare("UPDATE data_server SET payment_gateway = :payment_gateway, apikey_payment_gateway = :apikey_payment_gateway, url_payment_gateway = :url_payment_gateway, tokenkey_payment_gateway = :tokenkey_payment_gateway WHERE id = :idtik");
|
||||
$stmt->bindParam(':payment_gateway', $_POST['jenis']);
|
||||
$stmt->bindParam(':apikey_payment_gateway', $_POST['apikey']);
|
||||
$stmt->bindParam(':url_payment_gateway', $_POST['enpoint']);
|
||||
$stmt->bindParam(':tokenkey_payment_gateway', $_POST['tokenkey']);
|
||||
$stmt->bindParam(':idtik', $id, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
if ($_POST['jenis'] === 'flip') {
|
||||
$stmt = $pdo->prepare("UPDATE data_server SET payment_gateway = :payment_gateway, apikey_payment_gateway = :apikey_payment_gateway, url_payment_gateway = :url_payment_gateway, tokenkey_payment_gateway = :tokenkey_payment_gateway WHERE id = :idtik");
|
||||
$stmt->bindParam(':payment_gateway', $_POST['jenis']);
|
||||
$stmt->bindParam(':apikey_payment_gateway', $_POST['apikey']);
|
||||
$stmt->bindParam(':url_payment_gateway', $_POST['enpoint']);
|
||||
$stmt->bindParam(':tokenkey_payment_gateway', $_POST['tokenkey']);
|
||||
$stmt->bindParam(':idtik', $id, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
}
|
||||
else {
|
||||
$adminpg = !empty($_POST['adminpg']) ? $_POST['adminpg'] : 2;
|
||||
$stmt = $pdo->prepare("UPDATE data_server SET payment_gateway = :payment_gateway, biaya_payment_gateway = :biaya_payment_gateway WHERE id = :idtik");
|
||||
$stmt->bindParam(':payment_gateway', $_POST['jenis']);
|
||||
$stmt->bindParam(':biaya_payment_gateway', $adminpg);
|
||||
$stmt->bindParam(':idtik', $id, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
}
|
||||
sweetAlert("Payment Gateway telah ubah", "success");
|
||||
|
||||
} catch (PDOException $e) {
|
||||
@@ -154,22 +419,179 @@ $status = $data[0]['status_payment_gateway'];
|
||||
}
|
||||
}
|
||||
?>
|
||||
<script>
|
||||
document.querySelectorAll('.password-toggle').forEach(function(toggle) {
|
||||
toggle.addEventListener('click', function() {
|
||||
var targetId = this.getAttribute('data-target');
|
||||
var passwordInput = document.getElementById(targetId);
|
||||
var icon = this.querySelector('span');
|
||||
|
||||
if (passwordInput.type === 'password') {
|
||||
passwordInput.type = 'text';
|
||||
icon.classList.remove('fa-eye');
|
||||
icon.classList.add('fa-eye-slash');
|
||||
} else {
|
||||
passwordInput.type = 'password';
|
||||
icon.classList.remove('fa-eye-slash');
|
||||
icon.classList.add('fa-eye');
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const select = document.getElementById('getSelected');
|
||||
const container = document.querySelector('.Paykategori');
|
||||
|
||||
function loadFormPage(data) {
|
||||
fetch('controller/payment_gateway.php', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(data)
|
||||
})
|
||||
.then(res => res.text())
|
||||
.then(html => {
|
||||
container.innerHTML = html;
|
||||
|
||||
// Pasang password toggle setelah HTML dimasukkan
|
||||
container.querySelectorAll(".password-toggle").forEach(function(toggle) {
|
||||
toggle.addEventListener("click", function() {
|
||||
const targetId = this.getAttribute("data-target");
|
||||
const input = document.getElementById(targetId);
|
||||
const icon = this.querySelector("span");
|
||||
|
||||
if (!input) return;
|
||||
|
||||
if (input.type === "password") {
|
||||
input.type = "text";
|
||||
icon.classList.remove("fa-eye");
|
||||
icon.classList.add("fa-eye-slash");
|
||||
} else {
|
||||
input.type = "password";
|
||||
icon.classList.remove("fa-eye-slash");
|
||||
icon.classList.add("fa-eye");
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('Error:', err);
|
||||
container.innerHTML = "<p class='text-danger'>Terjadi kesalahan saat memuat data.</p>";
|
||||
});
|
||||
}
|
||||
|
||||
select.addEventListener('change', function() {
|
||||
const value = this.value;
|
||||
if (!value) {
|
||||
container.innerHTML = "";
|
||||
return;
|
||||
}
|
||||
|
||||
let data = { page: value };
|
||||
|
||||
// Jika flip, kirim juga endpoint, apikey, tokenkey
|
||||
if (value === "flip") {
|
||||
data.endpoint = "<?= $enpoint ?>"; // sesuaikan dari PHP
|
||||
data.apikey = "<?= $apikey ?>";
|
||||
data.tokenkey = "<?= $tokenkey ?>";
|
||||
}
|
||||
|
||||
loadFormPage(data);
|
||||
});
|
||||
|
||||
// Optional: trigger load jika ada yang sudah selected
|
||||
if (select.value) {
|
||||
select.dispatchEvent(new Event('change'));
|
||||
}
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#withdrawTable').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"responsive": true,
|
||||
"ajax": {
|
||||
"url": "controller/get_withdrow.php?i=<?= $SvId; ?>&s=tagihan",
|
||||
"type": "POST"
|
||||
},
|
||||
"pageLength": 10,
|
||||
"columns": [
|
||||
{ "data": 0 }, // Server
|
||||
{ "data": 1 }, // Dibuat
|
||||
{ "data": 2 }, // Nominal
|
||||
{ "data": 3 }, // User
|
||||
{
|
||||
"data": 4, // Status
|
||||
"render": function(data, type, row, meta) {
|
||||
if (data === 'pending') {
|
||||
return `<span class="badge bg-primary p-2">${data.toUpperCase()}</span>`;
|
||||
} else {
|
||||
return `<span class="badge bg-success p-2">${data.toUpperCase()}</span>`;
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "data": 5 }, // Diproses
|
||||
{
|
||||
"data": 6, // id unik
|
||||
"render": function(data, type, row, meta) {
|
||||
let btn = "";
|
||||
|
||||
if (row[4] === 'success') {
|
||||
btn += `<button class="btn btn-sm btn-secondary me-1" onclick="viewBukti('${data.bukti_success}')">
|
||||
<i class="fa fa-image"></i>
|
||||
</button>`;
|
||||
}
|
||||
|
||||
return btn;
|
||||
}
|
||||
}
|
||||
],
|
||||
"order": [[1, "desc"]] // urut berdasarkan Dibuat
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// function viewBukti Transaksi
|
||||
function viewBukti(imgPath) {
|
||||
$("#viewBuktiImg").attr("src", imgPath);
|
||||
$("#viewBuktiModal").modal("show");
|
||||
}
|
||||
|
||||
$(document).ready(function(){
|
||||
var currentSaldo = 0; // simpan saldo terakhir
|
||||
|
||||
$("#idgetSaldo").on("change", function(){
|
||||
var serverId = $(this).val();
|
||||
var $nominalInput = $("#formNominal input");
|
||||
|
||||
if(serverId == 0){
|
||||
$("#saldoServer").html("Rp. 0");
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
currentSaldo = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "controller/get_saldo.php",
|
||||
type: "GET",
|
||||
data: { id: serverId, s: '1' },
|
||||
dataType: "json",
|
||||
success: function(res){
|
||||
if(res && res.saldo !== undefined){
|
||||
currentSaldo = parseInt(res.saldo) || 0;
|
||||
$("#saldoServer").html("Rp. " + new Intl.NumberFormat().format(currentSaldo));
|
||||
|
||||
if(currentSaldo < 10000){
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
} else {
|
||||
$nominalInput.prop("disabled", false).prop("readonly", false);
|
||||
}
|
||||
} else {
|
||||
$("#saldoServer").html("Rp. 0");
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
currentSaldo = 0;
|
||||
}
|
||||
},
|
||||
error: function(){
|
||||
$("#saldoServer").html("Gagal mengambil saldo");
|
||||
$nominalInput.prop("disabled", true).prop("readonly", true).val("");
|
||||
currentSaldo = 0;
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
// Cek saat user input nominal
|
||||
$("#formNominal input").on("input", function(){
|
||||
var val = parseInt($(this).val().replace(/\D/g, '')) || 0; // ambil angka aja
|
||||
if(val > currentSaldo){
|
||||
val = currentSaldo; // batasin maksimal saldo
|
||||
}
|
||||
$(this).val(val); // set kembali ke input
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ if (isset($_POST['kirim'])) {
|
||||
$sk1 = !empty($sk) ? " AND status_koneksi = :sk" : "";
|
||||
$mt1 = !empty($mt) ? " AND id_master_topologi = :mt" : "";
|
||||
|
||||
$target_dir = "https://bilspro.com/img/user/";
|
||||
$target_dir = "https://manjapro.net/img/user/";
|
||||
$SQL = "WHERE id_data_server IN ($idsv)" . $sp1 . $sk1 . $mt1;
|
||||
|
||||
try {
|
||||
|
||||
@@ -399,16 +399,16 @@
|
||||
|
||||
// Jika data tunnel radius kosong tapi mau bikin tunnel & radius
|
||||
if (empty($server['radius_nas_data']) && $_POST['tunnel'] == 1) {
|
||||
$nasgroup = "server" . $SvId;
|
||||
|
||||
$tunnel = new CreateTunnel();
|
||||
$resultTun = $tunnel->addTunnel($_POST['nmk'] . '_' . $_POST['ids']);
|
||||
$resultTun = $tunnel->addTunnel($_POST['nmk'] . '_' . $_POST['ids'], $nasgroup);
|
||||
$radius_nas_data = $resultTun;
|
||||
|
||||
$decodedResult = json_decode($resultTun);
|
||||
$nasname = $decodedResult->data->{"remote-address"} ?? null;
|
||||
$shortname = strtok($decodedResult->data->{"name"}, '@');
|
||||
$nassecret = $decodedResult->data->{"nas_secret"} ?? null;
|
||||
$nasgroup = "server" . $SvId;
|
||||
|
||||
// Tambahkan NAS ke Radius jika diminta
|
||||
if ($decodedResult->{'status'} == true && !empty($_POST['radius'])) {
|
||||
@@ -672,7 +672,7 @@ add dst-address=172.16.254.242 gateway=172.18.1.100 check-gateway=ping distance=
|
||||
</div>
|
||||
<pre class="bg-light border rounded p-3 mb-2" id="script1-<?= $server['id']; ?>">
|
||||
/interface ovpn-client
|
||||
add name=opvn-manjapro connect-to=tunnel.manjapro.net port=1199 mode=ip protocol=udp user=<?= $apiScript['data']['name']; ?> password=<?= $apiScript['data']['password']; ?> profile=default-encryption add-default-route=no route-nopull-yes disabled=no
|
||||
add name=opvn-manjapro connect-to=tunnel.manjapro.net port=1199 mode=ip protocol=udp user=<?= $apiScript['data']['name']; ?> password=<?= $apiScript['data']['password']; ?> profile=default-encryption add-default-route=no route-nopull=yes disabled=no
|
||||
/ip firewall nat
|
||||
add chain=dstnat dst-address=<?= $apiScript['data']['remote-address']; ?> protocol=tcp dst-port=<?= $apiScript['data']['port-remote']; ?> action=dst-nat to-addresses=172.0.0.1 to-port=80 comment="Remote"
|
||||
/ip service
|
||||
|
||||
+233
-4
@@ -1,4 +1,10 @@
|
||||
<?php
|
||||
|
||||
// ini_set('display_errors', 1);
|
||||
// error_reporting(E_ALL);
|
||||
// header("Content-Type: application/json");
|
||||
|
||||
|
||||
if (isset($_SESSION['user']))
|
||||
{
|
||||
$id = $_SESSION['user'];
|
||||
@@ -26,6 +32,11 @@ elseif (isset($_SESSION['master']))
|
||||
$username = $data[0]['username'];
|
||||
$email = $data[0]['email'];
|
||||
$profile = $data[0]['profile'];
|
||||
$rek_nomor = $data[0]['rekening_nomor'];
|
||||
$rek_nama = $data[0]['rekening_nama'];
|
||||
$rek_bank = $data[0]['rekening_bank'];
|
||||
$rek_status = $data[0]['rekening_status'];
|
||||
$nama_server = $data[0]['nama_server'];
|
||||
}
|
||||
|
||||
//Pembayaran masal jika apk di gabungkan
|
||||
@@ -152,7 +163,7 @@ if(isset($_SESSION['user']) && $_SESSION['user'] == 1) {
|
||||
<td class="p-2">Password</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-4">
|
||||
<div class="input-group mb-3">
|
||||
<input type="password" class="form-control" name="password" placeholder="Password">
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
@@ -166,7 +177,7 @@ if(isset($_SESSION['user']) && $_SESSION['user'] == 1) {
|
||||
<td class="p-2">Confirm Password</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-4">
|
||||
<div class="input-group mb-3">
|
||||
<input type="password" class="form-control" name="confirm_password" placeholder="Ulangi Password">
|
||||
<div class="input-group-append">
|
||||
<div class="input-group-text">
|
||||
@@ -180,6 +191,112 @@ if(isset($_SESSION['user']) && $_SESSION['user'] == 1) {
|
||||
</table>
|
||||
<input type="submit" class="btn btn-sm btn-primary m-1" name="simpanPassword" value="Simpan Password">
|
||||
</form>
|
||||
|
||||
<?php if($_SESSION['master']) {
|
||||
$readolny = ($rek_status != 'verificated' && $rek_status != 'onverification') ? '' : 'readonly disabled'; ?>
|
||||
<hr>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<table class="table table-borderless">
|
||||
<center>
|
||||
<label>Rekening Bank
|
||||
<?= ($rek_status == 'onverification')
|
||||
? '<span class="badge badge-warning p-2">On Verification</span>'
|
||||
: (($rek_status == 'verificated')
|
||||
? '<span class="badge badge-success p-2">Verificated</span>'
|
||||
: ''); ?>
|
||||
</label>
|
||||
</center>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="p-2">Bank</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-3">
|
||||
<select class="form-control" id="bank_code" name="bank_code" required <?= $readolny ?>>
|
||||
<option value="">-- PILIH BANK --</option>
|
||||
<option value="bca" <?= ($rek_bank=='bca' ? 'selected' : '') ?>>BCA</option>
|
||||
<option value="bni" <?= ($rek_bank=='bni' ? 'selected' : '') ?>>BNI</option>
|
||||
<option value="bri" <?= ($rek_bank=='bri' ? 'selected' : '') ?>>BRI</option>
|
||||
<option value="mandiri"<?= ($rek_bank=='mandiri' ? 'selected' : '') ?>>Mandiri</option>
|
||||
<option value="bjb" <?= ($rek_bank=='bjb' ? 'selected' : '') ?>>BJB</option>
|
||||
<option value="cimb" <?= ($rek_bank=='cimb' ? 'selected' : '') ?>>CIMB</option>
|
||||
<option value="danamon"<?= ($rek_bank=='danamon' ? 'selected' : '') ?>>Danamon</option>
|
||||
<option value="permata"<?= ($rek_bank=='permata' ? 'selected' : '') ?>>Permata</option>
|
||||
<option value="maybank"<?= ($rek_bank=='maybank' ? 'selected' : '') ?>>Maybank</option>
|
||||
<option value="btn" <?= ($rek_bank=='btn' ? 'selected' : '') ?>>BTN</option>
|
||||
</select>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="p-2">Nomor Rekening</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-3">
|
||||
<input class="form-control" type="text" id="account_number" name="account_number"
|
||||
value="<?= htmlspecialchars($rek_nomor ?? '') ?>" required <?= $readolny ?>>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="p-2">Nama Penerima</td>
|
||||
<td class="p-2">:</td>
|
||||
<td class="p-2">
|
||||
<div class="input-group mb-1">
|
||||
<input class="form-control" type="text" id="account_holder" name="account_holder"
|
||||
value="<?= htmlspecialchars($rek_nama ?? '') ?>" readonly>
|
||||
</div>
|
||||
<span id="testStatusCek"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<?= ($rek_status != 'verificated' && $rek_status != 'onverification')
|
||||
? '<input type="submit" class="btn btn-sm btn-primary m-1" name="simpanrekening" value="Simpan">'
|
||||
: ''; ?>
|
||||
|
||||
</form>
|
||||
|
||||
<?php
|
||||
if (isset($_POST['simpanrekening'])) {
|
||||
$SQLrek = "UPDATE data_server
|
||||
SET rekening_bank = :rekening_bank,
|
||||
rekening_nomor = :rekening_nomor,
|
||||
rekening_nama = :rekening_nama,
|
||||
rekening_status = 'onverification'
|
||||
WHERE id = :iddatas";
|
||||
$stmt = $pdo->prepare($SQLrek);
|
||||
|
||||
// pakai bindValue (langsung ambil dari $_POST)
|
||||
$stmt->bindValue(':rekening_bank', $_POST['bank_code']);
|
||||
$stmt->bindValue(':rekening_nomor', $_POST['account_number']);
|
||||
$stmt->bindValue(':rekening_nama', $_POST['account_holder']);
|
||||
$stmt->bindValue(':iddatas', $id, PDO::PARAM_INT);
|
||||
|
||||
if ($stmt->execute()) {
|
||||
$Pesan = "*Permintaan Verifikasi Rekening*
|
||||
|
||||
Server : " . $nama_server . "
|
||||
BANK : " . strtoupper($_POST['bank_code']) . "
|
||||
Rekening : *" . $_POST['account_number'] . "*
|
||||
Nama Rek : " . strtoupper($_POST['account_holder']) . "
|
||||
|
||||
status : _*On Verification*_
|
||||
|
||||
|
||||
_# Manja ~ Notif_
|
||||
";
|
||||
$nomorWA = ['6281298698422', '6285655548738'];
|
||||
$APIwa = new PesanWA();
|
||||
$APIwa->Send_Pesan('1','sendMessage',$nomorWA,$Pesan);
|
||||
|
||||
sweetAlert("BERHASIL.! Rekening telah ditambahkan silahkan tunggu verifikasi", "success");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
<?php } ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -353,7 +470,7 @@ if(isset($_SESSION['user']) && $_SESSION['user'] == 1) {
|
||||
// $stmt->bindParam(':id', $_SESSION['master']);
|
||||
// $stmt->execute();
|
||||
// }
|
||||
$stmt = $pdo->prepare("SELECT * FROM apk_payment WHERE id_data_server = :id ORDER BY waktu_transaksi DESC");
|
||||
$stmt = $pdo->prepare("SELECT * FROM apk_payment WHERE id_data_server = :id AND jenis IS NULL ORDER BY waktu_transaksi DESC");
|
||||
$stmt->bindParam(':id', $idserver);
|
||||
$stmt->execute();
|
||||
// Ambil semua hasil dari query
|
||||
@@ -547,4 +664,116 @@ document.querySelectorAll('.toggle-password').forEach(function(toggle) {
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
let debounceTimer;
|
||||
let loadingInterval;
|
||||
|
||||
const bankAccountLength = {
|
||||
"bca": [10],
|
||||
"bni": [10],
|
||||
"bri": [10, 15],
|
||||
"mandiri": [13],
|
||||
"bjb": [13],
|
||||
"cimb": [10, 13],
|
||||
"danamon": [10],
|
||||
"permata": [10],
|
||||
"maybank": [10],
|
||||
"btn": [10]
|
||||
};
|
||||
|
||||
const CEK_URL = "controller/cekrekeningFlip.php";
|
||||
const API_TOKEN = "xyz123"; // samakan dengan PHP
|
||||
|
||||
// POST dengan header token
|
||||
async function postFormSafe(url, formObj) {
|
||||
const body = new URLSearchParams(formObj).toString();
|
||||
|
||||
const res = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"Accept": "application/json",
|
||||
"X-Api-Token": API_TOKEN
|
||||
},
|
||||
body
|
||||
});
|
||||
|
||||
const text = await res.text();
|
||||
try {
|
||||
return JSON.parse(text);
|
||||
} catch (e) {
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-danger"><i>Respon tidak valid dari server</i></p>`;
|
||||
throw new Error("Respon bukan JSON");
|
||||
}
|
||||
}
|
||||
|
||||
// Auto cek rekening
|
||||
document.getElementById("account_number").addEventListener("keyup", function () {
|
||||
const accountHolderField = document.getElementById("account_holder");
|
||||
|
||||
if (accountHolderField.value.trim() !== "") return;
|
||||
|
||||
clearTimeout(debounceTimer);
|
||||
debounceTimer = setTimeout(async () => {
|
||||
let bank_code = (document.getElementById("bank_code").value || "").trim().toLowerCase();
|
||||
let account_number = this.value.trim();
|
||||
|
||||
if (!bank_code || !account_number) return;
|
||||
|
||||
// validasi panjang nomor rekening
|
||||
if (bankAccountLength[bank_code]) {
|
||||
let allowed = bankAccountLength[bank_code];
|
||||
if (!allowed.includes(account_number.length)) {
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-danger"><i>Nomor rekening ${bank_code.toUpperCase()} harus ${allowed.join(" / ")} digit</i></p>`;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// tampilkan status loading dengan animasi titik
|
||||
let dots = 0;
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-info"><i>Sedang pengecekan</i></p>`;
|
||||
loadingInterval = setInterval(() => {
|
||||
dots = (dots + 1) % 4; // 0..3
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-info"><i>Sedang pengecekan${"..".repeat(dots)}</i></p>`;
|
||||
}, 500);
|
||||
|
||||
try {
|
||||
// delay 2 detik biar animasi keliatan
|
||||
await new Promise(resolve => setTimeout(resolve, 2000));
|
||||
|
||||
let data = await postFormSafe(CEK_URL, { bank_code, account_number });
|
||||
|
||||
clearInterval(loadingInterval);
|
||||
|
||||
if (data.status) {
|
||||
if (data.account_holder && data.account_holder.trim() !== "") {
|
||||
accountHolderField.value = data.account_holder;
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-success"><i>✅ Rekening terdaftar</i></p>`;
|
||||
} else {
|
||||
accountHolderField.value = "";
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-danger"><i>❌ Rekening salah atau tidak terdaftar</i></p>`;
|
||||
}
|
||||
} else {
|
||||
accountHolderField.value = "";
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-danger"><i>❌ ${data.message || "Gagal cek rekening"}</i></p>`;
|
||||
}
|
||||
} catch (err) {
|
||||
clearInterval(loadingInterval);
|
||||
document.getElementById("testStatusCek").innerHTML =
|
||||
`<p class="text-danger"><i>🚨 Error: ${err.message}</i></p>`;
|
||||
}
|
||||
}, 800);
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
|
||||
+10
-6
@@ -373,11 +373,15 @@ $datakonpensasi = ($data[0]['konpensasi'] == 0) ? $data[0]['jumlah_konpensasi']
|
||||
$stmt->execute();
|
||||
}
|
||||
|
||||
if (in_array($data[0]['id_data_server'], [2, 3, 4, 5, 6, 8, 9])) {
|
||||
$nomor = explode(',', $data[0]['nomor_whatsapp'] . ',6282130888937');
|
||||
} else {
|
||||
$nomor = explode(',', $data[0]['nomor_whatsapp']);
|
||||
}
|
||||
// --- KIRIM CUSTOM ----
|
||||
// if (in_array($data[0]['id_data_server'], [2, 3, 4, 5, 6, 8, 9])) {
|
||||
// $nomor = explode(',', $data[0]['nomor_whatsapp'] . ',6282130888937');
|
||||
// } else {
|
||||
// $nomor = explode(',', $data[0]['nomor_whatsapp']);
|
||||
// }
|
||||
|
||||
|
||||
$nomor = explode(',', $data[0]['nomor_whatsapp']);
|
||||
// Kirim Pesan WhatsApp
|
||||
$Url = baseurl($invoicePath);
|
||||
|
||||
@@ -453,4 +457,4 @@ $datakonpensasi = ($data[0]['konpensasi'] == 0) ? $data[0]['jumlah_konpensasi']
|
||||
document.getElementById("detik").addEventListener("change", updateHiddenDatetime);
|
||||
|
||||
updateHiddenDatetime();
|
||||
</script>
|
||||
</script>
|
||||
|
||||
@@ -113,13 +113,13 @@ if (isset($_POST['tambah'])) {
|
||||
$status = 'pending';
|
||||
|
||||
// Payment gateway processing
|
||||
$transaction_id = '';
|
||||
$transaction_link = '';
|
||||
$transaction_status = '';
|
||||
$transaction_id = NULL;
|
||||
$transaction_link = NULL;
|
||||
$transaction_status = NULL;
|
||||
|
||||
$total_desimal = round($verifikasi_tagihan);
|
||||
|
||||
if (!empty($paygw['apikey_payment_gateway']) && $paygw['status_payment_gateway'] === 'ACTIVE') {
|
||||
if (!empty($paygw['apikey_payment_gateway']) && $paygw['status_payment_gateway'] === 'ACTIVE' && $paygw['payment_gateway'] == 'flip') {
|
||||
require 'payment/flip/Flip/Transaction.php';
|
||||
$flip = new FlipPaymentGateway($paygw['apikey_payment_gateway'], $paygw['url_payment_gateway']);
|
||||
$response = $flip->createBill($keterangan, $total_desimal, $pelanggan['email'], $pelanggan['nama'], $pelanggan['nomor_whatsapp'], $pelanggan['alamat']);
|
||||
@@ -159,6 +159,21 @@ if (isset($_POST['tambah'])) {
|
||||
]);
|
||||
|
||||
$last_id = $pdo->lastInsertId();
|
||||
|
||||
if ($paygw['payment_gateway'] == 'paydisini' && $paygw['status_payment_gateway'] == 'ACTIVE') {
|
||||
require 'controller/payment_paydisini.php';
|
||||
$link_paydisini = createUrlpaydisini($last_id);
|
||||
if ($link_paydisini) {
|
||||
$transaction_link_paydisini = $link_paydisini['url'];
|
||||
$stmt = $pdo->prepare("UPDATE tagihan
|
||||
SET transaction_link = :transaction_link
|
||||
WHERE id = :idtag");
|
||||
$stmt->bindParam(':transaction_link', $transaction_link_paydisini);
|
||||
$stmt->bindParam(':idtag', $last_id);
|
||||
$stmt->execute();
|
||||
}
|
||||
}
|
||||
|
||||
sweetAlert("Tagihan telah ditambahkan", "success", '?' . encrypt_url('tagihan_detail|' . $last_id . '|tagihan_sedang_berjalan'));
|
||||
} catch (Exception $e) {
|
||||
// Handle exceptions and errors gracefully
|
||||
|
||||
@@ -7,6 +7,12 @@ if ($data[0]['konpensasi'] == 0) {
|
||||
} else {
|
||||
$datakonpensasi = 0;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("SELECT payment_gateway, apikey_payment_gateway, url_payment_gateway,status_payment_gateway FROM data_server WHERE id = :id_data");
|
||||
$stmt->bindParam(':id_data', $data[0]['id_data_server'], PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
$paygw = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
// echo "<pre>";
|
||||
// print_r($_SERVER);
|
||||
// echo "</pre>";
|
||||
@@ -112,18 +118,19 @@ if ($data[0]['konpensasi'] == 0) {
|
||||
<td class="p-1"><b>Rp. <?php echo number_format($data[0]['verifikasi_tagihan']); ?></b></td>
|
||||
</tr>
|
||||
<?php
|
||||
if(isset($data[0]['transaction_link'])) { ?>
|
||||
if(isset($data[0]['transaction_status'])) { ?>
|
||||
<tr>
|
||||
<td class="p-1">Status Payment</td>
|
||||
<td class="p-1">:</td>
|
||||
<td class="p-1"><?php echo $data[0]['transaction_status']; ?></td>
|
||||
</tr>
|
||||
<?php } if(isset($data[0]['transaction_link'])) { ?>
|
||||
<tr>
|
||||
<td class="p-1">Link Pembayaran</td>
|
||||
<td class="p-1">:</td>
|
||||
<td class="p-1" style="max-width: 200px;">
|
||||
<?php
|
||||
$validStat = ['ACTIVE','INACTIVE'];
|
||||
$validStat = ['ACTIVE','INACTIVE', NULL];
|
||||
if (in_array($data[0]['transaction_status'], $validStat)) { ?>
|
||||
<a href="https://<?php echo $data[0]['transaction_link']; ?>" target="_blank">https://<?php echo $data[0]['transaction_link']; ?></a>
|
||||
<?php } else { echo "NO LINK"; }?>
|
||||
@@ -154,7 +161,11 @@ if ($data[0]['konpensasi'] == 0) {
|
||||
<?php } else { ?>
|
||||
|
||||
<input type="submit" name="simpan" class="btn btn-primary btn-sm m-1" value="Edit / Simpan">
|
||||
|
||||
|
||||
<?php if ($paygw['status_payment_gateway'] == "ACTIVE" && empty($data[0]['transaction_link'])) { ?>
|
||||
<input type="submit" name="buatlink" class="btn btn-warning btn-sm m-1" value="Buat Link Payment Gateway">
|
||||
<?php } ?>
|
||||
|
||||
<?php } if($data[0]['status'] != 'buat'){ ?>
|
||||
|
||||
<input type="submit" name="kirim" class="btn btn-success btn-sm m-1" value="Kirim Ulang Tagihan">
|
||||
@@ -165,7 +176,75 @@ if ($data[0]['konpensasi'] == 0) {
|
||||
|
||||
<?php } ?>
|
||||
</form>
|
||||
<?php
|
||||
<?php
|
||||
|
||||
//PERINTAH BUAT LINK PAYMENT GATEWAY
|
||||
if (isset($_POST['buatlink'])) {
|
||||
try {
|
||||
if ($paygw['payment_gateway'] == 'flip' && !empty($paygw['apikey_payment_gateway']) && $paygw['status_payment_gateway'] === 'ACTIVE') {
|
||||
require 'payment/flip/Flip/Transaction.php';
|
||||
$flip = new FlipPaymentGateway($paygw['apikey_payment_gateway'], $paygw['url_payment_gateway']);
|
||||
|
||||
$response = $flip->createBill(
|
||||
$data[0]['keterangan'] ?? '',
|
||||
$data[0]['verifikasi_tagihan'] ?? '',
|
||||
$data[0]['email'] ?? '',
|
||||
$data[0]['nama'] ?? '',
|
||||
$data[0]['nomor_whatsapp'] ?? '',
|
||||
$data[0]['alamat'] ?? ''
|
||||
);
|
||||
|
||||
if (isset($response['link_id'])) {
|
||||
$transaction_id = $response['link_id'];
|
||||
$transaction_link = $response['link_url'];
|
||||
$transaction_status = $response['status'];
|
||||
|
||||
$stmt = $pdo->prepare("UPDATE tagihan
|
||||
SET transaction_id = :transaction_id,
|
||||
transaction_link = :transaction_link,
|
||||
transaction_status = :transaction_status
|
||||
WHERE id = :idtag");
|
||||
$stmt->bindParam(':transaction_id', $transaction_id);
|
||||
$stmt->bindParam(':transaction_link', $transaction_link);
|
||||
$stmt->bindParam(':transaction_status', $transaction_status);
|
||||
$stmt->bindParam(':idtag', $page[1]);
|
||||
$stmt->execute();
|
||||
|
||||
sweetAlert("Link Payment Gateway telah dibuat", "success");
|
||||
} else {
|
||||
// Error dari response Flip
|
||||
$er = json_encode($response, JSON_PRETTY_PRINT);
|
||||
sweetAlert("Gagal membuat link pembayaran:<br><pre>{$er}</pre>", "error");
|
||||
}
|
||||
} elseif ($paygw['payment_gateway'] == 'paydisini' && $paygw['status_payment_gateway'] === 'ACTIVE') {
|
||||
require 'controller/payment_paydisini.php';
|
||||
|
||||
$link_paydisini = createUrlpaydisini($page[1]);
|
||||
if ($link_paydisini) {
|
||||
$transaction_link_paydisini = $link_paydisini['url'];
|
||||
|
||||
$stmt = $pdo->prepare("UPDATE tagihan
|
||||
SET transaction_link = :transaction_link
|
||||
WHERE id = :idtag");
|
||||
$stmt->bindParam(':transaction_link', $transaction_link_paydisini);
|
||||
$stmt->bindParam(':idtag', $page[1]);
|
||||
$stmt->execute();
|
||||
|
||||
sweetAlert("Link Payment Gateway telah dibuat", "success");
|
||||
} else {
|
||||
sweetAlert("Gagal membuat link pembayaran", "error");
|
||||
}
|
||||
} else {
|
||||
sweetAlert("Payment Gateway tidak aktif atau API key kosong.", "error");
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
// Error dari sistem / database
|
||||
sweetAlert("Terjadi kesalahan: " . $e->getMessage(), "error");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//PERINTAH UBAH TAGIHAN
|
||||
if(isset($_POST['simpan'])) {
|
||||
try {
|
||||
$stmt = $pdo->prepare("SELECT * FROM profile_tagihan WHERE id = :id1 ");
|
||||
@@ -228,7 +307,7 @@ if ($data[0]['konpensasi'] == 0) {
|
||||
$paygw = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
// print_r($paygw);
|
||||
//Jika menggunakan payment gateway
|
||||
if (!empty($paygw[0]['apikey_payment_gateway']) && isset($paygw[0]['status_payment_gateway']) && $paygw[0]['status_payment_gateway'] === 'ACTIVE') {
|
||||
if (!empty($paygw[0]['apikey_payment_gateway']) && isset($paygw[0]['status_payment_gateway']) && $paygw[0]['status_payment_gateway'] === 'ACTIVE' && $paygw[0]['payment_gateway'] == 'flip') {
|
||||
require 'payment/flip/Flip/Transaction.php';
|
||||
$apiKey = $paygw[0]['apikey_payment_gateway'];
|
||||
$apiUrl = $paygw[0]['url_payment_gateway'];
|
||||
@@ -250,10 +329,15 @@ if ($data[0]['konpensasi'] == 0) {
|
||||
$transaction_link = $response['link_url'];
|
||||
$transaction_status = $response['status'];
|
||||
}
|
||||
elseif ($paygw[0]['payment_gateway'] == 'paydisini') {
|
||||
$transaction_id = NULL;
|
||||
$transaction_link = $data[0]['transaction_link'];
|
||||
$transaction_status = NULL;
|
||||
}
|
||||
else {
|
||||
$transaction_id = "";
|
||||
$transaction_link = "";
|
||||
$transaction_status = "";
|
||||
$transaction_id = NULL;
|
||||
$transaction_link = NULL;
|
||||
$transaction_status = NULL;
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare("UPDATE tagihan SET konpensasi = :konpensasi, jumlah_konpensasi = :jumlahkon, jumlah_tagihan = :jumlah_tagihan, ppn = :ppn, total_tagihan = :total_tagihan, verifikasi_tagihan = :verifikasi_tagihan, transaction_id = :transaction_id, transaction_link = :transaction_link, transaction_status = :transaction_status, kode_unik = :kode_unik WHERE id = :idtag");
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
<tbody>
|
||||
<?php
|
||||
$no = 1;
|
||||
$stmt = $pdo->query("SELECT * FROM v_tiket_gangguan WHERE status = '1' $SqlDataId ORDER BY level");
|
||||
$stmt = $pdo->query("SELECT * FROM v_tiket_gangguan WHERE status = '1' $SqlDataId ORDER BY COALESCE(level, 999) ASC, start_time DESC");
|
||||
while ($server = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
if ($server['jenis_tiket'] == 'Pelanggan') {
|
||||
$ket = '<a href="?'.encrypt_url('user_detail|'.$server['id_pelanggan']).'"><b>'.$server['nama_pelanggan'].'</b></a><br>'.$server['permasalahan'];
|
||||
|
||||
+47
-70
@@ -1,9 +1,8 @@
|
||||
<?php
|
||||
$stmt = $pdo->prepare("SELECT
|
||||
SUM(user_hs_aktif) AS user_hs_aktif
|
||||
FROM v_jumlah_pelanggan $SqlDataWHIdM");
|
||||
$stmt->execute();
|
||||
$datauser = $stmt->fetchAll();
|
||||
$stmt = $pdo->prepare("SELECT SUM(user_hs_aktif) AS user_hs_aktif FROM v_jumlah_pelanggan $SqlDataWHIdM");
|
||||
$stmt->execute();
|
||||
$datauser = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$hotspotAktif = ($datauser['user_hs_aktif'] > 0);
|
||||
?>
|
||||
<section class="content" style="zoom : 85%;">
|
||||
<div class="container-fluid">
|
||||
@@ -15,21 +14,24 @@ $stmt = $pdo->prepare("SELECT
|
||||
<div class="col-sm-6">
|
||||
<h4>Pelanggan Aktif</h4>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="col-sm-6 text-right">
|
||||
<form id="exportForm" action="excel/exportPelAktif.php?data=<?= encrypt_url(json_encode([$SqlSvData])); ?>" method="POST" target="_blank">
|
||||
<input type="hidden" name="datatable_params" id="datatableParams">
|
||||
<button type="submit" id="export-button" class="btn btn-success"><i class="fas fa-file-excel mr-2"></i>Export</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-header -->
|
||||
<div class="card-body">
|
||||
<table id="example3" class="table table-bordered table-striped">
|
||||
<table id="dataTable3" class="table table-bordered table-striped">
|
||||
<thead>
|
||||
<tr class="bg-success">
|
||||
<th style="max-width: 20px">No</th>
|
||||
<th>No</th>
|
||||
<th>Nama</th>
|
||||
<th>NIK</th>
|
||||
<th>Id Pelanggan</th>
|
||||
<?php if($datauser[0]['user_hs_aktif'] > 0) { ?>
|
||||
<th>Akun Hotspot</th>
|
||||
<?php if($hotspotAktif) { ?>
|
||||
<th>Akun Hotspot</th>
|
||||
<?php } ?>
|
||||
<th>Alamat</th>
|
||||
<th>Koordinat</th>
|
||||
@@ -42,68 +44,43 @@ $stmt = $pdo->prepare("SELECT
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
// Teknik CHUNGKING
|
||||
$no = 1;
|
||||
$chunkSize = 200;
|
||||
$stmt = $pdo->query("SELECT COUNT(id) FROM v_pelanggan WHERE $SqlSvData status = 'aktif' ORDER BY nama");
|
||||
$totalRows = $stmt->fetchColumn();
|
||||
for ($offset = 0; $offset < $totalRows; $offset += $chunkSize) {
|
||||
$stmt = $pdo->prepare("SELECT id,akun,user_hotspot,nama,alamat,latitude,longitude,nomor_whatsapp,email,nik,nama_server,nama_paket,time_start,status_koneksi,nama_mikrotik,id_setting_mikrotik,time_update,ip_address FROM v_pelanggan WHERE $SqlSvData status = 'aktif' ORDER BY nama LIMIT :limit OFFSET :offset");
|
||||
$stmt->bindValue(':limit', $chunkSize, PDO::PARAM_INT);
|
||||
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
|
||||
$data = $stmt->fetchAll();
|
||||
foreach ($data as $row) {
|
||||
|
||||
?>
|
||||
<tr>
|
||||
<td style="max-width: 20px"><?php echo $no; ?></td>
|
||||
<td><?php echo $row['nama']; ?></td>
|
||||
<td><?php echo $row['nik']; ?></td>
|
||||
<td><?php echo $row['akun']; ?></td>
|
||||
<?php if($datauser[0]['user_hs_aktif'] > 0) { ?>
|
||||
<td><?php echo $row['user_hotspot']; ?></td>
|
||||
<?php } ?>
|
||||
<td style="max-width: 200px"><?php echo $row['alamat']; ?></td>
|
||||
<td style="max-width: 200px">
|
||||
<?php if(substr($row['latitude'],0,1) != '-') { ?>
|
||||
<a href="https://google.com/maps/?q=<?php echo $row['latitude']; ?>" target="_blank"><?php echo $row['latitude']; ?></a>
|
||||
<?php } else { ?>
|
||||
<a href="https://google.com/maps/?q=<?php echo $row['latitude'].','.$row['longitude']; ?>" target="_blank"><?php echo $row['latitude'].', '.$row['longitude']; ?></a>
|
||||
<?php } ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php echo $row['nomor_whatsapp'];?>
|
||||
<a href="https://wa.me/<?php echo $row['nomor_whatsapp']; ?>" target="_blank" style="border-radius: 20px;" class="btn btn-sm btn-success"><i class="fab fa-whatsapp"></i></a><br>
|
||||
<?php echo $row['email']; ?>
|
||||
</td>
|
||||
<td><?php echo $row['nama_server']; ?></td>
|
||||
<td><?php echo $row['nama_mikrotik']; ?></td>
|
||||
<td><?php echo $row['nama_paket']; ?></td>
|
||||
<td>
|
||||
<?php echo $row['status_koneksi']; if($row['status_koneksi'] == 'On') { ?>
|
||||
<a href="?<?php echo encrypt_url('user_remote|'.$row['id'].'|'.$row['id_setting_mikrotik']); ?>" class="btn btn-sm btn-success ml-1" style="border-radius: 20px;">Remote</a>
|
||||
<br><?php echo $row['ip_address']; ?>
|
||||
<?php } ?>
|
||||
<br><?php echo $row['time_update']; ?>
|
||||
</td>
|
||||
<td><?php echo $row['time_start']; ?></td>
|
||||
<td style="max-width: 30px">
|
||||
<a href="?<?php echo encrypt_url('user_detail|'.$row['id']); ?>" class="btn btn-sm btn-info btn-sm m-1">Detail</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<?php
|
||||
$no++;
|
||||
}} ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
var table = $("#dataTable3").DataTable({
|
||||
processing: true,
|
||||
serverSide: true,
|
||||
ajax: {
|
||||
url: "controller/get_user_aktif.php?data=<?= encrypt_url(json_encode([$SqlSvData, $SqlDataWHIdM, $hotspotAktif])); ?>",
|
||||
type: "POST"
|
||||
},
|
||||
responsive: true,
|
||||
lengthChange: true,
|
||||
autoWidth: false,
|
||||
buttons: ["excel", "pdf", "print"]
|
||||
});
|
||||
|
||||
table.buttons().container().appendTo('#dataTable3_wrapper .col-md-6:eq(0)');
|
||||
|
||||
// Debug: tampilkan POST parameter setiap kali request
|
||||
table.on('preXhr.dt', function(e, settings, data){
|
||||
console.log("🔎 DataTables POST Params:", data);
|
||||
});
|
||||
|
||||
// Simpan param terakhir ke hidden input (opsional untuk export)
|
||||
table.on('draw', function(){
|
||||
const params = table.ajax.params();
|
||||
console.log("📦 Last Ajax Params:", params);
|
||||
$("#datatableParams").val(JSON.stringify(params));
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
+80
-5
@@ -13,6 +13,28 @@ $stmt1 = $pdo->prepare("SELECT catatan FROM order_list WHERE akun = :akun");
|
||||
$stmt1->execute(['akun' => $user]);
|
||||
$isi1 = $stmt1->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
$catatanada = ($isi1) ? $isi1['catatan'] : '';
|
||||
|
||||
$lat = $isi['latitude'] ?? null;
|
||||
$long = $isi['longitude'] ?? null;
|
||||
|
||||
|
||||
function isValidLat($lat) {
|
||||
return is_numeric($lat) && (float)$lat >= -90 && (float)$lat <= 90;
|
||||
}
|
||||
|
||||
function isValidLong($long) {
|
||||
return is_numeric($long) && (float)$long >= -180 && (float)$long <= 180;
|
||||
}
|
||||
|
||||
if (!isValidLat($lat)) {
|
||||
$lat = null;
|
||||
}
|
||||
|
||||
if (!isValidLong($long)) {
|
||||
$long = null;
|
||||
}
|
||||
|
||||
?>
|
||||
<!-- Main content -->
|
||||
<section class="content">
|
||||
@@ -161,8 +183,8 @@ $isi1 = $stmt1->fetch(PDO::FETCH_ASSOC);
|
||||
<input class="form-control" type="text" id="latlong" required name="koordinat">
|
||||
<i class="text-danger"><small>Anda bisa pilih salah satu untuk mengisi bagian ini</small></i>
|
||||
<!-- Input hidden untuk latitude dan longitude -->
|
||||
<input type="hidden" id="latitude" data-maps="latitude" name="latitude" value="<?php echo $isi['latitude']; ?>" required="required">
|
||||
<input type="hidden" id="longitude" data-maps="longitude" name="longitude" value="<?php echo $isi['longitude']; ?>" required="required">
|
||||
<input type="hidden" id="latitude" data-maps="latitude" name="latitude" value="<?php echo $lat; ?>" required="required">
|
||||
<input type="hidden" id="longitude" data-maps="longitude" name="longitude" value="<?php echo $long; ?>" required="required">
|
||||
<div id="map" style="height:250px;margin-top: 10px;"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
@@ -209,7 +231,7 @@ $isi1 = $stmt1->fetch(PDO::FETCH_ASSOC);
|
||||
</div>
|
||||
<div class="form-group m-1">
|
||||
<label>Catatan Saat Order</label>
|
||||
<textarea class="form-control" rows="2" disabled><?php echo $isi1['catatan']; ?></textarea>
|
||||
<textarea class="form-control" rows="2" disabled><?= $catatanada ?></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -419,10 +441,62 @@ if (isset($_POST['ubah'])) {
|
||||
$fotoonu1 = $_SESSION['uploaded_files']['onu'.$isi['id']];
|
||||
$fototes1 = $_SESSION['uploaded_files']['tes'.$isi['id']];
|
||||
|
||||
$stmt = $pdo->prepare("SELECT ip_address,username,password,port_api FROM setting_mikrotik WHERE id = :id");
|
||||
$stmt->execute(['id' => $isi['id_setting_mikrotik']]);
|
||||
$mikEdit = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if($_POST['jenis'] == "Hotspot"){
|
||||
$hotspot = $_POST['user_hotspot'];
|
||||
} else {
|
||||
$hotspot = "";
|
||||
$logubahpaket = "";
|
||||
if ($isi['id_profile_paket'] != $_POST['idp']) {
|
||||
$userEdit = $isi['akun'];
|
||||
|
||||
$stmt = $pdo->prepare("SELECT nama_profile FROM profile_paket WHERE id = :id");
|
||||
$stmt->execute(['id' => $_POST['idp']]);
|
||||
$proPaket = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($proPaket && !empty($proPaket['nama_profile'])) {
|
||||
$profileNew = $proPaket['nama_profile'];
|
||||
|
||||
$API = new RouterosAPI();
|
||||
$API->debug = false;
|
||||
|
||||
if ($API->connect2($mikEdit['ip_address'], $mikEdit['username'], $mikEdit['password'], $mikEdit['port_api'])) {
|
||||
|
||||
$arrID = $API->comm("/ppp/secret/getall", [
|
||||
".proplist"=> ".id",
|
||||
"?name" => $userEdit,
|
||||
]);
|
||||
|
||||
if (!empty($arrID)) {
|
||||
$API->comm("/ppp/secret/set", [
|
||||
".id" => $arrID[0][".id"],
|
||||
"profile" => $profileNew,
|
||||
]);
|
||||
|
||||
$arrID1 = $API->comm("/ppp/active/getall", [
|
||||
".proplist" => ".id",
|
||||
"?name" => $userEdit,
|
||||
]);
|
||||
|
||||
if (!empty($arrID1)) {
|
||||
$API->comm("/ppp/active/remove", [
|
||||
".id" => $arrID1[0][".id"],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$API->disconnect();
|
||||
$logubahpaket = "dan paket di Mikrotik ";
|
||||
} else {
|
||||
sweetAlert("Perubahan paket gagal, Aplikasi tidak terhubung ke mikrotik", "error");
|
||||
exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$SQL = "UPDATE pelanggan SET
|
||||
@@ -478,7 +552,7 @@ if (isset($_POST['ubah'])) {
|
||||
':id' => $page[1]
|
||||
]);
|
||||
|
||||
sweetAlert("Data pelanggan sudah diubah", "success");
|
||||
sweetAlert("Data pelanggan " . $logubahpaket . "berhasil diubah", "success");
|
||||
} catch (PDOException $e) {
|
||||
// Handle error appropriately
|
||||
sweetAlert("Error: " . $e->getMessage(), "error");
|
||||
@@ -635,4 +709,5 @@ $_SESSION['uploaded_files']['odp'.$isi['id']] = $isi['foto_odp'];
|
||||
$_SESSION['uploaded_files']['rmh'.$isi['id']] = $isi['foto_rumah'];
|
||||
$_SESSION['uploaded_files']['onu'.$isi['id']] = $isi['foto_onu'];
|
||||
$_SESSION['uploaded_files']['tes'.$isi['id']] = $isi['foto_test'];
|
||||
?>
|
||||
?>
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
@@ -85,4 +85,6 @@ $stmt = $pdo->prepare("SELECT
|
||||
<!-- /.row -->
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
+44
-3
@@ -15,6 +15,8 @@
|
||||
|
||||
<?php
|
||||
|
||||
// error_reporting(1);
|
||||
|
||||
$ambil=$con->query("SELECT id,ip_address,username,password,port_api,port_remote,user_remote,last_remote FROM setting_mikrotik WHERE id='$page[2]'");
|
||||
$pecah= $ambil->fetch_assoc();
|
||||
|
||||
@@ -53,11 +55,49 @@ $end = new DateTime($now);
|
||||
|
||||
$diff_in_seconds = $end->getTimestamp() - $start->getTimestamp();//
|
||||
|
||||
// print_r($pecah);
|
||||
// echo "<br><br><br>";
|
||||
// print_r($pel);
|
||||
if ($SvNama != $user_remote && $diff_in_seconds <= 180)
|
||||
{
|
||||
include "controller/remoteModem.php";
|
||||
|
||||
$remote = new RemoteModem($pdo);
|
||||
$result = $remote->remote_add($page[2], $addressuser, $nama);
|
||||
$dataresult = json_decode($result, true);
|
||||
|
||||
if ($dataresult['status'] == "success") {
|
||||
|
||||
?>
|
||||
<div class="card-body">
|
||||
<table class="table table-borderless">
|
||||
<tr>
|
||||
<td>Nama</td>
|
||||
<td><?php echo $nama; ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Alamat</td>
|
||||
<td><?php echo $alamat; ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Last Ip Address</td>
|
||||
<td><?php echo $addressuser; ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Last Up Time</td>
|
||||
<td><?php echo $lasttime; ?></td>
|
||||
</tr>
|
||||
</table><br><br>
|
||||
<div class="text-center">
|
||||
<div class="alert alert-danger">
|
||||
<b>PERINGATAN..!!</b>
|
||||
Router / Modem Pelanggan bisa di remote jika fitur remote di Router/Modem di aktifkan.
|
||||
</div>
|
||||
<a target="_blank" class="btn btn-primary btn-rouded btn-sm" href="http://<?= $dataresult['link_remote'];?>">Buka Web Browser</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
else {
|
||||
|
||||
// echo $nama . $page[2] . " " . $addressuser . " " .$page[1];
|
||||
?>
|
||||
<div class="card-body">
|
||||
<div class="text-center">
|
||||
@@ -70,6 +110,7 @@ if ($SvNama != $user_remote && $diff_in_seconds <= 180)
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
|
||||
+39
-2
@@ -67,8 +67,13 @@
|
||||
</div>
|
||||
<div class="form-group m-1">
|
||||
<label>Email</label>
|
||||
<input type="email" class="form-control" name="email">
|
||||
<input type="email" class="form-control" required="required" name="email" id="emailInput">
|
||||
<small id="emailError"></small>
|
||||
</div>
|
||||
<!--<div class="form-group m-1">-->
|
||||
<!-- <label>Email</label>-->
|
||||
<!-- <input type="email" class="form-control" name="email">-->
|
||||
<!--</div>-->
|
||||
<div class="form-group m-1">
|
||||
<label>Nomor WhatsApp</label>
|
||||
<input type="text" class="form-control" name="nowa">
|
||||
@@ -250,4 +255,36 @@ if (isset($_POST['tambah'])) {
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
?>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
const emailInput = document.getElementById("emailInput");
|
||||
const emailError = document.getElementById("emailError");
|
||||
const gmailRegex = /^[a-z0-9._%+-]+@gmail\.com$/;
|
||||
|
||||
// Saat ngetik
|
||||
emailInput.addEventListener("input", function() {
|
||||
this.value = this.value.toLowerCase();
|
||||
|
||||
if (gmailRegex.test(this.value)) {
|
||||
emailError.textContent = "✅ Email valid";
|
||||
emailError.style.color = "green";
|
||||
} else {
|
||||
emailError.textContent = "❌ Email tidak valid (harus @gmail.com & huruf kecil)";
|
||||
emailError.style.color = "red";
|
||||
}
|
||||
});
|
||||
|
||||
// Saat submit
|
||||
emailInput.form.addEventListener("submit", function(e) {
|
||||
if (!gmailRegex.test(emailInput.value)) {
|
||||
e.preventDefault(); // stop submit
|
||||
emailError.textContent = "❌ Email tidak valid (harus @gmail.com & huruf kecil)";
|
||||
emailError.style.color = "red";
|
||||
emailInput.focus();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript" src="dist/js/mapsFormCustom.js"></script>
|
||||
@@ -24,15 +24,18 @@
|
||||
<th>API Key</th>
|
||||
<th>Status</th>
|
||||
<th>Action</th>
|
||||
<?php if($_SESSION['master'] == 1) { ?>
|
||||
<th>Status</th>
|
||||
<?php } ?>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
if($SvId == '1'){
|
||||
$SQL = "SELECT id,nama_server,nomor_whatsapp,url_whatsapp_gateway,apikey_whatsapp,status_whatsapp FROM data_server WHERE id != '1'";
|
||||
$SQL = "SELECT id,nama_server,nomor_whatsapp,url_whatsapp_gateway,apikey_whatsapp,status_whatsapp, expaired_date FROM data_server WHERE id != '1'";
|
||||
}
|
||||
else{
|
||||
$SQL = "SELECT id,nama_server,nomor_whatsapp,url_whatsapp_gateway,apikey_whatsapp,status_whatsapp FROM data_server WHERE id IN (".$SvId.")";
|
||||
$SQL = "SELECT id,nama_server,nomor_whatsapp,url_whatsapp_gateway,apikey_whatsapp,status_whatsapp, expaired_date FROM data_server WHERE id IN (".$SvId.")";
|
||||
}
|
||||
$no = 1;
|
||||
$aserver = mysqli_query($con,$SQL);
|
||||
@@ -60,7 +63,16 @@
|
||||
<td>
|
||||
<a href="?<?php echo encrypt_url('whatsapp_gateway_scan|'.$server['id']);?>" class="text-success"><i class="fas fa-qrcode fa-2x"></i></a>
|
||||
<a type="button" class="btn btn-sm btn-secondary btn-sm ml-3" data-toggle="modal" data-target="#modal-proses<?php echo $server['id'];?>" style="margin-top: -15px;">Edit</a>
|
||||
</td>
|
||||
<?php if($_SESSION['master'] == 1) { ?>
|
||||
<td><?php
|
||||
if ($server['expaired_date'] >= date('Y-m-d')) { ?>
|
||||
<span class="badge badge-success">Aktif</span>
|
||||
<?php } else { ?>
|
||||
<span class="badge badge-danger">Tidak Aktif</span>
|
||||
<?php } ?>
|
||||
</td>
|
||||
<?php } ?>
|
||||
</tr>
|
||||
<div class="modal fade" id="modal-proses<?php echo $server['id'];?>">
|
||||
<div class="modal-dialog modal-lg">
|
||||
|
||||
@@ -0,0 +1,285 @@
|
||||
<?php
|
||||
|
||||
if($SvId == 2 || $_SESSION['user']['id'] == 1) { ?>
|
||||
<!--Mode Pengembangan-->
|
||||
|
||||
<!-- Main content -->
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h3 class="card-title">AI Customer Service</h3>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<!-- Posisi Jika Butuh Button Modal di kanan atas -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- /.card-header -->
|
||||
<div class="card-body">
|
||||
<!--START ISI KONTEN-->
|
||||
<div class="row">
|
||||
<div class="col-md-5">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<center>
|
||||
<p>Beritahu AI Informasi</p>
|
||||
</center>
|
||||
</div>
|
||||
<!--<div class="col-md-3 mb-2 text-right">-->
|
||||
<!-- <a type="button" class="btn btn-primary btn-sm m-1" data-toggle="modal" data-target="#ModalPencairan">Pencairan Dana</a> -->
|
||||
<!--</div>-->
|
||||
</div>
|
||||
<table id="topikPercakapan" class="table table-striped table-bordered" style="zoom: 90%; width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Topik</th>
|
||||
<th>Deskripsi</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--END ISI KONTEN-->
|
||||
|
||||
|
||||
</div>
|
||||
<!-- /.card-body -->
|
||||
</div>
|
||||
<!-- /.card -->
|
||||
</div>
|
||||
<!-- /.col -->
|
||||
</div>
|
||||
<!-- /.row -->
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
</section>
|
||||
<!-- /.content -->
|
||||
|
||||
<!-- Modal Edit Topik -->
|
||||
<div class="modal fade" id="modalEditTopik" tabindex="-1" role="dialog" aria-labelledby="modalEditTopikLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg" role="document">
|
||||
<div class="modal-content">
|
||||
<form id="formEditTopik">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modalEditTopikLabel"></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input type="hidden" name="id" id="editId">
|
||||
<div class="form-group">
|
||||
<label for="editDeskripsi">Deskripsi</label>
|
||||
<textarea class="form-control" name="deskripsi" id="editDeskripsi" rows="8" required></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Tutup</button>
|
||||
<button type="submit" class="btn btn-primary">Simpan</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#topikPercakapan').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"responsive": true,
|
||||
"ajax": {
|
||||
"url": "controller/get_topik_ai.php?action=list&i=<?= $SvId; ?>",
|
||||
"type": "POST"
|
||||
},
|
||||
"pageLength": 10,
|
||||
"columns": [
|
||||
{ "data": 0 }, // Topik
|
||||
{ "data": 1 }, // Deskripsi
|
||||
{
|
||||
"data": 2, // id unik
|
||||
"render": function(data) {
|
||||
return `<button class="btn btn-sm btn-secondary me-1" onclick="editTopik('${data.id}')">
|
||||
Edit
|
||||
</button>`;
|
||||
}
|
||||
}
|
||||
],
|
||||
"order": [[1, "desc"]]
|
||||
});
|
||||
});
|
||||
|
||||
function editTopik(id) {
|
||||
$.ajax({
|
||||
url: "controller/get_topik_ai.php?action=detail",
|
||||
type: "POST",
|
||||
data: { id: id },
|
||||
dataType: "json",
|
||||
success: function(res) {
|
||||
if (res) {
|
||||
$("#editId").val(res.id);
|
||||
$('#modalEditTopikLabel').html(`Edit Topik <b>${res.topik}</b>`);
|
||||
$("#editDeskripsi").val(res.deskripsi);
|
||||
$("#modalEditTopik").modal("show");
|
||||
} else {
|
||||
alert("Data tidak ditemukan!");
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
alert("Gagal mengambil data dari server!");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
$("#formEditTopik").on("submit", function(e) {
|
||||
e.preventDefault();
|
||||
$.ajax({
|
||||
url: "controller/get_topik_ai.php?action=save&i=<?= $SvId; ?>",
|
||||
type: "POST",
|
||||
data: $(this).serialize(),
|
||||
dataType: "json",
|
||||
success: function(res) {
|
||||
if(res.status === "ok") {
|
||||
$("#modalEditTopik").modal("hide");
|
||||
$('#topikPercakapan').DataTable().ajax.reload();
|
||||
Swal.fire("Sukses", "Deskripsi berhasil disimpan!", "success");
|
||||
} else {
|
||||
Swal.fire("Error", res.msg, "error");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<?php } else { ?>
|
||||
<!--MODE AKAN DATANG FITUR NYA-->
|
||||
<section class="content">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h3 class="card-title">AI Customer Service</h3>
|
||||
</div>
|
||||
<div class="col-sm-6"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.card-header -->
|
||||
<div class="card-body">
|
||||
<div class="row align-items-center">
|
||||
<!-- Bagian Gambar -->
|
||||
<div class="col-sm-5 text-center">
|
||||
<div style="padding:30px;">
|
||||
<img src="https://maxicus.com/wp-content/uploads/2023/05/5_AI-in-Customer-service.png" alt="Coming Soon" width="100%" style="max-width:500px; border-radius:15px; box-shadow:0px 4px 15px rgba(0,0,0,0.1);">
|
||||
<h2 style="margin-top:20px; font-weight:bold; color:#2c3e50;">Fitur ini akan segera hadir!</h2>
|
||||
<p style="font-size:16px; color:#666;">Kami sedang mempersiapkan teknologi AI yang siap membantu bisnis Anda.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bagian Fitur -->
|
||||
<div class="col-sm-7">
|
||||
<div style="padding:30px;">
|
||||
<h4 style="font-weight:bold; color:#34495e; margin-bottom:20px;">✨ Fitur - Fitur yang Membantu Customer Service</h4>
|
||||
<p style="font-size:15px; color:#555; margin-bottom:20px; line-height:1.6;">
|
||||
AI ini bukan menggantikan Customer Service, tapi menjadi asisten yang membuat pekerjaan lebih ringan, cepat, dan efisien.
|
||||
</p>
|
||||
|
||||
<!-- Grid Fitur dengan Card -->
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
🤖 <b>Chatbot Cerdas</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Menjawab pertanyaan rutin pelanggan otomatis.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
🧭 <b>Mengenali Customer</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Dapat langsung mengenali pelanggan saat chat masuk.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
🔍 <b>Pencarian Cepat</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Memberikan info instan dari database.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
📊 <b>Analisis Percakapan</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Menampilkan tren pertanyaan pelanggan.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
💬 <b>Saran Balasan</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Memberi rekomendasi jawaban cepat untuk CS.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
📱 <b>Integrasi WhatsApp</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Melayani langsung dari aplikasi populer.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
🗂️ <b>Auto-Routing</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Mengarahkan pertanyaan ke CS yang tepat.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
⏱️ <b>24/7 Online</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Tetap melayani pelanggan di luar jam kerja.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
📂 <b>Integrasi Data</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Menampilkan data pelanggan otomatis saat chat masuk.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<div style="background:#fff; border-radius:12px; padding:15px; box-shadow:0 4px 12px rgba(0,0,0,0.1); height:100%;">
|
||||
⚡ <b>Notifikasi Real-Time</b>
|
||||
<p style="margin:5px 0 0; font-size:14px; color:#555;">Memberi tahu CS saat ada pesan penting atau urgent.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:20px; text-align:center;">
|
||||
<span style="background:#3498db; color:#fff; padding:10px 20px; border-radius:25px; font-weight:bold; box-shadow:0 4px 10px rgba(52,152,219,0.4);">
|
||||
🚀 Coming Soon!
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
<?php } ?>
|
||||
|
||||
Reference in New Issue
Block a user