Perbaiki .gitignore agar log dan file sensitif tidak ikut commit

This commit is contained in:
WD - Dev
2025-10-18 16:05:45 +07:00
parent eb13c69431
commit 6017dfd369
27 changed files with 89223 additions and 280 deletions
+6
View File
@@ -2,12 +2,18 @@ invoice/*.png
invoice/inv_contoh/*.pdf
invoice/thermal/*.pdf
img/user/
img/pesan/
agen/profile/
payment/paydisini/api_control.php
config/connect.php
config/whatsapp_api.php
whapi_webhook/*.log
whapi_webhook/ai/*.log
payment/paydisini/callback/*.log
.well-known/
berita_acara/*.pdf
load/logs/*.txt
load/cronjob/*.log
load/*.log
webhook_cloud_api/*.jsonl
load/*.txt
Binary file not shown.
+75
View File
@@ -0,0 +1,75 @@
<?php
require __DIR__ . "/../config/connect.php";
require __DIR__ . "/../config/encrypt.php";
header('Content-Type: application/json');
$id = $_GET['id'] ?? null;
if (!$id) {
echo json_encode(['error' => 'Parameter kosong']);
exit;
}
// Dekripsi dan parsing
$datadecrypt = decrypt_url($id);
$dataurl = json_decode($datadecrypt, true);
$ids = $dataurl[0] ?? null; // hasilnya: "2,3,4,7"
$filter = $dataurl[1] ?? null; // hasilnya: "informasi"
if (!$ids) {
echo json_encode(['error' => 'Parameter tidak boleh kosong']);
exit;
}
// Ubah string ID jadi array angka
$idArray = array_map('intval', explode(',', $ids));
// Buat placeholder dinamis
$placeholders = implode(',', array_fill(0, count($idArray), '?'));
// Query database
$sql = "SELECT * FROM whatsapp_cloud_api WHERE id_data_server IN ($placeholders) LIMIT 1";
$stmt3 = $pdo->prepare($sql);
$stmt3->execute($idArray);
$wacapi = $stmt3->fetch(PDO::FETCH_ASSOC);
if (!$wacapi) {
echo json_encode(['error' => 'Data API WhatsApp Cloud tidak ditemukan.']);
exit;
}
// Ambil token dan ID
$accessToken = $wacapi['token_access'];
$phoneNumberId = $wacapi['waba_id'];
// Panggil API WhatsApp
$url = "https://graph.facebook.com/v17.0/$phoneNumberId/message_templates";
$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)) {
echo json_encode(['error' => curl_error($ch)]);
exit;
}
curl_close($ch);
// Decode hasil API
$data = json_decode($response, true);
if (!isset($data['data'])) {
echo json_encode(['error' => 'Tidak ada data template ditemukan.']);
exit;
}
// Filter hanya template dengan awalan "informasi_"
$templates = array_values(array_filter($data['data'], function ($tpl) {
return isset($tpl['name']) && strpos($tpl['name'], 'informasi_') === 0;
}));
// Kirim hasil JSON ke fetch
echo json_encode(['templates' => $templates], JSON_UNESCAPED_UNICODE);
+33
View File
@@ -0,0 +1,33 @@
<?php
header("Content-Type: application/json");
// direktori upload
$uploadDir = __DIR__ . "/../img/pesan/";
if (!file_exists($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
if (!isset($_FILES['file'])) {
echo json_encode(["status" => "error", "message" => "No file uploaded"]);
exit;
}
$file = $_FILES['file'];
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
$allowed = ['jpg', 'jpeg', 'png', 'gif'];
if (!in_array($ext, $allowed)) {
echo json_encode(["status" => "error", "message" => "Invalid file type"]);
exit;
}
$newName = uniqid("img_") . "." . $ext;
$target = $uploadDir . $newName;
if (move_uploaded_file($file['tmp_name'], $target)) {
$url = "https://manjapro.net/img/pesan/" . $newName;
echo json_encode(["status" => "success", "url" => $url]);
} else {
echo json_encode(["status" => "error", "message" => "Failed to move file"]);
}
?>
+117 -117
View File
@@ -1,117 +1,117 @@
[21:00:01] [OK] 103.26.176.81
[21:00:01] [OK] 103.188.169.123
[21:00:01] [OK] 103.26.176.85
[21:00:01] [OK] 103.26.176.83
[21:00:01] [OK] 103.155.198.185
[21:00:01] [OK] tunnel.manjapro.net
[21:00:01] [OK] 103.188.169.121
[21:00:01] [OK] tunnel.manjapro.net
[21:00:01] [OK] tunnel.manjapro.net
[21:00:01] [OK] tunnel.manjapro.net
[21:00:01] [OK] tunnel.manjapro.net
[21:00:01] [OK] 103.18.78.86
[21:00:01] [OK] 157.20.128.231
[21:00:01] [OK] 103.236.190.109
[21:00:02] [OK] tunnel.manjapro.net
[21:00:02] [OK] tunnel.manjapro.net
[21:00:02] [OK] tunnel.manjapro.net
[21:00:02] [OK] 103.155.196.145
[21:00:02] [OK] 103.26.176.87
[21:00:02] [OK] 103.242.104.69
[21:00:02] [OK] 103.26.176.93
[21:00:02] [OK] tunnel.manjapro.net
[21:00:02] [OK] 103.31.233.237
[21:00:02] [OK] 103.18.79.171
[21:00:03] [OK] 103.94.10.112
[21:00:03] [OK] 103.155.199.191
[21:00:03] [OK] tunnel.manjapro.net
[21:00:03] [OK] tunnel.manjapro.net
[21:00:03] [OK] 103.242.106.56
[21:00:03] [OK] tunnel.manjapro.net
[21:00:04] [OK] tunnel.manjapro.net
[21:00:05] [FAIL] 103.67.80.126
[21:00:06] [OK] 114.141.51.12
[21:00:06] [FAIL] tunnel.bilspro.com
[21:00:06] [FAIL] tunnel.bilspro.com
[21:00:06] [FAIL] 103.94.10.240
[21:00:06] [FAIL] 103.94.10.240
[21:00:06] [OK] 114.141.51.12
[21:00:06] [OK] tunnel.manjapro.net
[21:00:07] [FAIL] 103.94.10.240
[21:00:07] [OK] tunnel.manjapro.net
[21:00:07] [FAIL] tunnel.bilspro.com
[21:00:07] [OK] tunnel.manjapro.net
[21:00:07] [OK] tunnel.manjapro.net
[21:00:07] [OK] tunnel.manjapro.net
[21:00:08] [FAIL] infinnet.cloud
[21:00:08] [OK] tunnel.manjapro.net
[21:00:08] [OK] tunnel.manjapro.net
[21:00:08] [OK] tunnel.manjapro.net
[21:00:08] [OK] tunnel.manjapro.net
[21:00:10] [OK] tunnel.manjapro.net
[21:00:10] [FAIL] infinnet.cloud
[21:00:10] [FAIL] tunnel.bilspro.com
[21:00:13] [FAIL] tunnel.manjapro.net
[21:00:14] [FAIL] 157.20.12
[21:00:14] [FAIL] 103.155.198.109
[21:00:15] [FAIL] 103.103.147.225
[2025-10-07 21:00:15] Semua child selesai. Mulai update DB...
[21:00:15] [UPDATE DB] 03FK-Q7XE1
[21:00:15] [UPDATE DB] IDLF-SK944
[21:00:15] [UPDATE DB] TYF0-3RP75
[21:00:15] [UPDATE DB] 0YDS-EI1V6
[21:00:15] [UPDATE DB] C7CU-PGT97
[21:00:15] [UPDATE STATUS] 7FZH-WIBI8 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] YHVJ-ZN9V9
[21:00:15] [UPDATE DB] C7CU-PGT910
[21:00:15] [UPDATE DB] MPK0-Q43P11
[21:00:15] [UPDATE DB] S9QL-XRJ512
[21:00:15] [UPDATE DB] HHJH-UFWL14
[21:00:15] [UPDATE DB] 03FK-Q7XE15
[21:00:15] [UPDATE DB] DG7B-JP4218
[21:00:15] [UPDATE DB] XXWL-VMH419
[21:00:15] [UPDATE DB] 03FK-Q7XE20
[21:00:15] [UPDATE DB] C7CU-PGT922
[21:00:15] [UPDATE DB] 8FHL-TXVS23
[21:00:15] [UPDATE DB] Q23C-IE2524
[21:00:15] [UPDATE DB] Q4D5-ATUM25
[21:00:15] [UPDATE DB] HHJH-UFWL28
[21:00:15] [UPDATE DB] 11P4-SII029
[21:00:15] [UPDATE DB] CUAA-CD2K30
[21:00:15] [UPDATE DB] S1Z8-TK6932
[21:00:15] [UPDATE DB] H67G-R4AK33
[21:00:15] [UPDATE STATUS] 9RV7-3W5U34 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] 32PA-DAZ435
[21:00:15] [UPDATE STATUS] LJQ6-KDDJ37 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] 0TW0-J74U38
[21:00:15] [UPDATE DB] L7TJ-IF2G39
[21:00:15] [UPDATE DB] RWDJ-NXBZ40
[21:00:15] [UPDATE DB] A26W-ART341
[21:00:15] [UPDATE STATUS] RE5H-G12Y42 (Disconnected -> Disconnected)
[21:00:15] [UPDATE STATUS] 03FK-Q7XE43 (Disconnected -> Disconnected)
[21:00:15] [UPDATE STATUS] Q96U-20UZ44 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] D3TU-JN5745
[21:00:15] [UPDATE DB] 7SDF-17X546
[21:00:15] [UPDATE DB] HMAZ-3HSX51
[21:00:15] [UPDATE STATUS] PQJB-HG8V53 (Disconnected -> Disconnected)
[21:00:15] [UPDATE STATUS] PMA9-QC7654 (Disconnected -> Disconnected)
[21:00:15] [UPDATE STATUS] 7ZCI-NFCI62 (Disconnected -> Disconnected)
[21:00:15] [UPDATE STATUS] 0E73-PABK63 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] 4MZF-SFTR65
[21:00:15] [UPDATE DB] PJC8-K0EG66
[21:00:15] [UPDATE STATUS] 351D-5NCH67 (Disconnected -> Disconnected)
[21:00:15] [UPDATE STATUS] A0S7-K2IC69 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] G9Z1-HRLY70
[21:00:15] [UPDATE STATUS] C7CU-PGT972 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] 66AU-Z7I573
[21:00:15] [UPDATE DB] S9QL-XRJ575
[21:00:15] [UPDATE DB] ABMS-YBP776
[21:00:15] [UPDATE DB] C7CU-PGT977
[21:00:15] [UPDATE DB] C7CU-PGT978
[21:00:15] [UPDATE DB] HHJH-UFWL81
[21:00:15] [UPDATE DB] 83
[21:00:15] [UPDATE STATUS] RNS6-DB3N84 (Disconnected -> Disconnected)
[21:00:15] [UPDATE DB] C7CU-PGT987
[21:00:15] [UPDATE DB] ZMVC-KAFH88
[2025-10-07 21:00:15] Update DB selesai. OK: 57, FAIL: 0
[2025-10-07 21:00:15] Lama eksekusi: 14.58 detik
[16:00:01] [OK] 103.26.176.81
[16:00:01] [OK] 103.188.169.123
[16:00:01] [OK] 103.26.176.85
[16:00:01] [OK] 103.188.169.121
[16:00:01] [OK] 103.26.176.83
[16:00:01] [OK] 103.155.198.185
[16:00:02] [OK] tunnel.manjapro.net
[16:00:02] [OK] tunnel.manjapro.net
[16:00:02] [OK] 103.188.169.127
[16:00:02] [OK] tunnel.manjapro.net
[16:00:02] [OK] tunnel.manjapro.net
[16:00:02] [OK] tunnel.manjapro.net
[16:00:02] [OK] 157.20.128.231
[16:00:02] [OK] tunnel.manjapro.net
[16:00:02] [OK] tunnel.manjapro.net
[16:00:02] [OK] 103.155.196.145
[16:00:02] [OK] 103.26.176.93
[16:00:03] [OK] 103.242.104.69
[16:00:03] [OK] tunnel.manjapro.net
[16:00:03] [OK] 103.94.10.112
[16:00:03] [OK] tunnel.manjapro.net
[16:00:03] [OK] 103.31.233.237
[16:00:03] [OK] tunnel.manjapro.net
[16:00:03] [OK] 103.18.79.171
[16:00:04] [OK] 103.26.176.87
[16:00:04] [OK] 103.155.199.191
[16:00:04] [OK] tunnel.manjapro.net
[16:00:04] [OK] tunnel.manjapro.net
[16:00:04] [OK] tunnel.manjapro.net
[16:00:05] [OK] 103.236.190.109
[16:00:05] [OK] 103.242.106.56
[16:00:05] [FAIL] 103.67.80.126
[16:00:06] [FAIL] tunnel.bilspro.com
[16:00:06] [FAIL] tunnel.bilspro.com
[16:00:07] [FAIL] 103.94.10.240
[16:00:07] [FAIL] 103.94.10.240
[16:00:08] [FAIL] 103.94.10.240
[16:00:08] [OK] tunnel.manjapro.net
[16:00:08] [FAIL] tunnel.bilspro.com
[16:00:09] [FAIL] infinnet.cloud
[16:00:09] [OK] tunnel.manjapro.net
[16:00:09] [OK] tunnel.manjapro.net
[16:00:09] [FAIL] 103.155.198.109
[16:00:09] [OK] tunnel.manjapro.net
[16:00:10] [OK] tunnel.manjapro.net
[16:00:10] [OK] tunnel.manjapro.net
[16:00:10] [OK] tunnel.manjapro.net
[16:00:10] [OK] tunnel.manjapro.net
[16:00:10] [OK] tunnel.manjapro.net
[16:00:11] [FAIL] infinnet.cloud
[16:00:11] [FAIL] tunnel.bilspro.com
[16:00:11] [OK] tunnel.manjapro.net
[16:00:14] [FAIL] tunnel.manjapro.net
[16:00:15] [FAIL] 103.103.147.225
[16:00:15] [FAIL] 157.20.12
[16:00:15] [FAIL] 114.141.51.12
[16:00:17] [FAIL] 114.141.51.12
[2025-10-18 16:00:17] Semua child selesai. Mulai update DB...
[16:00:17] [UPDATE DB] 03FK-Q7XE1
[16:00:17] [UPDATE DB] IDLF-SK944
[16:00:17] [UPDATE DB] TYF0-3RP75
[16:00:18] [UPDATE DB] 0YDS-EI1V6
[16:00:18] [UPDATE DB] C7CU-PGT97
[16:00:18] [UPDATE STATUS] 7FZH-WIBI8 (Disconnected -> Disconnected)
[16:00:19] [UPDATE DB] YHVJ-ZN9V9
[16:00:20] [UPDATE DB] C7CU-PGT910
[16:00:20] [UPDATE DB] MPK0-Q43P11
[16:00:20] [UPDATE DB] S9QL-XRJ512
[16:00:21] [UPDATE DB] HHJH-UFWL14
[16:00:21] [UPDATE DB] 03FK-Q7XE15
[16:00:21] [UPDATE DB] DG7B-JP4218
[16:00:21] [UPDATE DB] XXWL-VMH419
[16:00:21] [UPDATE DB] 03FK-Q7XE20
[16:00:21] [UPDATE DB] C7CU-PGT922
[16:00:21] [UPDATE DB] 8FHL-TXVS23
[16:00:21] [UPDATE DB] Q23C-IE2524
[16:00:21] [UPDATE DB] Q4D5-ATUM25
[16:00:21] [UPDATE DB] HHJH-UFWL28
[16:00:21] [UPDATE DB] 11P4-SII029
[16:00:21] [UPDATE DB] CUAA-CD2K30
[16:00:21] [UPDATE DB] S1Z8-TK6932
[16:00:21] [UPDATE DB] H67G-R4AK33
[16:00:21] [UPDATE STATUS] 9RV7-3W5U34 (Disconnected -> Disconnected)
[16:00:21] [UPDATE DB] 32PA-DAZ435
[16:00:21] [UPDATE STATUS] LJQ6-KDDJ37 (Disconnected -> Disconnected)
[16:00:21] [UPDATE DB] 0TW0-J74U38
[16:00:21] [UPDATE DB] L7TJ-IF2G39
[16:00:21] [UPDATE DB] RWDJ-NXBZ40
[16:00:21] [UPDATE DB] A26W-ART341
[16:00:21] [UPDATE STATUS] RE5H-G12Y42 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] 03FK-Q7XE43 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] Q96U-20UZ44 (Disconnected -> Disconnected)
[16:00:21] [UPDATE DB] D3TU-JN5745
[16:00:21] [UPDATE DB] 7SDF-17X546
[16:00:21] [UPDATE DB] HMAZ-3HSX51
[16:00:21] [UPDATE STATUS] PQJB-HG8V53 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] PMA9-QC7654 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] 7ZCI-NFCI62 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] 0E73-PABK63 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] 4MZF-SFTR65 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] PJC8-K0EG66 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] 351D-5NCH67 (Disconnected -> Disconnected)
[16:00:21] [UPDATE STATUS] A0S7-K2IC69 (Disconnected -> Disconnected)
[16:00:21] [UPDATE DB] G9Z1-HRLY70
[16:00:21] [UPDATE STATUS] C7CU-PGT972 (Disconnected -> Disconnected)
[16:00:21] [UPDATE DB] 66AU-Z7I573
[16:00:21] [UPDATE DB] S9QL-XRJ575
[16:00:21] [UPDATE DB] ABMS-YBP776
[16:00:21] [UPDATE DB] C7CU-PGT977
[16:00:21] [UPDATE DB] C7CU-PGT978
[16:00:21] [UPDATE DB] HHJH-UFWL81
[16:00:21] [UPDATE DB] 83
[16:00:21] [UPDATE STATUS] RNS6-DB3N84 (Disconnected -> Disconnected)
[16:00:21] [UPDATE DB] C7CU-PGT987
[16:00:21] [UPDATE DB] ZMVC-KAFH88
[2025-10-18 16:00:21] Update DB selesai. OK: 57, FAIL: 0
[2025-10-18 16:00:21] Lama eksekusi: 19.82 detik
+1 -1
View File
@@ -1 +1 @@
[2025-10-07 21:00:01] Tidak ada remote expired.
[2025-10-18 16:00:01] Tidak ada remote expired.
+1 -1
View File
@@ -1 +1 @@
[2025-10-06 23:50:02] 0 data telah dihapus. Data tersisa sejak 2025-09-01 00:00:00 sampai sekarang.
[2025-10-17 23:50:02] 0 data telah dihapus. Data tersisa sejak 2025-09-01 00:00:00 sampai sekarang.
+1 -1
View File
@@ -1 +1 @@
2025-10-07 21:00:06 ✅ Summary updated, rows affected: 1629
2025-10-18 16:00:06 ✅ Summary updated, rows affected: 1627
+15 -15
View File
@@ -1,23 +1,23 @@
SV_Cikembar_Utama Data pelanggan tidak ada
2025-10-07 20:30:01SV_BojongKerta Data pelanggan tidak ada
2025-10-07 20:30:01RO Bima Net Data pelanggan tidak ada
2025-10-07 20:30:01SV_Kingnet_Cibadak Data pelanggan tidak ada
2025-10-07 20:30:01SV_CC-Net_Cipicung Data pelanggan tidak ada
2025-10-07 20:30:01SV_Nusaina_Cibadak Data pelanggan tidak ada
2025-10-07 20:30:01SV_Diamond Net Status koneksi tidak aktif atau interval tidak tersedia.
2025-10-18 15:30:01SV_BojongKerta Data pelanggan tidak ada
2025-10-18 15:30:01RO Bima Net Data pelanggan tidak ada
2025-10-18 15:30:01SV_Kingnet_Cibadak Data pelanggan tidak ada
2025-10-18 15:30:01SV_CC-Net_Cipicung Data pelanggan tidak ada
2025-10-18 15:30:01SV_Nusaina_Cibadak Data pelanggan tidak ada
2025-10-18 15:30:01SV_Diamond Net Status koneksi tidak aktif atau interval tidak tersedia.
SV_22P Net Cibadak Data pelanggan tidak ada
2025-10-07 20:30:01SV_Nettizen_Segaranten Data pelanggan tidak ada
2025-10-07 20:00:01SV-DNY-Net-1 Data pelanggan tidak ada
2025-10-07 20:40:01SV_NTA_2_PSW_1 Status koneksi tidak aktif atau interval tidak tersedia.
2025-10-18 15:30:01SV_Nettizen_Segaranten Data pelanggan tidak ada
2025-10-18 15:00:01SV-DNY-Net-1 Data pelanggan tidak ada
2025-10-18 15:40:01SV_NTA_2_PSW_1 Status koneksi tidak aktif atau interval tidak tersedia.
SV_NTA_1 Status koneksi tidak aktif atau interval tidak tersedia.
SV-Cicukang Status koneksi tidak aktif atau interval tidak tersedia.
RO-Bumdes-Mekarmanah Status koneksi tidak aktif atau interval tidak tersedia.
RO-Pak-Kholiq Data pelanggan tidak ada
2025-10-07 20:45:01RO-Dendrit-Net Status koneksi tidak aktif atau interval tidak tersedia.
2025-10-18 15:45:01RO-Dendrit-Net Status koneksi tidak aktif atau interval tidak tersedia.
LJN.NS.CSR.NET Status koneksi tidak aktif atau interval tidak tersedia.
IVVINET-CBD Data pelanggan tidak ada
2025-10-07 20:30:01QONNET Data pelanggan tidak ada
2025-10-07 20:30:01Mikrotik_X86 Status koneksi tidak aktif atau interval tidak tersedia.
2025-10-18 15:30:01QONNET Data pelanggan tidak ada
2025-10-18 15:30:01Mikrotik_X86 Status koneksi tidak aktif atau interval tidak tersedia.
Mikrotik_BSW_1 Status koneksi tidak aktif atau interval tidak tersedia.
Mikrotik_Alea Status koneksi tidak aktif atau interval tidak tersedia.
STANG Status koneksi tidak aktif atau interval tidak tersedia.
@@ -37,16 +37,16 @@ RO_Wargasari Status koneksi tidak aktif atau interval tidak tersedia.
LJN_AGUNG Status koneksi tidak aktif atau interval tidak tersedia.
RNET-CMS Status koneksi tidak aktif atau interval tidak tersedia.
DCN-GB-CCR Data pelanggan tidak ada
2025-10-07 20:30:01412NET Status koneksi tidak aktif atau interval tidak tersedia.
2025-10-18 15:30:01412NET Status koneksi tidak aktif atau interval tidak tersedia.
brf Status koneksi tidak aktif atau interval tidak tersedia.
BMSNET Status koneksi tidak aktif atau interval tidak tersedia.
purabaya Status koneksi tidak aktif atau interval tidak tersedia.
DCN-CO-GX4 Data pelanggan tidak ada
2025-10-07 20:30:01MIKROTIK GX4 Status koneksi tidak aktif atau interval tidak tersedia.
2025-10-18 15:30:01MIKROTIK GX4 Status koneksi tidak aktif atau interval tidak tersedia.
RO - Netborhood Wifi Status koneksi tidak aktif atau interval tidak tersedia.
Neglasari Status koneksi tidak aktif atau interval tidak tersedia.
SV-DNY-Net-2 Data pelanggan tidak ada
2025-10-07 20:40:01DNY-Neglasari Status koneksi tidak aktif atau interval tidak tersedia.
2025-10-18 15:40:01DNY-Neglasari Status koneksi tidak aktif atau interval tidak tersedia.
RO_TTO Status koneksi tidak aktif atau interval tidak tersedia.
AP - NET Status koneksi tidak aktif atau interval tidak tersedia.
GAS NET Status koneksi tidak aktif atau interval tidak tersedia.
+1 -3
View File
@@ -10,8 +10,6 @@ Successfully started background process for IP: tunnel.manjapro.net SV-Cicukang
Successfully started background process for IP: tunnel.manjapro.net SV_NTA_1
Successfully started background process for IP: 103.94.10.112 STANG
Successfully started background process for IP: 157.20.128.231 QONNET
Successfully started background process for IP: 114.141.51.12 BMSNET
Successfully started background process for IP: 114.141.51.12 purabaya
Successfully started background process for IP: 103.155.198.185 SV_Cikembar_Utama
Successfully started background process for IP: 103.155.196.145 UNIX-NET
Successfully started background process for IP: 103.26.176.81 SV_CC-Net_Cipicung
@@ -20,4 +18,4 @@ Successfully started background process for IP: tunnel.manjapro.net Mikrotik_X86
Successfully started background process for IP: tunnel.manjapro.net SV_NTA_2_PSW_2
Successfully started background process for IP: tunnel.manjapro.net Triunsa
Successfully started background process for IP: tunnel.manjapro.net SV_Diamond Net
Started parallel processes for checking vouchers. => 2025-10-07 21:00:01
Started parallel processes for checking vouchers. => 2025-10-18 16:00:02
+7
View File
@@ -2,6 +2,7 @@
// include "../manjapro-project/config/connect.php";
include "../config/connect.php";
include __DIR__ . "/../webhook_cloud_api/send_to_app2.php";
$stmt = $pdo->prepare("SELECT * FROM whatsapp_cloud_api GROUP BY id_data_server");
$stmt->execute();
@@ -56,6 +57,12 @@ foreach ($whatsapp as $waKey) {
}
}
// kirim ke aplikasi 2
forwardToApp2([
"data" => $data,
"respon" => $response
]);
curl_close($ch);
}
}
+1 -1
View File
@@ -21,7 +21,6 @@ Mikrotik_X86 =><br>
Mikrotik_BSW_1 =><br>
Mikrotik_Alea =><br>
STANG =><br>
UNIX-NET =><br>
SV_NTA_2_TBL =><br>
MULYANAJAYA =><br>
PERWASIM-NETWORK =><br>
@@ -46,6 +45,7 @@ RO - Netborhood Wifi =><br>
Neglasari =><br>
SV-DNY-Net-2 =><br>
DNY-Neglasari =><br>
RO_TTO =><br>
AP - NET =><br>
GAS NET =><br>
SV_NTA_2_PSW_2 =><br>
+1 -1
View File
@@ -1 +1 @@
Tidak perlu update untuk ID: 2 Rp.200,000<br>Harga khusus untuk ID: 3 Rp.250,000<br>Tidak perlu update untuk ID: 4 Rp.300,000<br>Tidak perlu update untuk ID: 5 Rp.300,000<br>Tidak perlu update untuk ID: 6 Rp.200,000<br>Harga khusus untuk ID: 7 Rp.200,000<br>Tidak perlu update untuk ID: 8 Rp.200,000<br>Tidak perlu update untuk ID: 9 Rp.200,000<br>Tidak perlu update untuk ID: 10 Rp.200,000<br>Tidak perlu update untuk ID: 12 Rp.750,000<br>Tidak perlu update untuk ID: 13 Rp.750,000<br>Tidak perlu update untuk ID: 14 Rp.450,000<br>Tidak perlu update untuk ID: 15 Rp.450,000<br>Tidak perlu update untuk ID: 16 Rp.300,000<br>Harga khusus untuk ID: 17 Rp.300,000<br>Tidak perlu update untuk ID: 18 Rp.300,000<br>Tidak perlu update untuk ID: 19 Rp.450,000<br>Tidak perlu update untuk ID: 20 Rp.200,000<br>Tidak perlu update untuk ID: 21 Rp.300,000<br>Tidak perlu update untuk ID: 22 Rp.300,000<br>Tidak perlu update untuk ID: 23 Rp.450,000<br>Tidak perlu update untuk ID: 24 Rp.200,000<br>Tidak perlu update untuk ID: 25 Rp.250,000<br>Tidak perlu update untuk ID: 26 Rp.200,000<br>Tidak perlu update untuk ID: 28 Rp.200,000<br>Tidak perlu update untuk ID: 29 Rp.300,000<br>Tidak perlu update untuk ID: 30 Rp.200,000<br>Tidak perlu update untuk ID: 31 Rp.300,000<br>Tidak perlu update untuk ID: 32 Rp.200,000<br>Tidak perlu update untuk ID: 33 Rp.200,000<br>Tidak perlu update untuk ID: 34 Rp.200,000<br>Tidak perlu update untuk ID: 35 Rp.200,000<br>Tidak perlu update untuk ID: 36 Rp.200,000<br>Tidak perlu update untuk ID: 37 Rp.300,000<br>Tidak perlu update untuk ID: 38 Rp.200,000<br>Tidak perlu update untuk ID: 39 Rp.200,000<br>Harga khusus untuk ID: 40 Rp.1,000,000<br>Tidak perlu update untuk ID: 41 Rp.200,000<br>Tidak perlu update untuk ID: 42 Rp.200,000<br>Harga khusus untuk ID: 43 Rp.100,000<br>Tidak perlu update untuk ID: 44 Rp.200,000<br>Tidak perlu update untuk ID: 45 Rp.300,000<br>Tidak perlu update untuk ID: 46 Rp.200,000<br>Tidak perlu update untuk ID: 47 Rp.200,000<br>Tidak perlu update untuk ID: 48 Rp.200,000<br>Tidak perlu update untuk ID: 49 Rp.200,000<br>Tidak perlu update untuk ID: 50 Rp.200,000<br>Tidak perlu update untuk ID: 51 Rp.200,000<br>Tidak perlu update untuk ID: 52 Rp.1,000,000<br>Tidak perlu update untuk ID: 53 Rp.200,000<br>Tidak perlu update untuk ID: 54 Rp.200,000<br>Tidak perlu update untuk ID: 55 Rp.200,000<br>Tidak perlu update untuk ID: 56 Rp.200,000<br>Tidak perlu update untuk ID: 57 Rp.200,000<br>Tidak perlu update untuk ID: 58 Rp.200,000<br>Tidak perlu update untuk ID: 59 Rp.200,000<br>Tidak perlu update untuk ID: 60 Rp.200,000<br>Tidak perlu update untuk ID: 61 Rp.300,000<br>Tidak perlu update untuk ID: 62 Rp.200,000<br>Tidak perlu update untuk ID: 63 Rp.200,000<br>Tidak perlu update untuk ID: 64 Rp.200,000<br>Tidak perlu update untuk ID: 65 Rp.200,000<br>Tidak perlu update untuk ID: 66 Rp.200,000<br>Tidak perlu update untuk ID: 67 Rp.200,000<br>Harga khusus untuk ID: 68 Rp.200,000<br>Harga khusus untuk ID: 69 Rp.200,000<br>Tidak perlu update untuk ID: 70 Rp.200,000<br>Tidak perlu update untuk ID: 71 Rp.200,000<br>Tidak perlu update untuk ID: 72 Rp.200,000<br>Tidak perlu update untuk ID: 73 Rp.200,000<br>Harga khusus untuk ID: 74 Rp.0<br>Harga khusus untuk ID: 75 Rp.0<br>Harga khusus untuk ID: 76 Rp.0<br>Tidak perlu update untuk ID: 77 Rp.200,000<br>Harga khusus untuk ID: 78 Rp.200,000<br>Harga khusus untuk ID: 79 Rp.200,000<br>2673 data pesan sebelum 3 hari terakhir berhasil dihapus.<br>
Tidak perlu update untuk ID: 2 Rp.200,000<br>Harga khusus untuk ID: 3 Rp.250,000<br>Tidak perlu update untuk ID: 4 Rp.300,000<br>Tidak perlu update untuk ID: 5 Rp.300,000<br>Tidak perlu update untuk ID: 6 Rp.200,000<br>Harga khusus untuk ID: 7 Rp.200,000<br>Tidak perlu update untuk ID: 8 Rp.200,000<br>Tidak perlu update untuk ID: 9 Rp.200,000<br>Tidak perlu update untuk ID: 10 Rp.200,000<br>Tidak perlu update untuk ID: 12 Rp.750,000<br>Tidak perlu update untuk ID: 13 Rp.750,000<br>Tidak perlu update untuk ID: 14 Rp.450,000<br>Tidak perlu update untuk ID: 15 Rp.450,000<br>Tidak perlu update untuk ID: 16 Rp.300,000<br>Harga khusus untuk ID: 17 Rp.300,000<br>Tidak perlu update untuk ID: 18 Rp.300,000<br>Tidak perlu update untuk ID: 19 Rp.450,000<br>Tidak perlu update untuk ID: 20 Rp.200,000<br>Tidak perlu update untuk ID: 21 Rp.300,000<br>Tidak perlu update untuk ID: 22 Rp.300,000<br>Tidak perlu update untuk ID: 23 Rp.450,000<br>Tidak perlu update untuk ID: 24 Rp.200,000<br>Tidak perlu update untuk ID: 25 Rp.250,000<br>Tidak perlu update untuk ID: 26 Rp.200,000<br>Tidak perlu update untuk ID: 28 Rp.200,000<br>Tidak perlu update untuk ID: 29 Rp.300,000<br>Tidak perlu update untuk ID: 30 Rp.200,000<br>Tidak perlu update untuk ID: 31 Rp.300,000<br>Tidak perlu update untuk ID: 32 Rp.200,000<br>Tidak perlu update untuk ID: 33 Rp.200,000<br>Tidak perlu update untuk ID: 34 Rp.200,000<br>Tidak perlu update untuk ID: 35 Rp.200,000<br>Tidak perlu update untuk ID: 36 Rp.200,000<br>Tidak perlu update untuk ID: 37 Rp.300,000<br>Tidak perlu update untuk ID: 38 Rp.200,000<br>Tidak perlu update untuk ID: 39 Rp.200,000<br>Harga khusus untuk ID: 40 Rp.1,000,000<br>Tidak perlu update untuk ID: 41 Rp.200,000<br>Tidak perlu update untuk ID: 42 Rp.200,000<br>Harga khusus untuk ID: 43 Rp.100,000<br>Tidak perlu update untuk ID: 44 Rp.200,000<br>Tidak perlu update untuk ID: 45 Rp.300,000<br>Tidak perlu update untuk ID: 46 Rp.200,000<br>Tidak perlu update untuk ID: 47 Rp.200,000<br>Tidak perlu update untuk ID: 48 Rp.200,000<br>Tidak perlu update untuk ID: 49 Rp.200,000<br>Tidak perlu update untuk ID: 50 Rp.200,000<br>Tidak perlu update untuk ID: 51 Rp.200,000<br>Tidak perlu update untuk ID: 52 Rp.1,000,000<br>Tidak perlu update untuk ID: 53 Rp.200,000<br>Tidak perlu update untuk ID: 54 Rp.200,000<br>Tidak perlu update untuk ID: 55 Rp.200,000<br>Tidak perlu update untuk ID: 56 Rp.200,000<br>Tidak perlu update untuk ID: 57 Rp.200,000<br>Tidak perlu update untuk ID: 58 Rp.200,000<br>Tidak perlu update untuk ID: 59 Rp.200,000<br>Tidak perlu update untuk ID: 60 Rp.200,000<br>Tidak perlu update untuk ID: 61 Rp.300,000<br>Tidak perlu update untuk ID: 62 Rp.200,000<br>Tidak perlu update untuk ID: 63 Rp.200,000<br>Tidak perlu update untuk ID: 64 Rp.200,000<br>Tidak perlu update untuk ID: 65 Rp.200,000<br>Tidak perlu update untuk ID: 66 Rp.200,000<br>Tidak perlu update untuk ID: 67 Rp.200,000<br>Harga khusus untuk ID: 68 Rp.200,000<br>Harga khusus untuk ID: 69 Rp.200,000<br>Tidak perlu update untuk ID: 70 Rp.200,000<br>Tidak perlu update untuk ID: 71 Rp.200,000<br>Tidak perlu update untuk ID: 72 Rp.200,000<br>Tidak perlu update untuk ID: 73 Rp.200,000<br>Harga khusus untuk ID: 74 Rp.0<br>Harga khusus untuk ID: 75 Rp.0<br>Harga khusus untuk ID: 76 Rp.0<br>Tidak perlu update untuk ID: 77 Rp.200,000<br>Harga khusus untuk ID: 78 Rp.200,000<br>Harga khusus untuk ID: 79 Rp.200,000<br>1601 data pesan sebelum 3 hari terakhir berhasil dihapus.<br>
+446 -22
View File
@@ -1,5 +1,12 @@
<style>
/* Sembunyikan semua dulu saat pertama kali load */
.official-section,
.unofficial-section {
display: none;
}
</style>
<!-- Main content -->
<section class="content">
<section class="content" style="zoom: 90%;">
<div class="container-fluid">
<div class="row">
<div class="col-12">
@@ -16,7 +23,15 @@
<div class="card-body">
<div class="row">
<div class="col-md-4">
<div class="card-body">
<form method="post" enctype="multipart/form-data">
<div class="form-group">
<label>Tipe WhatsApp Gateway</label>
<select class="form-control" name="gateway_type" id="gateway_type" required>
<option value="unofficial">Unofficial WA API</option>
<option value="official">Official WA API</option>
</select>
</div>
<div class="form-group">
<label>Data Server</label>
<div class="select2-primary">
@@ -59,13 +74,15 @@
</select>
</div>
</div>
<div class="col-md-4">
</div>
<div class="col-md-4 unofficial-section">
<div class="form-group">
<label>Isi Pesan Siaran</label>
<textarea class="form-control" rows="11" name="pesan" required="required"></textarea>
<textarea class="form-control" rows="11" name="pesan"></textarea>
</div>
</div>
<div class="col-md-4">
<div class="col-md-4 unofficial-section">
<center>
<label>Foto</label>
<div class="uploadImage" data-id="siaran<?php echo $SvId; ?>">
@@ -77,6 +94,45 @@
</div>
</center>
</div>
<div class="col-md-3 official-section">
<div class="card-body">
<div class="form-group">
<label for="template">Pilih Template</label>
<select class="form-control" name="template" id="template">
<?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>
<input type="hidden" name="pesan_official" id="pesan_official">
<!-- Form dinamis -->
<div id="paramForm" style="margin-top:20px;"></div>
</div>
</div>
<div class="col-md-5 official-section">
<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>
</div>
<div class="card-footer">
@@ -90,12 +146,20 @@
</section>
<?php
if (isset($_POST['kirim'])) {
$idsv = implode(", ", $_POST['ids']);
$sp = $_POST['sp'];
$sk = $_POST['sk'];
$mt = $_POST['mt'];
$type = $_POST['gateway_type'] ?? null;
$ids = $_POST['ids'] ?? [];
// Cegah implode null
if (empty($ids)) {
sweetAlert("Tidak ada server yang dipilih!", "warning");
exit;
}
$idsv = implode(", ", array_map('intval', $ids)); // sanitasi ID
$sp = $_POST['sp'] ?? null;
$sk = $_POST['sk'] ?? null;
$mt = $_POST['mt'] ?? null;
$sp1 = !empty($sp) ? " AND status = :sp" : "";
$sk1 = !empty($sk) ? " AND status_koneksi = :sk" : "";
@@ -113,23 +177,54 @@ if (isset($_POST['kirim'])) {
$stmt->execute();
$countInserted = 0;
while ($pecah = $stmt->fetch(PDO::FETCH_ASSOC)) {
// ====== GATEWAY OFFICIAL ======
if (!empty($type) && $type == "official") {
$id = $pecah['id_data_server'];
$jenis = "sendMessage";
$nomor = $pecah['nomor_whatsapp'];
// Replace placeholder #no_whatsapp dengan angka murni dari nomor
$cleanNumber = preg_replace('/\D/', '', $nomor);
$message = str_replace('#no_whatsapp', $cleanNumber, $_POST['pesan_official']);
$file_url = NULL;
$apiurl = 0;
$apikey = 0;
$sqlIn = "INSERT INTO master_pesan
(id_data_server, jenis_pesan, api_url, api_key, nomor, pesan, url_file, status, gateway_type)
VALUES
(:id, :jenis, :apiurl, :apikey, :nomor, :pesan, :url_file, 'PENDING', 'official')";
}
// ====== GATEWAY UNOFFICIAL ======
else {
$stmt2 = $pdo->prepare("SELECT url_whatsapp_gateway, apiKey_whatsapp FROM data_server WHERE id = :id_data_server");
$stmt2->bindParam(':id_data_server', $pecah['id_data_server']);
$stmt2->execute();
$pecah2 = $stmt2->fetch(PDO::FETCH_ASSOC);
if (isset($_SESSION['uploaded_files']['siaran'.$SvId])) {
if (!$pecah2) {
continue; // skip kalau data_server tidak ditemukan
}
// Cek apakah ada file yang diupload di sesi
$sessionKey = 'siaran' . $SvId;
if (isset($_SESSION['uploaded_files'][$sessionKey])) {
$id = $pecah['id_data_server'];
$jenis = "sendMediaFromUrl";
$nomor = $pecah['nomor_whatsapp'];
$message = $_POST['pesan'];
$file_url = $target_dir . $_SESSION['uploaded_files']['siaran'.$SvId];
$file_url = $target_dir . $_SESSION['uploaded_files'][$sessionKey];
$apiurl = $pecah2['url_whatsapp_gateway'];
$apikey = $pecah2['apiKey_whatsapp'];
$sqlIn = "INSERT INTO master_pesan (id_data_server, jenis_pesan, api_url, api_key, nomor, pesan, url_file, status)
VALUES (:id, :jenis, :apiurl, :apikey, :nomor, :pesan, :url_file, 'PENDING')";
$sqlIn = "INSERT INTO master_pesan
(id_data_server, jenis_pesan, api_url, api_key, nomor, pesan, url_file, status, gateway_type)
VALUES
(:id, :jenis, :apiurl, :apikey, :nomor, :pesan, :url_file, 'PENDING', 'unofficial')";
} else {
$id = $pecah['id_data_server'];
$jenis = "sendMessage";
@@ -137,11 +232,16 @@ if (isset($_POST['kirim'])) {
$message = $_POST['pesan'];
$apiurl = $pecah2['url_whatsapp_gateway'];
$apikey = $pecah2['apiKey_whatsapp'];
$file_url = NULL;
$sqlIn = "INSERT INTO master_pesan (id_data_server, jenis_pesan, api_url, api_key, nomor, pesan, status)
VALUES (:id, :jenis, :apiurl, :apikey, :nomor, :pesan, 'PENDING')";
$sqlIn = "INSERT INTO master_pesan
(id_data_server, jenis_pesan, api_url, api_key, nomor, pesan, status, gateway_type)
VALUES
(:id, :jenis, :apiurl, :apikey, :nomor, :pesan, 'PENDING', 'unofficial')";
}
}
// === Insert ke tabel master_pesan ===
$stmtInsert = $pdo->prepare($sqlIn);
$stmtInsert->bindParam(':id', $id);
$stmtInsert->bindParam(':jenis', $jenis);
@@ -150,22 +250,346 @@ if (isset($_POST['kirim'])) {
$stmtInsert->bindParam(':nomor', $nomor);
$stmtInsert->bindParam(':pesan', $message);
if (isset($file_url)) {
if (strpos($sqlIn, ':url_file') !== false) {
$stmtInsert->bindParam(':url_file', $file_url);
}
$stmtInsert->execute();
$countInserted++;
}
sweetAlert("Pesan Akan Segera di Kirim", "success");
// Bersihkan sesi upload jika ada
if (isset($_SESSION['uploaded_files']['siaran' . $SvId])) {
unset($_SESSION['uploaded_files']['siaran' . $SvId]);
}
if ($countInserted > 0) {
sweetAlert("Pesan ($countInserted) akan segera dikirim.", "success");
} else {
sweetAlert("Tidak ada data pelanggan yang cocok.", "info");
}
} catch (PDOException $e) {
// Handle exception, e.g., log the error
sweetAlert("Error: " . $e->getMessage(), "success");
// echo "Error: " . $e->getMessage();
sweetAlert("Error Database: " . $e->getMessage(), "error");
} catch (Exception $e) {
sweetAlert("Kesalahan Umum: " . $e->getMessage(), "error");
}
}
?>
<script>
document.addEventListener("DOMContentLoaded", function () {
const gatewaySelect = document.getElementById("gateway_type");
const unofficialSections = document.querySelectorAll(".unofficial-section");
const officialSections = document.querySelectorAll(".official-section");
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 waPostmessage = document.getElementById("pesan_official");
const SvId = '<?= encrypt_url(json_encode([$SvId, "informasi"])); ?>';
let templateLoaded = false;
// ============================================================
// DEFINISI SEMUA FUNCTION UTAMA DI AWAL (biar pasti dikenal)
// ============================================================
function updatePreview() {
let preview = waMessage.getAttribute("data-original") || "";
document.querySelectorAll("#paramForm input[data-placeholder]").forEach(input => {
let ph = input.dataset.placeholder;
let val = input.value || ph;
preview = preview.replace(ph, val);
});
preview = preview
.replace(/\*(.*?)\*/g, "<b>$1</b>")
.replace(/__(.*?)__/g, "<u>$1</u>")
.replace(/_(.*?)_/g, "<i>$1</i>")
.replace(/~(.*?)~/g, "<s>$1</s>")
.replace(/\n/g, "<br>");
waMessage.innerHTML = preview;
const payload = generatePayload();
if (waPostmessage && payload) {
waPostmessage.value = JSON.stringify(payload, null, 2);
}
}
function updateHeaderImage(input) {
const img = document.getElementById("header-img-preview");
if (img) img.src = input.value || "";
updatePreview();
}
function generatePayload() {
const template = templateSelect.value;
if (!template) return null;
const data = {
messaging_product: "whatsapp",
recipient_type: "individual",
to: "#no_whatsapp",
type: "template",
template: {
name: template,
language: { code: "id" },
components: []
}
};
const headerImageInput = document.querySelector("input[name='header_image']");
if (headerImageInput?.value) {
data.template.components.push({
type: "header",
parameters: [{ type: "image", image: { link: headerImageInput.value } }]
});
}
const 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 });
}
document.querySelectorAll("input[name^='btn_']").forEach(input => {
if (input.value.trim()) {
let [_, index] = input.name.split("_");
data.template.components.push({
type: "button",
sub_type: "url",
index: parseInt(index),
parameters: [{ type: "text", text: input.value }]
});
}
});
return data;
}
function initImageUploader() {
const imgInput = document.getElementById("image_update_value");
const imgPreview = document.getElementById("header-img-preview");
const container = document.getElementById("upload_container");
if (!imgInput || !container) return;
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = "image/*";
fileInput.className = "form-control mt-2";
fileInput.addEventListener("change", async (e) => {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = ev => { if (imgPreview) imgPreview.src = ev.target.result; };
reader.readAsDataURL(file);
const formData = new FormData();
formData.append("file", file);
try {
const res = await fetch("controller/upload_image_pesan_siaran.php", {
method: "POST",
body: formData
});
const data = await res.json();
if (data.status === "success" && data.url) {
imgInput.value = data.url;
updateHeaderImage(imgInput);
} else {
alert("Upload gagal: " + (data.message || "Unknown error"));
}
} catch (err) {
alert("Upload gagal. Cek koneksi atau server upload.");
console.error(err);
}
});
container.innerHTML = "";
container.appendChild(fileInput);
}
// ============================================================
// RENDER PARAMETER DINAMIS (dengan binding event via JS)
// ============================================================
function renderParamForm(tpl) {
paramForm.innerHTML = "";
waHeader.innerHTML = "";
waMessage.innerHTML = "";
waFooter.innerHTML = "";
waButtons.innerHTML = "";
if (!tpl?.components) return;
let formHtml = "<h5 class='text-center'><b>Parameter Wajib</b></h5><hr>";
let previewBody = "";
tpl.components.forEach((comp) => {
// HEADER IMAGE
if (comp.type === "HEADER" && comp.format === "IMAGE") {
let defaultImg = comp.example?.header_handle?.[0] || "";
formHtml += `
<div class="form-group">
<label>Gambar</label>
<input class="form-control" type="hidden" id="image_update_value"
name="header_image" value="${defaultImg}" required>
<div id="upload_container"></div>
</div>`;
waHeader.innerHTML = `<img id="header-img-preview" src="${defaultImg}" style="max-width:100%;border-radius:6px;"><br>`;
}
// BODY PARAMS
if (comp.type === "BODY" && comp.text) {
waMessage.setAttribute("data-original", comp.text);
let regex = /\{\{(\d+)\}\}/g, match, idx = 0;
while ((match = regex.exec(comp.text)) !== null) {
let paramNum = match[1];
formHtml += `
<div class="form-group">
<label>Parameter : {{${paramNum}}}</label>
<input class="form-control body-param" type="text"
name="body_${paramNum}" data-placeholder="{{${paramNum}}}" required>
</div>`;
idx++;
}
previewBody += comp.text.replace(/\n/g, "<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;
// Tambahkan listener dinamis untuk semua input yang baru dibuat
paramForm.querySelectorAll("input[data-placeholder]").forEach(input => {
input.addEventListener("input", updatePreview);
});
const imgInput = document.getElementById("image_update_value");
if (imgInput) imgInput.addEventListener("input", e => updateHeaderImage(e.target));
updatePreview();
initImageUploader();
}
// ============================================================
// FETCH TEMPLATE OFFICIAL
// ============================================================
function loadOfficialTemplates() {
fetch(`controller/get_template_official.php?id=${SvId}`)
.then(res => res.json())
.then(data => {
if (data.error) {
templateSelect.innerHTML = `<option disabled selected>${data.error}</option>`;
return;
}
const templates = Array.isArray(data.templates) ? data.templates : [];
const filtered = templates.filter(t => t.name?.startsWith("informasi_"));
if (filtered.length === 0) {
templateSelect.innerHTML = `<option disabled selected>Tidak ada template informasi_</option>`;
return;
}
templateSelect.innerHTML = "";
filtered.forEach(tpl => {
const opt = document.createElement("option");
opt.value = tpl.name;
opt.textContent = tpl.name;
opt.dataset.template = JSON.stringify(tpl);
templateSelect.appendChild(opt);
});
if (templateSelect.options.length > 0) {
templateSelect.selectedIndex = 0;
const firstTpl = JSON.parse(templateSelect.options[0].dataset.template);
renderParamForm(firstTpl);
}
})
.catch(err => {
console.error("Gagal load template:", err);
templateSelect.innerHTML = `<option disabled selected>Gagal load template</option>`;
});
}
// ============================================================
// TOGGLE GATEWAY VIEW
// ============================================================
function toggleGatewayView() {
const val = gatewaySelect.value;
if (val === "unofficial") {
unofficialSections.forEach(el => el.style.display = "block");
officialSections.forEach(el => el.style.display = "none");
} else if (val === "official") {
unofficialSections.forEach(el => el.style.display = "none");
officialSections.forEach(el => el.style.display = "block");
if (!templateLoaded) {
loadOfficialTemplates();
templateLoaded = true;
}
}
}
// ============================================================
// EVENT LISTENERS
// ============================================================
templateSelect.addEventListener("change", function () {
const opt = this.options[this.selectedIndex];
if (!opt?.dataset.template) return;
const tpl = JSON.parse(opt.dataset.template);
renderParamForm(tpl);
});
gatewaySelect.addEventListener("change", toggleGatewayView);
toggleGatewayView();
});
</script>
+1 -1
View File
@@ -1,4 +1,4 @@
<?php if($SvId == 2 ) { ?>
<?php if($SvId == 2 || $_SESSION['user'] == 1 ) { ?>
<?php
$stmt3 = $pdo->prepare("SELECT * FROM master_template_pesan WHERE id = :id");
+2
View File
@@ -29,6 +29,7 @@
<th>Keterangan</th>
<th>Paket Berlanggan</th>
<th>Jumlah Tagihan</th>
<th>Limit Pembayaran</th>
<?php echo ($statuspaygw == "ACTIVE") ? '<th>Payment Link</th>' : ''; ?>
<th>Nama Server</th>
<th>Action</th>
@@ -59,6 +60,7 @@
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
<td><?php echo $row['nama_paket']; ?></td>
<td>Rp. <?php echo number_format($row['verifikasi_tagihan']); ?></td>
<td><?php echo formatIndo($row['limit_pembayaran']); ?></td>
<?php echo ($statuspaygw == "ACTIVE") ? '<td style="max-width: 200px">'.$row['transaction_link'].'</td>' : ''; ?>
<td style="max-width: 200px"><?php echo $row['nama_server']; ?></td>
<td style="max-width: 30px">
+5
View File
@@ -79,6 +79,11 @@ $paygw = $stmt->fetch(PDO::FETCH_ASSOC);
<td class="p-1">:</td>
<td class="p-1"><?php echo $data[0]['keterangan']; ?></td>
</tr>
<tr>
<td class="p-1">Limit Pembayaran</td>
<td class="p-1">:</td>
<td class="p-1"><?php echo formatIndo($data[0]['limit_pembayaran']); ?></td>
</tr>
<tr>
<td class="p-1">Paket Berlangganan</td>
<td class="p-1">:</td>
+2
View File
@@ -24,6 +24,7 @@
<th>Keterangan</th>
<th>Paket Berlanggan</th>
<th>Jumlah Tagihan</th>
<th>Limit Pembayaran</th>
<?php echo ($statuspaygw == "ACTIVE") ? '<th>Payment Link</th>' : ''; ?>
<th>Nama Server</th>
<th>Action</th>
@@ -54,6 +55,7 @@
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
<td><?php echo $row['nama_paket']; ?></td>
<td>Rp. <?php echo number_format($row['verifikasi_tagihan']); ?></td>
<td><?php echo formatIndo($row['limit_pembayaran']); ?></td>
<?php echo ($statuspaygw == "ACTIVE") ? '<td style="max-width: 200px">'.$row['transaction_link'].'</td>' : ''; ?>
<td style="max-width: 200px"><?php echo $row['nama_server']; ?></td>
<td>
+2
View File
@@ -24,6 +24,7 @@
<th>Keterangan</th>
<th>Paket Berlanggan</th>
<th>Jumlah Tagihan</th>
<th>Limit Pembayaran</th>
<th>Nama Server</th>
<th>Action</th>
</tr>
@@ -54,6 +55,7 @@
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
<td><?php echo $row['nama_paket']; ?></td>
<td>Rp. <?php echo number_format($row['verifikasi_tagihan']); ?></td>
<td><?php echo formatIndo($row['limit_pembayaran']); ?></td>
<td style="max-width: 200px"><?php echo $row['nama_server']; ?></td>
<td>
<?php if(in_array("Bayar", $json_array[4]['sub_menu'])){ ?>
+88119
View File
File diff suppressed because it is too large Load Diff
+65 -2
View File
@@ -1,8 +1,9 @@
<?php
include __DIR__ . "/../config/connect.php";
include __DIR__ . "/send_to_app2.php";
// --- CONFIG LOGGING ---
$enableLogging = true;
$enableLogging = false;
$logFile = __DIR__ . '/webhook_log.jsonl';
function writeLog($data) {
@@ -82,6 +83,29 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$text = ($type === 'text') ? $message['text']['body'] ?? '' : '[Pesan non-teks: ' . $type . ']';
writeLog(["event" => "INCOMING_MESSAGE", "from" => $from, "type" => $type, "text" => $text]);
// Cek apakah nomor sudah ada di database
$stmt = $pdo->prepare("SELECT * FROM contact_number_api WHERE whatsapp_number = :number_id");
$stmt->execute([':number_id' => $from]);
$waNumber = $stmt->fetch(PDO::FETCH_ASSOC);
// Tentukan apakah sudah lewat 24 jam
$shouldSend = false;
if (!$waNumber) {
// Nomor baru → tambahkan ke DB dan tandai perlu kirim
$shouldSend = true;
$pdo->prepare("INSERT INTO contact_number_api (whatsapp_number, updated_at) VALUES (:number_id, NOW())")
->execute([':number_id' => $from]);
} else {
$lastUpdate = strtotime($waNumber['updated_at']);
$now = time();
$hoursPassed = ($now - $lastUpdate) / 3600;
if ($hoursPassed >= 24) {
$shouldSend = true;
}
}
if ($shouldSend) {
// --- Kirim balasan template ---
$reply = [
"messaging_product" => "whatsapp",
@@ -104,9 +128,20 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reply));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Kirim ke aplikasi 2
forwardToApp2([
"data" => $reply,
"respon" => $response
]);
// Update waktu eksekusi terakhir
$pdo->prepare("UPDATE contact_number_api SET updated_at = NOW() WHERE whatsapp_number = :number_id")
->execute([':number_id' => $from]);
}
writeLog(["event"=>"REPLY_SENT","to"=>$from,"http_code"=>$http_code]);
}
@@ -145,6 +180,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
}
// --- Forward ke webhook baru (jika ada) ---
$forwardUrl = "http://172.16.254.226/webhook/receive";
try {
$ch = curl_init($forwardUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $input);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
// Jika webhook baru masih HTTP, nonaktifkan verifikasi SSL sementara
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($ch);
$err = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
writeLog([
"event" => "FORWARDED_TO_NEW_WEBHOOK",
"url" => $forwardUrl,
"http_code" => $httpCode,
"error" => $err ?: null
]);
} catch (Exception $e) {
writeLog(["event" => "FORWARD_FAILED", "error" => $e->getMessage()]);
}
http_response_code(200);
echo "EVENT_RECEIVED";
exit;
+28
View File
@@ -0,0 +1,28 @@
<?php
function forwardToApp2($payload)
{
// URL endpoint di aplikasi 2 (CI3)
$endpoint = 'http://172.16.254.226/webhook/send';
// Encode payload ke JSON
$data_string = json_encode($payload);
// Kirim dengan CURL
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string)
]);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Log hasil kirim
// file_put_contents('forward_log.txt', date('Y-m-d H:i:s') . " | HTTP $httpCode | " . $result . "\n", FILE_APPEND);
return $httpCode == 200;
}
-34
View File
@@ -1,34 +0,0 @@
{"timestamp":"2025-10-04 20:53:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"PROSES"}}
{"timestamp":"2025-10-04 20:53:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 20:53:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 20:53:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEkFERTI3OEY3M0E1NDdFNDYxQgA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-04 21:59:29","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjI4QzBBOUQwMjNGMjE2RjhCMwA=","new_status":"PROSES"}}
{"timestamp":"2025-10-04 21:59:30","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjI4QzBBOUQwMjNGMjE2RjhCMwA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 21:59:56","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjI4QzBBOUQwMjNGMjE2RjhCMwA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-04 23:31:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjBCNDMzNDY4NTA0MUU4NzUyNAA=","new_status":"PROSES"}}
{"timestamp":"2025-10-04 23:31:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjBCNDMzNDY4NTA0MUU4NzUyNAA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-04 23:31:27","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTI5ODY5ODQyMhUCABEYEjBCNDMzNDY4NTA0MUU4NzUyNAA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 12:08:17","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg2MzQ1ODQ0MBUCABEYEjYxQTlFQ0ZDMEEzRjgyRTY3NAA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 12:08:20","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg2MzQ1ODQ0MBUCABEYEjYxQTlFQ0ZDMEEzRjgyRTY3NAA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 12:47:01","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg2MzQ1ODQ0MBUCABEYEjYxQTlFQ0ZDMEEzRjgyRTY3NAA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 13:24:48","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkJGNkI2M0U0RjY1N0I4ODdGRQA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:25:00","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkFGMDQzQkZBQzBFNDVGNTBDQgA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:25:42","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkQ1MUNDM0UyQjA4QzJBODUyRgA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:28:27","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkJBMTcyRTBDRTcxRTkwOEVEQwA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:29:22","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEkVEN0Y3OTdDQjJEQkE3QkFFMQA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:29:24","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTg4ODU2MTk4NxUCABEYEjU1RDhGNEI5N0FDOTNEN0EyNAA=","new_status":"GAGAL"}}
{"timestamp":"2025-10-05 13:34:32","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTY1NTU1ODAxNxUCABEYEjc0ODJGMDU3QzNDMzcxQkM0QwA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 13:34:34","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTY1NTU1ODAxNxUCABEYEjc0ODJGMDU3QzNDMzcxQkM0QwA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 14:15:32","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4NTY1NTU1ODAxNxUCABEYEjc0ODJGMDU3QzNDMzcxQkM0QwA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 14:18:40","data":{"event":"INCOMING_MESSAGE","from":"6285655558017","type":"image","text":"[Pesan non-teks: image]"}}
{"timestamp":"2025-10-05 14:18:41","data":{"event":"REPLY_SENT","to":"6285655558017","http_code":200}}
{"timestamp":"2025-10-05 14:30:41","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTU2MzY1ODcyNRUCABEYEjYzMkY5MzA3RkMzQkZEODVFQQA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 14:30:47","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTU2MzY1ODcyNRUCABEYEjYzMkY5MzA3RkMzQkZEODVFQQA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 14:45:25","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MjIxNjEzMjc3NxUCABEYEjYwOTFFOTZFOTZDODgyM0EzMgA=","new_status":"PROSES"}}
{"timestamp":"2025-10-05 14:45:39","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MjIxNjEzMjc3NxUCABEYEjYwOTFFOTZFOTZDODgyM0EzMgA=","new_status":"TERKIRIM"}}
{"timestamp":"2025-10-05 14:45:44","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MjIxNjEzMjc3NxUCABEYEjYwOTFFOTZFOTZDODgyM0EzMgA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-05 15:59:08","data":{"event":"INCOMING_MESSAGE","from":"6285655558017","type":"text","text":"Transaksi pembayaran saya knp blom di konfirmasi"}}
{"timestamp":"2025-10-05 15:59:09","data":{"event":"REPLY_SENT","to":"6285655558017","http_code":200}}
{"timestamp":"2025-10-06 06:52:54","data":{"event":"STATUS_UPDATED","wa_message_id":"wamid.HBgNNjI4MTU2MzY1ODcyNRUCABEYEjYzMkY5MzA3RkMzQkZEODVFQQA=","new_status":"DIBACA"}}
{"timestamp":"2025-10-07 11:40:31","data":{"event":"INCOMING_MESSAGE","from":"6282114113413","type":"text","text":"Kenapa gangguan ya"}}
{"timestamp":"2025-10-07 11:40:32","data":{"event":"REPLY_SENT","to":"6282114113413","http_code":200}}
+4
View File
@@ -2,3 +2,7 @@
2025-09-30 22:03:10 Exception ResponAI / Send_Pesan: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'nomor_whatsapp' at row 1
2025-09-30 22:03:20 Exception ResponAI / Send_Pesan: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'nomor_whatsapp' at row 1
2025-09-30 22:03:30 Exception ResponAI / Send_Pesan: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'nomor_whatsapp' at row 1
2025-10-09 22:00:21 Exception ResponAI / Send_Pesan: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'nomor_whatsapp' at row 1
2025-10-09 22:00:31 Exception ResponAI / Send_Pesan: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'nomor_whatsapp' at row 1
2025-10-09 22:00:41 Exception ResponAI / Send_Pesan: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'nomor_whatsapp' at row 1
2025-10-09 22:00:51 Exception ResponAI / Send_Pesan: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'nomor_whatsapp' at row 1
+125
View File
@@ -324,3 +324,128 @@ Semoga langkah-langkah
[2025-10-05 16:38:55][628562271573][DEBUG] Payload Stage 2: {"model":"gpt-4.1-nano","messages":[{"role":"system","content":"Kamu adalah AI Customer Service yang membantu menjawab pertanyaan pelanggan. Berikan respons yang natural, ramah, dan informatif berdasarkan pesan pengguna dan hasil query database (jika ada).\n \nHal yang WAJIB DIPATUHI:\n1. Selalu panggil pengguna dengan kata 'Kak' di setiap jawaban.\n - Jika ada nama pada hasil query, sesekali sapa juga dengan menyebut nama.\n2. Gunakan kata 'kami' untuk menjawab, jangan pernah gunakan kata saya, aku, gue, gua.\n3. Hanya berikan informasi yang tersedia dari database atau pengetahuan yang kamu miliki.\n4. Jangan menambahkan saran atau pendapat pribadi, kecuali jika topiknya umum.\n5. Jika informasi tidak tersedia \/ tidak ada data:\n - Sampaikan dengan sopan bahwa akan kami cek terlebih dahulu.\n - WAJIB tambahkan teks #manualcheck# di akhir jawaban.\n\nAturan akses database untuk role 'umum': Role umum hanya boleh mengakses informasi publik: daftar paket internet (profile_paket) dan informasi wilayah (master_desa). Role ini tidak boleh mengakses data pelanggan (v_pelanggan) maupun data tagihan (v_tagihan).\n\nTopik percakapan saat ini: umum\n\nData dan atauran atau langkah-langkah: \n"},{"role":"user","content":"Tesy"},{"role":"assistant","content":"Halo Kak, terima kasih sudah menghubungi. Apakah ada yang bisa kami bantu hari ini? #manualcheck#"},{"role":"user","content":"Test"},{"role":"system","content":"Database Statis: Tidak ada query database statis yang dilakukan atau hasil query kosong.\nDatabase Dinamis: Tidak ada query database yang dilakukan atau hasil query kosong."}],"temperature":0.7,"max_tokens":100}
[2025-10-05 16:38:57][628562271573][Proses AI Tahap 2 (Natural Response)] Halo Kak, terima kasih sudah menghubungi. Apakah ada yang bisa kami bantu hari ini? #manualcheck#
[2025-10-05 16:38:57][628562271573][DEBUG] === Selesai respon_chat ===
[2025-10-08 17:12:20][6281298698422][DEBUG] === Mulai respon_chat ===
[2025-10-08 17:12:20][6281298698422][DEBUG] Body pesan: Test
[2025-10-08 17:12:20][6281298698422][DEBUG] API Key: 6276cd6419cd00903ea809d0af614cb4
[2025-10-08 17:12:20][6281298698422][DEBUG] ID Server hasil lookup: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-08 17:12:20][6281298698422][Terima Pesan] dari 6281298698422: Test
[2025-10-08 17:12:20][6281298698422][DEBUG] Role hasil cek: {"role":"pelanggan","data":{"id_pelanggan_db":"511","nama":"Silviana Safitri","jenis_layanan":"PPPOE","email":"silvianasafitri1130@gmail.com","nik":"3202025012010004","status_pelanggan":"sampah","mulai_berlangganan":"2022-08-13 00:00:00","alamat":"Kp. Cipicung Tengah 014\/003 Desa Mekarasih ","nomor_whatsapp":"6281298698422","desa":null,"titik_koordinat":null,"akun":"silvianasafitri","id_pelanggan":"silvianasafitri","user_hotspot":null,"ip_address":"172.16.10.237","status_koneksi":"Off","nama_server":"CC_Net","paket_berlanggan":"Paket 20 Mbps Boardband","nama_odp":null,"port_odp":null,"nama_sales":"RJN ( Penagih )"}}
[2025-10-08 17:12:20][6281298698422][DEBUG] Topik lama: umum
[2025-10-08 17:12:20][6281298698422][DEBUG] Topik baru: umum
[2025-10-08 17:12:20][6281298698422][DEBUG] Topik final: umum
[2025-10-08 17:12:20][6281298698422][DEBUG] TopicMapping: {"tables":[]}
[2025-10-08 17:12:20][6281298698422][DEBUG] RoleMapping: {"profile_paket":["jenis_profile","nama","harga"],"promo":["id_promo","nama_promo","deskripsi","tanggal_mulai","tanggal_akhir"],"v_order_list":["nama","jenis_layanan","start_time","alamat","status","nomor_whatsapp"],"v_pelanggan":["akun","nama","status_koneksi","alamat","status","nama_paket","harga_paket"],"v_tagihan":["id","id_pelanggan","akun","nomor_whatsapp","total_tagihan","limit_pembayaran","status"],"v_tiket_gangguan":["id","id_pelanggan","permasalahan","status","jenis_tiket","start_time"],"rekening_bank":["id_rekening","nama_bank","no_rekening","pemilik"]}
[2025-10-08 17:12:20][6281298698422][DEBUG] FinalMapping: {"tables":[]}
[2025-10-08 17:12:20][6281298698422][DEBUG] TableMapping string (Stage 1): []
[2025-10-08 17:12:20][6281298698422][DEBUG] Payload Stage 1: {"model":"gpt-4.1-nano","messages":[{"role":"system","content":"Tugas: ubah pertanyaan user menjadi instruksi query database dalam format JSON.\n Gunakan hanya tabel & kolom berikut (strict whitelist): []\n \n \ud83d\udccc Data user yang tersedia untuk WHERE:\n {\n \"id_pelanggan_db\": \"511\",\n \"nama\": \"Silviana Safitri\",\n \"jenis_layanan\": \"PPPOE\",\n \"email\": \"silvianasafitri1130@gmail.com\",\n \"nik\": \"3202025012010004\",\n \"status_pelanggan\": \"sampah\",\n \"mulai_berlangganan\": \"2022-08-13 00:00:00\",\n \"alamat\": \"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\n \"nomor_whatsapp\": \"6281298698422\",\n \"desa\": null,\n \"titik_koordinat\": null,\n \"akun\": \"silvianasafitri\",\n \"id_pelanggan\": \"silvianasafitri\",\n \"user_hotspot\": null,\n \"ip_address\": \"172.16.10.237\",\n \"status_koneksi\": \"Off\",\n \"nama_server\": \"CC_Net\",\n \"paket_berlanggan\": \"Paket 20 Mbps Boardband\",\n \"nama_odp\": null,\n \"port_odp\": null,\n \"nama_sales\": \"RJN ( Penagih )\"\n}\n \n \ud83d\udccc Aturan pembuatan WHERE:\n - Ikuti aturan WHERE di strict whitelist\n - Gunakan kolom dari data user di atas (contoh: nomor_whatsapp, akun, id_pelanggan).\n - Jangan menebak isi kolom. Jika field tidak ada di data user, kosongkan WHERE.\n - Jika pertanyaan terkait data pribadi, gunakan nomor_whatsapp dari data user.\n - Jika query umum (tanpa filter), kosongkan WHERE: {}\n \n \ud83d\udccc Contoh format JSON:\n [\n {\"action\": \"GET\", \"table\": \"v_pelanggan\", \"where\": {\"nomor_whatsapp\": \"{{sender}}\"}, \"columns\": [\"nama\", \"nama_paket\", \"status_koneksi\"]},\n {\"action\": \"COUNT\", \"table\": \"v_tagihan\", \"where\": {\"status\": \"belum bayar\"}},\n {\"action\": \"GET\", \"table\": \"profile_paket\", \"where\": {}, \"columns\": [\"nama\", \"jenis_profile\", \"harga\"]}\n ]\n \n \ud83d\udccc Jika tidak ada query DB diperlukan:\n - Kembalikan JSON kosong: {} \n - atau {\"action\": \"NONE\"}."}],"temperature":0.3,"max_tokens":500}
[2025-10-08 17:12:21][6281298698422][Proses AI Tahap 1 (JSON)] []
[2025-10-08 17:12:21][6281298698422][DEBUG] Reply Stage 1 (sanitized): []
[2025-10-08 17:12:21][6281298698422][DEBUG] Parsed JSON Stage 1: []
[2025-10-08 17:12:21][6281298698422][DEBUG] ID Servers sebelum get_topik: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-08 17:12:21][6281298698422][DEBUG] Topik final sebelum get_topik: umum
[2025-10-08 17:12:21][6281298698422][DEBUG] Hasil get_topik: null
[2025-10-08 17:12:21][6281298698422][DEBUG] Payload Stage 2: {"model":"gpt-4.1-nano","messages":[{"role":"system","content":"Kamu adalah AI Customer Service yang membantu menjawab pertanyaan pelanggan. Berikan respons yang natural, ramah, dan informatif berdasarkan pesan pengguna dan hasil query database (jika ada).\n \nHal yang WAJIB DIPATUHI:\n1. Selalu panggil pengguna dengan kata 'Kak' di setiap jawaban.\n - Jika ada nama pada hasil query, sesekali sapa juga dengan menyebut nama.\n2. Gunakan kata 'kami' untuk menjawab, jangan pernah gunakan kata saya, aku, gue, gua.\n3. Hanya berikan informasi yang tersedia dari database atau pengetahuan yang kamu miliki.\n4. Jangan menambahkan saran atau pendapat pribadi, kecuali jika topiknya umum.\n5. Jika informasi tidak tersedia \/ tidak ada data:\n - Sampaikan dengan sopan bahwa akan kami cek terlebih dahulu.\n - WAJIB tambahkan teks #manualcheck# di akhir jawaban.\n\nAturan akses database untuk role 'pelanggan': Role pelanggan mewarisi hak akses role umum. Selain itu, pelanggan boleh mengakses data tagihan miliknya sendiri di v_tagihan (difilter berdasarkan nomor_whatsapp). Jika pelanggan menanyakan informasi terkait dirinya (nama, alamat, server, paket, dll), ambil dari Database Statis, bukan langsung dari tabel dinamis.\n\nTopik percakapan saat ini: umum\n\nData dan atauran atau langkah-langkah: \n"},{"role":"user","content":"Test"},{"role":"system","content":"Database Statis: {\"id_pelanggan_db\":\"511\",\"nama\":\"Silviana Safitri\",\"jenis_layanan\":\"PPPOE\",\"email\":\"silvianasafitri1130@gmail.com\",\"nik\":\"3202025012010004\",\"status_pelanggan\":\"sampah\",\"mulai_berlangganan\":\"2022-08-13 00:00:00\",\"alamat\":\"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\"nomor_whatsapp\":\"6281298698422\",\"desa\":null,\"titik_koordinat\":null,\"akun\":\"silvianasafitri\",\"id_pelanggan\":\"silvianasafitri\",\"user_hotspot\":null,\"ip_address\":\"172.16.10.237\",\"status_koneksi\":\"Off\",\"nama_server\":\"CC_Net\",\"paket_berlanggan\":\"Paket 20 Mbps Boardband\",\"nama_odp\":null,\"port_odp\":null,\"nama_sales\":\"RJN ( Penagih )\"}\nDatabase Dinamis: Tidak ada query database yang dilakukan atau hasil query kosong."}],"temperature":0.7,"max_tokens":100}
[2025-10-08 17:12:22][6281298698422][Proses AI Tahap 2 (Natural Response)] Halo Kak, terima kasih sudah menghubungi. Apakah ada yang bisa kami bantu hari ini?
[2025-10-08 17:12:22][6281298698422][DEBUG] === Selesai respon_chat ===
[2025-10-08 17:12:41][6281298698422][DEBUG] === Mulai respon_chat ===
[2025-10-08 17:12:41][6281298698422][DEBUG] Body pesan: selamat sore ?
[2025-10-08 17:12:41][6281298698422][DEBUG] API Key: 6276cd6419cd00903ea809d0af614cb4
[2025-10-08 17:12:41][6281298698422][DEBUG] ID Server hasil lookup: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-08 17:12:41][6281298698422][Terima Pesan] dari 6281298698422: selamat sore ?
[2025-10-08 17:12:41][6281298698422][DEBUG] Role hasil cek: {"role":"pelanggan","data":{"id_pelanggan_db":"511","nama":"Silviana Safitri","jenis_layanan":"PPPOE","email":"silvianasafitri1130@gmail.com","nik":"3202025012010004","status_pelanggan":"sampah","mulai_berlangganan":"2022-08-13 00:00:00","alamat":"Kp. Cipicung Tengah 014\/003 Desa Mekarasih ","nomor_whatsapp":"6281298698422","desa":null,"titik_koordinat":null,"akun":"silvianasafitri","id_pelanggan":"silvianasafitri","user_hotspot":null,"ip_address":"172.16.10.237","status_koneksi":"Off","nama_server":"CC_Net","paket_berlanggan":"Paket 20 Mbps Boardband","nama_odp":null,"port_odp":null,"nama_sales":"RJN ( Penagih )"}}
[2025-10-08 17:12:41][6281298698422][DEBUG] Topik lama: umum
[2025-10-08 17:12:41][6281298698422][DEBUG] Topik baru: umum
[2025-10-08 17:12:41][6281298698422][DEBUG] Topik final: umum
[2025-10-08 17:12:41][6281298698422][DEBUG] TopicMapping: {"tables":[]}
[2025-10-08 17:12:41][6281298698422][DEBUG] RoleMapping: {"profile_paket":["jenis_profile","nama","harga"],"promo":["id_promo","nama_promo","deskripsi","tanggal_mulai","tanggal_akhir"],"v_order_list":["nama","jenis_layanan","start_time","alamat","status","nomor_whatsapp"],"v_pelanggan":["akun","nama","status_koneksi","alamat","status","nama_paket","harga_paket"],"v_tagihan":["id","id_pelanggan","akun","nomor_whatsapp","total_tagihan","limit_pembayaran","status"],"v_tiket_gangguan":["id","id_pelanggan","permasalahan","status","jenis_tiket","start_time"],"rekening_bank":["id_rekening","nama_bank","no_rekening","pemilik"]}
[2025-10-08 17:12:41][6281298698422][DEBUG] FinalMapping: {"tables":[]}
[2025-10-08 17:12:41][6281298698422][DEBUG] TableMapping string (Stage 1): []
[2025-10-08 17:12:41][6281298698422][DEBUG] Payload Stage 1: {"model":"gpt-4.1-nano","messages":[{"role":"system","content":"Tugas: ubah pertanyaan user menjadi instruksi query database dalam format JSON.\n Gunakan hanya tabel & kolom berikut (strict whitelist): []\n \n \ud83d\udccc Data user yang tersedia untuk WHERE:\n {\n \"id_pelanggan_db\": \"511\",\n \"nama\": \"Silviana Safitri\",\n \"jenis_layanan\": \"PPPOE\",\n \"email\": \"silvianasafitri1130@gmail.com\",\n \"nik\": \"3202025012010004\",\n \"status_pelanggan\": \"sampah\",\n \"mulai_berlangganan\": \"2022-08-13 00:00:00\",\n \"alamat\": \"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\n \"nomor_whatsapp\": \"6281298698422\",\n \"desa\": null,\n \"titik_koordinat\": null,\n \"akun\": \"silvianasafitri\",\n \"id_pelanggan\": \"silvianasafitri\",\n \"user_hotspot\": null,\n \"ip_address\": \"172.16.10.237\",\n \"status_koneksi\": \"Off\",\n \"nama_server\": \"CC_Net\",\n \"paket_berlanggan\": \"Paket 20 Mbps Boardband\",\n \"nama_odp\": null,\n \"port_odp\": null,\n \"nama_sales\": \"RJN ( Penagih )\"\n}\n \n \ud83d\udccc Aturan pembuatan WHERE:\n - Ikuti aturan WHERE di strict whitelist\n - Gunakan kolom dari data user di atas (contoh: nomor_whatsapp, akun, id_pelanggan).\n - Jangan menebak isi kolom. Jika field tidak ada di data user, kosongkan WHERE.\n - Jika pertanyaan terkait data pribadi, gunakan nomor_whatsapp dari data user.\n - Jika query umum (tanpa filter), kosongkan WHERE: {}\n \n \ud83d\udccc Contoh format JSON:\n [\n {\"action\": \"GET\", \"table\": \"v_pelanggan\", \"where\": {\"nomor_whatsapp\": \"{{sender}}\"}, \"columns\": [\"nama\", \"nama_paket\", \"status_koneksi\"]},\n {\"action\": \"COUNT\", \"table\": \"v_tagihan\", \"where\": {\"status\": \"belum bayar\"}},\n {\"action\": \"GET\", \"table\": \"profile_paket\", \"where\": {}, \"columns\": [\"nama\", \"jenis_profile\", \"harga\"]}\n ]\n \n \ud83d\udccc Jika tidak ada query DB diperlukan:\n - Kembalikan JSON kosong: {} \n - atau {\"action\": \"NONE\"}."}],"temperature":0.3,"max_tokens":500}
[2025-10-08 17:12:43][6281298698422][Proses AI Tahap 1 (JSON)] [
{
"action": "GET",
"table": "v_pelanggan",
"where": {
"nomor_whatsapp": "6281298698422"
},
"columns": ["nama", "nama_paket", "status_koneksi"]
}
]
[2025-10-08 17:12:43][6281298698422][DEBUG] Reply Stage 1 (sanitized): [
{
"action": "GET",
"table": "v_pelanggan",
"where": {
"nomor_whatsapp": "6281298698422"
},
"columns": ["nama", "nama_paket", "status_koneksi"]
}
]
[2025-10-08 17:12:43][6281298698422][DEBUG] Parsed JSON Stage 1: [{"action":"GET","table":"v_pelanggan","where":{"nomor_whatsapp":"6281298698422"},"columns":["nama","nama_paket","status_koneksi"]}]
[2025-10-08 17:12:43][6281298698422][DEBUG] Eksekusi DB Query: {"action":"GET","table":"v_pelanggan","where":{"nomor_whatsapp":"6281298698422"},"columns":["nama","nama_paket","status_koneksi"]}
[2025-10-08 17:12:43][6281298698422][DEBUG] ID Servers sebelum get_topik: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-08 17:12:43][6281298698422][DEBUG] Topik final sebelum get_topik: umum
[2025-10-08 17:12:43][6281298698422][DEBUG] Hasil get_topik: null
[2025-10-08 17:12:43][6281298698422][DEBUG] Payload Stage 2: {"model":"gpt-4.1-nano","messages":[{"role":"system","content":"Kamu adalah AI Customer Service yang membantu menjawab pertanyaan pelanggan. Berikan respons yang natural, ramah, dan informatif berdasarkan pesan pengguna dan hasil query database (jika ada).\n \nHal yang WAJIB DIPATUHI:\n1. Selalu panggil pengguna dengan kata 'Kak' di setiap jawaban.\n - Jika ada nama pada hasil query, sesekali sapa juga dengan menyebut nama.\n2. Gunakan kata 'kami' untuk menjawab, jangan pernah gunakan kata saya, aku, gue, gua.\n3. Hanya berikan informasi yang tersedia dari database atau pengetahuan yang kamu miliki.\n4. Jangan menambahkan saran atau pendapat pribadi, kecuali jika topiknya umum.\n5. Jika informasi tidak tersedia \/ tidak ada data:\n - Sampaikan dengan sopan bahwa akan kami cek terlebih dahulu.\n - WAJIB tambahkan teks #manualcheck# di akhir jawaban.\n\nAturan akses database untuk role 'pelanggan': Role pelanggan mewarisi hak akses role umum. Selain itu, pelanggan boleh mengakses data tagihan miliknya sendiri di v_tagihan (difilter berdasarkan nomor_whatsapp). Jika pelanggan menanyakan informasi terkait dirinya (nama, alamat, server, paket, dll), ambil dari Database Statis, bukan langsung dari tabel dinamis.\n\nTopik percakapan saat ini: umum\n\nData dan atauran atau langkah-langkah: \n"},{"role":"user","content":"Test"},{"role":"assistant","content":"Halo Kak, terima kasih sudah menghubungi. Apakah ada yang bisa kami bantu hari ini?"},{"role":"user","content":"selamat sore ?"},{"role":"system","content":"Database Statis: {\"id_pelanggan_db\":\"511\",\"nama\":\"Silviana Safitri\",\"jenis_layanan\":\"PPPOE\",\"email\":\"silvianasafitri1130@gmail.com\",\"nik\":\"3202025012010004\",\"status_pelanggan\":\"sampah\",\"mulai_berlangganan\":\"2022-08-13 00:00:00\",\"alamat\":\"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\"nomor_whatsapp\":\"6281298698422\",\"desa\":null,\"titik_koordinat\":null,\"akun\":\"silvianasafitri\",\"id_pelanggan\":\"silvianasafitri\",\"user_hotspot\":null,\"ip_address\":\"172.16.10.237\",\"status_koneksi\":\"Off\",\"nama_server\":\"CC_Net\",\"paket_berlanggan\":\"Paket 20 Mbps Boardband\",\"nama_odp\":null,\"port_odp\":null,\"nama_sales\":\"RJN ( Penagih )\"}\nDatabase Dinamis: [{\"error\":\"Tabel tidak diizinkan atau tidak valid: v_pelanggan\"}]"}],"temperature":0.7,"max_tokens":100}
[2025-10-08 17:12:43][6281298698422][Proses AI Tahap 2 (Natural Response)] Selamat sore, Kak! Terima kasih sudah menghubungi kami. Apakah ada yang bisa kami bantu hari ini?
[2025-10-08 17:12:43][6281298698422][DEBUG] === Selesai respon_chat ===
[2025-10-08 17:13:34][6281298698422][DEBUG] === Mulai respon_chat ===
[2025-10-08 17:13:34][6281298698422][DEBUG] Body pesan: saya siapa?
[2025-10-08 17:13:34][6281298698422][DEBUG] API Key: 6276cd6419cd00903ea809d0af614cb4
[2025-10-08 17:13:34][6281298698422][DEBUG] ID Server hasil lookup: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-08 17:13:34][6281298698422][Terima Pesan] dari 6281298698422: saya siapa?
[2025-10-08 17:13:34][6281298698422][DEBUG] Role hasil cek: {"role":"pelanggan","data":{"id_pelanggan_db":"511","nama":"Silviana Safitri","jenis_layanan":"PPPOE","email":"silvianasafitri1130@gmail.com","nik":"3202025012010004","status_pelanggan":"sampah","mulai_berlangganan":"2022-08-13 00:00:00","alamat":"Kp. Cipicung Tengah 014\/003 Desa Mekarasih ","nomor_whatsapp":"6281298698422","desa":null,"titik_koordinat":null,"akun":"silvianasafitri","id_pelanggan":"silvianasafitri","user_hotspot":null,"ip_address":"172.16.10.237","status_koneksi":"Off","nama_server":"CC_Net","paket_berlanggan":"Paket 20 Mbps Boardband","nama_odp":null,"port_odp":null,"nama_sales":"RJN ( Penagih )"}}
[2025-10-08 17:13:34][6281298698422][DEBUG] Topik lama: umum
[2025-10-08 17:13:34][6281298698422][DEBUG] Topik baru: umum
[2025-10-08 17:13:34][6281298698422][DEBUG] Topik final: umum
[2025-10-08 17:13:34][6281298698422][DEBUG] TopicMapping: {"tables":[]}
[2025-10-08 17:13:34][6281298698422][DEBUG] RoleMapping: {"profile_paket":["jenis_profile","nama","harga"],"promo":["id_promo","nama_promo","deskripsi","tanggal_mulai","tanggal_akhir"],"v_order_list":["nama","jenis_layanan","start_time","alamat","status","nomor_whatsapp"],"v_pelanggan":["akun","nama","status_koneksi","alamat","status","nama_paket","harga_paket"],"v_tagihan":["id","id_pelanggan","akun","nomor_whatsapp","total_tagihan","limit_pembayaran","status"],"v_tiket_gangguan":["id","id_pelanggan","permasalahan","status","jenis_tiket","start_time"],"rekening_bank":["id_rekening","nama_bank","no_rekening","pemilik"]}
[2025-10-08 17:13:34][6281298698422][DEBUG] FinalMapping: {"tables":[]}
[2025-10-08 17:13:34][6281298698422][DEBUG] TableMapping string (Stage 1): []
[2025-10-08 17:13:34][6281298698422][DEBUG] Payload Stage 1: {"model":"gpt-4.1-nano","messages":[{"role":"system","content":"Tugas: ubah pertanyaan user menjadi instruksi query database dalam format JSON.\n Gunakan hanya tabel & kolom berikut (strict whitelist): []\n \n \ud83d\udccc Data user yang tersedia untuk WHERE:\n {\n \"id_pelanggan_db\": \"511\",\n \"nama\": \"Silviana Safitri\",\n \"jenis_layanan\": \"PPPOE\",\n \"email\": \"silvianasafitri1130@gmail.com\",\n \"nik\": \"3202025012010004\",\n \"status_pelanggan\": \"sampah\",\n \"mulai_berlangganan\": \"2022-08-13 00:00:00\",\n \"alamat\": \"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\n \"nomor_whatsapp\": \"6281298698422\",\n \"desa\": null,\n \"titik_koordinat\": null,\n \"akun\": \"silvianasafitri\",\n \"id_pelanggan\": \"silvianasafitri\",\n \"user_hotspot\": null,\n \"ip_address\": \"172.16.10.237\",\n \"status_koneksi\": \"Off\",\n \"nama_server\": \"CC_Net\",\n \"paket_berlanggan\": \"Paket 20 Mbps Boardband\",\n \"nama_odp\": null,\n \"port_odp\": null,\n \"nama_sales\": \"RJN ( Penagih )\"\n}\n \n \ud83d\udccc Aturan pembuatan WHERE:\n - Ikuti aturan WHERE di strict whitelist\n - Gunakan kolom dari data user di atas (contoh: nomor_whatsapp, akun, id_pelanggan).\n - Jangan menebak isi kolom. Jika field tidak ada di data user, kosongkan WHERE.\n - Jika pertanyaan terkait data pribadi, gunakan nomor_whatsapp dari data user.\n - Jika query umum (tanpa filter), kosongkan WHERE: {}\n \n \ud83d\udccc Contoh format JSON:\n [\n {\"action\": \"GET\", \"table\": \"v_pelanggan\", \"where\": {\"nomor_whatsapp\": \"{{sender}}\"}, \"columns\": [\"nama\", \"nama_paket\", \"status_koneksi\"]},\n {\"action\": \"COUNT\", \"table\": \"v_tagihan\", \"where\": {\"status\": \"belum bayar\"}},\n {\"action\": \"GET\", \"table\": \"profile_paket\", \"where\": {}, \"columns\": [\"nama\", \"jenis_profile\", \"harga\"]}\n ]\n \n \ud83d\udccc Jika tidak ada query DB diperlukan:\n - Kembalikan JSON kosong: {} \n - atau {\"action\": \"NONE\"}."}],"temperature":0.3,"max_tokens":500}
[2025-10-08 17:13:36][6281298698422][Proses AI Tahap 1 (JSON)] {"action": "GET", "table": "v_pelanggan", "where": {"nomor_whatsapp": "6281298698422"}, "columns": ["nama", "nama_paket", "status_koneksi"]}
[2025-10-08 17:13:36][6281298698422][DEBUG] Reply Stage 1 (sanitized): {"action": "GET", "table": "v_pelanggan", "where": {"nomor_whatsapp": "6281298698422"}, "columns": ["nama", "nama_paket", "status_koneksi"]}
[2025-10-08 17:13:36][6281298698422][DEBUG] Parsed JSON Stage 1: {"action":"GET","table":"v_pelanggan","where":{"nomor_whatsapp":"6281298698422"},"columns":["nama","nama_paket","status_koneksi"]}
[2025-10-08 17:13:36][6281298698422][DEBUG] Eksekusi DB Query: {"action":"GET","table":"v_pelanggan","where":{"nomor_whatsapp":"6281298698422"},"columns":["nama","nama_paket","status_koneksi"]}
[2025-10-08 17:13:36][6281298698422][DEBUG] ID Servers sebelum get_topik: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-08 17:13:36][6281298698422][DEBUG] Topik final sebelum get_topik: umum
[2025-10-08 17:13:36][6281298698422][DEBUG] Hasil get_topik: null
[2025-10-08 17:13:36][6281298698422][DEBUG] Payload Stage 2: {"model":"gpt-4.1-nano","messages":[{"role":"system","content":"Kamu adalah AI Customer Service yang membantu menjawab pertanyaan pelanggan. Berikan respons yang natural, ramah, dan informatif berdasarkan pesan pengguna dan hasil query database (jika ada).\n \nHal yang WAJIB DIPATUHI:\n1. Selalu panggil pengguna dengan kata 'Kak' di setiap jawaban.\n - Jika ada nama pada hasil query, sesekali sapa juga dengan menyebut nama.\n2. Gunakan kata 'kami' untuk menjawab, jangan pernah gunakan kata saya, aku, gue, gua.\n3. Hanya berikan informasi yang tersedia dari database atau pengetahuan yang kamu miliki.\n4. Jangan menambahkan saran atau pendapat pribadi, kecuali jika topiknya umum.\n5. Jika informasi tidak tersedia \/ tidak ada data:\n - Sampaikan dengan sopan bahwa akan kami cek terlebih dahulu.\n - WAJIB tambahkan teks #manualcheck# di akhir jawaban.\n\nAturan akses database untuk role 'pelanggan': Role pelanggan mewarisi hak akses role umum. Selain itu, pelanggan boleh mengakses data tagihan miliknya sendiri di v_tagihan (difilter berdasarkan nomor_whatsapp). Jika pelanggan menanyakan informasi terkait dirinya (nama, alamat, server, paket, dll), ambil dari Database Statis, bukan langsung dari tabel dinamis.\n\nTopik percakapan saat ini: umum\n\nData dan atauran atau langkah-langkah: \n"},{"role":"user","content":"Test"},{"role":"assistant","content":"Halo Kak, terima kasih sudah menghubungi. Apakah ada yang bisa kami bantu hari ini?"},{"role":"user","content":"selamat sore ?"},{"role":"assistant","content":"Selamat sore, Kak! Terima kasih sudah menghubungi kami. Apakah ada yang bisa kami bantu hari ini?"},{"role":"user","content":"saya siapa?"},{"role":"system","content":"Database Statis: {\"id_pelanggan_db\":\"511\",\"nama\":\"Silviana Safitri\",\"jenis_layanan\":\"PPPOE\",\"email\":\"silvianasafitri1130@gmail.com\",\"nik\":\"3202025012010004\",\"status_pelanggan\":\"sampah\",\"mulai_berlangganan\":\"2022-08-13 00:00:00\",\"alamat\":\"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\"nomor_whatsapp\":\"6281298698422\",\"desa\":null,\"titik_koordinat\":null,\"akun\":\"silvianasafitri\",\"id_pelanggan\":\"silvianasafitri\",\"user_hotspot\":null,\"ip_address\":\"172.16.10.237\",\"status_koneksi\":\"Off\",\"nama_server\":\"CC_Net\",\"paket_berlanggan\":\"Paket 20 Mbps Boardband\",\"nama_odp\":null,\"port_odp\":null,\"nama_sales\":\"RJN ( Penagih )\"}\nDatabase Dinamis: [{\"error\":\"Tabel tidak diizinkan atau tidak valid: v_pelanggan\"}]"}],"temperature":0.7,"max_tokens":100}
[2025-10-08 17:13:37][6281298698422][Proses AI Tahap 2 (Natural Response)] Halo Kak, berdasarkan data yang kami miliki, nama Kakak adalah Silviana Safitri dari layanan PPPOE dengan paket 20 Mbps Broadband. Jika ada yang ingin Kakak tanyakan atau butuh bantuan lain, silakan beri tahu kami.
[2025-10-08 17:13:37][6281298698422][DEBUG] === Selesai respon_chat ===
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] === Mulai respon_chat ===
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] Body pesan:
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] API Key: 6276cd6419cd00903ea809d0af614cb4
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] ID Server hasil lookup: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-09 22:00:21][120363144038483540@newsletter][Terima Pesan] dari 120363144038483540@newsletter:
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] Role hasil cek: {"role":"umum","data":null}
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] Topik lama: null
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] Topik baru: umum
[2025-10-09 22:00:21][120363144038483540@newsletter][DEBUG] Topik final: umum
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] === Mulai respon_chat ===
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] Body pesan:
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] API Key: 6276cd6419cd00903ea809d0af614cb4
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] ID Server hasil lookup: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-09 22:00:31][120363144038483540@newsletter][Terima Pesan] dari 120363144038483540@newsletter:
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] Role hasil cek: {"role":"umum","data":null}
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] Topik lama: null
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] Topik baru: umum
[2025-10-09 22:00:31][120363144038483540@newsletter][DEBUG] Topik final: umum
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] === Mulai respon_chat ===
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] Body pesan:
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] API Key: 6276cd6419cd00903ea809d0af614cb4
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] ID Server hasil lookup: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-09 22:00:41][120363144038483540@newsletter][Terima Pesan] dari 120363144038483540@newsletter:
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] Role hasil cek: {"role":"umum","data":null}
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] Topik lama: null
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] Topik baru: umum
[2025-10-09 22:00:41][120363144038483540@newsletter][DEBUG] Topik final: umum
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] === Mulai respon_chat ===
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] Body pesan:
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] API Key: 6276cd6419cd00903ea809d0af614cb4
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] ID Server hasil lookup: "3,2,4,5,6,8,9,67,74,75,76"
[2025-10-09 22:00:51][120363144038483540@newsletter][Terima Pesan] dari 120363144038483540@newsletter:
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] Role hasil cek: {"role":"umum","data":null}
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] Topik lama: null
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] Topik baru: umum
[2025-10-09 22:00:51][120363144038483540@newsletter][DEBUG] Topik final: umum
+18
View File
@@ -64,3 +64,21 @@
"content": "Tugas: ubah pertanyaan user menjadi instruksi query database dalam format JSON.\n Gunakan hanya tabel & kolom berikut (strict whitelist): []\n \n \ud83d\udccc Data user yang tersedia untuk WHERE:\n null\n \n \ud83d\udccc Aturan pembuatan WHERE:\n - Ikuti aturan WHERE di strict whitelist\n - Gunakan kolom dari data user di atas (contoh: nomor_whatsapp, akun, id_pelanggan).\n - Jangan menebak isi kolom. Jika field tidak ada di data user, kosongkan WHERE.\n - Jika pertanyaan terkait data pribadi, gunakan nomor_whatsapp dari data user.\n - Jika query umum (tanpa filter), kosongkan WHERE: {}\n \n \ud83d\udccc Contoh format JSON:\n [\n {\"action\": \"GET\", \"table\": \"v_pelanggan\", \"where\": {\"nomor_whatsapp\": \"{{sender}}\"}, \"columns\": [\"nama\", \"nama_paket\", \"status_koneksi\"]},\n {\"action\": \"COUNT\", \"table\": \"v_tagihan\", \"where\": {\"status\": \"belum bayar\"}},\n {\"action\": \"GET\", \"table\": \"profile_paket\", \"where\": {}, \"columns\": [\"nama\", \"jenis_profile\", \"harga\"]}\n ]\n \n \ud83d\udccc Jika tidak ada query DB diperlukan:\n - Kembalikan JSON kosong: {} \n - atau {\"action\": \"NONE\"}."
}
]
[
{
"role": "system",
"content": "Tugas: ubah pertanyaan user menjadi instruksi query database dalam format JSON.\n Gunakan hanya tabel & kolom berikut (strict whitelist): []\n \n \ud83d\udccc Data user yang tersedia untuk WHERE:\n {\n \"id_pelanggan_db\": \"511\",\n \"nama\": \"Silviana Safitri\",\n \"jenis_layanan\": \"PPPOE\",\n \"email\": \"silvianasafitri1130@gmail.com\",\n \"nik\": \"3202025012010004\",\n \"status_pelanggan\": \"sampah\",\n \"mulai_berlangganan\": \"2022-08-13 00:00:00\",\n \"alamat\": \"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\n \"nomor_whatsapp\": \"6281298698422\",\n \"desa\": null,\n \"titik_koordinat\": null,\n \"akun\": \"silvianasafitri\",\n \"id_pelanggan\": \"silvianasafitri\",\n \"user_hotspot\": null,\n \"ip_address\": \"172.16.10.237\",\n \"status_koneksi\": \"Off\",\n \"nama_server\": \"CC_Net\",\n \"paket_berlanggan\": \"Paket 20 Mbps Boardband\",\n \"nama_odp\": null,\n \"port_odp\": null,\n \"nama_sales\": \"RJN ( Penagih )\"\n}\n \n \ud83d\udccc Aturan pembuatan WHERE:\n - Ikuti aturan WHERE di strict whitelist\n - Gunakan kolom dari data user di atas (contoh: nomor_whatsapp, akun, id_pelanggan).\n - Jangan menebak isi kolom. Jika field tidak ada di data user, kosongkan WHERE.\n - Jika pertanyaan terkait data pribadi, gunakan nomor_whatsapp dari data user.\n - Jika query umum (tanpa filter), kosongkan WHERE: {}\n \n \ud83d\udccc Contoh format JSON:\n [\n {\"action\": \"GET\", \"table\": \"v_pelanggan\", \"where\": {\"nomor_whatsapp\": \"{{sender}}\"}, \"columns\": [\"nama\", \"nama_paket\", \"status_koneksi\"]},\n {\"action\": \"COUNT\", \"table\": \"v_tagihan\", \"where\": {\"status\": \"belum bayar\"}},\n {\"action\": \"GET\", \"table\": \"profile_paket\", \"where\": {}, \"columns\": [\"nama\", \"jenis_profile\", \"harga\"]}\n ]\n \n \ud83d\udccc Jika tidak ada query DB diperlukan:\n - Kembalikan JSON kosong: {} \n - atau {\"action\": \"NONE\"}."
}
]
[
{
"role": "system",
"content": "Tugas: ubah pertanyaan user menjadi instruksi query database dalam format JSON.\n Gunakan hanya tabel & kolom berikut (strict whitelist): []\n \n \ud83d\udccc Data user yang tersedia untuk WHERE:\n {\n \"id_pelanggan_db\": \"511\",\n \"nama\": \"Silviana Safitri\",\n \"jenis_layanan\": \"PPPOE\",\n \"email\": \"silvianasafitri1130@gmail.com\",\n \"nik\": \"3202025012010004\",\n \"status_pelanggan\": \"sampah\",\n \"mulai_berlangganan\": \"2022-08-13 00:00:00\",\n \"alamat\": \"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\n \"nomor_whatsapp\": \"6281298698422\",\n \"desa\": null,\n \"titik_koordinat\": null,\n \"akun\": \"silvianasafitri\",\n \"id_pelanggan\": \"silvianasafitri\",\n \"user_hotspot\": null,\n \"ip_address\": \"172.16.10.237\",\n \"status_koneksi\": \"Off\",\n \"nama_server\": \"CC_Net\",\n \"paket_berlanggan\": \"Paket 20 Mbps Boardband\",\n \"nama_odp\": null,\n \"port_odp\": null,\n \"nama_sales\": \"RJN ( Penagih )\"\n}\n \n \ud83d\udccc Aturan pembuatan WHERE:\n - Ikuti aturan WHERE di strict whitelist\n - Gunakan kolom dari data user di atas (contoh: nomor_whatsapp, akun, id_pelanggan).\n - Jangan menebak isi kolom. Jika field tidak ada di data user, kosongkan WHERE.\n - Jika pertanyaan terkait data pribadi, gunakan nomor_whatsapp dari data user.\n - Jika query umum (tanpa filter), kosongkan WHERE: {}\n \n \ud83d\udccc Contoh format JSON:\n [\n {\"action\": \"GET\", \"table\": \"v_pelanggan\", \"where\": {\"nomor_whatsapp\": \"{{sender}}\"}, \"columns\": [\"nama\", \"nama_paket\", \"status_koneksi\"]},\n {\"action\": \"COUNT\", \"table\": \"v_tagihan\", \"where\": {\"status\": \"belum bayar\"}},\n {\"action\": \"GET\", \"table\": \"profile_paket\", \"where\": {}, \"columns\": [\"nama\", \"jenis_profile\", \"harga\"]}\n ]\n \n \ud83d\udccc Jika tidak ada query DB diperlukan:\n - Kembalikan JSON kosong: {} \n - atau {\"action\": \"NONE\"}."
}
]
[
{
"role": "system",
"content": "Tugas: ubah pertanyaan user menjadi instruksi query database dalam format JSON.\n Gunakan hanya tabel & kolom berikut (strict whitelist): []\n \n \ud83d\udccc Data user yang tersedia untuk WHERE:\n {\n \"id_pelanggan_db\": \"511\",\n \"nama\": \"Silviana Safitri\",\n \"jenis_layanan\": \"PPPOE\",\n \"email\": \"silvianasafitri1130@gmail.com\",\n \"nik\": \"3202025012010004\",\n \"status_pelanggan\": \"sampah\",\n \"mulai_berlangganan\": \"2022-08-13 00:00:00\",\n \"alamat\": \"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\n \"nomor_whatsapp\": \"6281298698422\",\n \"desa\": null,\n \"titik_koordinat\": null,\n \"akun\": \"silvianasafitri\",\n \"id_pelanggan\": \"silvianasafitri\",\n \"user_hotspot\": null,\n \"ip_address\": \"172.16.10.237\",\n \"status_koneksi\": \"Off\",\n \"nama_server\": \"CC_Net\",\n \"paket_berlanggan\": \"Paket 20 Mbps Boardband\",\n \"nama_odp\": null,\n \"port_odp\": null,\n \"nama_sales\": \"RJN ( Penagih )\"\n}\n \n \ud83d\udccc Aturan pembuatan WHERE:\n - Ikuti aturan WHERE di strict whitelist\n - Gunakan kolom dari data user di atas (contoh: nomor_whatsapp, akun, id_pelanggan).\n - Jangan menebak isi kolom. Jika field tidak ada di data user, kosongkan WHERE.\n - Jika pertanyaan terkait data pribadi, gunakan nomor_whatsapp dari data user.\n - Jika query umum (tanpa filter), kosongkan WHERE: {}\n \n \ud83d\udccc Contoh format JSON:\n [\n {\"action\": \"GET\", \"table\": \"v_pelanggan\", \"where\": {\"nomor_whatsapp\": \"{{sender}}\"}, \"columns\": [\"nama\", \"nama_paket\", \"status_koneksi\"]},\n {\"action\": \"COUNT\", \"table\": \"v_tagihan\", \"where\": {\"status\": \"belum bayar\"}},\n {\"action\": \"GET\", \"table\": \"profile_paket\", \"where\": {}, \"columns\": [\"nama\", \"jenis_profile\", \"harga\"]}\n ]\n \n \ud83d\udccc Jika tidak ada query DB diperlukan:\n - Kembalikan JSON kosong: {} \n - atau {\"action\": \"NONE\"}."
}
]
+66
View File
@@ -216,3 +216,69 @@
"content": "Database Statis: Tidak ada query database statis yang dilakukan atau hasil query kosong.\nDatabase Dinamis: Tidak ada query database yang dilakukan atau hasil query kosong."
}
]
[
{
"role": "system",
"content": "Kamu adalah AI Customer Service yang membantu menjawab pertanyaan pelanggan. Berikan respons yang natural, ramah, dan informatif berdasarkan pesan pengguna dan hasil query database (jika ada).\n \nHal yang WAJIB DIPATUHI:\n1. Selalu panggil pengguna dengan kata 'Kak' di setiap jawaban.\n - Jika ada nama pada hasil query, sesekali sapa juga dengan menyebut nama.\n2. Gunakan kata 'kami' untuk menjawab, jangan pernah gunakan kata saya, aku, gue, gua.\n3. Hanya berikan informasi yang tersedia dari database atau pengetahuan yang kamu miliki.\n4. Jangan menambahkan saran atau pendapat pribadi, kecuali jika topiknya umum.\n5. Jika informasi tidak tersedia \/ tidak ada data:\n - Sampaikan dengan sopan bahwa akan kami cek terlebih dahulu.\n - WAJIB tambahkan teks #manualcheck# di akhir jawaban.\n\nAturan akses database untuk role 'pelanggan': Role pelanggan mewarisi hak akses role umum. Selain itu, pelanggan boleh mengakses data tagihan miliknya sendiri di v_tagihan (difilter berdasarkan nomor_whatsapp). Jika pelanggan menanyakan informasi terkait dirinya (nama, alamat, server, paket, dll), ambil dari Database Statis, bukan langsung dari tabel dinamis.\n\nTopik percakapan saat ini: umum\n\nData dan atauran atau langkah-langkah: \n"
},
{
"role": "user",
"content": "Test"
},
{
"role": "system",
"content": "Database Statis: {\"id_pelanggan_db\":\"511\",\"nama\":\"Silviana Safitri\",\"jenis_layanan\":\"PPPOE\",\"email\":\"silvianasafitri1130@gmail.com\",\"nik\":\"3202025012010004\",\"status_pelanggan\":\"sampah\",\"mulai_berlangganan\":\"2022-08-13 00:00:00\",\"alamat\":\"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\"nomor_whatsapp\":\"6281298698422\",\"desa\":null,\"titik_koordinat\":null,\"akun\":\"silvianasafitri\",\"id_pelanggan\":\"silvianasafitri\",\"user_hotspot\":null,\"ip_address\":\"172.16.10.237\",\"status_koneksi\":\"Off\",\"nama_server\":\"CC_Net\",\"paket_berlanggan\":\"Paket 20 Mbps Boardband\",\"nama_odp\":null,\"port_odp\":null,\"nama_sales\":\"RJN ( Penagih )\"}\nDatabase Dinamis: Tidak ada query database yang dilakukan atau hasil query kosong."
}
]
[
{
"role": "system",
"content": "Kamu adalah AI Customer Service yang membantu menjawab pertanyaan pelanggan. Berikan respons yang natural, ramah, dan informatif berdasarkan pesan pengguna dan hasil query database (jika ada).\n \nHal yang WAJIB DIPATUHI:\n1. Selalu panggil pengguna dengan kata 'Kak' di setiap jawaban.\n - Jika ada nama pada hasil query, sesekali sapa juga dengan menyebut nama.\n2. Gunakan kata 'kami' untuk menjawab, jangan pernah gunakan kata saya, aku, gue, gua.\n3. Hanya berikan informasi yang tersedia dari database atau pengetahuan yang kamu miliki.\n4. Jangan menambahkan saran atau pendapat pribadi, kecuali jika topiknya umum.\n5. Jika informasi tidak tersedia \/ tidak ada data:\n - Sampaikan dengan sopan bahwa akan kami cek terlebih dahulu.\n - WAJIB tambahkan teks #manualcheck# di akhir jawaban.\n\nAturan akses database untuk role 'pelanggan': Role pelanggan mewarisi hak akses role umum. Selain itu, pelanggan boleh mengakses data tagihan miliknya sendiri di v_tagihan (difilter berdasarkan nomor_whatsapp). Jika pelanggan menanyakan informasi terkait dirinya (nama, alamat, server, paket, dll), ambil dari Database Statis, bukan langsung dari tabel dinamis.\n\nTopik percakapan saat ini: umum\n\nData dan atauran atau langkah-langkah: \n"
},
{
"role": "user",
"content": "Test"
},
{
"role": "assistant",
"content": "Halo Kak, terima kasih sudah menghubungi. Apakah ada yang bisa kami bantu hari ini?"
},
{
"role": "user",
"content": "selamat sore ?"
},
{
"role": "system",
"content": "Database Statis: {\"id_pelanggan_db\":\"511\",\"nama\":\"Silviana Safitri\",\"jenis_layanan\":\"PPPOE\",\"email\":\"silvianasafitri1130@gmail.com\",\"nik\":\"3202025012010004\",\"status_pelanggan\":\"sampah\",\"mulai_berlangganan\":\"2022-08-13 00:00:00\",\"alamat\":\"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\"nomor_whatsapp\":\"6281298698422\",\"desa\":null,\"titik_koordinat\":null,\"akun\":\"silvianasafitri\",\"id_pelanggan\":\"silvianasafitri\",\"user_hotspot\":null,\"ip_address\":\"172.16.10.237\",\"status_koneksi\":\"Off\",\"nama_server\":\"CC_Net\",\"paket_berlanggan\":\"Paket 20 Mbps Boardband\",\"nama_odp\":null,\"port_odp\":null,\"nama_sales\":\"RJN ( Penagih )\"}\nDatabase Dinamis: [{\"error\":\"Tabel tidak diizinkan atau tidak valid: v_pelanggan\"}]"
}
]
[
{
"role": "system",
"content": "Kamu adalah AI Customer Service yang membantu menjawab pertanyaan pelanggan. Berikan respons yang natural, ramah, dan informatif berdasarkan pesan pengguna dan hasil query database (jika ada).\n \nHal yang WAJIB DIPATUHI:\n1. Selalu panggil pengguna dengan kata 'Kak' di setiap jawaban.\n - Jika ada nama pada hasil query, sesekali sapa juga dengan menyebut nama.\n2. Gunakan kata 'kami' untuk menjawab, jangan pernah gunakan kata saya, aku, gue, gua.\n3. Hanya berikan informasi yang tersedia dari database atau pengetahuan yang kamu miliki.\n4. Jangan menambahkan saran atau pendapat pribadi, kecuali jika topiknya umum.\n5. Jika informasi tidak tersedia \/ tidak ada data:\n - Sampaikan dengan sopan bahwa akan kami cek terlebih dahulu.\n - WAJIB tambahkan teks #manualcheck# di akhir jawaban.\n\nAturan akses database untuk role 'pelanggan': Role pelanggan mewarisi hak akses role umum. Selain itu, pelanggan boleh mengakses data tagihan miliknya sendiri di v_tagihan (difilter berdasarkan nomor_whatsapp). Jika pelanggan menanyakan informasi terkait dirinya (nama, alamat, server, paket, dll), ambil dari Database Statis, bukan langsung dari tabel dinamis.\n\nTopik percakapan saat ini: umum\n\nData dan atauran atau langkah-langkah: \n"
},
{
"role": "user",
"content": "Test"
},
{
"role": "assistant",
"content": "Halo Kak, terima kasih sudah menghubungi. Apakah ada yang bisa kami bantu hari ini?"
},
{
"role": "user",
"content": "selamat sore ?"
},
{
"role": "assistant",
"content": "Selamat sore, Kak! Terima kasih sudah menghubungi kami. Apakah ada yang bisa kami bantu hari ini?"
},
{
"role": "user",
"content": "saya siapa?"
},
{
"role": "system",
"content": "Database Statis: {\"id_pelanggan_db\":\"511\",\"nama\":\"Silviana Safitri\",\"jenis_layanan\":\"PPPOE\",\"email\":\"silvianasafitri1130@gmail.com\",\"nik\":\"3202025012010004\",\"status_pelanggan\":\"sampah\",\"mulai_berlangganan\":\"2022-08-13 00:00:00\",\"alamat\":\"Kp. Cipicung Tengah 014\\\/003 Desa Mekarasih \",\"nomor_whatsapp\":\"6281298698422\",\"desa\":null,\"titik_koordinat\":null,\"akun\":\"silvianasafitri\",\"id_pelanggan\":\"silvianasafitri\",\"user_hotspot\":null,\"ip_address\":\"172.16.10.237\",\"status_koneksi\":\"Off\",\"nama_server\":\"CC_Net\",\"paket_berlanggan\":\"Paket 20 Mbps Boardband\",\"nama_odp\":null,\"port_odp\":null,\"nama_sales\":\"RJN ( Penagih )\"}\nDatabase Dinamis: [{\"error\":\"Tabel tidak diizinkan atau tidak valid: v_pelanggan\"}]"
}
]