diff --git a/.gitignore b/.gitignore index e6f0876..d368dc7 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ whapi_webhook/*.log payment/paydisini/callback/*.log .well-known/ berita_acara/*.pdf +load/logs/*.txt diff --git a/config/cronjob_tagihan.log b/config/cronjob_tagihan.log index 00cbbde..c89d201 100644 --- a/config/cronjob_tagihan.log +++ b/config/cronjob_tagihan.log @@ -1 +1 @@ -NO ACTION => 2 <-> cc.net Limit_Tgl_5
NO ACTION => 3 <-> nsn utama Limit_Tgl_10
NO ACTION => 3 <-> ciangsana Limit_Tgl_15
NO ACTION => 4 <-> fast.net Limit_Tgl_12
NO ACTION => 5 <-> bima net Limit Tagihan Tgl 15
NO ACTION => 6 <-> kingnet Limit Tgl 15
NO ACTION => 8 <-> diamond.net Limit_Tgl_15
NO ACTION => 9 <-> 22 p.net Limit_Tgl_15
NO ACTION => 10 <-> nettizen Tagihan Limit tgl 15
NO ACTION => 12 <-> Tagihan_Limit_Tgl5
NO ACTION => 15 <-> Tag_NTA2 Limit Tgl 5
NO ACTION => 16 <-> Tagihan Limit Tgl 5
BUAT TAGIHAN => 13 <-> Limit Tanggal 26 (Infinnet) Start : 2025-07-04 - Last : 2025-07-09
REMAND => 18 <-> BUM-Limit-Tgl-5
NO ACTION => 14 <-> Kh_Limit Tanggal 25
KIRIM TAGIHAN => 17 <-> Tagihan Limit Tgl 10
NO ACTION => 17 <-> Tagihan Limit Tgl 15
NO ACTION => 20 <-> IVVI-10
NO ACTION => 20 <-> IVVI-20
NO ACTION => 20 <-> IVVI-30
BUAT TAGIHAN => 21 <-> QONNET Start : 2025-07-02 - Last : 2025-07-05
NO ACTION => 21 <-> QONNET2
NO ACTION => 25 <-> Tagihan Limit Tgl 5
REMAND => 23 <-> Limit Tanggal 5
NO ACTION => 26 <-> Limit Tanggal 10
NO ACTION => 24 <-> Tagihan30
BUAT TAGIHAN => 23 <-> limit tanggal 19 Start : 2025-06-27 - Last : 2025-07-14
KIRIM TAGIHAN => 31 <-> 23-ISOLIR
NO ACTION => 33 <-> usolir-10
NO ACTION => 37 <-> paket 140 ribu
REMAND => 28 <-> PAKET-100K
REMAND => 28 <-> PAKET-150K
REMAND => 28 <-> PAKET-200K
REMAND => 28 <-> PAKET-300K
KIRIM TAGIHAN => 42 <-> meldina-20
BUAT TAGIHAN => 41 <-> lippy-20 Start : 2025-07-04 - Last : 2025-07-09
BUAT TAGIHAN => 43 <-> Tagihan_Limit_tgl_13 Start : 2025-07-01 - Last : 2025-07-06
REMAND => 46 <-> Limit_Tgl_5
NO ACTION => 35 <-> PAKET 1 DEVICE
NO ACTION => 35 <-> PAKET 2 DEVICE
NO ACTION => 35 <-> PAKET 3 DEVICE
NO ACTION => 35 <-> PAKET 4 DEVICE
NO ACTION => 35 <-> PAKET 5 DEVICE [1/80]
NO ACTION => 35 <-> PAKET 5 DEVICE [1/70]
NO ACTION => 35 <-> PAKET 6 DEVICE [1/80]
NO ACTION => 35 <-> PAKET 6 DEVICE [1/70]
NO ACTION => 35 <-> PAKET 7 DEVICE
NO ACTION => 35 <-> PAKET 8 DEVICE
BUAT TAGIHAN => 44 <-> Isolir_20 Start : 2025-07-04 - Last : 2025-07-07
BUAT TAGIHAN => 53 <-> PAKET BRONZE Start : 2025-07-01 - Last : 2025-07-06
KIRIM TAGIHAN => 54 <-> Muhamad rouf
BUAT TAGIHAN => 53 <-> PAKET PLATINUM 5MBs Start : 2025-07-01 - Last : 2025-07-06
BUAT TAGIHAN => 53 <-> PAKET GLOD 7 MBs Start : 2025-07-01 - Last : 2025-07-06
BUAT TAGIHAN => 53 <-> PAKET GLOD+ 10 MBs Start : 2025-07-01 - Last : 2025-07-06
NO ACTION => 59 <-> Isolir_21
BUAT TAGIHAN => 46 <-> Limit tgl 30 Start : 2025-06-29 - Last : 2025-07-24
NO ACTION => 61 <-> Isolir_20
BUAT TAGIHAN => 55 <-> Dcn_CO_Isolir Start : 2025-06-28 - Last : 2025-07-24
REMAND => 62 <-> limit tanggal 5
NO ACTION => 21 <-> VIP-BAGUS
REMAND => 55 <-> Dcn_GB_Isolir
BUAT TAGIHAN => 49 <-> TAGIHAN TANGGAL 20 Start : 2025-06-29 - Last : 2025-07-18
NO ACTION => 19 <-> TAGIHAN-TGL1
NO ACTION => 49 <-> TAGIHAN TANGGAL 1
NO ACTION => 66 <-> Tagihan Isolir Tgl 1
NO ACTION => 67 <-> Tag Netborhood Limit Tgl 10
REMAND => 73 <-> Tagihan01-05
\ No newline at end of file +NO ACTION => 2 <-> cc.net Limit_Tgl_5
NO ACTION => 3 <-> nsn utama Limit_Tgl_10
NO ACTION => 3 <-> ciangsana Limit_Tgl_15
NO ACTION => 4 <-> fast.net Limit_Tgl_12
NO ACTION => 5 <-> bima net Limit Tagihan Tgl 15
NO ACTION => 6 <-> kingnet Limit Tgl 15
NO ACTION => 8 <-> diamond.net Limit_Tgl_15
NO ACTION => 9 <-> 22 p.net Limit_Tgl_15
NO ACTION => 10 <-> nettizen Tagihan Limit tgl 15
NO ACTION => 12 <-> Tagihan_Limit_Tgl5
NO ACTION => 15 <-> Tag_NTA2 Limit Tgl 10
NO ACTION => 16 <-> Tagihan Limit Tgl 5
NO ACTION => 13 <-> Limit Tanggal 26 (Infinnet)
NO ACTION => 18 <-> BUM-Limit-Tgl-5
BUAT TAGIHAN => 14 <-> Kh_Limit Tanggal 25 Start : 2025-07-13 - Last : 2025-07-18
NO ACTION => 17 <-> Tagihan Limit Tgl 10
NO ACTION => 17 <-> Tagihan Limit Tgl 15
NO ACTION => 20 <-> IVVI-10
NO ACTION => 20 <-> IVVI-20
NO ACTION => 20 <-> IVVI-30
NO ACTION => 21 <-> QONNET
NO ACTION => 21 <-> QONNET2
NO ACTION => 25 <-> Tagihan Limit Tgl 5
NO ACTION => 23 <-> Limit Tanggal 5
NO ACTION => 26 <-> Limit Tanggal 10
NO ACTION => 24 <-> Tagihan30
NO ACTION => 23 <-> limit tanggal 19
NO ACTION => 31 <-> 23-ISOLIR
NO ACTION => 33 <-> usolir-10
NO ACTION => 37 <-> paket 140 ribu
NO ACTION => 28 <-> PAKET-100K
NO ACTION => 28 <-> PAKET-150K
NO ACTION => 28 <-> PAKET-200K
NO ACTION => 28 <-> PAKET-300K
NO ACTION => 42 <-> meldina-20
NO ACTION => 41 <-> lippy-20
NO ACTION => 43 <-> Tagihan_Limit_tgl_13
NO ACTION => 46 <-> Limit_Tgl_5
NO ACTION => 35 <-> PAKET 1 DEVICE
NO ACTION => 35 <-> PAKET 2 DEVICE
NO ACTION => 35 <-> PAKET 3 DEVICE
NO ACTION => 35 <-> PAKET 4 DEVICE
NO ACTION => 35 <-> PAKET 5 DEVICE [1/80]
NO ACTION => 35 <-> PAKET 5 DEVICE [1/70]
NO ACTION => 35 <-> PAKET 6 DEVICE [1/80]
NO ACTION => 35 <-> PAKET 6 DEVICE [1/70]
NO ACTION => 35 <-> PAKET 7 DEVICE
NO ACTION => 35 <-> PAKET 8 DEVICE
NO ACTION => 44 <-> Isolir_20
NO ACTION => 53 <-> PAKET BRONZE
NO ACTION => 54 <-> Muhamad rouf
NO ACTION => 53 <-> PAKET PLATINUM 5MBs
NO ACTION => 53 <-> PAKET GLOD 7 MBs
NO ACTION => 53 <-> PAKET GLOD+ 10 MBs
NO ACTION => 59 <-> Isolir_21
NO ACTION => 46 <-> Limit tgl 30
NO ACTION => 61 <-> Isolir_20
NO ACTION => 55 <-> Dcn_CO_Isolir
NO ACTION => 62 <-> limit tanggal 5
NO ACTION => 55 <-> Dcn_GB_Isolir
NO ACTION => 49 <-> TAGIHAN TANGGAL 20
NO ACTION => 19 <-> TAGIHAN-TGL1
NO ACTION => 49 <-> TAGIHAN TANGGAL 1
NO ACTION => 66 <-> Tagihan Isolir Tgl 1
NO ACTION => 67 <-> Tag Netborhood Limit Tgl 10
NO ACTION => 73 <-> Tagihan01-05
\ No newline at end of file diff --git a/dashboard.php b/dashboard.php index aea0856..24013e2 100644 --- a/dashboard.php +++ b/dashboard.php @@ -709,7 +709,8 @@ $statuspaygw = $datastatus['status_payment_gateway']; }).buttons().container().appendTo('#example1_wrapper .col-md-6:eq(0)'); $("#example2").DataTable({ "responsive": true, - "autoWidth": false + "autoWidth": false, + "pageLength": 100 }); $("#example3").DataTable({ "responsive": true, diff --git a/img/default_kwitansi_Lyppi.png b/img/default_kwitansi_Lyppi.png new file mode 100644 index 0000000..1fdcc55 Binary files /dev/null and b/img/default_kwitansi_Lyppi.png differ diff --git a/load/check_voucher.php b/load/check_voucher.php index c779cc7..e3d013d 100644 --- a/load/check_voucher.php +++ b/load/check_voucher.php @@ -2,127 +2,189 @@ ini_set('display_errors', 1); error_reporting(E_ALL); +// ======================= // Include necessary files +// ======================= include "/www/wwwroot/bilspro/config/connect.php"; include "/www/wwwroot/bilspro/config/routeros_api.class.php"; -// include "../config/connect.php"; -// include "../config/routeros_api.class.php"; +// ============================ +// Get parameters from CLI args +// ============================ +$m_ip = $argv[1]; // IP address +$m_user = $argv[2]; // Username +$m_pass = $argv[3]; // Password +$m_port = $argv[4]; // Port +$idsm = $argv[5]; // Mikrotik setting ID +$nama = $argv[6]; // Nama Mikrotik -// Get parameters from command line arguments -$m_ip = $argv[1]; // IP address -$m_user = $argv[2]; // Username -$m_pass = $argv[3]; // Password -$m_port = $argv[4]; // Port -$idsm = $argv[5]; // Mikrotik setting ID +// ==================== +// Log file location +// ==================== +$logFile = "/www/wwwroot/bilspro/load/logs/voucher_{$nama}_log.txt"; -// Create new RouterosAPI instance +// ================================ +// Function: Write to log file +// ================================ +function writeLog($message) +{ + global $logFile; + $date = date("Y-m-d H:i:s"); + $newLine = "[$date] $message\n"; + + // Append new log + file_put_contents($logFile, $newLine, FILE_APPEND); + + // Keep log file max 1000 lines + $lines = file($logFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + $totalLines = count($lines); + if ($totalLines > 1000) { + $lines = array_slice($lines, -1000); // Keep only last 1000 + file_put_contents($logFile, implode("\n", $lines) . "\n"); + } +} + +// ========================== +// Create RouterOS API object +// ========================== $API = new RouterosAPI(); $API->debug = false; -// Connect to the router API +// ======================= +// Connect to RouterOS API +// ======================= if ($API->connect2($m_ip, $m_user, $m_pass, $m_port)) { - echo "\nConnected to Router: {$m_ip}\n"; + echo "✅ Berhasil terhubung ke Router: {$m_ip}\n"; + writeLog("[✅] Berhasil terhubung ke Router: {$m_ip}"); - // Query vouchers that need to be checked - $ambilv1 = $pdo->prepare("SELECT id, create_time, voucher, durasi FROM v_load_cek_voucher WHERE id_setting_mikrotik = :idsm AND status_cek IS NULL LIMIT 75"); - $ambilv1->execute([':idsm' => $idsm]); + $batchSize = 200; // Batasi 200 voucher per batch + $offset = 0; - while ($cekv1 = $ambilv1->fetch(PDO::FETCH_ASSOC)) { - $iddatav1 = $cekv1['id']; - $datav1 = $cekv1['voucher']; - $durasi = $cekv1['durasi']; + do { + $ambilv1 = $pdo->prepare(" + SELECT id, create_time, voucher, durasi + FROM v_load_cek_voucher + WHERE id_setting_mikrotik = :idsm + LIMIT :limit OFFSET :offset + "); + $ambilv1->bindValue(':idsm', $idsm, PDO::PARAM_INT); + $ambilv1->bindValue(':limit', $batchSize, PDO::PARAM_INT); + $ambilv1->bindValue(':offset', $offset, PDO::PARAM_INT); + $ambilv1->execute(); - // Convert the 'durasi' to a valid DateInterval format - $inter = convertDurationToInterval($durasi); - if (!$inter) { - echo "Invalid duration format: $durasi.\n"; - continue; // Skip this voucher if the duration is invalid - } + $rows = $ambilv1->fetchAll(PDO::FETCH_ASSOC); + if (!$rows) break; - // Check if the voucher exists in the hotspot users - $cek = $API->comm('/ip/hotspot/user/print', ["?name" => $datav1]); + foreach ($rows as $cekv1) { + $iddatav1 = $cekv1['id']; + $datav1 = $cekv1['voucher']; + $durasi = $cekv1['durasi']; - if ($cek) { - // If voucher exists, check the comment - if (isset($cek[0]['comment']) && $cek[0]['comment'] != '') { - $activetime = processCommentDate($cek[0]['comment']); - $Tgl = new DateTime($activetime); + // ================================ + // Convert duration to DateInterval + // ================================ + $inter = convertDurationToInterval($durasi); + if (!$inter) { + $status = "Durasi tidak valid ($durasi)"; + echo "{$datav1} => $status\n"; + writeLog("[⛔] {$datav1} => $status"); + continue; + } + + // ===================================== + // Check if voucher exists on Hotspot + // ===================================== + $cek = $API->comm('/ip/hotspot/user/print', ["?name" => $datav1]); + + if ($cek) { + // If voucher exists and has comment + if (!empty($cek[0]['comment'])) { + $activetime = processCommentDate($cek[0]['comment']); + $Tgl = new DateTime($activetime); + $Tgl->add($inter); + $exp = $Tgl->format('Y-m-d H:i:s'); + + updateVoucher($pdo, $iddatav1, $activetime, $exp); + $status = "Voucher aktif & diperbarui. Expired: $exp"; + echo "{$datav1} => $status\n"; + writeLog("[✅] {$datav1} => $status"); + } else { + markVoucherChecked($pdo, $iddatav1); + $status = "Voucher ditemukan tanpa komentar, ditandai sudah dicek"; + echo "{$datav1} => $status\n"; + writeLog("[ℹ️] {$datav1} => $status"); + } + } else { + // If voucher does not exist + $aktif = $cekv1['create_time']; + $Tgl = new DateTime($aktif); $Tgl->add($inter); $exp = $Tgl->format('Y-m-d H:i:s'); - echo "{$datav1} comment->{$cek[0]['comment']} active->{$activetime} exp->{$exp} => Exists\n"; - - // Update the database with active and expired time - updateVoucher($pdo, $iddatav1, $activetime, $exp); - } else { - // Mark the voucher as checked - markVoucherChecked($pdo, $iddatav1); + updateVoucher($pdo, $iddatav1, $aktif, $exp); + $status = "Voucher tidak ditemukan, dianggap aktif sejak $aktif, expired: $exp"; + echo "{$datav1} => $status\n"; + writeLog("[⚠️] {$datav1} => $status"); } - } else { - // If voucher does not exist, calculate expiration time based on creation date - $aktif = $cekv1['create_time']; - $Tgl = new DateTime($aktif); - $Tgl->add($inter); - $exp = $Tgl->format('Y-m-d H:i:s'); - - echo "{$datav1} active->{$aktif} exp->{$exp} => Does not exist\n"; - - // Update the database with active and expired time - updateVoucher($pdo, $iddatav1, $aktif, $exp); } - echo "{$cekv1['voucher']}\n"; - } + $offset += $batchSize; + } while (count($rows) == $batchSize); + + echo "✅ Selesai memproses semua voucher untuk Router {$m_ip}\n"; + writeLog("[✅] Selesai memproses semua voucher untuk Router {$m_ip}"); } else { - echo "Unable to connect to router: {$m_ip}\n"; + $msg = "Gagal terhubung ke Router: {$m_ip}"; + echo "❌ $msg\n"; + writeLog("[❌] $msg"); } -// Disconnect the API session +// ======================= +// Disconnect API session +// ======================= $API->disconnect(); -// Function to convert duration string to DateInterval -function convertDurationToInterval($durasi) { + +// ============================================ +// Helper Functions +// ============================================ +function convertDurationToInterval($durasi) +{ if (substr($durasi, -1) == 'H') { - return new DateInterval("PT" . rtrim($durasi, 'H') . "H"); // For hours + return new DateInterval("PT" . rtrim($durasi, 'H') . "H"); } elseif (substr($durasi, -1) == 'D') { - return new DateInterval("P" . rtrim($durasi, 'D') . "D"); // For days + return new DateInterval("P" . rtrim($durasi, 'D') . "D"); } elseif (substr($durasi, -1) == 'M') { - return new DateInterval("PT" . rtrim($durasi, 'M') . "M"); // For minutes + return new DateInterval("PT" . rtrim($durasi, 'M') . "M"); } else { - return false; // Invalid duration format + return false; } } -// Function to process the comment and extract valid activation time -function processCommentDate($comment) { +function processCommentDate($comment) +{ $modifiedDateTime = substr($comment, 6); if (substr($modifiedDateTime, 0, 4) == date('Y')) { return $modifiedDateTime; } else { $date = date_create_from_format("M/d/Y H:i:s", $modifiedDateTime); - if ($date !== false) { - return date_format($date, "Y-m-d H:i:s"); - } else { - echo "Invalid date format: {$modifiedDateTime}\n"; - return null; - } + return $date ? date_format($date, "Y-m-d H:i:s") : null; } } -// Function to update the voucher in the database -function updateVoucher($pdo, $iddatav1, $activetime, $exp) { +function updateVoucher($pdo, $iddatav1, $activetime, $exp) +{ $updateQuery = "UPDATE ganerate_voucher SET active_time = :activetime, expaired_time = :exp WHERE id = :id"; $stmt = $pdo->prepare($updateQuery); $stmt->execute([ ':activetime' => $activetime, - ':exp' => $exp, - ':id' => $iddatav1 + ':exp' => $exp, + ':id' => $iddatav1 ]); } -// Function to mark voucher as checked in the database -function markVoucherChecked($pdo, $iddatav1) { +function markVoucherChecked($pdo, $iddatav1) +{ $updateQuery = "UPDATE ganerate_voucher SET status_cek = '1' WHERE id = :id"; $stmt = $pdo->prepare($updateQuery); $stmt->execute([':id' => $iddatav1]); diff --git a/load/koneksi_off.log b/load/koneksi_off.log index 2c8ea27..f7a6d7d 100644 --- a/load/koneksi_off.log +++ b/load/koneksi_off.log @@ -1,23 +1,23 @@ SV_Cikembar_Utama Data pelanggan tidak ada -2025-07-05 16:21:01SV_BojongKerta Data pelanggan tidak ada -2025-07-05 16:21:01SV_Permata_Sampora Data pelanggan tidak ada -2025-07-05 16:21:01SV_Kingnet_Cibadak Data pelanggan tidak ada -2025-07-05 16:21:01SV_CC-Net_Cipicung Data pelanggan tidak ada -2025-07-05 16:21:01SV_Nusaina_Cibadak Data pelanggan tidak ada -2025-07-05 16:21:01SV_Diamond Net Status koneksi tidak aktif atau interval tidak tersedia. +2025-07-14 23:47:01SV_BojongKerta Data pelanggan tidak ada +2025-07-14 23:47:01SV_Permata_Sampora Data pelanggan tidak ada +2025-07-14 23:47:01SV_Kingnet_Cibadak Data pelanggan tidak ada +2025-07-14 23:47:01SV_CC-Net_Cipicung Data pelanggan tidak ada +2025-07-14 23:47:01SV_Nusaina_Cibadak Data pelanggan tidak ada +2025-07-14 23:47:01SV_Diamond Net Status koneksi tidak aktif atau interval tidak tersedia. SV_22P Net Cibadak Data pelanggan tidak ada -2025-07-05 16:21:01SV_Nettizen_Segaranten Data pelanggan tidak ada -2025-07-05 15:51:01SV-DNY-Net-1 Data pelanggan tidak ada -2025-07-05 16:31:01SV_NTA_2_Pasawahan Status koneksi tidak aktif atau interval tidak tersedia. +2025-07-14 23:47:01SV_Nettizen_Segaranten Data pelanggan tidak ada +2025-07-14 23:17:02SV-DNY-Net-1 Data pelanggan tidak ada +2025-07-14 23:57:02SV_NTA_2_Pasawahan Status koneksi tidak aktif atau interval tidak tersedia. SV_NTA_1 Status koneksi tidak aktif atau interval tidak tersedia. SV-Cicukang Status koneksi tidak aktif atau interval tidak tersedia. RO-Bumdes-Mekarmanah Status koneksi tidak aktif atau interval tidak tersedia. RO-Pak-Kholiq Data pelanggan tidak ada -2025-07-05 16:36:01RO-Dendrit-Net Status koneksi tidak aktif atau interval tidak tersedia. +2025-07-15 00:02:02RO-Dendrit-Net Status koneksi tidak aktif atau interval tidak tersedia. LJN.NS.CSR.NET Status koneksi tidak aktif atau interval tidak tersedia. IVVINET-CBD Data pelanggan tidak ada -2025-07-05 16:21:01QONNET Data pelanggan tidak ada -2025-07-05 16:21:01Mikrotik_X86 Status koneksi tidak aktif atau interval tidak tersedia. +2025-07-14 23:47:02QONNET Data pelanggan tidak ada +2025-07-14 23:47:02Mikrotik_X86 Status koneksi tidak aktif atau interval tidak tersedia. Mikrotik_BSW_1 Status koneksi tidak aktif atau interval tidak tersedia. Mikrotik_Alea Status koneksi tidak aktif atau interval tidak tersedia. STANG Status koneksi tidak aktif atau interval tidak tersedia. @@ -25,7 +25,7 @@ UNIX-NET Status koneksi tidak aktif atau interval tidak tersedia. BTR CIEMAS Status koneksi tidak aktif atau interval tidak tersedia. SV_NTA_2_TBL Status koneksi tidak aktif atau interval tidak tersedia. MULYANAJAYA Status koneksi tidak aktif atau interval tidak tersedia. -PERWASIM.NET Status koneksi tidak aktif atau interval tidak tersedia. +PERWASIM-NETWORK Status koneksi tidak aktif atau interval tidak tersedia. RO_MELDINA Status koneksi tidak aktif atau interval tidak tersedia. RO_LIPPY Status koneksi tidak aktif atau interval tidak tersedia. RO_Asep Status koneksi tidak aktif atau interval tidak tersedia. @@ -37,14 +37,14 @@ RO_Wargasari Status koneksi tidak aktif atau interval tidak tersedia. LJN_AGUNG Status koneksi tidak aktif atau interval tidak tersedia. RNET-CMS Status koneksi tidak aktif atau interval tidak tersedia. DCN-GB-CCR Data pelanggan tidak ada -2025-07-05 16:21:01coba Status koneksi tidak aktif atau interval tidak tersedia. +2025-07-14 23:47:02coba Status koneksi tidak aktif atau interval tidak tersedia. 412NET Status koneksi tidak aktif atau interval tidak tersedia. brf Status koneksi tidak aktif atau interval tidak tersedia. BMSNET Status koneksi tidak aktif atau interval tidak tersedia. purabaya Status koneksi tidak aktif atau interval tidak tersedia. DCN-CO-GX4 Data pelanggan tidak ada -2025-07-05 16:21:01MIKROTIK GX4 Status koneksi tidak aktif atau interval tidak tersedia. +2025-07-14 23:47:02MIKROTIK GX4 Status koneksi tidak aktif atau interval tidak tersedia. RO - Netborhood Wifi Status koneksi tidak aktif atau interval tidak tersedia. Neglasari Status koneksi tidak aktif atau interval tidak tersedia. SV-DNY-Net-2 Data pelanggan tidak ada -2025-07-05 16:31:01DNY-Neglasari Status koneksi tidak aktif atau interval tidak tersedia. +2025-07-14 23:57:02DNY-Neglasari Status koneksi tidak aktif atau interval tidak tersedia. diff --git a/load/load_multi_cek.log b/load/load_multi_cek.log index 1c49085..6e6050b 100644 --- a/load/load_multi_cek.log +++ b/load/load_multi_cek.log @@ -1 +1 @@ -Update ALL to NULL successful +Successfully started background process for IP: tunnel.manjapro.net SV-DNY-Net-1
Successfully started background process for IP: nsn.my.id SV_22P Net Cibadak
Successfully started background process for IP: nsn.my.id RO-Bumdes-Mekarmanah
Successfully started background process for IP: 103.242.104.69 RO-Dendrit-Net
Successfully started background process for IP: 103.26.176.93 LJN.NS.CSR.NET
Successfully started background process for IP: 103.155.198.109 RO_Asep
Successfully started background process for IP: 103.155.199.191 PERWASIM-NETWORK
Successfully started background process for IP: tunnel.manjapro.net SV_NTA_2_Pasawahan
Successfully started background process for IP: tunnel.manjapro.net SV-Cicukang
Successfully started background process for IP: tunnel.manjapro.net SV_NTA_1
Successfully started background process for IP: 103.94.10.112 STANG
Successfully started background process for IP: 157.20.128.231 QONNET
Successfully started background process for IP: 114.141.51.12 BMSNET
Successfully started background process for IP: 114.141.51.12 purabaya
Successfully started background process for IP: nsn.my.id SV_Cikembar_Utama
Successfully started background process for IP: tunnel.bilspro.com RO_Sukasari
Successfully started background process for IP: tunnel.bilspro.com Mikrotik_X86
Successfully started background process for IP: 103.155.196.145 UNIX-NET
Successfully started background process for IP: nsn.my.id SV_Diamond Net
Successfully started background process for IP: 103.26.176.81 SV_CC-Net_Cipicung
Successfully started background process for IP: 103.242.105.199 SV-DNY-Net-2
Started parallel processes for checking vouchers. => 2025-07-15 00:00:01 \ No newline at end of file diff --git a/load/load_multi_cek.php b/load/load_multi_cek.php index a7963c7..a9b1156 100644 --- a/load/load_multi_cek.php +++ b/load/load_multi_cek.php @@ -19,6 +19,7 @@ if ($set1->rowCount() > 0) { while ($pset = $set1->fetch(PDO::FETCH_ASSOC)) { // Get connection details for the router + $nama = $pset['nama']; $m_ip = $pset['ip_address']; $m_user = $pset['username']; $m_pass = $pset['password']; @@ -26,16 +27,16 @@ if ($set1->rowCount() > 0) { $idsm = $pset['id_setting_mikrotik']; // Prepare the command for each router - $command = "php /www/wwwroot/bilspro/load/check_voucher.php {$m_ip} {$m_user} {$m_pass} {$m_port} {$idsm} > /dev/null 2>&1 &"; + $command = "php /www/wwwroot/bilspro/load/check_voucher.php {$m_ip} {$m_user} {$m_pass} {$m_port} {$idsm} {$nama} > /dev/null 2>&1 &"; // Execute the command in background exec($command, $output, $return_var); // Check if there was an issue with exec if ($return_var !== 0) { - echo "Error executing command for IP: {$m_ip}\n"; + echo "Error executing command for IP: {$m_ip}
"; } else { - echo "Successfully started background process for IP: {$m_ip}\n"; + echo "Successfully started background process for IP: {$m_ip} {$nama}
"; } } diff --git a/load/pppoe_update.log b/load/pppoe_update.log index 7511230..b8b9c48 100644 --- a/load/pppoe_update.log +++ b/load/pppoe_update.log @@ -24,7 +24,7 @@ STANG =>
UNIX-NET =>
SV_NTA_2_TBL =>
MULYANAJAYA =>
-PERWASIM.NET =>
+PERWASIM-NETWORK =>
RO_MELDINA =>
RO_LIPPY =>
RO_Asep =>
diff --git a/load/update_sewa_apk.log b/load/update_sewa_apk.log index b09c162..88a941e 100644 --- a/load/update_sewa_apk.log +++ b/load/update_sewa_apk.log @@ -1 +1 @@ -Tidak perlu update untuk ID: 2 Rp.200,000
Harga khusus untuk ID: 3 Rp.250,000
Tidak perlu update untuk ID: 4 Rp.300,000
Tidak perlu update untuk ID: 5 Rp.300,000
Tidak perlu update untuk ID: 6 Rp.200,000
Harga khusus untuk ID: 7 Rp.200,000
Tidak perlu update untuk ID: 8 Rp.200,000
Tidak perlu update untuk ID: 9 Rp.200,000
Tidak perlu update untuk ID: 10 Rp.200,000
Harga harus diupdate untuk ID Data Server: 12 Rp.750,000
Tidak perlu update untuk ID: 13 Rp.750,000
Tidak perlu update untuk ID: 14 Rp.450,000
Tidak perlu update untuk ID: 15 Rp.450,000
Tidak perlu update untuk ID: 16 Rp.300,000
Harga khusus untuk ID: 17 Rp.300,000
Tidak perlu update untuk ID: 18 Rp.300,000
Tidak perlu update untuk ID: 19 Rp.450,000
Tidak perlu update untuk ID: 20 Rp.200,000
Tidak perlu update untuk ID: 21 Rp.300,000
Tidak perlu update untuk ID: 22 Rp.300,000
Tidak perlu update untuk ID: 23 Rp.450,000
Tidak perlu update untuk ID: 24 Rp.200,000
Tidak perlu update untuk ID: 25 Rp.250,000
Tidak perlu update untuk ID: 26 Rp.200,000
Tidak perlu update untuk ID: 28 Rp.200,000
Tidak perlu update untuk ID: 29 Rp.300,000
Tidak perlu update untuk ID: 30 Rp.200,000
Tidak perlu update untuk ID: 31 Rp.200,000
Tidak perlu update untuk ID: 32 Rp.200,000
Tidak perlu update untuk ID: 33 Rp.200,000
Tidak perlu update untuk ID: 34 Rp.200,000
Tidak perlu update untuk ID: 35 Rp.200,000
Tidak perlu update untuk ID: 36 Rp.200,000
Tidak perlu update untuk ID: 37 Rp.300,000
Tidak perlu update untuk ID: 38 Rp.200,000
Tidak perlu update untuk ID: 39 Rp.200,000
Harga khusus untuk ID: 40 Rp.1,000,000
Tidak perlu update untuk ID: 41 Rp.200,000
Tidak perlu update untuk ID: 42 Rp.200,000
Harga khusus untuk ID: 43 Rp.100,000
Tidak perlu update untuk ID: 44 Rp.200,000
Tidak perlu update untuk ID: 45 Rp.300,000
Tidak perlu update untuk ID: 46 Rp.200,000
Tidak perlu update untuk ID: 47 Rp.200,000
Tidak perlu update untuk ID: 48 Rp.200,000
Tidak perlu update untuk ID: 49 Rp.200,000
Tidak perlu update untuk ID: 50 Rp.200,000
Tidak perlu update untuk ID: 51 Rp.200,000
Tidak perlu update untuk ID: 52 Rp.1,000,000
Tidak perlu update untuk ID: 53 Rp.200,000
Tidak perlu update untuk ID: 54 Rp.200,000
Tidak perlu update untuk ID: 55 Rp.200,000
Tidak perlu update untuk ID: 56 Rp.200,000
Tidak perlu update untuk ID: 57 Rp.200,000
Tidak perlu update untuk ID: 58 Rp.200,000
Tidak perlu update untuk ID: 59 Rp.200,000
Tidak perlu update untuk ID: 60 Rp.200,000
Tidak perlu update untuk ID: 61 Rp.300,000
Tidak perlu update untuk ID: 62 Rp.200,000
Tidak perlu update untuk ID: 63 Rp.200,000
Tidak perlu update untuk ID: 64 Rp.200,000
Tidak perlu update untuk ID: 65 Rp.200,000
Tidak perlu update untuk ID: 66 Rp.200,000
Tidak perlu update untuk ID: 67 Rp.200,000
Harga khusus untuk ID: 68 Rp.200,000
Harga khusus untuk ID: 69 Rp.200,000
Tidak perlu update untuk ID: 70 Rp.200,000
Tidak perlu update untuk ID: 71 Rp.200,000
Tidak perlu update untuk ID: 72 Rp.200,000
Tidak perlu update untuk ID: 73 Rp.200,000
\ No newline at end of file +Tidak perlu update untuk ID: 2 Rp.200,000
Harga khusus untuk ID: 3 Rp.250,000
Tidak perlu update untuk ID: 4 Rp.300,000
Tidak perlu update untuk ID: 5 Rp.300,000
Tidak perlu update untuk ID: 6 Rp.200,000
Harga khusus untuk ID: 7 Rp.200,000
Tidak perlu update untuk ID: 8 Rp.200,000
Tidak perlu update untuk ID: 9 Rp.200,000
Tidak perlu update untuk ID: 10 Rp.200,000
Tidak perlu update untuk ID: 12 Rp.750,000
Tidak perlu update untuk ID: 13 Rp.750,000
Tidak perlu update untuk ID: 14 Rp.450,000
Tidak perlu update untuk ID: 15 Rp.450,000
Tidak perlu update untuk ID: 16 Rp.300,000
Harga khusus untuk ID: 17 Rp.300,000
Tidak perlu update untuk ID: 18 Rp.300,000
Tidak perlu update untuk ID: 19 Rp.450,000
Tidak perlu update untuk ID: 20 Rp.200,000
Tidak perlu update untuk ID: 21 Rp.300,000
Tidak perlu update untuk ID: 22 Rp.300,000
Tidak perlu update untuk ID: 23 Rp.450,000
Tidak perlu update untuk ID: 24 Rp.200,000
Tidak perlu update untuk ID: 25 Rp.250,000
Tidak perlu update untuk ID: 26 Rp.200,000
Tidak perlu update untuk ID: 28 Rp.200,000
Tidak perlu update untuk ID: 29 Rp.300,000
Tidak perlu update untuk ID: 30 Rp.200,000
Tidak perlu update untuk ID: 31 Rp.200,000
Tidak perlu update untuk ID: 32 Rp.200,000
Tidak perlu update untuk ID: 33 Rp.200,000
Tidak perlu update untuk ID: 34 Rp.200,000
Tidak perlu update untuk ID: 35 Rp.200,000
Tidak perlu update untuk ID: 36 Rp.200,000
Tidak perlu update untuk ID: 37 Rp.300,000
Tidak perlu update untuk ID: 38 Rp.200,000
Tidak perlu update untuk ID: 39 Rp.200,000
Harga khusus untuk ID: 40 Rp.1,000,000
Tidak perlu update untuk ID: 41 Rp.200,000
Tidak perlu update untuk ID: 42 Rp.200,000
Harga khusus untuk ID: 43 Rp.100,000
Tidak perlu update untuk ID: 44 Rp.200,000
Tidak perlu update untuk ID: 45 Rp.300,000
Tidak perlu update untuk ID: 46 Rp.200,000
Tidak perlu update untuk ID: 47 Rp.200,000
Tidak perlu update untuk ID: 48 Rp.200,000
Tidak perlu update untuk ID: 49 Rp.200,000
Tidak perlu update untuk ID: 50 Rp.200,000
Tidak perlu update untuk ID: 51 Rp.200,000
Tidak perlu update untuk ID: 52 Rp.1,000,000
Tidak perlu update untuk ID: 53 Rp.200,000
Tidak perlu update untuk ID: 54 Rp.200,000
Tidak perlu update untuk ID: 55 Rp.200,000
Tidak perlu update untuk ID: 56 Rp.200,000
Tidak perlu update untuk ID: 57 Rp.200,000
Tidak perlu update untuk ID: 58 Rp.200,000
Tidak perlu update untuk ID: 59 Rp.200,000
Tidak perlu update untuk ID: 60 Rp.200,000
Tidak perlu update untuk ID: 61 Rp.300,000
Tidak perlu update untuk ID: 62 Rp.200,000
Tidak perlu update untuk ID: 63 Rp.200,000
Tidak perlu update untuk ID: 64 Rp.200,000
Tidak perlu update untuk ID: 65 Rp.200,000
Tidak perlu update untuk ID: 66 Rp.200,000
Tidak perlu update untuk ID: 67 Rp.200,000
Harga khusus untuk ID: 68 Rp.200,000
Harga khusus untuk ID: 69 Rp.200,000
Tidak perlu update untuk ID: 70 Rp.200,000
Tidak perlu update untuk ID: 71 Rp.200,000
Tidak perlu update untuk ID: 72 Rp.200,000
Tidak perlu update untuk ID: 73 Rp.200,000
2399 data pesan sebelum 3 hari terakhir berhasil dihapus.
\ No newline at end of file diff --git a/load/update_sewa_apk.php b/load/update_sewa_apk.php index a3af0c3..55bcd11 100644 --- a/load/update_sewa_apk.php +++ b/load/update_sewa_apk.php @@ -55,6 +55,24 @@ try { echo "Harga khusus untuk ID: " . $data['id'] . " Rp." . number_format($data['harga_sewa']) . "
"; } } + + $sekarang = date('Y-m-d H:i:s'); + $harilalu = date('Y-m-d H:i:s', strtotime("$sekarang -3 days")); + + // Hitung jumlah data yang akan dihapus + $sqlCount = "SELECT COUNT(id) AS jumid FROM master_pesan WHERE waktu <= :harilalu"; + $stmtCount = $pdo->prepare($sqlCount); + $stmtCount->execute(['harilalu' => $harilalu]); + $pp = $stmtCount->fetch(PDO::FETCH_ASSOC); + $jumlahHapus = $pp['jumid'] ?? 0; + + // Hapus data + $sqlDelete = "DELETE FROM master_pesan WHERE waktu <= :harilalu"; + $stmtDelete = $pdo->prepare($sqlDelete); + $stmtDelete->execute(['harilalu' => $harilalu]); + + echo $jumlahHapus . " data pesan sebelum 3 hari terakhir berhasil dihapus.
"; + } catch (PDOException $e) { // Tangani kesalahan koneksi atau query echo "Terjadi kesalahan: " . $e->getMessage(); diff --git a/pages/log_pesan.php b/pages/log_pesan.php index b229aa0..b7bbe34 100644 --- a/pages/log_pesan.php +++ b/pages/log_pesan.php @@ -1,5 +1,5 @@ -
+
@@ -10,7 +10,80 @@

Log Pesan

+
    + Kirim Ulang +
+ + + prepare("UPDATE master_pesan SET status = 'PENDING' WHERE status = 'GAGAL' AND api_key = :api_key AND waktu >= :mulaiulang"); + $updatePesan->execute([ + 'api_key' => $pakw['apikey_whatsapp'], + 'mulaiulang' => $mulaiulang + ]); + + // Hitung jumlah pesan yang diupdate + $jumlahPesan = $updatePesan->rowCount(); + + if ($jumlahPesan > 0) { + sweetAlert("$jumlahPesan pesan berhasil masuk antrian pengiriman ulang", "success"); + } else { + sweetAlert("Tidak ada pesan GAGAL yang ditemukan dalam $jamtam jam terakhir", "warning"); + } + + } catch (PDOException $e) { + sweetAlert("Error: " . $e->getMessage(), "error"); + } + } + ?> +
@@ -19,6 +92,7 @@ Nama Server + Waktu Nomor Pesan Url Image @@ -40,9 +114,10 @@ echo $sv['nama_server']; ?> + - - + +