prepare("SELECT id, hsa, nama FROM setting_mikrotik WHERE hsa != '' AND status = 'Connected'"); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); if (!$rows) { echo "Tidak ada data HSA untuk diproses.\n"; exit; } foreach ($rows as $row) { $id_mikrotik = $row['id']; $hsa_raw = rtrim($row['hsa'], "|"); $entries = explode('|', $hsa_raw); // Mapping data Hotspot (Voucher => RawTime) $hotspot_active = []; foreach ($entries as $entry) { $parts = explode('_', $entry); if (count($parts) >= 2) { // Bersihkan karakter titik yang sering muncul di MikroTik lama $cleanTime = str_replace('.', ' ', trim($parts[1])); $hotspot_active[$parts[0]] = $cleanTime; } } // 2. Ambil voucher yang belum aktif $stmtPel = $pdo->prepare("SELECT id, voucher, durasi FROM v_ganerate_voucher WHERE id_setting_mikrotik = :id AND active_time IS NULL"); $stmtPel->execute([':id' => $id_mikrotik]); $vouchers = $stmtPel->fetchAll(PDO::FETCH_ASSOC); if (empty($vouchers)) continue; echo "---[ " . date('Y-m-d H:i:s') . " ]---\n"; echo "--- Mengolah MikroTik: {$row['nama']} (" . count($vouchers) . " voucher) ---\n"; $pdo->beginTransaction(); try { $stmtUpdate = $pdo->prepare("UPDATE ganerate_voucher SET active_time = :at, expaired_time = :et WHERE id = :id"); $countUpdate = 0; foreach ($vouchers as $v) { $kode = $v['voucher']; if (isset($hotspot_active[$kode])) { $rawTime = $hotspot_active[$kode]; $activetime = null; // LOGIKA PARSING WAKTU MULTI-FORMAT if (preg_match('/^\d{4}-\d{2}-\d{2}/', $rawTime)) { // Format: 2026-03-13 21:15:25 $activetime = $rawTime; } else { // Format: mar/13/2026 21:12:57 atau may/25/2024 $dateObj = date_create($rawTime); if ($dateObj) { $activetime = $dateObj->format("Y-m-d H:i:s"); } } if ($activetime) { // Hitung Masa Aktif $durasi = strtoupper($v['durasi']); $unit = substr($durasi, -1); $val = rtrim($durasi, $unit); // Interval Format: Jam (H) -> PT...H, Hari (D) -> P...D, Bulan (M) -> P...M $intervalStr = ($unit == 'H') ? "PT{$val}H" : "P{$val}{$unit}"; try { $tgl = new DateTime($activetime); $tgl->add(new DateInterval($intervalStr)); $expired = $tgl->format('Y-m-d H:i:s'); $stmtUpdate->execute([ ':at' => $activetime, ':et' => $expired, ':id' => $v['id'] ]); $countUpdate++; } catch (Exception $e) { continue; } } } } $pdo->commit(); echo "Sukses Update: $countUpdate voucher.\n"; } catch (Exception $e) { $pdo->rollBack(); echo "Gagal pada MikroTik ini: " . $e->getMessage() . "\n"; } }