224 lines
5.5 KiB
Plaintext
224 lines
5.5 KiB
Plaintext
<?php
|
|
require_once __DIR__ . '/../config/database.php';
|
|
|
|
set_time_limit(300);
|
|
|
|
$db = new Database();
|
|
$conn = $db->getConnection();
|
|
|
|
// 🔥 GROUP TEKNISI
|
|
$groupTeknisi = "120363427232707228@g.us";
|
|
|
|
// ======================
|
|
// 🔥 FUNCTION WA
|
|
// ======================
|
|
if (!function_exists('kirimWA')) {
|
|
function kirimWA($target, $pesan) {
|
|
if (!$target) return;
|
|
|
|
$token = "XjC9oSr4jECWG93JQRWf";
|
|
|
|
$data = [
|
|
"target" => $target,
|
|
"message" => $pesan,
|
|
];
|
|
|
|
$curl = curl_init();
|
|
|
|
curl_setopt_array($curl, [
|
|
CURLOPT_URL => "https://api.fonnte.com/send",
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_POST => true,
|
|
CURLOPT_POSTFIELDS => http_build_query($data),
|
|
CURLOPT_HTTPHEADER => [
|
|
"Authorization: $token"
|
|
],
|
|
CURLOPT_TIMEOUT => 10
|
|
]);
|
|
|
|
curl_exec($curl);
|
|
curl_close($curl);
|
|
}
|
|
}
|
|
|
|
// ======================
|
|
// 🔥 TEST MODE (OPSIONAL)
|
|
// ======================
|
|
$TEST_MODE = false;
|
|
|
|
// ======================
|
|
// 🔥 AMBIL DATA DARI DATABASE (JOIN HISTORY)
|
|
// ======================
|
|
$stmt = $conn->query("
|
|
SELECT
|
|
f.id,
|
|
f.name,
|
|
f.sn_onu,
|
|
f.latitude,
|
|
f.longitude,
|
|
f.customer_phone,
|
|
|
|
o.rx_power,
|
|
o.voltage,
|
|
o.updated_at
|
|
|
|
FROM ftth_items f
|
|
|
|
LEFT JOIN onu_daily_history o
|
|
ON o.sn = f.sn_onu
|
|
|
|
INNER JOIN item_types it
|
|
ON it.id = f.item_type_id
|
|
|
|
WHERE f.sn_onu IS NOT NULL
|
|
AND LOWER(it.name) = 'pelanggan'
|
|
");
|
|
|
|
$dataItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
foreach ($dataItems as $item) {
|
|
|
|
usleep(200000);
|
|
|
|
$sn = strtoupper(trim($item['sn_onu']));
|
|
$nama = $item['name'];
|
|
$lat = $item['latitude'];
|
|
$lng = $item['longitude'];
|
|
$phone = $item['customer_phone'];
|
|
|
|
// ======================
|
|
// 🔥 AMBIL RX & VOLT DARI DB
|
|
// ======================
|
|
$rx = isset($item['rx_power']) ? floatval($item['rx_power']) : null;
|
|
$volt = isset($item['voltage']) ? floatval($item['voltage']) : null;
|
|
|
|
if ($rx === null && $volt === null) {
|
|
continue;
|
|
}
|
|
|
|
// ======================
|
|
// 🔥 STATUS DETEKSI
|
|
// ======================
|
|
$isBadRx = ($rx !== null && $rx <= -25.99);
|
|
$isBadVolt = ($volt !== null && $volt < 3.29);
|
|
|
|
echo "DEBUG $sn | RX:$rx | Volt:$volt<br>";
|
|
|
|
if (!$isBadRx && !$isBadVolt) {
|
|
continue;
|
|
}
|
|
|
|
// ======================
|
|
// 🔥 CEK ANTI SPAM LOG
|
|
// ======================
|
|
$cek = $conn->prepare("
|
|
SELECT last_rx, last_voltage
|
|
FROM notif_device_log
|
|
WHERE sn = ?
|
|
");
|
|
$cek->execute([$sn]);
|
|
$last = $cek->fetch(PDO::FETCH_ASSOC);
|
|
|
|
$lastRx = $last['last_rx'] ?? null;
|
|
$lastVolt = $last['last_voltage'] ?? null;
|
|
|
|
$isChanged = ($lastRx != $rx || $lastVolt != $volt);
|
|
|
|
if (!$isChanged) {
|
|
continue;
|
|
}
|
|
|
|
// ======================
|
|
// 🔥 MAPS
|
|
// ======================
|
|
$maps = ($lat && $lng)
|
|
? "https://www.google.com/maps?q={$lat},{$lng}"
|
|
: "-";
|
|
|
|
// ======================
|
|
// 🔥 FORMAT NOMOR
|
|
// ======================
|
|
$phoneFix = null;
|
|
if ($phone) {
|
|
$phoneFix = preg_replace('/[^0-9]/', '', $phone);
|
|
if (substr($phoneFix, 0, 1) == '0') {
|
|
$phoneFix = '62' . substr($phoneFix, 1);
|
|
}
|
|
}
|
|
|
|
// ======================
|
|
// 🔥 NOTIFIKASI
|
|
// ======================
|
|
|
|
if ($isBadRx && $isBadVolt) {
|
|
|
|
kirimWA($phoneFix,
|
|
"🚨 *Gangguan Jaringan & Perangkat*\n\n" .
|
|
"Yth. {$nama},\n" .
|
|
"📉 RX: " . number_format($rx,2) . " dBm\n" .
|
|
"🔌 Volt: " . number_format($volt,2) . " V\n\n" .
|
|
"Gangguan pada jaringan & perangkat terdeteksi.\n" .
|
|
"Estimasi perbaikan ±2 jam.\n\n" .
|
|
"Mohon maaf 🙏"
|
|
);
|
|
|
|
kirimWA($groupTeknisi,
|
|
"🚨 *DOUBLE ISSUE*\n\n" .
|
|
"👤 {$nama}\n" .
|
|
"📉 RX: {$rx} dBm\n" .
|
|
"🔌 Volt: " . number_format($volt,2) . " V\n\n" .
|
|
"📡 Gangguan IKR + ONU\n" .
|
|
"📍 {$maps}\n\n" .
|
|
"⚠ PRIORITAS TINGGI"
|
|
);
|
|
|
|
} elseif ($isBadRx) {
|
|
|
|
kirimWA($phoneFix,
|
|
"🚨 *Gangguan Jaringan*\n\n" .
|
|
"Yth. {$nama},\n" .
|
|
"📉 RX: {$rx} dBm\n\n" .
|
|
"Terjadi gangguan pada jalur fiber.\n" .
|
|
"Tim akan segera ke lokasi.\n"
|
|
);
|
|
|
|
kirimWA($groupTeknisi,
|
|
"🚨 *REDAMAN TIDAK NORMAL*\n\n" .
|
|
"👤 {$nama}\n" .
|
|
"📉 RX: {$rx} dBm\n" .
|
|
"📍 {$maps}"
|
|
);
|
|
|
|
} elseif ($isBadVolt) {
|
|
|
|
kirimWA($phoneFix,
|
|
"⚡ *Perangkat Bermasalah*\n\n" .
|
|
"Yth. {$nama},\n" .
|
|
"🔌 Volt: " . number_format($volt,2) . " V\n\n" .
|
|
"Indikasi power tidak stabil.\n"
|
|
);
|
|
|
|
kirimWA($groupTeknisi,
|
|
"⚡ *VOLTAGE TIDAK NORMAL*\n\n" .
|
|
"👤 {$nama}\n" .
|
|
"🔌 Volt: " . number_format($volt,2) . " V\n" .
|
|
"📍 {$maps}"
|
|
);
|
|
}
|
|
|
|
// ======================
|
|
// 🔥 UPDATE LOG ANTI SPAM
|
|
// ======================
|
|
$update = $conn->prepare("
|
|
INSERT INTO notif_device_log (sn, last_rx, last_voltage, last_sent)
|
|
VALUES (?, ?, ?, NOW())
|
|
ON DUPLICATE KEY UPDATE
|
|
last_rx = VALUES(last_rx),
|
|
last_voltage = VALUES(last_voltage),
|
|
last_sent = NOW()
|
|
");
|
|
|
|
$update->execute([$sn, $rx, $volt]);
|
|
|
|
echo "✅ SENT $sn | RX:$rx | V:$volt<br>";
|
|
} |