Perbaiki .gitignore agar log dan file sensitif tidak ikut commit
This commit is contained in:
+8
-2
@@ -1,13 +1,19 @@
|
|||||||
invoice/*.png
|
invoice/*.png
|
||||||
invoice/inv_contoh/*.pdf
|
invoice/inv_contoh/*.pdf
|
||||||
invoice/thermal/*.pdf
|
invoice/thermal/*.pdf
|
||||||
img/user/
|
img/user/
|
||||||
|
img/pesan/
|
||||||
agen/profile/
|
agen/profile/
|
||||||
payment/paydisini/api_control.php
|
payment/paydisini/api_control.php
|
||||||
config/connect.php
|
config/connect.php
|
||||||
config/whatsapp_api.php
|
config/whatsapp_api.php
|
||||||
whapi_webhook/*.log
|
whapi_webhook/*.log
|
||||||
|
whapi_webhook/ai/*.log
|
||||||
payment/paydisini/callback/*.log
|
payment/paydisini/callback/*.log
|
||||||
.well-known/
|
.well-known/
|
||||||
berita_acara/*.pdf
|
berita_acara/*.pdf
|
||||||
load/logs/*.txt
|
load/logs/*.txt
|
||||||
|
load/cronjob/*.log
|
||||||
|
load/*.log
|
||||||
|
webhook_cloud_api/*.jsonl
|
||||||
|
load/*.txt
|
||||||
|
|||||||
Binary file not shown.
@@ -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);
|
||||||
@@ -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"]);
|
||||||
|
}
|
||||||
|
?>
|
||||||
@@ -1,117 +1,117 @@
|
|||||||
[21:00:01] [OK] 103.26.176.81
|
[16:00:01] [OK] 103.26.176.81
|
||||||
[21:00:01] [OK] 103.188.169.123
|
[16:00:01] [OK] 103.188.169.123
|
||||||
[21:00:01] [OK] 103.26.176.85
|
[16:00:01] [OK] 103.26.176.85
|
||||||
[21:00:01] [OK] 103.26.176.83
|
[16:00:01] [OK] 103.188.169.121
|
||||||
[21:00:01] [OK] 103.155.198.185
|
[16:00:01] [OK] 103.26.176.83
|
||||||
[21:00:01] [OK] tunnel.manjapro.net
|
[16:00:01] [OK] 103.155.198.185
|
||||||
[21:00:01] [OK] 103.188.169.121
|
[16:00:02] [OK] tunnel.manjapro.net
|
||||||
[21:00:01] [OK] tunnel.manjapro.net
|
[16:00:02] [OK] tunnel.manjapro.net
|
||||||
[21:00:01] [OK] tunnel.manjapro.net
|
[16:00:02] [OK] 103.188.169.127
|
||||||
[21:00:01] [OK] tunnel.manjapro.net
|
[16:00:02] [OK] tunnel.manjapro.net
|
||||||
[21:00:01] [OK] tunnel.manjapro.net
|
[16:00:02] [OK] tunnel.manjapro.net
|
||||||
[21:00:01] [OK] 103.18.78.86
|
[16:00:02] [OK] tunnel.manjapro.net
|
||||||
[21:00:01] [OK] 157.20.128.231
|
[16:00:02] [OK] 157.20.128.231
|
||||||
[21:00:01] [OK] 103.236.190.109
|
[16:00:02] [OK] tunnel.manjapro.net
|
||||||
[21:00:02] [OK] tunnel.manjapro.net
|
[16:00:02] [OK] tunnel.manjapro.net
|
||||||
[21:00:02] [OK] tunnel.manjapro.net
|
[16:00:02] [OK] 103.155.196.145
|
||||||
[21:00:02] [OK] tunnel.manjapro.net
|
[16:00:02] [OK] 103.26.176.93
|
||||||
[21:00:02] [OK] 103.155.196.145
|
[16:00:03] [OK] 103.242.104.69
|
||||||
[21:00:02] [OK] 103.26.176.87
|
[16:00:03] [OK] tunnel.manjapro.net
|
||||||
[21:00:02] [OK] 103.242.104.69
|
[16:00:03] [OK] 103.94.10.112
|
||||||
[21:00:02] [OK] 103.26.176.93
|
[16:00:03] [OK] tunnel.manjapro.net
|
||||||
[21:00:02] [OK] tunnel.manjapro.net
|
[16:00:03] [OK] 103.31.233.237
|
||||||
[21:00:02] [OK] 103.31.233.237
|
[16:00:03] [OK] tunnel.manjapro.net
|
||||||
[21:00:02] [OK] 103.18.79.171
|
[16:00:03] [OK] 103.18.79.171
|
||||||
[21:00:03] [OK] 103.94.10.112
|
[16:00:04] [OK] 103.26.176.87
|
||||||
[21:00:03] [OK] 103.155.199.191
|
[16:00:04] [OK] 103.155.199.191
|
||||||
[21:00:03] [OK] tunnel.manjapro.net
|
[16:00:04] [OK] tunnel.manjapro.net
|
||||||
[21:00:03] [OK] tunnel.manjapro.net
|
[16:00:04] [OK] tunnel.manjapro.net
|
||||||
[21:00:03] [OK] 103.242.106.56
|
[16:00:04] [OK] tunnel.manjapro.net
|
||||||
[21:00:03] [OK] tunnel.manjapro.net
|
[16:00:05] [OK] 103.236.190.109
|
||||||
[21:00:04] [OK] tunnel.manjapro.net
|
[16:00:05] [OK] 103.242.106.56
|
||||||
[21:00:05] [FAIL] 103.67.80.126
|
[16:00:05] [FAIL] 103.67.80.126
|
||||||
[21:00:06] [OK] 114.141.51.12
|
[16:00:06] [FAIL] tunnel.bilspro.com
|
||||||
[21:00:06] [FAIL] tunnel.bilspro.com
|
[16:00:06] [FAIL] tunnel.bilspro.com
|
||||||
[21:00:06] [FAIL] tunnel.bilspro.com
|
[16:00:07] [FAIL] 103.94.10.240
|
||||||
[21:00:06] [FAIL] 103.94.10.240
|
[16:00:07] [FAIL] 103.94.10.240
|
||||||
[21:00:06] [FAIL] 103.94.10.240
|
[16:00:08] [FAIL] 103.94.10.240
|
||||||
[21:00:06] [OK] 114.141.51.12
|
[16:00:08] [OK] tunnel.manjapro.net
|
||||||
[21:00:06] [OK] tunnel.manjapro.net
|
[16:00:08] [FAIL] tunnel.bilspro.com
|
||||||
[21:00:07] [FAIL] 103.94.10.240
|
[16:00:09] [FAIL] infinnet.cloud
|
||||||
[21:00:07] [OK] tunnel.manjapro.net
|
[16:00:09] [OK] tunnel.manjapro.net
|
||||||
[21:00:07] [FAIL] tunnel.bilspro.com
|
[16:00:09] [OK] tunnel.manjapro.net
|
||||||
[21:00:07] [OK] tunnel.manjapro.net
|
[16:00:09] [FAIL] 103.155.198.109
|
||||||
[21:00:07] [OK] tunnel.manjapro.net
|
[16:00:09] [OK] tunnel.manjapro.net
|
||||||
[21:00:07] [OK] tunnel.manjapro.net
|
[16:00:10] [OK] tunnel.manjapro.net
|
||||||
[21:00:08] [FAIL] infinnet.cloud
|
[16:00:10] [OK] tunnel.manjapro.net
|
||||||
[21:00:08] [OK] tunnel.manjapro.net
|
[16:00:10] [OK] tunnel.manjapro.net
|
||||||
[21:00:08] [OK] tunnel.manjapro.net
|
[16:00:10] [OK] tunnel.manjapro.net
|
||||||
[21:00:08] [OK] tunnel.manjapro.net
|
[16:00:10] [OK] tunnel.manjapro.net
|
||||||
[21:00:08] [OK] tunnel.manjapro.net
|
[16:00:11] [FAIL] infinnet.cloud
|
||||||
[21:00:10] [OK] tunnel.manjapro.net
|
[16:00:11] [FAIL] tunnel.bilspro.com
|
||||||
[21:00:10] [FAIL] infinnet.cloud
|
[16:00:11] [OK] tunnel.manjapro.net
|
||||||
[21:00:10] [FAIL] tunnel.bilspro.com
|
[16:00:14] [FAIL] tunnel.manjapro.net
|
||||||
[21:00:13] [FAIL] tunnel.manjapro.net
|
[16:00:15] [FAIL] 103.103.147.225
|
||||||
[21:00:14] [FAIL] 157.20.12
|
[16:00:15] [FAIL] 157.20.12
|
||||||
[21:00:14] [FAIL] 103.155.198.109
|
[16:00:15] [FAIL] 114.141.51.12
|
||||||
[21:00:15] [FAIL] 103.103.147.225
|
[16:00:17] [FAIL] 114.141.51.12
|
||||||
[2025-10-07 21:00:15] Semua child selesai. Mulai update DB...
|
[2025-10-18 16:00:17] Semua child selesai. Mulai update DB...
|
||||||
[21:00:15] [UPDATE DB] 03FK-Q7XE1
|
[16:00:17] [UPDATE DB] 03FK-Q7XE1
|
||||||
[21:00:15] [UPDATE DB] IDLF-SK944
|
[16:00:17] [UPDATE DB] IDLF-SK944
|
||||||
[21:00:15] [UPDATE DB] TYF0-3RP75
|
[16:00:17] [UPDATE DB] TYF0-3RP75
|
||||||
[21:00:15] [UPDATE DB] 0YDS-EI1V6
|
[16:00:18] [UPDATE DB] 0YDS-EI1V6
|
||||||
[21:00:15] [UPDATE DB] C7CU-PGT97
|
[16:00:18] [UPDATE DB] C7CU-PGT97
|
||||||
[21:00:15] [UPDATE STATUS] 7FZH-WIBI8 (Disconnected -> Disconnected)
|
[16:00:18] [UPDATE STATUS] 7FZH-WIBI8 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] YHVJ-ZN9V9
|
[16:00:19] [UPDATE DB] YHVJ-ZN9V9
|
||||||
[21:00:15] [UPDATE DB] C7CU-PGT910
|
[16:00:20] [UPDATE DB] C7CU-PGT910
|
||||||
[21:00:15] [UPDATE DB] MPK0-Q43P11
|
[16:00:20] [UPDATE DB] MPK0-Q43P11
|
||||||
[21:00:15] [UPDATE DB] S9QL-XRJ512
|
[16:00:20] [UPDATE DB] S9QL-XRJ512
|
||||||
[21:00:15] [UPDATE DB] HHJH-UFWL14
|
[16:00:21] [UPDATE DB] HHJH-UFWL14
|
||||||
[21:00:15] [UPDATE DB] 03FK-Q7XE15
|
[16:00:21] [UPDATE DB] 03FK-Q7XE15
|
||||||
[21:00:15] [UPDATE DB] DG7B-JP4218
|
[16:00:21] [UPDATE DB] DG7B-JP4218
|
||||||
[21:00:15] [UPDATE DB] XXWL-VMH419
|
[16:00:21] [UPDATE DB] XXWL-VMH419
|
||||||
[21:00:15] [UPDATE DB] 03FK-Q7XE20
|
[16:00:21] [UPDATE DB] 03FK-Q7XE20
|
||||||
[21:00:15] [UPDATE DB] C7CU-PGT922
|
[16:00:21] [UPDATE DB] C7CU-PGT922
|
||||||
[21:00:15] [UPDATE DB] 8FHL-TXVS23
|
[16:00:21] [UPDATE DB] 8FHL-TXVS23
|
||||||
[21:00:15] [UPDATE DB] Q23C-IE2524
|
[16:00:21] [UPDATE DB] Q23C-IE2524
|
||||||
[21:00:15] [UPDATE DB] Q4D5-ATUM25
|
[16:00:21] [UPDATE DB] Q4D5-ATUM25
|
||||||
[21:00:15] [UPDATE DB] HHJH-UFWL28
|
[16:00:21] [UPDATE DB] HHJH-UFWL28
|
||||||
[21:00:15] [UPDATE DB] 11P4-SII029
|
[16:00:21] [UPDATE DB] 11P4-SII029
|
||||||
[21:00:15] [UPDATE DB] CUAA-CD2K30
|
[16:00:21] [UPDATE DB] CUAA-CD2K30
|
||||||
[21:00:15] [UPDATE DB] S1Z8-TK6932
|
[16:00:21] [UPDATE DB] S1Z8-TK6932
|
||||||
[21:00:15] [UPDATE DB] H67G-R4AK33
|
[16:00:21] [UPDATE DB] H67G-R4AK33
|
||||||
[21:00:15] [UPDATE STATUS] 9RV7-3W5U34 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] 9RV7-3W5U34 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] 32PA-DAZ435
|
[16:00:21] [UPDATE DB] 32PA-DAZ435
|
||||||
[21:00:15] [UPDATE STATUS] LJQ6-KDDJ37 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] LJQ6-KDDJ37 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] 0TW0-J74U38
|
[16:00:21] [UPDATE DB] 0TW0-J74U38
|
||||||
[21:00:15] [UPDATE DB] L7TJ-IF2G39
|
[16:00:21] [UPDATE DB] L7TJ-IF2G39
|
||||||
[21:00:15] [UPDATE DB] RWDJ-NXBZ40
|
[16:00:21] [UPDATE DB] RWDJ-NXBZ40
|
||||||
[21:00:15] [UPDATE DB] A26W-ART341
|
[16:00:21] [UPDATE DB] A26W-ART341
|
||||||
[21:00:15] [UPDATE STATUS] RE5H-G12Y42 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] RE5H-G12Y42 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE STATUS] 03FK-Q7XE43 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] 03FK-Q7XE43 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE STATUS] Q96U-20UZ44 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] Q96U-20UZ44 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] D3TU-JN5745
|
[16:00:21] [UPDATE DB] D3TU-JN5745
|
||||||
[21:00:15] [UPDATE DB] 7SDF-17X546
|
[16:00:21] [UPDATE DB] 7SDF-17X546
|
||||||
[21:00:15] [UPDATE DB] HMAZ-3HSX51
|
[16:00:21] [UPDATE DB] HMAZ-3HSX51
|
||||||
[21:00:15] [UPDATE STATUS] PQJB-HG8V53 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] PQJB-HG8V53 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE STATUS] PMA9-QC7654 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] PMA9-QC7654 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE STATUS] 7ZCI-NFCI62 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] 7ZCI-NFCI62 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE STATUS] 0E73-PABK63 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] 0E73-PABK63 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] 4MZF-SFTR65
|
[16:00:21] [UPDATE STATUS] 4MZF-SFTR65 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] PJC8-K0EG66
|
[16:00:21] [UPDATE STATUS] PJC8-K0EG66 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE STATUS] 351D-5NCH67 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] 351D-5NCH67 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE STATUS] A0S7-K2IC69 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] A0S7-K2IC69 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] G9Z1-HRLY70
|
[16:00:21] [UPDATE DB] G9Z1-HRLY70
|
||||||
[21:00:15] [UPDATE STATUS] C7CU-PGT972 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] C7CU-PGT972 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] 66AU-Z7I573
|
[16:00:21] [UPDATE DB] 66AU-Z7I573
|
||||||
[21:00:15] [UPDATE DB] S9QL-XRJ575
|
[16:00:21] [UPDATE DB] S9QL-XRJ575
|
||||||
[21:00:15] [UPDATE DB] ABMS-YBP776
|
[16:00:21] [UPDATE DB] ABMS-YBP776
|
||||||
[21:00:15] [UPDATE DB] C7CU-PGT977
|
[16:00:21] [UPDATE DB] C7CU-PGT977
|
||||||
[21:00:15] [UPDATE DB] C7CU-PGT978
|
[16:00:21] [UPDATE DB] C7CU-PGT978
|
||||||
[21:00:15] [UPDATE DB] HHJH-UFWL81
|
[16:00:21] [UPDATE DB] HHJH-UFWL81
|
||||||
[21:00:15] [UPDATE DB] 83
|
[16:00:21] [UPDATE DB] 83
|
||||||
[21:00:15] [UPDATE STATUS] RNS6-DB3N84 (Disconnected -> Disconnected)
|
[16:00:21] [UPDATE STATUS] RNS6-DB3N84 (Disconnected -> Disconnected)
|
||||||
[21:00:15] [UPDATE DB] C7CU-PGT987
|
[16:00:21] [UPDATE DB] C7CU-PGT987
|
||||||
[21:00:15] [UPDATE DB] ZMVC-KAFH88
|
[16:00:21] [UPDATE DB] ZMVC-KAFH88
|
||||||
[2025-10-07 21:00:15] Update DB selesai. OK: 57, FAIL: 0
|
[2025-10-18 16:00:21] Update DB selesai. OK: 57, FAIL: 0
|
||||||
[2025-10-07 21:00:15] Lama eksekusi: 14.58 detik
|
[2025-10-18 16:00:21] Lama eksekusi: 19.82 detik
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
[2025-10-07 21:00:01] Tidak ada remote expired.
|
[2025-10-18 16:00:01] Tidak ada remote expired.
|
||||||
|
|||||||
@@ -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 @@
|
|||||||
2025-10-07 21:00:06 ✅ Summary updated, rows affected: 1629
|
2025-10-18 16:00:06 ✅ Summary updated, rows affected: 1627
|
||||||
|
|||||||
+15
-15
@@ -1,23 +1,23 @@
|
|||||||
SV_Cikembar_Utama Data pelanggan tidak ada
|
SV_Cikembar_Utama Data pelanggan tidak ada
|
||||||
2025-10-07 20:30:01SV_BojongKerta Data pelanggan tidak ada
|
2025-10-18 15:30:01SV_BojongKerta Data pelanggan tidak ada
|
||||||
2025-10-07 20:30:01RO Bima Net Data pelanggan tidak ada
|
2025-10-18 15:30:01RO Bima Net Data pelanggan tidak ada
|
||||||
2025-10-07 20:30:01SV_Kingnet_Cibadak Data pelanggan tidak ada
|
2025-10-18 15:30:01SV_Kingnet_Cibadak Data pelanggan tidak ada
|
||||||
2025-10-07 20:30:01SV_CC-Net_Cipicung Data pelanggan tidak ada
|
2025-10-18 15:30:01SV_CC-Net_Cipicung Data pelanggan tidak ada
|
||||||
2025-10-07 20:30:01SV_Nusaina_Cibadak Data pelanggan tidak ada
|
2025-10-18 15: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_Diamond Net Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
SV_22P Net Cibadak Data pelanggan tidak ada
|
SV_22P Net Cibadak Data pelanggan tidak ada
|
||||||
2025-10-07 20:30:01SV_Nettizen_Segaranten Data pelanggan tidak ada
|
2025-10-18 15:30:01SV_Nettizen_Segaranten Data pelanggan tidak ada
|
||||||
2025-10-07 20:00:01SV-DNY-Net-1 Data pelanggan tidak ada
|
2025-10-18 15: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: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_NTA_1 Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
SV-Cicukang 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-Bumdes-Mekarmanah Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
RO-Pak-Kholiq Data pelanggan tidak ada
|
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.
|
LJN.NS.CSR.NET Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
IVVINET-CBD Data pelanggan tidak ada
|
IVVINET-CBD Data pelanggan tidak ada
|
||||||
2025-10-07 20:30:01QONNET Data pelanggan tidak ada
|
2025-10-18 15: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:01Mikrotik_X86 Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
Mikrotik_BSW_1 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.
|
Mikrotik_Alea Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
STANG 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.
|
LJN_AGUNG Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
RNET-CMS 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
|
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.
|
brf Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
BMSNET 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.
|
purabaya Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
DCN-CO-GX4 Data pelanggan tidak ada
|
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.
|
RO - Netborhood Wifi Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
Neglasari 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
|
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.
|
RO_TTO Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
AP - NET 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.
|
GAS NET Status koneksi tidak aktif atau interval tidak tersedia.
|
||||||
|
|||||||
@@ -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: tunnel.manjapro.net SV_NTA_1
|
||||||
Successfully started background process for IP: 103.94.10.112 STANG
|
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: 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.198.185 SV_Cikembar_Utama
|
||||||
Successfully started background process for IP: 103.155.196.145 UNIX-NET
|
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
|
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 SV_NTA_2_PSW_2
|
||||||
Successfully started background process for IP: tunnel.manjapro.net Triunsa
|
Successfully started background process for IP: tunnel.manjapro.net Triunsa
|
||||||
Successfully started background process for IP: tunnel.manjapro.net SV_Diamond Net
|
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
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
// include "../manjapro-project/config/connect.php";
|
// include "../manjapro-project/config/connect.php";
|
||||||
include "../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 = $pdo->prepare("SELECT * FROM whatsapp_cloud_api GROUP BY id_data_server");
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
@@ -55,6 +56,12 @@ foreach ($whatsapp as $waKey) {
|
|||||||
echo "Gagal mengirim pesan Cloud API Official ID {$pesan['id']}, response: $response<br>";
|
echo "Gagal mengirim pesan Cloud API Official ID {$pesan['id']}, response: $response<br>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// kirim ke aplikasi 2
|
||||||
|
forwardToApp2([
|
||||||
|
"data" => $data,
|
||||||
|
"respon" => $response
|
||||||
|
]);
|
||||||
|
|
||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ Mikrotik_X86 =><br>
|
|||||||
Mikrotik_BSW_1 =><br>
|
Mikrotik_BSW_1 =><br>
|
||||||
Mikrotik_Alea =><br>
|
Mikrotik_Alea =><br>
|
||||||
STANG =><br>
|
STANG =><br>
|
||||||
UNIX-NET =><br>
|
|
||||||
SV_NTA_2_TBL =><br>
|
SV_NTA_2_TBL =><br>
|
||||||
MULYANAJAYA =><br>
|
MULYANAJAYA =><br>
|
||||||
PERWASIM-NETWORK =><br>
|
PERWASIM-NETWORK =><br>
|
||||||
@@ -46,6 +45,7 @@ RO - Netborhood Wifi =><br>
|
|||||||
Neglasari =><br>
|
Neglasari =><br>
|
||||||
SV-DNY-Net-2 =><br>
|
SV-DNY-Net-2 =><br>
|
||||||
DNY-Neglasari =><br>
|
DNY-Neglasari =><br>
|
||||||
|
RO_TTO =><br>
|
||||||
AP - NET =><br>
|
AP - NET =><br>
|
||||||
GAS NET =><br>
|
GAS NET =><br>
|
||||||
SV_NTA_2_PSW_2 =><br>
|
SV_NTA_2_PSW_2 =><br>
|
||||||
|
|||||||
@@ -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>
|
||||||
+502
-78
@@ -1,5 +1,12 @@
|
|||||||
<!-- Main content -->
|
<style>
|
||||||
<section class="content">
|
/* Sembunyikan semua dulu saat pertama kali load */
|
||||||
|
.official-section,
|
||||||
|
.unofficial-section {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<!-- Main content -->
|
||||||
|
<section class="content" style="zoom: 90%;">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
@@ -16,56 +23,66 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<form method="post" enctype="multipart/form-data">
|
<div class="card-body">
|
||||||
<div class="form-group">
|
<form method="post" enctype="multipart/form-data">
|
||||||
<label>Data Server</label>
|
<div class="form-group">
|
||||||
<div class="select2-primary">
|
<label>Tipe WhatsApp Gateway</label>
|
||||||
<select class="select2" name="ids[]" multiple="multiple" data-placeholder="Select a State" data-dropdown-css-class="select2-primary" style="width: 100%;" required>
|
<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">
|
||||||
|
<select class="select2" name="ids[]" multiple="multiple" data-placeholder="Select a State" data-dropdown-css-class="select2-primary" style="width: 100%;" required>
|
||||||
|
<?php
|
||||||
|
$List = new Listdata();
|
||||||
|
$List->set_list("data_server",$SqlDataWH);
|
||||||
|
foreach ($List->get_list() as $key => $value): ?>
|
||||||
|
<option value="<?php echo $value['id']; ?>"><?php echo $value['nama_server']; ?></option>
|
||||||
|
<?php endforeach ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Status Pelanggan</label>
|
||||||
|
<select id="sp" class="form-control" name="sp">
|
||||||
|
<option value="">All</option>
|
||||||
|
<option value="aktif">Aktif</option>
|
||||||
|
<option value="tidak aktif" >Tidak Aktif</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Status Koneksi</label>
|
||||||
|
<select id="sk" class="form-control" name="sk">
|
||||||
|
<option value="">All</option>
|
||||||
|
<option value="On">Connected</option>
|
||||||
|
<option value="Off" >Disconnected</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Topologi ODP / ODC</label>
|
||||||
|
<select class="form-control select2bs4" name="mt">
|
||||||
|
<option value="">All</option>
|
||||||
<?php
|
<?php
|
||||||
$List = new Listdata();
|
$List = new Listdata();
|
||||||
$List->set_list("data_server",$SqlDataWH);
|
$List->set_list("master_topologi", $SqlDataWHId);
|
||||||
foreach ($List->get_list() as $key => $value): ?>
|
foreach ($List->get_list() as $key => $value): ?>
|
||||||
<option value="<?php echo $value['id']; ?>"><?php echo $value['nama_server']; ?></option>
|
<option value="<?php echo $value['id']; ?>" ><?php echo $value['nama']; ?></option>
|
||||||
<?php endforeach ?>
|
<?php endforeach ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label>Status Pelanggan</label>
|
|
||||||
<select id="sp" class="form-control" name="sp">
|
|
||||||
<option value="">All</option>
|
|
||||||
<option value="aktif">Aktif</option>
|
|
||||||
<option value="tidak aktif" >Tidak Aktif</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Status Koneksi</label>
|
|
||||||
<select id="sk" class="form-control" name="sk">
|
|
||||||
<option value="">All</option>
|
|
||||||
<option value="On">Connected</option>
|
|
||||||
<option value="Off" >Disconnected</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Topologi ODP / ODC</label>
|
|
||||||
<select class="form-control select2bs4" name="mt">
|
|
||||||
<option value="">All</option>
|
|
||||||
<?php
|
|
||||||
$List = new Listdata();
|
|
||||||
$List->set_list("master_topologi", $SqlDataWHId);
|
|
||||||
foreach ($List->get_list() as $key => $value): ?>
|
|
||||||
<option value="<?php echo $value['id']; ?>" ><?php echo $value['nama']; ?></option>
|
|
||||||
<?php endforeach ?>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
|
||||||
|
<div class="col-md-4 unofficial-section">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Isi Pesan Siaran</label>
|
<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>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4 unofficial-section">
|
||||||
<center>
|
<center>
|
||||||
<label>Foto</label>
|
<label>Foto</label>
|
||||||
<div class="uploadImage" data-id="siaran<?php echo $SvId; ?>">
|
<div class="uploadImage" data-id="siaran<?php echo $SvId; ?>">
|
||||||
@@ -77,6 +94,45 @@
|
|||||||
</div>
|
</div>
|
||||||
</center>
|
</center>
|
||||||
</div>
|
</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>
|
</div>
|
||||||
<div class="card-footer">
|
<div class="card-footer">
|
||||||
@@ -90,12 +146,20 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
if (isset($_POST['kirim'])) {
|
if (isset($_POST['kirim'])) {
|
||||||
$idsv = implode(", ", $_POST['ids']);
|
$type = $_POST['gateway_type'] ?? null;
|
||||||
$sp = $_POST['sp'];
|
$ids = $_POST['ids'] ?? [];
|
||||||
$sk = $_POST['sk'];
|
|
||||||
$mt = $_POST['mt'];
|
// 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" : "";
|
$sp1 = !empty($sp) ? " AND status = :sp" : "";
|
||||||
$sk1 = !empty($sk) ? " AND status_koneksi = :sk" : "";
|
$sk1 = !empty($sk) ? " AND status_koneksi = :sk" : "";
|
||||||
@@ -106,42 +170,78 @@ if (isset($_POST['kirim'])) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
$stmt = $pdo->prepare("SELECT nomor_whatsapp, id_data_server FROM pelanggan $SQL");
|
$stmt = $pdo->prepare("SELECT nomor_whatsapp, id_data_server FROM pelanggan $SQL");
|
||||||
|
|
||||||
if (!empty($sp)) $stmt->bindParam(':sp', $sp);
|
if (!empty($sp)) $stmt->bindParam(':sp', $sp);
|
||||||
if (!empty($sk)) $stmt->bindParam(':sk', $sk);
|
if (!empty($sk)) $stmt->bindParam(':sk', $sk);
|
||||||
if (!empty($mt)) $stmt->bindParam(':mt', $mt);
|
if (!empty($mt)) $stmt->bindParam(':mt', $mt);
|
||||||
|
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
|
|
||||||
|
$countInserted = 0;
|
||||||
while ($pecah = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
while ($pecah = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||||
$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])) {
|
// ====== GATEWAY OFFICIAL ======
|
||||||
$id = $pecah['id_data_server'];
|
if (!empty($type) && $type == "official") {
|
||||||
$jenis = "sendMediaFromUrl";
|
|
||||||
$nomor = $pecah['nomor_whatsapp'];
|
|
||||||
$message = $_POST['pesan'];
|
|
||||||
$file_url = $target_dir . $_SESSION['uploaded_files']['siaran'.$SvId];
|
|
||||||
$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')";
|
|
||||||
} else {
|
|
||||||
$id = $pecah['id_data_server'];
|
$id = $pecah['id_data_server'];
|
||||||
$jenis = "sendMessage";
|
$jenis = "sendMessage";
|
||||||
$nomor = $pecah['nomor_whatsapp'];
|
$nomor = $pecah['nomor_whatsapp'];
|
||||||
$message = $_POST['pesan'];
|
|
||||||
$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, status)
|
// Replace placeholder #no_whatsapp dengan angka murni dari nomor
|
||||||
VALUES (:id, :jenis, :apiurl, :apikey, :nomor, :pesan, 'PENDING')";
|
$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 (!$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'][$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, gateway_type)
|
||||||
|
VALUES
|
||||||
|
(:id, :jenis, :apiurl, :apikey, :nomor, :pesan, :url_file, 'PENDING', 'unofficial')";
|
||||||
|
} else {
|
||||||
|
$id = $pecah['id_data_server'];
|
||||||
|
$jenis = "sendMessage";
|
||||||
|
$nomor = $pecah['nomor_whatsapp'];
|
||||||
|
$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, gateway_type)
|
||||||
|
VALUES
|
||||||
|
(:id, :jenis, :apiurl, :apikey, :nomor, :pesan, 'PENDING', 'unofficial')";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// === Insert ke tabel master_pesan ===
|
||||||
$stmtInsert = $pdo->prepare($sqlIn);
|
$stmtInsert = $pdo->prepare($sqlIn);
|
||||||
$stmtInsert->bindParam(':id', $id);
|
$stmtInsert->bindParam(':id', $id);
|
||||||
$stmtInsert->bindParam(':jenis', $jenis);
|
$stmtInsert->bindParam(':jenis', $jenis);
|
||||||
@@ -149,23 +249,347 @@ if (isset($_POST['kirim'])) {
|
|||||||
$stmtInsert->bindParam(':apikey', $apikey);
|
$stmtInsert->bindParam(':apikey', $apikey);
|
||||||
$stmtInsert->bindParam(':nomor', $nomor);
|
$stmtInsert->bindParam(':nomor', $nomor);
|
||||||
$stmtInsert->bindParam(':pesan', $message);
|
$stmtInsert->bindParam(':pesan', $message);
|
||||||
|
|
||||||
if (isset($file_url)) {
|
if (strpos($sqlIn, ':url_file') !== false) {
|
||||||
$stmtInsert->bindParam(':url_file', $file_url);
|
$stmtInsert->bindParam(':url_file', $file_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
$stmtInsert->execute();
|
$stmtInsert->execute();
|
||||||
|
$countInserted++;
|
||||||
}
|
}
|
||||||
sweetAlert("Pesan Akan Segera di Kirim", "success");
|
|
||||||
unset($_SESSION['uploaded_files']['siaran'.$SvId]);
|
// 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) {
|
} catch (PDOException $e) {
|
||||||
// Handle exception, e.g., log the error
|
sweetAlert("Error Database: " . $e->getMessage(), "error");
|
||||||
sweetAlert("Error: " . $e->getMessage(), "success");
|
} catch (Exception $e) {
|
||||||
// echo "Error: " . $e->getMessage();
|
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,4 +1,4 @@
|
|||||||
<?php if($SvId == 2 ) { ?>
|
<?php if($SvId == 2 || $_SESSION['user'] == 1 ) { ?>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$stmt3 = $pdo->prepare("SELECT * FROM master_template_pesan WHERE id = :id");
|
$stmt3 = $pdo->prepare("SELECT * FROM master_template_pesan WHERE id = :id");
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
<th>Keterangan</th>
|
<th>Keterangan</th>
|
||||||
<th>Paket Berlanggan</th>
|
<th>Paket Berlanggan</th>
|
||||||
<th>Jumlah Tagihan</th>
|
<th>Jumlah Tagihan</th>
|
||||||
|
<th>Limit Pembayaran</th>
|
||||||
<?php echo ($statuspaygw == "ACTIVE") ? '<th>Payment Link</th>' : ''; ?>
|
<?php echo ($statuspaygw == "ACTIVE") ? '<th>Payment Link</th>' : ''; ?>
|
||||||
<th>Nama Server</th>
|
<th>Nama Server</th>
|
||||||
<th>Action</th>
|
<th>Action</th>
|
||||||
@@ -59,6 +60,7 @@
|
|||||||
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
|
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
|
||||||
<td><?php echo $row['nama_paket']; ?></td>
|
<td><?php echo $row['nama_paket']; ?></td>
|
||||||
<td>Rp. <?php echo number_format($row['verifikasi_tagihan']); ?></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>' : ''; ?>
|
<?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: 200px"><?php echo $row['nama_server']; ?></td>
|
||||||
<td style="max-width: 30px">
|
<td style="max-width: 30px">
|
||||||
|
|||||||
@@ -79,6 +79,11 @@ $paygw = $stmt->fetch(PDO::FETCH_ASSOC);
|
|||||||
<td class="p-1">:</td>
|
<td class="p-1">:</td>
|
||||||
<td class="p-1"><?php echo $data[0]['keterangan']; ?></td>
|
<td class="p-1"><?php echo $data[0]['keterangan']; ?></td>
|
||||||
</tr>
|
</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>
|
<tr>
|
||||||
<td class="p-1">Paket Berlangganan</td>
|
<td class="p-1">Paket Berlangganan</td>
|
||||||
<td class="p-1">:</td>
|
<td class="p-1">:</td>
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
<th>Keterangan</th>
|
<th>Keterangan</th>
|
||||||
<th>Paket Berlanggan</th>
|
<th>Paket Berlanggan</th>
|
||||||
<th>Jumlah Tagihan</th>
|
<th>Jumlah Tagihan</th>
|
||||||
|
<th>Limit Pembayaran</th>
|
||||||
<?php echo ($statuspaygw == "ACTIVE") ? '<th>Payment Link</th>' : ''; ?>
|
<?php echo ($statuspaygw == "ACTIVE") ? '<th>Payment Link</th>' : ''; ?>
|
||||||
<th>Nama Server</th>
|
<th>Nama Server</th>
|
||||||
<th>Action</th>
|
<th>Action</th>
|
||||||
@@ -54,6 +55,7 @@
|
|||||||
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
|
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
|
||||||
<td><?php echo $row['nama_paket']; ?></td>
|
<td><?php echo $row['nama_paket']; ?></td>
|
||||||
<td>Rp. <?php echo number_format($row['verifikasi_tagihan']); ?></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>' : ''; ?>
|
<?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: 200px"><?php echo $row['nama_server']; ?></td>
|
||||||
<td>
|
<td>
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
<th>Keterangan</th>
|
<th>Keterangan</th>
|
||||||
<th>Paket Berlanggan</th>
|
<th>Paket Berlanggan</th>
|
||||||
<th>Jumlah Tagihan</th>
|
<th>Jumlah Tagihan</th>
|
||||||
|
<th>Limit Pembayaran</th>
|
||||||
<th>Nama Server</th>
|
<th>Nama Server</th>
|
||||||
<th>Action</th>
|
<th>Action</th>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -54,6 +55,7 @@
|
|||||||
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
|
<td style="max-width: 200px"><?php echo $row['keterangan']; ?></td>
|
||||||
<td><?php echo $row['nama_paket']; ?></td>
|
<td><?php echo $row['nama_paket']; ?></td>
|
||||||
<td>Rp. <?php echo number_format($row['verifikasi_tagihan']); ?></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 style="max-width: 200px"><?php echo $row['nama_server']; ?></td>
|
||||||
<td>
|
<td>
|
||||||
<?php if(in_array("Bayar", $json_array[4]['sub_menu'])){ ?>
|
<?php if(in_array("Bayar", $json_array[4]['sub_menu'])){ ?>
|
||||||
|
|||||||
+88119
File diff suppressed because it is too large
Load Diff
+88
-25
@@ -1,8 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
include __DIR__ . "/../config/connect.php";
|
include __DIR__ . "/../config/connect.php";
|
||||||
|
include __DIR__ . "/send_to_app2.php";
|
||||||
|
|
||||||
// --- CONFIG LOGGING ---
|
// --- CONFIG LOGGING ---
|
||||||
$enableLogging = true;
|
$enableLogging = false;
|
||||||
$logFile = __DIR__ . '/webhook_log.jsonl';
|
$logFile = __DIR__ . '/webhook_log.jsonl';
|
||||||
|
|
||||||
function writeLog($data) {
|
function writeLog($data) {
|
||||||
@@ -81,31 +82,65 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
|
|
||||||
$text = ($type === 'text') ? $message['text']['body'] ?? '' : '[Pesan non-teks: ' . $type . ']';
|
$text = ($type === 'text') ? $message['text']['body'] ?? '' : '[Pesan non-teks: ' . $type . ']';
|
||||||
writeLog(["event" => "INCOMING_MESSAGE", "from" => $from, "type" => $type, "text" => $text]);
|
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",
|
||||||
|
"to" => $from,
|
||||||
|
"type" => "template",
|
||||||
|
"template" => [
|
||||||
|
"name" => "customer_service_contact",
|
||||||
|
"language" => ["code" => "id"],
|
||||||
|
"components" => []
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$url = "https://graph.facebook.com/v17.0/$phone_number_id/messages";
|
||||||
|
$ch = curl_init($url);
|
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||||
|
"Authorization: Bearer $access_token",
|
||||||
|
"Content-Type: application/json"
|
||||||
|
]);
|
||||||
|
curl_setopt($ch, CURLOPT_POST, true);
|
||||||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reply));
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
$response = curl_exec($ch);
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
|
||||||
// --- Kirim balasan template ---
|
|
||||||
$reply = [
|
|
||||||
"messaging_product" => "whatsapp",
|
|
||||||
"to" => $from,
|
|
||||||
"type" => "template",
|
|
||||||
"template" => [
|
|
||||||
"name" => "customer_service_contact",
|
|
||||||
"language" => ["code" => "id"],
|
|
||||||
"components" => []
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
$url = "https://graph.facebook.com/v17.0/$phone_number_id/messages";
|
|
||||||
$ch = curl_init($url);
|
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
||||||
"Authorization: Bearer $access_token",
|
|
||||||
"Content-Type: application/json"
|
|
||||||
]);
|
|
||||||
curl_setopt($ch, CURLOPT_POST, true);
|
|
||||||
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);
|
|
||||||
|
|
||||||
writeLog(["event"=>"REPLY_SENT","to"=>$from,"http_code"=>$http_code]);
|
writeLog(["event"=>"REPLY_SENT","to"=>$from,"http_code"=>$http_code]);
|
||||||
}
|
}
|
||||||
@@ -144,6 +179,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);
|
http_response_code(200);
|
||||||
echo "EVENT_RECEIVED";
|
echo "EVENT_RECEIVED";
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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}}
|
|
||||||
@@ -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: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: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-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
|
||||||
|
|||||||
@@ -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: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][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-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
|
||||||
|
|||||||
@@ -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\"}."
|
"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\"}."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|||||||
@@ -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."
|
"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\"}]"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user