update wa official API

This commit is contained in:
WD - Dev
2025-10-07 21:01:15 +07:00
parent efca8f5f80
commit eb13c69431
55 changed files with 138040 additions and 1543 deletions
+1 -1
View File
@@ -722,7 +722,7 @@ $(document).ready(function() {
"serverSide": true,
"responsive": true,
"ajax": {
"url": "controller/get_withdrow.php?i=<?= $id; ?>",
"url": "controller/get_withdrow.php?i=<?= $id; ?>&s=hotspot_auto",
"type": "POST"
},
"pageLength": 10,
+39 -4
View File
@@ -1,3 +1,31 @@
<?php
function modifStatus($status) {
$status = strtoupper(trim($status));
switch ($status) {
case 'PROSES':
$class = 'badge badge-warning text-dark'; // kuning
break;
case 'TERKIRIM':
$class = 'badge badge-info'; // biru muda
break;
case 'DIBACA':
$class = 'badge badge-success'; // hijau
break;
case 'GAGAL':
$class = 'badge badge-danger'; // merah
break;
default:
$class = 'badge badge-secondary'; // abu-abu
break;
}
return '<span class="' . $class . '">' . htmlspecialchars($status) . '</span>';
}
?>
<!-- Main content -->
<section class="content" style="zoom: 90%;">
<div class="container-fluid">
@@ -63,7 +91,7 @@
$mulaiulang = date('Y-m-d H:i:s', strtotime("$sekarang -$jamtam hours"));
// Update pesan yang gagal
$updatePesan = $pdo->prepare("UPDATE master_pesan SET status = 'PENDING' WHERE status = 'GAGAL' AND api_key = :api_key AND waktu >= :mulaiulang");
$updatePesan = $pdo->prepare("UPDATE master_pesan SET status = 'PENDING' WHERE status = 'GAGAL' AND api_key = :api_key AND waktu >= :mulaiulang AND gateway_type = 'unofficial'");
$updatePesan->execute([
'api_key' => $pakw['apikey_whatsapp'],
'mulaiulang' => $mulaiulang
@@ -96,6 +124,7 @@
<th>Nomor</th>
<th>Pesan</th>
<th>Url Image</th>
<th>Type Gateway</th>
<th>Status</th>
<th>Action</th>
</tr>
@@ -118,9 +147,15 @@
<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' || $paket['status'] == 'TERKIRIM') { ?>
<td style="text-align: center;"><?php echo ucwords($paket['gateway_type']); ?></td>
<td style="text-align: center;">
<?php
echo modifStatus($paket['status']);
echo (empty($paket['message_status'])) ? '' : '<br>' . $paket['message_status'] ;
?>
</td>
<td style="text-align: center;">
<?php if($paket['gateway_type'] == 'unofficial' AND ($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>
+2 -2
View File
@@ -127,9 +127,9 @@ if (isset($_POST['tambah'])) {
// Kirim Pesan WhatsApp
$APIwa = new PesanWA();
$APIwa->Create_Pesan($_POST['ids'], $last_id, 'pesan_registrasi', 'order');
$APIwa->Create_Pesan($_POST['ids'], $last_id, 'Pesan Registrasi', 'order');
$Pesan = $APIwa->Get_Pesan();
$APIwa->Send_Pesan($_POST['ids'], 'sendMessage', $nomor, $Pesan);
$APIwa->Send_Pesan($_POST['ids'], ['sendMessage','Pesan Registrasi'], $nomor, $Pesan);
sweetAlert("Order list telah di tambah", "success", "?" . encrypt_url('order_list'));
+3 -1
View File
@@ -166,4 +166,6 @@ if (isset($_POST['kirim'])) {
}
?>
?>
+1 -1
View File
@@ -985,7 +985,7 @@ if (isset($_POST['finish'])) { // Assuming 'finish' is set in session when form
$pdo->commit();
// Perform Mikrotik update
$script = ':global hsa "";:global pppa "";:local id [/system license get software-id];:local idbm ($id."'.$lastInsertIdMikrotik.'");:local uptim [/system resource get uptime];:local bname [/system resource get board-name];:foreach i in=[/ppp active find] do={:local name [/ppp active get $i name];:local ip [/ppp active get $i address];:set $pppa ("$pppa$name_$ip|");};:foreach h in=[/ip hotspot user find comment!="" and uptime<20m] do={:local cek [:pick [/ip hotspot user get $h comment] 0 6];:if ($cek = "Login.") do={:local hsuser [/ip hotspot user get $h name];:local hscom [:pick [/ip hotspot user get $h comment] 6 50];:set $hsa ("$hsa$hsuser_$hscom|");}};/tool fetch url="https://bilspro.com/api/mikrotik.php" mode=https http-method=post http-data="{\"id\":\"$idbm\",\"bm\":\"$bname\",\"ut\":\"$uptim\",\"hsa\":\"$hsa\",\"pppa\":\"$pppa\"}" keep-result=no;:delay 1s;:set $pppa ("");:set $hsa ("");';
$script = ':global hsa "";:global pppa "";:local id [/system license get software-id];:local idbm ($id."7");:local uptim [/system resource get uptime];:local bname [/system resource get board-name];:foreach i in=[/ppp active find] do={:local name [/ppp active get $i name];:local ip [/ppp active get $i address];:local mac [/ppp active get $i caller-id];:set $pppa ("$pppa$name_$ip_$mac|");};:foreach h in=[/ip hotspot user find comment!="" and uptime<20m] do={:local cek [:pick [/ip hotspot user get $h comment] 0 6];:if ($cek = "Login.") do={:local hsuser [/ip hotspot user get $h name];:local hscom [:pick [/ip hotspot user get $h comment] 6 50];:set $hsa ("$hsa$hsuser_$hscom|");}};/tool fetch url="https://manjapro.net/api/mikrotik.php" mode=https http-method=post http-data="{\"id\":\"$idbm\",\"bm\":\"$bname\",\"ut\":\"$uptim\",\"hsa\":\"$hsa\",\"pppa\":\"$pppa\"}" keep-result=no;:delay 1s;:set $pppa ("");:set $hsa ("");';
$API = new RouterosAPI();
$API->debug = false;
+31 -29
View File
@@ -4,36 +4,38 @@
<div class="card-header">
<h4 class="text-center">Script ON LOGIN Hotspot Yang Sekali Pakai</h4>
</div>
<div class="row">
<div class="col-md-6">
<div class="card-body">
<?php echo '
:local nama $user;
:local tanggal [/system clock get date];
:local waktu [/system clock get time];
:if ([/ip hotspot user get [find name=$nama] comment] = "") do={
/ip hotspot user set [find name=$nama] comment="Login.$tanggal $waktu";
:log warning ("User " . $nama . " berhasil login.");
} else={
:log warning ("User " . $nama . " berhasil melakukan login ulang.");
}
<!-- <div class="row">-->
<!-- <div class="col-md-6">-->
<!-- <div class="card-body">-->
<?php
// echo '
// :local nama $user;
// :local tanggal [/system clock get date];
// :local waktu [/system clock get time];
// :if ([/ip hotspot user get [find name=$nama] comment] = "") do={
// /ip hotspot user set [find name=$nama] comment="Login.$tanggal $waktu";
// :log warning ("User " . $nama . " berhasil login.");
// } else={
// :log warning ("User " . $nama . " berhasil melakukan login ulang.");
// }
:if ([/system schedule find name=$nama] = "") do={
/system schedule add name=$nama interval=ISI DENGAN INTERVAL on-event="/ip hotspot active remove [find user=$nama]; /ip hotspot user remove [find name=$nama]; /system schedule remove [find name=$nama]" start-date=$tanggal start-time=$waktu;
}'; ?>
</div>
</div>
<div class="col-md-6">
<div class="card-body">
<h5 class="text-danger"><u>PERHATIAN..!</u></h5>
<ul class="text-danger">
<li>Sebelum di paste ke On Login silakan modif dulu "ISI DURASI VOUCHER" sesuai dengan interval Voucher nya</li>
<li>Jika ingin memodifikasi script silahkan sesuaikan dengan fungsi yang anda mau.</li>
<li>Jika menambahankan Telegram atau yang lainnya silahkan sesuaikan.</li>
</ul>
</div>
</div>
</div>
// :if ([/system schedule find name=$nama] = "") do={
// /system schedule add name=$nama interval=ISI DENGAN INTERVAL on-event="/ip hotspot active remove [find user=$nama]; /ip hotspot user remove [find name=$nama]; /system schedule remove [find name=$nama]" start-date=$tanggal start-time=$waktu;
// }';
?>
<!-- </div>-->
<!-- </div>-->
<!-- <div class="col-md-6">-->
<!-- <div class="card-body">-->
<!-- <h5 class="text-danger"><u>PERHATIAN..!</u></h5>-->
<!-- <ul class="text-danger">-->
<!-- <li>Sebelum di paste ke On Login silakan modif dulu "ISI DURASI VOUCHER" sesuai dengan interval Voucher nya</li>-->
<!-- <li>Jika ingin memodifikasi script silahkan sesuaikan dengan fungsi yang anda mau.</li>-->
<!-- <li>Jika menambahankan Telegram atau yang lainnya silahkan sesuaikan.</li>-->
<!-- </ul>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
</div>
</div>
</section>
+1 -1
View File
@@ -226,7 +226,7 @@
<?php
if (isset($_POST['test'.$server['id']]))
{
$script = ':global hsa "";:global pppa "";:local id [/system license get software-id];:local idbm ($id."'.$server['id'].'");:local uptim [/system resource get uptime];:local bname [/system resource get board-name];:foreach i in=[/ppp active find] do={:local name [/ppp active get $i name];:local ip [/ppp active get $i address];:set $pppa ("$pppa$name_$ip|");};:foreach h in=[/ip hotspot user find comment!="" and uptime<20m] do={:local cek [:pick [/ip hotspot user get $h comment] 0 6];:if ($cek = "Login.") do={:local hsuser [/ip hotspot user get $h name];:local hscom [:pick [/ip hotspot user get $h comment] 6 50];:set $hsa ("$hsa$hsuser_$hscom|");}};/tool fetch url="https://manjapro.net/api/mikrotik.php" mode=https http-method=post http-data="{\"id\":\"$idbm\",\"bm\":\"$bname\",\"ut\":\"$uptim\",\"hsa\":\"$hsa\",\"pppa\":\"$pppa\"}" keep-result=no;:delay 1s;:set $pppa ("");:set $hsa ("");';
$script = ':global hsa "";:global pppa "";:local id [/system license get software-id];:local idbm ($id."7");:local uptim [/system resource get uptime];:local bname [/system resource get board-name];:foreach i in=[/ppp active find] do={:local name [/ppp active get $i name];:local ip [/ppp active get $i address];:local mac [/ppp active get $i caller-id];:set $pppa ("$pppa$name_$ip_$mac|");};:foreach h in=[/ip hotspot user find comment!="" and uptime<20m] do={:local cek [:pick [/ip hotspot user get $h comment] 0 6];:if ($cek = "Login.") do={:local hsuser [/ip hotspot user get $h name];:local hscom [:pick [/ip hotspot user get $h comment] 6 50];:set $hsa ("$hsa$hsuser_$hscom|");}};/tool fetch url="https://manjapro.net/api/mikrotik.php" mode=https http-method=post http-data="{\"id\":\"$idbm\",\"bm\":\"$bname\",\"ut\":\"$uptim\",\"hsa\":\"$hsa\",\"pppa\":\"$pppa\"}" keep-result=no;:delay 1s;:set $pppa ("");:set $hsa ("");';
error_reporting(0);
{
$API = new RouterosAPI();
+102 -32
View File
@@ -1,3 +1,72 @@
<?php if($SvId == 2 || $_SESSION['user']['id'] == 1) { ?>
<!-- Main content -->
<section class="content">
<div class="container-fluid" style="zoom: 90%">
<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">Setting Pesan</h3>
</div>
<div class="col-sm-6">
</div>
</div>
</div>
<!-- /.card-header -->
<div class="card-body">
<table id="example1" class="table table-bordered table-striped">
<thead>
<tr>
<th>Jenis Pesan</th>
<th>Pesan WhataApp</th>
<th style="max-width: 80px;">Template Cloud API</th>
<th style="max-width: 80px;">Backroud Kwitansi</th>
<th style="max-width: 50px;">Interval Koneksi Off</th>
<th style="max-width: 50px;">Status Koneksi Off</th>
<th>Tipe Gateway</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php
$stmt3 = $pdo->prepare("SELECT * FROM master_template_pesan WHERE id_data_server IN ($SvId) GROUP BY nama");
$stmt3->execute();
$pesans = $stmt3->fetchALL(PDO::FETCH_ASSOC);
foreach ($pesans as $pesan) {
?>
<tr>
<td><?= $pesan['nama']; ?></td>
<td style="max-width: 400px;"><?= ($pesan['gateway_type'] == 'unofficial') ? $pesan['pesan'] : '-'; ?></td>
<td><?= $pesan['nama_template'] ?? '-'; ?></td>
<td><?= $pesan['backround_kwitansi'] ?? '-'; ?></td>
<td class="text-center"><?= $pesan['interval_koneksi_off'] ?? '-'; ?></td>
<td class="text-center"><?= $pesan['status_koneksi_off'] ?? '-'; ?></td>
<td class="text-center"><?= $pesan['status_pesan']; ?></td>
<td class="text-center">
<a href="?<?php echo encrypt_url('setting_pesan_pesan|'. $pesan['id']); ?>" type="button" class="btn btn-secondary btn-sm m-1" >Edit</a>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</div>
<!-- /.container-fluid -->
</section>
<!-- /.content -->
<?php } else { ?>
<!-- Main content -->
<section class="content">
<div class="container-fluid">
@@ -17,43 +86,43 @@
<div class="card-body">
<table id="example1" class="table table-bordered table-striped">
<thead>
<tr>
<th>Jenis Pesan</th>
<th>Pesan WhataApp</th>
<th>Action</th>
</tr>
<tr>
<th>Jenis Pesan</th>
<th>Pesan WhataApp</th>
<th style="max-width: 80px;">Template Cloud API</th>
<th style="max-width: 80px;">Backroud Kwitansi</th>
<th style="max-width: 50px;">Interval Koneksi Off</th>
<th style="max-width: 50px;">Status Koneksi Off</th>
<th>Tipe Gateway</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php
$aserver = mysqli_query($con,"SELECT backround_kwitansi, pesan_kirim_tagihan, pesan_peringatan_tagihan, pesan_isolir_pelanggan, pesan_melunasi_tagihan, pesan_koneksi_off, pesan_registrasi, pesan_aktivasi FROM data_server WHERE id = '$SvId' ");
$server = mysqli_fetch_assoc($aserver);
$data = array(
array("id" => "1", "nama" => "pesan_kirim_tagihan", "pesan" => $server['pesan_kirim_tagihan']),
array("id" => "2", "nama" => "pesan_peringatan_tagihan", "pesan" => $server['pesan_peringatan_tagihan']),
array("id" => "3", "nama" => "pesan_isolir_pelanggan", "pesan" => $server['pesan_isolir_pelanggan']),
array("id" => "4", "nama" => "pesan_melunasi_tagihan", "pesan" => $server['pesan_melunasi_tagihan']),
array("id" => "5", "nama" => "pesan_koneksi_off", "pesan" => $server['pesan_koneksi_off']),
array("id" => "6", "nama" => "pesan_registrasi", "pesan" => $server['pesan_registrasi']),
array("id" => "7", "nama" => "pesan_aktivasi", "pesan" => $server['pesan_aktivasi'])
);
// echo "<pre>";
// print_r($data);
// echo "</pre>";
foreach ($data as $key) {
?>
<tr>
<td><?php echo $key['nama']; ?></td>
<td><?php echo $key['pesan']; ?></td>
<td>
<a href="?<?php echo encrypt_url('setting_pesan_pesan|'.$key['nama']); ?>" type="button" class="btn btn-secondary btn-sm m-1" >Edit</a>
</td>
</tr>
<?php } ?>
<?php
$stmt3 = $pdo->prepare("SELECT * FROM master_template_pesan WHERE id_data_server IN ($SvId) GROUP BY nama");
$stmt3->execute();
$pesans = $stmt3->fetchALL(PDO::FETCH_ASSOC);
foreach ($pesans as $pesan) {
?>
<tr>
<td><?= $pesan['nama']; ?></td>
<td style="max-width: 400px;"><?= ($pesan['gateway_type'] == 'unofficial') ? $pesan['pesan'] : '-'; ?></td>
<td><?= $pesan['nama_template'] ?? '-'; ?></td>
<td><?= $pesan['backround_kwitansi'] ?? '-'; ?></td>
<td class="text-center"><?= $pesan['interval_koneksi_off'] ?? '-'; ?></td>
<td class="text-center"><?= $pesan['status_koneksi_off'] ?? '-'; ?></td>
<td class="text-center"><?= $pesan['status_pesan']; ?></td>
<td class="text-center">
<a href="?<?php echo encrypt_url('setting_pesan_pesan|'. $pesan['id']); ?>" type="button" class="btn btn-secondary btn-sm m-1" >Edit</a>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
@@ -63,4 +132,5 @@
</div>
<!-- /.container-fluid -->
</section>
<!-- /.content -->
<!-- /.content -->
<?php } ?>
+618 -65
View File
@@ -1,6 +1,532 @@
<?php if($SvId == 2 ) { ?>
<?php
$aserver = mysqli_query($con,"SELECT $page[1],backround_kwitansi,status_koneksi_off, interval_koneksi_off, status_payment_gateway FROM data_server WHERE id = '$SvId' ");
$server = mysqli_fetch_assoc($aserver);
$stmt3 = $pdo->prepare("SELECT * FROM master_template_pesan WHERE id = :id");
$stmt3->execute([':id' => $page[1]]);
$pesan = $stmt3->fetch(PDO::FETCH_ASSOC);
$pesanDb = json_decode($pesan['pesan_official'], true);
if ($pesan['nama'] == 'Pesan Melunasi Tagihan' OR
$pesan['nama'] == 'Pesan Isolir Pelanggan' OR
$pesan['nama'] == 'Pesan Peringatan Tagihan' OR
$pesan['nama'] == 'Pesan Kirim Tagihan') {
$baseVariable = [
[ "key" => "#usr", "label" => "Nama Pelanggan" ],
[ "key" => "#add", "label" => "Alamat Pelanggan" ],
[ "key" => "#ppp", "label" => "PPPOE Pelanggan / ID Pelanggan" ],
[ "key" => "#lyn", "label" => "Paket Berlangganan" ],
[ "key" => "#hly", "label" => "Harga Layanan" ],
[ "key" => "#jns", "label" => "Jenis Layanan" ],
[ "key" => "#ket", "label" => "Keterangan Tagihan" ],
[ "key" => "#jum", "label" => "Jumlah Tagihan" ],
[ "key" => "#ppn", "label" => "PPN" ],
[ "key" => "#unk", "label" => "Kode Unik (for payment gateway)" ],
[ "key" => "#tot", "label" => "Total Tagihan" ],
[ "key" => "#lmt", "label" => "Limit Pembayaran" ],
[ "key" => "#lnk", "label" => "Link Payment Gateway" ]
];
} else {
$baseVariable = [
[ "key" => "#usr", "label" => "Nama Pelanggan" ],
[ "key" => "#add", "label" => "Alamat Pelanggan" ],
[ "key" => "#ppp", "label" => "PPPOE Pelanggan / ID Pelanggan" ],
[ "key" => "#lyn", "label" => "Paket Berlangganan" ],
[ "key" => "#hly", "label" => "Harga Layanan" ],
[ "key" => "#jns", "label" => "Jenis Layanan" ]
];
}
?>
<section class="content" style="zoom: 90%;">
<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">Setting <?php echo $pesan['nama']; ?> <b><i class="text-success">(WhatsApp Official API)</i></b></h3>
</div>
<div class="col-sm-6">
</div>
</div>
</div>
<!-- /.card-header -->
<div class="card-body">
<div class="row">
<?php
try {
// Pastikan $SvId tidak kosong
if (empty($SvId)) {
throw new Exception("Parameter SvId tidak boleh kosong.");
}
// Konversi jadi array (jika ada banyak ID, misalnya "1,2,3")
$ids = array_map('intval', explode(',', $SvId));
$ids = array_filter($ids); // buang ID kosong
if (empty($ids)) {
throw new Exception("ID server tidak valid: $SvId");
}
// Buat placeholder dinamis
$placeholders = implode(',', array_fill(0, count($ids), '?'));
// Query database
$sql = "SELECT * FROM whatsapp_cloud_api WHERE id_data_server IN ($placeholders) LIMIT 1";
$stmt3 = $pdo->prepare($sql);
$stmt3->execute($ids);
$wacapi = $stmt3->fetch(PDO::FETCH_ASSOC);
$accessToken = $wacapi['token_access'];
$phoneNumberId = $wacapi['waba_id'];
// URL endpoint template
$url = "https://graph.facebook.com/v17.0/$phoneNumberId/message_templates";
// Request ke Cloud API
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => ["Authorization: Bearer $accessToken"],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception("cURL Error: " . curl_error($ch));
}
curl_close($ch);
// Decode JSON
$data = json_decode($response, true);
if (!isset($data['data'])) {
throw new Exception("Gagal mengambil template dari Cloud API. Response: " . $response);
}
// Ambil list template
$templates = $data['data'] ?? [];
// echo "<pre>";
// print_r($templates);
// echo "</pre>";
// Template yang terpilih (dari GET)
$selectedTemplate = $_GET['template'] ?? '';
} catch (Exception $e) {
echo "<p style='color:red;'>Error: " . htmlspecialchars($e->getMessage()) . "</p>";
$templates = [];
$selectedTemplate = '';
}
?>
<div class="col-md-3">
<div class="card-body">
<form method="POST" id="templateForm">
<div class="form-group">
<label for="template">Pilih Template:</label>
<select class="form-control" name="template" id="template">
<option value="">-- Pilih Template --</option>
<?php foreach ($templates as $tpl): ?>
<option
value="<?= htmlspecialchars($tpl['name']) ?>"
data-template='<?= json_encode($tpl, JSON_HEX_APOS | JSON_HEX_QUOT) ?>' <?= (htmlspecialchars($tpl['name']) == $pesan['nama_template']) ? 'selected' : '' ?>>
<?= htmlspecialchars($tpl['name']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
</form>
<!-- Form dinamis -->
<div id="paramForm" style="margin-top:20px;"></div>
<hr>
<div class="text-right">
<button id="saveBtn" class="btn btn-success">Simpan</button>
</div>
</div>
</div>
<div class="col-md-2">
<div class="text-danger" style="margin: 20px;">
<h5 class="text-center"><b><u>PERHATIAN..!</u></b></h5>
<p style="text-align: justify;">Untuk memposisikan data dari pelanggan silahkan isi dengan Variabel di bawah ini :</p>
<table class="table table-sm">
<tr>
<th>Variabel</th>
<th></th>
<th>Label</th>
</tr>
<?php
foreach($baseVariable as $base) {
echo '<tr>
<td>' . $base['key'] . '</td>
<td>:</td>
<td>' . $base['label'] . '</td>
<tr>';
}
?>
</table>
</div>
</div>
<div class="col-md-4">
<div class="card-body" style="display:flex;justify-content:center;align-items:center;">
<!-- Preview gaya WhatsApp -->
<div id="waPreview" style="margin-top:20px;max-width:400px;font-family:sans-serif;">
<div style="background:#075E54;color:white;padding:10px;border-radius:8px 8px 0 0;">
WhatsApp Preview
</div>
<div style="border:1px solid #ccc;border-top:0;padding-top:10px;padding-left:10px;padding-right:10px;border-radius:0 0 8px 8px;background:#ECE5DD; padding-bottom: 20px;">
<div style="background:white;padding:8px;border-radius:8px;display:flex;flex-direction:column;gap:0;max-width:90%;margin-bottom:-6px;">
<div id="waHeader"></div>
<div id="waMessage"></div>
<div id="waFooter"></div>
</div>
<div id="waButtons" style="max-width:90%;"></div>
</div>
</div>
</div>
</div>
<div class="col-md-5">
<div class="card-body">
<div id="hasilUntukAPI" style="margin-top:15px;padding:10px;border:1px solid #ccc;border-radius:6px;background:#f9f9f9;"></div>
</div>
</div>
<script>
const templateSelect = document.getElementById("template");
const paramForm = document.getElementById("paramForm");
const waHeader = document.getElementById("waHeader");
const waMessage = document.getElementById("waMessage");
const waFooter = document.getElementById("waFooter");
const waButtons = document.getElementById("waButtons");
const submitBtn = document.getElementById("saveBtn");
// default submitBtn
// submitBtn.disabled = true;
// data dari DB (PHP -> JS)
let pesanDb = <?= json_encode($pesanDb ?? [], JSON_UNESCAPED_SLASHES) ?>;
// fungsi gabungkan Cloud API template dengan data DB
function mergeWithDb(tpl, pesanDb) {
if (!pesanDb || !pesanDb.template || !pesanDb.template.components) return tpl;
let dbComponents = pesanDb.template.components;
tpl.components.forEach((comp) => {
let dbComp = dbComponents.find(c => c.type.toLowerCase() === comp.type.toLowerCase());
if (comp.type === "HEADER" && dbComp?.parameters) {
comp.dbValue = dbComp.parameters[0]?.image?.link || "";
}
if (comp.type === "BODY" && dbComp?.parameters) {
comp.dbParams = dbComp.parameters.map(p => p.text);
}
if (comp.type === "BUTTONS" && comp.buttons) {
comp.buttons.forEach((btn, bi) => {
let dbBtn = dbComponents.find(c =>
c.type.toLowerCase() === "button" && parseInt(c.index) === bi
);
if (dbBtn?.parameters) {
comp.buttons[bi].dbParams = dbBtn.parameters.map(p => p.text);
}
});
}
});
return tpl;
}
// trigger default on load
window.addEventListener("DOMContentLoaded", () => {
let selectedOpt = templateSelect.options[templateSelect.selectedIndex];
let tplJson = selectedOpt.getAttribute("data-template");
if (tplJson) {
renderParamForm(JSON.parse(tplJson));
updatePreview();
}
});
function renderParamForm(tpl) {
tpl = mergeWithDb(tpl, pesanDb); // 🔹 merge dengan DB
paramForm.innerHTML = "";
waHeader.innerHTML = "";
waMessage.innerHTML = "";
waFooter.innerHTML = "";
waButtons.innerHTML = "";
if (!tpl || !tpl.components) return;
let formHtml = "<h5>Parameter Dinamis</h5>";
let previewBody = "";
tpl.components.forEach((comp, ci) => {
if (comp.type === "HEADER") {
if (comp.format === "IMAGE") {
let defaultImg = comp.dbValue || comp.example?.header_handle?.[0] || "";
formHtml += `<div class="form-group">
<label>Header Image URL:</label><br>
<input class="form-control" type="text"
name="header_image"
value="${defaultImg}"
oninput="updateHeaderImage(this)" required>
</div>`;
waHeader.innerHTML = `<img id="header-img-preview"
src="${defaultImg}"
style="max-width:100%;border-radius:6px;"><br>`;
}
}
if (comp.type === "BODY" && comp.text) {
waMessage.setAttribute("data-original", comp.text);
let regex = /\{\{(\d+)\}\}/g;
let match, idx = 0;
while ((match = regex.exec(comp.text)) !== null) {
let paramNum = match[1];
let dbVal = comp.dbParams ? (comp.dbParams[idx] || "") : "";
formHtml += `<div class="form-group">
<label>Body Param ${paramNum}:</label><br>
<input class="form-control" type="text" name="body_${paramNum}"
value="${dbVal}"
oninput="updatePreview()" data-placeholder="{{${paramNum}}}" required>
</div>`;
idx++;
}
// apply formatting ke preview
let text = comp.text
.replace(/\*(.*?)\*/g, "<b>$1</b>")
.replace(/__(.*?)__/g, "<u>$1</u>")
.replace(/_(.*?)_/g, "<i>$1</i>")
.replace(/~(.*?)~/g, "<s>$1</s>")
.replace(/\n/g, "<br>");
previewBody += text + "<br>";
}
if (comp.type === "FOOTER" && comp.text) {
waFooter.innerHTML = `<small class="text-secondary">${comp.text}</small><br>`;
}
if (comp.type === "BUTTONS" && comp.buttons) {
comp.buttons.forEach((btn, bi) => {
if (btn.type === "URL") {
let btnText = btn.text;
let url = btn.url;
let regex = /\{\{(\d+)\}\}/g;
let match, idx = 0;
while ((match = regex.exec(url)) !== null) {
let paramNum = match[1];
let dbVal = btn.dbParams ? (btn.dbParams[idx] || "") : "";
formHtml += `<div class="form-group">
<label>Button ${bi+1} Param ${paramNum}:</label><br>
<input class="form-control" type="text" name="btn_${bi}_${paramNum}"
value="${dbVal}"
oninput="updatePreview()" data-placeholder="{{${paramNum}}}" required>
</div>`;
idx++;
}
waButtons.innerHTML += `<a href="#"
style="display:flex;align-items:center;justify-content:center;
background:#fff;color:green;padding:8px 12px;
border-radius:6px;border-top:1px solid #c0c0c0;
text-decoration:none;position:relative;z-index:10;">
<i class="fa fa-share-square" style="margin-right:8px; font-size:16px;"></i>
<span>${btnText}</span>
</a>`;
}
});
}
});
paramForm.innerHTML = formHtml;
waMessage.innerHTML = previewBody;
}
// update preview teks saat input diisi
function updatePreview() {
let preview = waMessage.getAttribute("data-original"); // simpan text asli
document.querySelectorAll("input[data-placeholder]").forEach(input => {
let ph = input.dataset.placeholder; // contoh {{1}}
let val = input.value || ph; // kalau kosong tetap {{1}}
preview = preview.replace(ph, val);
});
// styling simbol
preview = preview.replace(/\*(.*?)\*/g, "<b>$1</b>");
preview = preview.replace(/__(.*?)__/g, "<u>$1</u>");
preview = preview.replace(/_(.*?)_/g, "<i>$1</i>");
preview = preview.replace(/~(.*?)~/g, "<s>$1</s>");
preview = preview.replace(/\n/g, "<br>");
waMessage.innerHTML = preview;
}
// update header image preview
function updateHeaderImage(input) {
const img = document.getElementById("header-img-preview");
if (img) img.src = input.value || "";
}
// event change
templateSelect.addEventListener("change", function() {
let opt = this.options[this.selectedIndex];
let tplJson = opt.getAttribute("data-template");
if (tplJson) {
renderParamForm(JSON.parse(tplJson));
} else {
paramForm.innerHTML = "";
waHeader.innerHTML = "";
waMessage.innerHTML = "";
waFooter.innerHTML = "";
waButtons.innerHTML = "";
}
});
</script>
<script>
function generatePayload() {
let template = templateSelect.value;
if (!template) {
alert("Pilih template dulu!");
return null;
}
let data = {
messaging_product: "whatsapp",
recipient_type: "individual",
to: "#no_whatsapp",
// <input type="text" id="toNumber" placeholder="628xxxxxx" class="form-control">
// to: document.getElementById("toNumber")?.value || "", // isi dari input nomor tujuan
type: "template",
template: {
name: template,
language: { code: "id" },
components: []
}
};
// 🔹 HEADER
let headerImageInput = document.querySelector("input[name='header_image']");
if (headerImageInput && headerImageInput.value) {
data.template.components.push({
type: "header",
parameters: [{
type: "image",
image: { link: headerImageInput.value }
}]
});
}
// 🔹 BODY
let bodyParams = [];
document.querySelectorAll("input[name^='body_']").forEach(input => {
if (input.value.trim() !== "") {
bodyParams.push({ type: "text", text: input.value });
}
});
if (bodyParams.length > 0) {
data.template.components.push({
type: "body",
parameters: bodyParams
});
}
// 🔹 BUTTONS
let btnInputs = document.querySelectorAll("input[name^='btn_']");
btnInputs.forEach(input => {
if (input.value.trim() !== "") {
let [_, index, paramNum] = input.name.split("_"); // contoh: btn_0_1
data.template.components.push({
type: "button",
sub_type: "url",
index: parseInt(index),
parameters: [{
type: "text",
text: input.value
}]
});
}
});
return data;
}
// 🔘 Event tombol Simpan
document.getElementById("saveBtn").addEventListener("click", function() {
let payload = generatePayload();
if (!payload) return;
console.log("🚀 Payload siap dikirim:", payload);
// tampilkan payload ke div
document.getElementById("hasilUntukAPI").innerHTML =
"<pre>" + JSON.stringify(payload, null, 4) + "</pre>";
fetch("controller/setting_pesan.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
payload: payload,
nama: "<?= $pesan['nama']; ?>",
id: "<?= $SvId; ?>"
})
})
.then(r => r.json())
.then(resp => {
Swal.fire({
title: resp.status === "success" ? "Berhasil ✅" : "Gagal ⚠️",
text: resp.message,
icon: resp.status, // success | error | warning | info
confirmButtonText: "OK"
});
})
.catch(err => {
Swal.fire({
title: "Error ❌",
text: "Terjadi kesalahan koneksi: " + err,
icon: "error",
confirmButtonText: "OK"
});
});
});
</script>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<?php } else { ?>
<?php
$stmt3 = $pdo->prepare("SELECT * FROM master_template_pesan WHERE id = :id");
$stmt3->execute([':id' => $page[1]]);
$pesan = $stmt3->fetch(PDO::FETCH_ASSOC);
$stmt3 = $pdo->prepare("SELECT status_payment_gateway FROM data_server WHERE id = :ids");
$stmt3->execute([':ids' => $pesan['id_data_server']]);
$server = $stmt3->fetch(PDO::FETCH_ASSOC);
// print_r($_SESSION);
?>
<!-- Main content -->
@@ -12,7 +538,7 @@ $server = mysqli_fetch_assoc($aserver);
<div class="card-header">
<div class="row">
<div class="col-sm-6">
<h3 class="card-title">Setting <?php echo $page[1]; ?></h3>
<h3 class="card-title">Setting <?php echo $pesan['nama']; ?></h3>
</div>
<div class="col-sm-6">
</div>
@@ -31,18 +557,15 @@ $server = mysqli_fetch_assoc($aserver);
#lyn => Paket Berlangganan<br>
#hly => Harga Layanan<br>
#jns => Jenis Layanan<br>
<?php if($page[1] == 'pesan_melunasi_tagihan' OR $page[1] == 'pesan_isolir_pelanggan' OR $page[1] == 'pesan_peringatan_tagihan' OR $page[1] == 'pesan_kirim_tagihan') { ?>
<?php if($pesan['nama'] == 'Pesan Melunasi Tagihan' OR $pesan['nama'] == 'Pesan Isolir Pelanggan' OR $pesan['nama'] == 'Pesan Peringatan Tagihan' OR $pesan['nama'] == 'Pesan Kirim Tagihan') { ?>
#ket => Keterangan Tagihan<br>
#jum => Jumlah Tagihan<br>
#ppn => PPN<br>
#unk => Kode Unik (for payment gateway)<br>
#tot => Total Tagihan<br>
#lmt => Limit Pembayaran
<?php }
if($server['status_payment_gateway'] == 'ACTIVE' AND $page[1] == 'pesan_kirim_tagihan') {
echo "<br>#lnk => Link Payment Gateway";
}
?>
#lmt => Limit Pembayaran<br>
#lnk => Link Payment Gateway
<?php } ?>
</p>
<p><b>Contoh :</b><br>
*Tagihan layanan internet*<br>
@@ -51,7 +574,7 @@ $server = mysqli_fetch_assoc($aserver);
PPN 11% : #ppn<br>
Total Tagihan : #tot
</p>
<?php if ($page[1] == 'pesan_koneksi_off') { ?>
<?php if ($pesan['nama'] == 'Pesan Koneksi Off') { ?>
<hr>
<h5><u>PERHATIAN..!!</u></h5>
<p>Jika Status Pesan <b>Aktif</b> dan <b>Interval</b> di isi, maka pelanggan yang aktif dan koneksi nya mati akan di beri pesan otomatis setelah Interval yang telah anda tentukan</p>
@@ -61,11 +584,11 @@ $server = mysqli_fetch_assoc($aserver);
<div class="col-sm-6">
<form method="post" enctype="multipart/form-data">
<?php
if ($page[1] == 'pesan_melunasi_tagihan')
if ($pesan['nama'] == 'Pesan Melunasi Tagihan')
{ ?>
<center>
<label>CONTOH</label>
<img src="img/<?php echo $server['backround_kwitansi']; ?>" width="100%"><br><br>
<img src="img/<?php echo $pesan['backround_kwitansi']; ?>" width="100%"><br><br>
<div class="form-group">
<label>Upload Backround Kwitansi</label>
<input type="file" class="form-control" name="gambar">
@@ -75,23 +598,23 @@ $server = mysqli_fetch_assoc($aserver);
<?php } ?>
<center><label>Edit Pesan</label></center>
<div class="form-group">
<textarea type="text" class="form-control" rows="15" name="fpesan"><?php echo $server[$page[1]]; ?></textarea>
<textarea type="text" class="form-control" rows="15" name="fpesan"><?php echo $pesan['pesan']; ?></textarea>
</div>
<?php if ($page[1] == 'pesan_koneksi_off') { ?>
<?php if ($pesan['nama'] == 'Pesan Koneksi Off') { ?>
<div class="row">
<div class="col-6">
<div class="form-group">
<label>Status Pesan</label>
<select class="form-control" name="status_koneksi_off" required="required">
<option value="Tidak Aktif" <?php if ($server['status_koneksi_off'] == "Tidak Aktif") { echo "selected"; }?>>Tidak Aktif</option>
<option value="Aktif" <?php if ($server['status_koneksi_off'] == "Aktif") { echo "selected"; }?>>Aktif</option>
<option value="Tidak Aktif" <?php if ($pesan['status_koneksi_off'] == "Tidak Aktif") { echo "selected"; }?>>Tidak Aktif</option>
<option value="Aktif" <?php if ($pesan['status_koneksi_off'] == "Aktif") { echo "selected"; }?>>Aktif</option>
</select>
</div>
</div>
<div class="col-6">
<label>Interval Saat Kirim Pesan</label>
<div class="input-group mb-4">
<input type="number" class="form-control" value="<?php echo $server['interval_koneksi_off']; ?>" name="interval">
<input type="number" class="form-control" value="<?php echo $pesan['interval_koneksi_off']; ?>" name="interval">
<div class="input-group-append">
<div class="input-group-text">
<span> Menit </span>
@@ -104,49 +627,75 @@ $server = mysqli_fetch_assoc($aserver);
<input type="submit" class="btn btn-sm btn-secondary m-1" name="edit" value="Simpan">
<a type="button" class="btn btn-success btn-sm m-1" data-toggle="modal" data-target="#staticBackdrop">Test Kirim Pesan</a>
</form>
<?php
if(isset($_POST['edit'])){
// Periksa apakah file di-upload dan validasi halaman
if (isset($page[1]) && $page[1] == 'pesan_melunasi_tagihan' && isset($_FILES['gambar'])) {
// Validasi file upload
if ($_FILES['gambar']['error'] === UPLOAD_ERR_OK) {
$nameFile = basename($_FILES["gambar"]["name"]);
$targetDir = "img/";
$targetFile = $targetDir . $nameFile;
<?php
if (isset($_POST['edit'])) {
// Memindahkan file ke direktori tujuan
if (move_uploaded_file($_FILES["gambar"]["tmp_name"], $targetFile)) {
// Menyiapkan string SQL untuk pembaruan
$SqlPost = ", backround_kwitansi = '$nameFile'";
} else {
// Tangani kesalahan jika file gagal dipindahkan
echo "Gagal memindahkan file.";
$SqlPost = '';
}
} else {
echo "Terjadi kesalahan dalam upload file.";
$SqlPost = '';
}
} else {
$SqlPost = '';
}
$SqlPost = '';
$sqlPostOff = '';
// --- Validasi upload gambar ---
if (isset($pesan['nama']) && $pesan['nama'] === 'Pesan Melunasi Tagihan' && isset($_FILES['gambar'])) {
if ($_FILES['gambar']['error'] === UPLOAD_ERR_OK) {
$nameFile = basename($_FILES["gambar"]["name"]);
$targetDir = "img/";
$targetFile = $targetDir . $nameFile;
if (move_uploaded_file($_FILES["gambar"]["tmp_name"], $targetFile)) {
$SqlPost = ", backround_kwitansi = :nameFile";
} else {
echo "Gagal memindahkan file.";
}
} else {
echo "Terjadi kesalahan dalam upload file.";
}
}
// --- Tambahan untuk Pesan Koneksi Off ---
if (isset($pesan['nama']) && $pesan['nama'] === 'Pesan Koneksi Off') {
$status_koneksi_off = $_POST['status_koneksi_off'] ?? '';
$interval = preg_replace("/[^0-9]/", "", $_POST['interval'] ?? '');
$sqlPostOff = ", status_koneksi_off = :status_koneksi_off, interval_koneksi_off = :interval_koneksi_off";
}
// --- Query Update ---
$query = "UPDATE master_template_pesan
SET pesan = :pesan $SqlPost $sqlPostOff
WHERE nama = :nama AND id_data_server IN ($SvId)";
$stmt = $pdo->prepare($query);
// Bind parameter utama
$stmt->bindValue(':pesan', $_POST['fpesan']);
// Bind jika ada file upload
if ($SqlPost !== '') {
$stmt->bindValue(':nameFile', $nameFile);
}
// Bind jika pesan koneksi off
if ($sqlPostOff !== '') {
$stmt->bindValue(':status_koneksi_off', $status_koneksi_off);
$stmt->bindValue(':interval_koneksi_off', $interval);
}
$stmt->bindValue(':nama', $pesan['nama']);
try {
$stmt->execute();
$rows = $stmt->rowCount();
if ($rows > 0) {
sweetAlert("Data telah diubah ($rows baris terpengaruh)", "success");
} else {
sweetAlert("Tidak ada data yang berubah", "info");
}
} catch (PDOException $e) {
echo "Gagal update data: " . $e->getMessage();
}
}
?>
if ($page[1] == 'pesan_koneksi_off') {
$status_koneksi_off = $_POST['status_koneksi_off'];
$interval = preg_replace("/[^0-9]/","",$_POST['interval']);
$sqlPostOff = ", status_koneksi_off = '".$status_koneksi_off."', interval_koneksi_off = '".$interval."' ";
} else {
$sqlPostOff = "";
}
$update = mysqli_query($con,"UPDATE data_server SET $page[1] = '$_POST[fpesan]' $SqlPost $sqlPostOff WHERE id = '$SvId'");
if($update){
sweetAlert("Data telah di ubah", "success");
// echo $SqlPost;
}
}
?>
</div>
</div>
</div>
@@ -185,16 +734,16 @@ $server = mysqli_fetch_assoc($aserver);
// Kirim Pesan WhatsApp
$APIwa = new PesanWA();
// Menyiapkan query berdasarkan jenis pesan
if ($page[1] == 'pesan_registrasi' || $page[1] == 'pesan_aktivasi' || $page[1] == 'pesan_koneksi_off') {
if ($pesan['nama'] == 'Pesan Registrasi' || $pesan['nama'] == 'Pesan Aktivasi' || $pesan['nama'] == 'Pesan Koneksi Off') {
$stmt = $pdo->prepare("SELECT id FROM pelanggan WHERE status = 'aktif' AND id_data_server = '$SvId'");
$stmt->execute();
$data = $stmt->fetchAll();
$id = $data[0]['id'];
$url = "";
$APIwa->Create_Pesan($SvId,$id,$page[1]);
$APIwa->Create_Pesan($SvId,$id,$pesan['nama']);
} elseif ($page[1] == 'pesan_melunasi_tagihan' || $page[1] == 'pesan_isolir_pelanggan' || $page[1] == 'pesan_peringatan_tagihan' || $page[1] == 'pesan_kirim_tagihan') {
if($server['status_payment_gateway'] == 'ACTIVE' AND $page[1] == 'pesan_kirim_tagihan') {
} elseif ($pesan['nama'] == 'Pesan Melunasi Tagihan' || $pesan['nama'] == 'Pesan Isolir Pelanggan' || $pesan['nama'] == 'Pesan Peringatan Tagihan' || $pesan['nama'] == 'Pesan Kirim Tagihan') {
if($server['status_payment_gateway'] == 'ACTIVE' AND $pesan['nama'] == 'Pesan Kirim Tagihan') {
$sqldata = "SELECT id,img_invoice FROM tagihan WHERE transaction_link != '' AND id_data_server = '$SvId'";
} else {
$sqldata = "SELECT id,img_invoice FROM tagihan WHERE status = 'lunas' AND id_data_server = '$SvId'";
@@ -205,16 +754,20 @@ $server = mysqli_fetch_assoc($aserver);
$id = $data[0]['id'];
$url = baseurl()."/invoice/".$data[0]['img_invoice'];
$APIwa->Create_Pesan($SvId,$id,$page[1],'tag');
$APIwa->Create_Pesan($SvId,$id,$pesan['nama'],'tag');
}
$Pesan = $APIwa->Get_Pesan();
if ($page[1] == 'pesan_melunasi_tagihan') {
if ($pesan['nama'] == 'Pesan Melunasi Tagihan') {
$APIwa->Send_Pesan($SvId,'sendMediaFromUrl',[$_POST['nomor']],$Pesan, $url);
} else {
$APIwa->Send_Pesan($SvId,'sendMessage',[$_POST['nomor']],$Pesan);
}
sweetAlert("Pesan akan segera di kirim ke nomor ".$_POST['nomor'],"success");
}
?>
?>
<?php } ?>
+2 -2
View File
@@ -386,9 +386,9 @@ $datakonpensasi = ($data[0]['konpensasi'] == 0) ? $data[0]['jumlah_konpensasi']
$Url = baseurl($invoicePath);
$APIwa = new PesanWA();
$APIwa->Create_Pesan($data[0]['id_data_server'],$idtag,'pesan_melunasi_tagihan','tag');
$APIwa->Create_Pesan($data[0]['id_data_server'],$idtag,'Pesan Melunasi Tagihan','tag');
$Pesan = $APIwa->Get_Pesan();
$APIwa->Send_Pesan($data[0]['id_data_server'],'sendMediaFromUrl',$nomor,$Pesan,$Url);
$APIwa->Send_Pesan($data[0]['id_data_server'],['sendMediaFromUrl','Pesan Melunasi Tagihan'],$nomor,$Pesan,$Url);
// echo $Pesan;
sweetAlert("Pembayaran tagihan berhasil", "success", "?".encrypt_url('tagihan_detail_lunas|' . $idtag));
+2 -2
View File
@@ -365,9 +365,9 @@ $paygw = $stmt->fetch(PDO::FETCH_ASSOC);
// KIRIM PESAN WHATSAPP
$phone = array($data[0]['nomor_whatsapp']);
$API_WA = new PesanWA();
$API_WA->Create_Pesan($data[0]['id_data_server'], $page[1], 'pesan_kirim_tagihan', 'tag');
$API_WA->Create_Pesan($data[0]['id_data_server'], $page[1], 'Pesan Kirim Tagihan', 'tag');
$Pesan = $API_WA->Get_Pesan();
$API_WA->Send_Pesan($data[0]['id_data_server'], 'sendMessage', $phone, $Pesan);
$API_WA->Send_Pesan($data[0]['id_data_server'], ['sendMessage','Pesan Kirim Tagihan'], $phone, $Pesan);
if($API_WA){
// echo $data[0]['id_data_server']. 'sendMessage'. $phone. $Pesan;
sweetAlert("Tagihan Akan Segera di Kirim", "success");
+122 -4
View File
@@ -35,9 +35,9 @@ $hotspotAktif = ($datauser['user_hs_aktif'] > 0);
<?php } ?>
<th>Alamat</th>
<th>Koordinat</th>
<th>Nomor WhatsApp</th>
<th>Nomor Tlp & Email</th>
<th>Server</th>
<th>Mikrotik</th>
<th>Detail Modem</th>
<th>Paket</th>
<th>Status Koneksi</th>
<th>Mulai Berlangganan</th>
@@ -52,6 +52,65 @@ $hotspotAktif = ($datauser['user_hs_aktif'] > 0);
</div>
</section>
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header bg-primary text-white">
<h5 class="modal-title" id="exampleModalLabel">Detail ONU</h5>
<button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<table class="table table-sm table-striped">
<tbody>
<tr>
<th>Serial Number</th>
<td><span id="modalSn"></span></td>
</tr>
<tr>
<th>MAC Address</th>
<td><span id="modalMac"></span></td>
</tr>
<tr>
<th>Nama</th>
<td><span id="modalNama"></span></td>
</tr>
<tr>
<th>Tipe</th>
<td><span id="modalType"></span></td>
</tr>
<tr>
<th>RX Power</th>
<td><span id="modalRx"></span></td>
</tr>
<tr>
<th>TX Power</th>
<td><span id="modalTx"></span></td>
</tr>
<tr>
<th>Status</th>
<td><span id="modalStatus"></span></td>
</tr>
<tr>
<th>Jarak (m)</th>
<td><span id="modalDistance"></span></td>
</tr>
<tr>
<th>Last Online</th>
<td><span id="modalLastOnline"></span></td>
</tr>
</tbody>
</table>
<span id="modalStatusCek" class="text-danger"></span>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var table = $("#dataTable3").DataTable({
@@ -71,16 +130,75 @@ $(document).ready(function(){
// Debug: tampilkan POST parameter setiap kali request
table.on('preXhr.dt', function(e, settings, data){
console.log("🔎 DataTables POST Params:", 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);
// console.log("📦 Last Ajax Params:", params);
$("#datatableParams").val(JSON.stringify(params));
});
});
</script>
<script>
$(document).ready(function(){
// event delegation supaya pasti kepanggil
$(document).on('click', '.openModal', function(){
let id = $(this).data('id');
// console.log("Klik modal dengan id:", id);
// Kosongkan dulu isi modal
$('#modalSn, #modalMac, #modalNama, #modalType, #modalRx, #modalTx, #modalStatus, #modalDistance, #modalLastOnline')
.text('-');
$('#modalStatusCek').text('');
$.ajax({
url: 'controller/get_onu_detail.php',
type: 'POST', // lebih aman
data: { id: id },
dataType: 'json',
beforeSend: function(){
// console.log("Mengirim request ke controller/get_onu_detail.php dengan id:", id);
},
success: function(response){
// console.log("Response:", response);
if(Array.isArray(response) && response.length > 0){
let data = response[0]; // ambil object pertama
// isi ke modal
$('#modalSn').text(data.onu_sn ?? '-');
$('#modalMac').text(data.onu_mac ?? '-');
$('#modalNama').text(data.onu_name ?? '-');
$('#modalType').text(data.onu_type ?? '-');
$('#modalRx').text(data.onu_rxpower ?? '-');
$('#modalTx').text(data.onu_txpower ?? '-');
$('#modalStatus').text(data.onu_status ?? '-');
$('#modalDistance').text(data.onu_gpon_distance ?? '-');
$('#modalLastOnline').text(data.onu_last_online ?? '-');
} else {
$('#modalStatusCek').text("Data tidak ditemukan");
}
},
error: function(xhr, status, error){
// console.error("AJAX Error:", error);
$('#modalStatusCek').text("Gagal ambil data: " + error);
}
});
// action button
$('#btnAction').off('click').on('click', function(){
alert("Kamu pilih ID: " + id);
});
});
});
</script>
+29 -8
View File
@@ -133,7 +133,7 @@ if (!isValidLong($long)) {
</select>
</div>
<hr><center><label>INFORMASI TOPOLOGI</label></center>
<hr><center><label>INFORMASI TOPOLOGI / PERANGKAT</label></center>
<div class="form-group m-1">
<label for="firstDropdown">Topologi ODP</label>
<select class="select2bs4" name="odp" style="width: 100%" id="firstDropdown" required="required" onchange="updateSecondDropdown()">
@@ -151,6 +151,10 @@ if (!isValidLong($long)) {
<select id="secondDropdown" name="port" class="form-control" required="required" data-id="<?php echo $isi['port_odp']; ?>">
</select>
</div>
<div class="form-group m-1">
<label>Serial Number <small><i> *Optional</i></small></label>
<input type="text" class="form-control" name="serial_number" value="<?php echo $isi['serial_number']; ?>">
</div>
</div>
<div class="col-sm-6">
<?php if($isi['status'] != 'sampah') { ?>
@@ -265,17 +269,17 @@ if (isset($_POST['aktivasi'])) {
try {
// Fetching setting_mikrotik
$stmt = $pdo->prepare("SELECT * FROM setting_mikrotik WHERE id = :id");
$stmt->execute(['id' => $isi['id_setting_mikrotik']]);
$stmt->execute(['id' => $_POST['ism']]);
$mik = $stmt->fetch(PDO::FETCH_ASSOC);
// Fetching profile_paket
$stmt = $pdo->prepare("SELECT nama_profile FROM profile_paket WHERE id = :id");
$stmt->execute(['id' => $isi['id_profile_paket']]);
$stmt->execute(['id' => $_POST['idp']]);
$pro = $stmt->fetch(PDO::FETCH_ASSOC);
// Fetching master_topologi
$stmt = $pdo->prepare("SELECT nama FROM master_topologi WHERE id = :id");
$stmt->execute(['id' => $isi['id_master_topologi']]);
$stmt->execute(['id' => $_POST['odp']]);
$top = $stmt->fetch(PDO::FETCH_ASSOC);
$API = new RouterosAPI();
@@ -324,10 +328,17 @@ if (isset($_POST['aktivasi'])) {
// Kirim Pesan WhatsApp
$nomor = [$isi['nomor_whatsapp']];
$time_start = date('Y-m-d H:i:s');
//clean serial nnumber
$serialnumber = $_POST['serial_number'] ?? null;
$serialnumber = str_replace(' ', '', $serialnumber);
$serialnumber = preg_replace('/[^A-Za-z0-9]/', '', $serialnumber);
$serialnumber = strtoupper($serialnumber);
$APIwa = new PesanWA();
$APIwa->Create_Pesan($isi['id_data_server'], $isi['id'], 'pesan_aktivasi');
$APIwa->Create_Pesan($isi['id_data_server'], $isi['id'], 'Pesan Aktivasi');
$Pesan = $APIwa->Get_Pesan();
$APIwa->Send_Pesan($isi['id_data_server'], 'sendMessage', $nomor, $Pesan);
$APIwa->Send_Pesan($isi['id_data_server'], ['sendMessage','Pesan Aktivasi'], $nomor, $Pesan);
// Menggunakan prepared statement untuk keamanan
$stmt = $pdo->prepare("SELECT kode_unik_tagihan FROM pelanggan WHERE id_data_server = :id ORDER BY kode_unik_tagihan DESC LIMIT 1");
@@ -356,7 +367,8 @@ if (isset($_POST['aktivasi'])) {
status = 'aktif',
user_hotspot = :user_hotspot,
kode_unik_tagihan = :kodeuser,
time_start = :time_start
time_start = :time_start,
serial_number = :serial_number
WHERE id = :id");
$stmt->execute([
':id_setting_mikrotik' => $_POST['ism'],
@@ -367,6 +379,7 @@ if (isset($_POST['aktivasi'])) {
'user_hotspot' => $hotspot,
'kodeuser' => $kodeuser,
'time_start' => $time_start,
'serial_number' => $serialnumber,
'id' => $isi['id']
]);
@@ -440,6 +453,12 @@ if (isset($_POST['ubah'])) {
$fotorumah1 = $_SESSION['uploaded_files']['rmh'.$isi['id']];
$fotoonu1 = $_SESSION['uploaded_files']['onu'.$isi['id']];
$fototes1 = $_SESSION['uploaded_files']['tes'.$isi['id']];
//clean serial nnumber
$serialnumber = $_POST['serial_number'] ?? null;
$serialnumber = str_replace(' ', '', $serialnumber);
$serialnumber = preg_replace('/[^A-Za-z0-9]/', '', $serialnumber);
$serialnumber = strtoupper($serialnumber);
$stmt = $pdo->prepare("SELECT ip_address,username,password,port_api FROM setting_mikrotik WHERE id = :id");
$stmt->execute(['id' => $isi['id_setting_mikrotik']]);
@@ -521,7 +540,8 @@ if (isset($_POST['ubah'])) {
foto_odp = :foto_odp,
foto_rumah = :foto_rumah,
foto_onu = :foto_onu,
foto_test = :foto_test
foto_test = :foto_test,
serial_number = :serial_number
WHERE id = :id";
try {
@@ -549,6 +569,7 @@ if (isset($_POST['ubah'])) {
':foto_rumah' => $fotorumah1,
':foto_onu' => $fotoonu1,
':foto_test' => $fototes1,
':serial_number' => $serialnumber,
':id' => $page[1]
]);
+2 -2
View File
@@ -226,9 +226,9 @@ if (isset($_POST['tambah'])) {
// Kirim Pesan WhatsApp
$nomor = explode(',', $nowa.','.$watsapp['nomor_whatsapp']);
$APIwa = new PesanWA();
$APIwa->Create_Pesan($_POST['ids'], $last_id, 'pesan_registrasi');
$APIwa->Create_Pesan($_POST['ids'], $last_id, 'Pesan Registrasi');
$Pesan = $APIwa->Get_Pesan();
$APIwa->Send_Pesan($_POST['ids'], 'sendMessage', $nomor, $Pesan);
$APIwa->Send_Pesan($_POST['ids'], ['sendMessage','Pesan Registrasi'], $nomor, $Pesan);
$_SESSION['uploaded_files'] = '';
$_SESSION['uploaded_files'] = '';
+2 -1
View File
@@ -50,7 +50,7 @@ $stmt = $pdo->prepare("SELECT
$stmt = $pdo->query("SELECT COUNT(id) FROM v_pelanggan WHERE $SqlSvData status = 'tidak 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,nama_server,nama_paket,time_start,status_koneksi,nama_mikrotik,id_setting_mikrotik,time_update,ip_address,tanggal_bayar FROM v_pelanggan WHERE $SqlSvData status = 'tidak aktif' ORDER BY nama LIMIT :limit OFFSET :offset");
$stmt = $pdo->prepare("SELECT id,akun,user_hotspot,nama,alamat,latitude,longitude,nomor_whatsapp,nama_server,nama_paket,time_start,status_koneksi,nama_mikrotik,id_setting_mikrotik,time_update,ip_address,tanggal_bayar,mac_address FROM v_pelanggan WHERE $SqlSvData status = 'tidak aktif' ORDER BY nama LIMIT :limit OFFSET :offset");
$stmt->bindValue(':limit', $chunkSize, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
@@ -87,6 +87,7 @@ $stmt = $pdo->prepare("SELECT
<br><?php echo $row['ip_address']; ?>
<?php } ?>
<br><?php echo $row['time_update']; ?>
<br><?php echo $row['mac_address']; ?>
</td>
<td><?php echo $row['time_start']; ?></td>
<td><?php echo $row['tanggal_bayar']; ?></td>
+2
View File
@@ -35,6 +35,7 @@
<th>Nama Mikrotik</th>
<th>Akun PPPOE</th>
<th>IP Address</th>
<th>MAC Address</th>
<th>Action</th>
</tr>
</thead>
@@ -64,6 +65,7 @@
<td><?php echo htmlspecialchars($server['nama']); ?></td>
<td><?php echo htmlspecialchars($value['akun']); ?></td>
<td><?php echo htmlspecialchars($value['ip_address']); ?></td>
<td><?php echo htmlspecialchars($value['mac_address']); ?></td>
<td>
<a href="?<?php echo encrypt_url('user_remote|0000|' . $server['id'] . '|' . $value['ip_address'] . '|' . $value['akun']); ?>"
class="btn btn-sm btn-success ml-1" style="border-radius: 20px;">Remote</a>