Update Banyak
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
include "/www/wwwroot/bilspro/config/connect.php";
|
||||
|
||||
// Ambil summary
|
||||
$stmt = $pdo->query("SELECT * FROM v_summary_transaksi_agen_bulanan");
|
||||
$summary = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// Ambil detail
|
||||
$stmt = $pdo->query("SELECT * FROM v_detail_agen_pascabayar");
|
||||
$detail = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// Ubah jadi keyed array
|
||||
function toKeyedArray($rows) {
|
||||
$out = [];
|
||||
foreach ($rows as $r) {
|
||||
$key = $r['id_agen_voucher'].'-'.$r['id_data_server'].'-'.$r['generate_time'];
|
||||
$out[$key] = $r;
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
$summaryArr = toKeyedArray($summary);
|
||||
$detailArr = toKeyedArray($detail);
|
||||
|
||||
// Gabungkan semua key
|
||||
$allKeys = array_unique(array_merge(array_keys($summaryArr), array_keys($detailArr)));
|
||||
|
||||
$diffs = [];
|
||||
$same = [];
|
||||
|
||||
foreach ($allKeys as $key) {
|
||||
$rowSummary = $summaryArr[$key] ?? null;
|
||||
$rowDetail = $detailArr[$key] ?? null;
|
||||
|
||||
if (!$rowSummary || !$rowDetail) {
|
||||
$diffs[$key] = [
|
||||
'missing_in' => !$rowSummary ? 'summary' : 'detail'
|
||||
];
|
||||
continue;
|
||||
}
|
||||
|
||||
// Bandingkan kolom satu per satu
|
||||
$rowDiff = [];
|
||||
foreach ($rowSummary as $col => $valSummary) {
|
||||
$valDetail = $rowDetail[$col] ?? null;
|
||||
|
||||
// Normalisasi null jadi 0
|
||||
$valSummaryNorm = ($valSummary === null || $valSummary === '') ? 0 : $valSummary;
|
||||
$valDetailNorm = ($valDetail === null || $valDetail === '') ? 0 : $valDetail;
|
||||
|
||||
if (trim((string)$valSummaryNorm) !== trim((string)$valDetailNorm)) {
|
||||
$rowDiff[$col] = [
|
||||
'summary' => $valSummary,
|
||||
'detail' => $valDetail
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if ($rowDiff) {
|
||||
$diffs[$key] = $rowDiff;
|
||||
} else {
|
||||
$same[$key] = $rowSummary;
|
||||
}
|
||||
}
|
||||
|
||||
// Hasil
|
||||
echo "<h3>✅ Data Sama: ".count($same)."</h3>";
|
||||
// echo "<pre>".json_encode($same, JSON_PRETTY_PRINT)."</pre>";
|
||||
|
||||
echo "<h3>⚠️ Data Berbeda / Hilang: ".count($diffs)."</h3>";
|
||||
echo "<pre>".json_encode($diffs, JSON_PRETTY_PRINT)."</pre>";
|
||||
@@ -0,0 +1,116 @@
|
||||
[21:38:01] [OK] 103.26.176.81
|
||||
[21:38:01] [OK] 103.188.169.123
|
||||
[21:38:01] [OK] 103.26.176.85
|
||||
[21:38:01] [OK] 103.26.176.83
|
||||
[21:38:01] [OK] 103.155.198.185
|
||||
[21:38:01] [OK] 103.188.169.121
|
||||
[21:38:01] [OK] tunnel.manjapro.net
|
||||
[21:38:01] [OK] tunnel.manjapro.net
|
||||
[21:38:01] [OK] tunnel.manjapro.net
|
||||
[21:38:01] [OK] tunnel.manjapro.net
|
||||
[21:38:01] [OK] tunnel.manjapro.net
|
||||
[21:38:02] [OK] 103.188.169.127
|
||||
[21:38:02] [OK] tunnel.manjapro.net
|
||||
[21:38:02] [OK] 103.26.176.87
|
||||
[21:38:02] [OK] tunnel.manjapro.net
|
||||
[21:38:02] [OK] 157.20.128.231
|
||||
[21:38:02] [OK] tunnel.manjapro.net
|
||||
[21:38:02] [OK] 103.26.176.93
|
||||
[21:38:02] [OK] 103.155.196.145
|
||||
[21:38:02] [OK] 103.94.10.112
|
||||
[21:38:02] [OK] tunnel.manjapro.net
|
||||
[21:38:02] [OK] 103.31.233.237
|
||||
[21:38:02] [OK] 103.242.104.69
|
||||
[21:38:03] [OK] 103.18.79.171
|
||||
[21:38:03] [OK] 103.155.199.191
|
||||
[21:38:03] [OK] tunnel.manjapro.net
|
||||
[21:38:03] [OK] tunnel.manjapro.net
|
||||
[21:38:03] [OK] tunnel.manjapro.net
|
||||
[21:38:04] [OK] 103.242.106.56
|
||||
[21:38:04] [OK] tunnel.manjapro.net
|
||||
[21:38:05] [FAIL] 103.67.80.126
|
||||
[21:38:06] [OK] 103.236.190.109
|
||||
[21:38:07] [FAIL] 103.94.10.240
|
||||
[21:38:07] [FAIL] 103.94.10.240
|
||||
[21:38:07] [FAIL] 103.94.10.240
|
||||
[21:38:07] [OK] 114.141.51.12
|
||||
[21:38:08] [FAIL] infinnet.cloud
|
||||
[21:38:08] [OK] 114.141.51.12
|
||||
[21:38:08] [OK] tunnel.manjapro.net
|
||||
[21:38:10] [OK] tunnel.manjapro.net
|
||||
[21:38:10] [OK] tunnel.manjapro.net
|
||||
[21:38:10] [OK] tunnel.manjapro.net
|
||||
[21:38:11] [OK] tunnel.manjapro.net
|
||||
[21:38:11] [OK] tunnel.manjapro.net
|
||||
[21:38:11] [FAIL] infinnet.cloud
|
||||
[21:38:12] [OK] tunnel.manjapro.net
|
||||
[21:38:12] [FAIL] tunnel.bilspro.com
|
||||
[21:38:12] [FAIL] tunnel.bilspro.com
|
||||
[21:38:12] [OK] tunnel.manjapro.net
|
||||
[21:38:13] [OK] tunnel.manjapro.net
|
||||
[21:38:14] [FAIL] tunnel.bilspro.com
|
||||
[21:38:14] [FAIL] 103.10.1.5
|
||||
[21:38:15] [FAIL] 157.20.12
|
||||
[21:38:16] [FAIL] 103.103.147.225
|
||||
[21:38:17] [FAIL] 103.155.198.109
|
||||
[21:38:17] [FAIL] tunnel.bilspro.com
|
||||
[21:38:18] [FAIL] tunnel.manjapro.net
|
||||
[2025-09-21 21:38:18] Semua child selesai. Mulai update DB...
|
||||
[21:38:18] [UPDATE DB] 03FK-Q7XE1
|
||||
[21:38:18] [UPDATE DB] IDLF-SK944
|
||||
[21:38:18] [UPDATE DB] TYF0-3RP75
|
||||
[21:38:18] [UPDATE DB] 0YDS-EI1V6
|
||||
[21:38:18] [UPDATE DB] C7CU-PGT97
|
||||
[21:38:18] [UPDATE STATUS] 7FZH-WIBI8 (Disconnected -> Disconnected)
|
||||
[21:38:18] [UPDATE DB] YHVJ-ZN9V9
|
||||
[21:38:18] [UPDATE DB] C7CU-PGT910
|
||||
[21:38:18] [UPDATE DB] MPK0-Q43P11
|
||||
[21:38:18] [UPDATE DB] S9QL-XRJ512
|
||||
[21:38:18] [UPDATE DB] HHJH-UFWL14
|
||||
[21:38:18] [UPDATE DB] 03FK-Q7XE15
|
||||
[21:38:18] [UPDATE DB] DG7B-JP4218
|
||||
[21:38:18] [UPDATE DB] XXWL-VMH419
|
||||
[21:38:18] [UPDATE DB] 03FK-Q7XE20
|
||||
[21:38:18] [UPDATE DB] C7CU-PGT922
|
||||
[21:38:18] [UPDATE DB] 8FHL-TXVS23
|
||||
[21:38:18] [UPDATE DB] Q23C-IE2524
|
||||
[21:38:18] [UPDATE DB] Q4D5-ATUM25
|
||||
[21:38:18] [UPDATE DB] HHJH-UFWL28
|
||||
[21:38:18] [UPDATE DB] 11P4-SII029
|
||||
[21:38:18] [UPDATE DB] CUAA-CD2K30
|
||||
[21:38:18] [UPDATE DB] S1Z8-TK6932
|
||||
[21:38:18] [UPDATE DB] H67G-R4AK33
|
||||
[21:38:18] [UPDATE STATUS] 9RV7-3W5U34 (Disconnected -> Disconnected)
|
||||
[21:38:18] [UPDATE DB] 32PA-DAZ435
|
||||
[21:38:18] [UPDATE STATUS] LJQ6-KDDJ37 (Disconnected -> Disconnected)
|
||||
[21:38:18] [UPDATE DB] 0TW0-J74U38
|
||||
[21:38:18] [UPDATE DB] L7TJ-IF2G39
|
||||
[21:38:18] [UPDATE DB] RWDJ-NXBZ40
|
||||
[21:38:18] [UPDATE DB] A26W-ART341
|
||||
[21:38:18] [UPDATE STATUS] RE5H-G12Y42 (Disconnected -> Disconnected)
|
||||
[21:38:18] [UPDATE STATUS] 03FK-Q7XE43 (Disconnected -> Disconnected)
|
||||
[21:38:18] [UPDATE STATUS] Q96U-20UZ44 (Disconnected -> Disconnected)
|
||||
[21:38:18] [UPDATE DB] D3TU-JN5745
|
||||
[21:38:18] [UPDATE DB] 7SDF-17X546
|
||||
[21:38:18] [UPDATE DB] HMAZ-3HSX51
|
||||
[21:38:18] [UPDATE STATUS] PQJB-HG8V53 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE STATUS] PMA9-QC7654 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE STATUS] 7ZCI-NFCI62 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE STATUS] 0E73-PABK63 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE DB] 4MZF-SFTR65
|
||||
[21:38:19] [UPDATE DB] PJC8-K0EG66
|
||||
[21:38:19] [UPDATE STATUS] 351D-5NCH67 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE STATUS] A0S7-K2IC69 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE DB] G9Z1-HRLY70
|
||||
[21:38:19] [UPDATE STATUS] C7CU-PGT972 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE DB] 66AU-Z7I573
|
||||
[21:38:19] [UPDATE DB] ABMS-YBP776
|
||||
[21:38:19] [UPDATE DB] C7CU-PGT977
|
||||
[21:38:19] [UPDATE DB] C7CU-PGT978
|
||||
[21:38:19] [UPDATE DB] HHJH-UFWL81
|
||||
[21:38:19] [UPDATE DB] 83
|
||||
[21:38:19] [UPDATE STATUS] RNS6-DB3N84 (Disconnected -> Disconnected)
|
||||
[21:38:19] [UPDATE DB] C7CU-PGT987
|
||||
[21:38:19] [UPDATE DB] ZMVC-KAFH88
|
||||
[2025-09-21 21:38:19] Update DB selesai. OK: 56, FAIL: 1
|
||||
[2025-09-21 21:38:19] Lama eksekusi: 17.58 detik
|
||||
@@ -0,0 +1,250 @@
|
||||
<?php
|
||||
$start_time = microtime(true);
|
||||
|
||||
if (php_sapi_name() !== 'cli') {
|
||||
die("Script ini hanya bisa dijalankan lewat CLI.\n");
|
||||
}
|
||||
|
||||
ini_set('max_execution_time', 0);
|
||||
date_default_timezone_set('Asia/Jakarta');
|
||||
|
||||
require "/www/wwwroot/bilspro/config/routeros_api.class.php";
|
||||
|
||||
// ---------------- Config ----------------
|
||||
$max_processes = 10;
|
||||
$timeout_api = 3;
|
||||
$tmpDir = sys_get_temp_dir() . '/mt_results';
|
||||
|
||||
if (!is_dir($tmpDir)) {
|
||||
@mkdir($tmpDir, 0770, true);
|
||||
}
|
||||
|
||||
// Ambil daftar perangkat
|
||||
include "/www/wwwroot/bilspro/config/connect.php";
|
||||
$sqlList = "
|
||||
SELECT DISTINCT ip_address, port_api, username, password, board_id
|
||||
FROM setting_mikrotik";
|
||||
$stmt = $pdo->prepare($sqlList);
|
||||
$stmt->execute();
|
||||
$mikrotiks = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
$pdo = null;
|
||||
|
||||
if (empty($mikrotiks)) {
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Tidak ada data MikroTik.\n";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
// Fork parallel
|
||||
$child_pids = [];
|
||||
$outfiles = [];
|
||||
|
||||
foreach ($mikrotiks as $data) {
|
||||
while (count($child_pids) >= $max_processes) {
|
||||
foreach ($child_pids as $key => $pid) {
|
||||
if (pcntl_waitpid($pid, $status, WNOHANG) > 0) {
|
||||
unset($child_pids[$key]);
|
||||
}
|
||||
}
|
||||
usleep(100000);
|
||||
}
|
||||
|
||||
$safeId = preg_replace('~[^A-Za-z0-9_\-]~', '_', substr($data['board_id'], 0, 64));
|
||||
$outfile = $tmpDir . "/mt_" . $safeId . "_" . microtime(true) . "_" . mt_rand(1000,9999) . ".json";
|
||||
$outfiles[] = $outfile;
|
||||
|
||||
$pid = pcntl_fork();
|
||||
if ($pid == -1) {
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Gagal fork.\n";
|
||||
continue;
|
||||
} elseif ($pid) {
|
||||
$child_pids[] = $pid;
|
||||
} else {
|
||||
process_mikrotik_child($data, $timeout_api, $outfile);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($child_pids as $pid) {
|
||||
pcntl_waitpid($pid, $status);
|
||||
}
|
||||
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Semua child selesai. Mulai update DB...\n";
|
||||
|
||||
// Update DB
|
||||
include "/www/wwwroot/bilspro/config/connect.php";
|
||||
|
||||
$updateSql = "
|
||||
UPDATE setting_mikrotik
|
||||
SET pppa = :pppa,
|
||||
hsa = :hsa,
|
||||
uptime = :ut,
|
||||
board_name = :bm,
|
||||
status = :st
|
||||
WHERE board_id = :id
|
||||
";
|
||||
$statusOnlySql = "
|
||||
UPDATE setting_mikrotik
|
||||
SET status = :st
|
||||
WHERE board_id = :id
|
||||
";
|
||||
|
||||
$updateStmt = $pdo->prepare($updateSql);
|
||||
$statusOnlyStmt = $pdo->prepare($statusOnlySql);
|
||||
|
||||
$execWithRetry = function($stmt, $params) use (&$pdo, $updateSql, $statusOnlySql, &$updateStmt, &$statusOnlyStmt) {
|
||||
try {
|
||||
$stmt->execute($params);
|
||||
return true;
|
||||
} catch (PDOException $e) {
|
||||
$msg = $e->getMessage();
|
||||
if (stripos($msg, '2006 MySQL server has gone away') !== false) {
|
||||
$pdo = null;
|
||||
include "/www/wwwroot/bilspro/config/connect.php";
|
||||
$updateStmt = $pdo->prepare($updateSql);
|
||||
$statusOnlyStmt = $pdo->prepare($statusOnlySql);
|
||||
$stmt = (isset($params[':pppa']) ? $updateStmt : $statusOnlyStmt);
|
||||
$stmt->execute($params);
|
||||
return true;
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
};
|
||||
|
||||
$updated = 0;
|
||||
$failed = 0;
|
||||
|
||||
foreach ($outfiles as $file) {
|
||||
if (!is_file($file)) continue;
|
||||
|
||||
$json = file_get_contents($file);
|
||||
@unlink($file);
|
||||
|
||||
$row = json_decode($json, true);
|
||||
if (!$row || !isset($row['board_id'], $row['status'])) {
|
||||
$failed++;
|
||||
continue;
|
||||
}
|
||||
|
||||
$paramsStatus = [
|
||||
':st' => $row['status'],
|
||||
':id' => $row['board_id'],
|
||||
];
|
||||
|
||||
// Cek data lama untuk log perbandingan
|
||||
$cekStmt = $pdo->prepare("SELECT pppa,hsa,uptime,board_name,status FROM setting_mikrotik WHERE board_id = :id");
|
||||
$cekStmt->execute([':id' => $row['board_id']]);
|
||||
$current = $cekStmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($row['status'] === 'Connected') {
|
||||
$params = [
|
||||
':pppa' => $row['pppa'] ?? '',
|
||||
':hsa' => $row['hsa'] ?? '',
|
||||
':ut' => $row['uptime'] ?? '',
|
||||
':bm' => $row['board_name'] ?? '',
|
||||
':st' => 'Connected',
|
||||
':id' => $row['board_id'],
|
||||
];
|
||||
try {
|
||||
$execWithRetry($updateStmt, $params);
|
||||
$updated++;
|
||||
|
||||
echo "[" . date('H:i:s') . "] [UPDATE DB] {$row['board_id']} \n ";
|
||||
// echo "OLD: " . json_encode($current, JSON_UNESCAPED_UNICODE) . "\n NEW: " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n";
|
||||
} catch (PDOException $e) {
|
||||
echo "[" . date('H:i:s') . "] [DB ERROR] {$row['board_id']} - " . $e->getMessage() . "\n";
|
||||
$failed++;
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
$execWithRetry($statusOnlyStmt, $paramsStatus);
|
||||
$updated++;
|
||||
echo "[" . date('H:i:s') . "] [UPDATE STATUS] {$row['board_id']} ({$current['status']} -> {$row['status']})\n";
|
||||
} catch (PDOException $e) {
|
||||
echo "[" . date('H:i:s') . "] [DB ERROR] {$row['board_id']} - " . $e->getMessage() . "\n";
|
||||
$failed++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$pdo = null;
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Update DB selesai. OK: {$updated}, FAIL: {$failed}\n";
|
||||
|
||||
$end_time = microtime(true);
|
||||
$duration = $end_time - $start_time;
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Lama eksekusi: " . number_format($duration, 2) . " detik\n";
|
||||
|
||||
exit(0);
|
||||
|
||||
// ================================
|
||||
// CHILD: konek RouterOS & tulis file hasil
|
||||
// ================================
|
||||
function process_mikrotik_child(array $data, int $timeout_api, string $outfile): void
|
||||
{
|
||||
$ip = $data['ip_address'];
|
||||
$username = $data['username'];
|
||||
$password = $data['password'];
|
||||
$port = $data['port_api'];
|
||||
$board_id = $data['board_id'];
|
||||
|
||||
$API = new RouterosAPI();
|
||||
$API->debug = false;
|
||||
$API->timeout = $timeout_api;
|
||||
|
||||
$result = [
|
||||
'board_id' => $board_id,
|
||||
'status' => 'Disconnected',
|
||||
'pppa' => '',
|
||||
'hsa' => '',
|
||||
'board_name' => '',
|
||||
'uptime' => '',
|
||||
'ip' => $ip,
|
||||
];
|
||||
|
||||
if ($API->connect2($ip, $username, $password, $port)) {
|
||||
$pppoe_active = [];
|
||||
$pppoe_data = $API->comm("/ppp/active/print");
|
||||
if (is_array($pppoe_data)) {
|
||||
foreach ($pppoe_data as $item) {
|
||||
$name = $item['name'] ?? '';
|
||||
$addr = $item['address'] ?? '';
|
||||
if ($name !== '' && $addr !== '') {
|
||||
$pppoe_active[] = "{$name}_{$addr}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$hotspot_active = [];
|
||||
$hotspot_users = $API->comm("/ip/hotspot/user/print");
|
||||
if (is_array($hotspot_users)) {
|
||||
foreach ($hotspot_users as $item) {
|
||||
$user = $item['name'] ?? '';
|
||||
$comment = $item['comment'] ?? '';
|
||||
if ($user !== '' && strpos($comment, 'Login.') === 0) {
|
||||
$hotspot_active[] = "{$user}_" . substr($comment, 6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$sys = $API->comm("/system/resource/print");
|
||||
$board_name = '';
|
||||
$uptime = '';
|
||||
if (is_array($sys) && !empty($sys[0])) {
|
||||
$board_name = $sys[0]['board-name'] ?? '';
|
||||
$uptime = $sys[0]['uptime'] ?? '';
|
||||
}
|
||||
|
||||
$API->disconnect();
|
||||
|
||||
$result['status'] = 'Connected';
|
||||
$result['pppa'] = implode('|', $pppoe_active);
|
||||
$result['hsa'] = implode('|', $hotspot_active);
|
||||
$result['board_name'] = $board_name;
|
||||
$result['uptime'] = $uptime;
|
||||
|
||||
echo "[" . date('H:i:s') . "] [OK] {$ip}\n";
|
||||
} else {
|
||||
echo "[" . date('H:i:s') . "] [FAIL] {$ip}\n";
|
||||
}
|
||||
|
||||
file_put_contents($outfile, json_encode($result, JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
[2025-09-21 21:36:01] Tidak ada remote expired.
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
include "/www/wwwroot/bilspro/config/connect.php";
|
||||
include "/www/wwwroot/bilspro/config/routeros_api.class.php";
|
||||
include "/www/wwwroot/bilspro/controller/remoteModem.php";
|
||||
|
||||
// Kurangi 30 menit dari waktu sekarang
|
||||
$date = date('Y-m-d H:i:s', strtotime('-20 minutes'));
|
||||
|
||||
$stmt = $pdo->prepare("SELECT id_setting_mikrotik, remote_port
|
||||
FROM log_remote
|
||||
WHERE aktif_time <= :date
|
||||
LIMIT 1");
|
||||
$stmt->execute([':date' => $date]);
|
||||
|
||||
$data = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($data) {
|
||||
// Tutup remote yang sudah expired
|
||||
$remote = new RemoteModem($pdo);
|
||||
$result = $remote->remote_close($data['id_setting_mikrotik'], $data['remote_port']);
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Remote port " . $data['remote_port'] . " berhasil ditutup.\n";
|
||||
} else {
|
||||
// Tidak ada yang perlu dihapus
|
||||
echo "[" . date('Y-m-d H:i:s') . "] Tidak ada remote expired.\n";
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
[2025-09-20 23:50:02] 0 data telah dihapus. Data tersisa sejak 2025-08-01 00:00:00 sampai sekarang.
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
include "/www/wwwroot/bilspro/config/connect.php";
|
||||
|
||||
// Ambil tanggal awal bulan -1 (bulan sebelumnya)
|
||||
$date = date('Y-m-01 00:00:00', strtotime('-1 month'));
|
||||
|
||||
// Jalankan query DELETE
|
||||
$stmt = $pdo->prepare("DELETE FROM monitoring_pelanggan
|
||||
WHERE waktu < :date");
|
||||
$stmt->execute([':date' => $date]);
|
||||
|
||||
// Ambil jumlah data yang dihapus
|
||||
$delete = $stmt->rowCount();
|
||||
|
||||
// Tampilkan hasil
|
||||
echo "[" . date('Y-m-d H:i:s') . "] " . $delete . " data telah dihapus. Data tersisa sejak " . $date . " sampai sekarang.\n";
|
||||
@@ -0,0 +1 @@
|
||||
2025-09-21 21:30:06 ✅ Summary updated, rows affected: 1474
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
include "/www/wwwroot/bilspro/config/connect.php";
|
||||
|
||||
try {
|
||||
// Update / replace summary table
|
||||
$sql = "
|
||||
REPLACE INTO summary_transaksi_agen_bulanan
|
||||
|
||||
SELECT
|
||||
a.id_agen_voucher AS id_agen_voucher,
|
||||
a.id_data_server AS id_data_server,
|
||||
SUBSTR(a.generate_time, 1, 7) AS generate_time,
|
||||
SUM(a.debet) AS debet,
|
||||
SUM(a.kredit) AS kredit,
|
||||
(SUM(COALESCE(a.kredit, 0)) - SUM(COALESCE(a.debet, 0))) AS saldo,
|
||||
COUNT(DISTINCT (CASE WHEN (a.kredit IS NOT NULL) THEN a.id END)) AS jumlah_voucher,
|
||||
COUNT(DISTINCT (CASE WHEN (c.active_time IS NULL) THEN c.id END)) AS jumlah_voucher_belum_aktif,
|
||||
COUNT(DISTINCT (CASE WHEN (c.expaired_time > NOW()) THEN c.id END)) AS jumlah_voucher_aktif,
|
||||
COUNT(DISTINCT (CASE WHEN (c.expaired_time < NOW()) THEN c.id END)) AS jumlah_voucher_expaired
|
||||
FROM
|
||||
transaksi_agen_voucher a
|
||||
JOIN agen_voucher b ON (a.id_agen_voucher = b.id)
|
||||
LEFT JOIN ganerate_voucher c ON (a.id_ganerate_voucher = c.id)
|
||||
WHERE
|
||||
b.jenis_agen = 'Pascabayar'
|
||||
AND a.generate_time < DATE_FORMAT(CURDATE(), '%Y-%m-01')
|
||||
GROUP BY
|
||||
SUBSTR(a.generate_time, 1, 7),
|
||||
a.id_agen_voucher
|
||||
";
|
||||
|
||||
$affected = $pdo->exec($sql);
|
||||
echo date('Y-m-d H:i:s') . " ✅ Summary updated, rows affected: {$affected}\n";
|
||||
|
||||
} catch (PDOException $e) {
|
||||
echo date('Y-m-d H:i:s') . " ❌ Error: " . $e->getMessage() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user