Generate Voucher Auto Pilot

beginTransaction(); // Ambil data paket $stmt = $pdo->prepare("SELECT radius_data,durasi,nama_profile,harga_paket FROM profile_paket WHERE id = :idp"); $stmt->execute([':idp' => $_POST['idp']]); $paket = $stmt->fetch(PDO::FETCH_ASSOC); // ====== KIRIM KE API MIKROTIK ====== $stmt = $pdo->prepare("SELECT ip_address,username,password,port_api,radius_nas_data FROM setting_mikrotik WHERE id = :id"); $stmt->execute([':id' => $_POST['idm']]); $mikrotik = $stmt->fetch(PDO::FETCH_ASSOC); $dataMik = json_decode($mikrotik['radius_nas_data']); if (!$paket) { throw new Exception("Paket tidak ditemukan."); } $data = json_decode($paket['radius_data']); $kode = $data ? 'VR' : 'VM'; // VR = Radius, VM = MikroTik $jenis = $data ? 'sv-radius' : 'sv-mikrotik'; $karakter = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm"; $str = $paket['durasi']; $jumlah = intval($_POST['jumlah']); $date = date('Y-m-d H:i:s'); // Validasi jumlah if ($jumlah < 1 || $jumlah > 200) { throw new Exception("Jumlah voucher harus antara 1-200."); } // Generate voucher unik $voucherList = []; while (count($voucherList) < $jumlah) { $kodevoucher = $str . substr(str_shuffle($karakter), 0, 7) . $kode; // Pastikan tidak duplikat di DB & array $cek = $pdo->prepare("SELECT COUNT(*) FROM ganerate_voucher WHERE voucher = :voucher"); $cek->execute([':voucher' => $kodevoucher]); if ($cek->fetchColumn() == 0 && !in_array($kodevoucher, $voucherList)) { $voucherList[] = $kodevoucher; } } // Kirim ke Radius atau MikroTik $successVoucher = []; $failVoucher = []; if ($data) { // ====== KIRIM KE RADIUS ====== $radius = new CrudRadiusServer(); $apiResponse = $radius->request('add_user', 'POST', [ 'jenis' => 'Hotspot', 'username' => $voucherList, 'password' => $voucherList, 'groupname' => $data->groupname, 'nasgroupname' => $dataMik->data->{'nasgroupname'} ]); foreach ($apiResponse['results'] as $res) { if ($res['status'] === 'success') { $successVoucher[] = $res['username']; } else { $failVoucher[] = $res['username']; } } if (empty($successVoucher)) { throw new Exception("Tidak ada voucher yang berhasil dibuat di Radius."); } } else { require('router_api/routeros_api.class.php'); $API = new RouterosAPI(); $API->debug = false; if (!$API->connect2($mikrotik['ip_address'], $mikrotik['username'], $mikrotik['password'], $mikrotik['port_api'])) { throw new Exception("Gagal konek ke API MikroTik."); } foreach ($voucherList as $vcr) { $result = $API->comm('/ip/hotspot/user/add', [ "name" => $vcr, "password" => $vcr, "profile" => $paket['nama_profile'], // pastikan field profile ada di DB "server" => "all" ]); if (isset($result['!trap'])) { $failVoucher[] = $vcr; } else { $successVoucher[] = $vcr; } } $API->disconnect(); if (empty($successVoucher)) { throw new Exception("Tidak ada voucher yang berhasil dibuat di MikroTik."); } } // Insert ke DB hanya yang sukses $values = []; $params = []; foreach ($successVoucher as $voucher) { $values[] = "(?, ?, ?, ?, ?, ?, ?)"; $params[] = $_POST['ids']; // id_data_server $params[] = $_POST['idm']; // id_setting_mikrotik $params[] = $_POST['idp']; // id_profile_paket $params[] = $voucher; // voucher $params[] = $paket['harga_paket']; // harga $params[] = $jenis; // jenis $params[] = $date; // create_time } $sql = "INSERT INTO ganerate_voucher (id_data_server, id_setting_mikrotik, id_profile_paket, voucher, harga, jenis, create_time) VALUES " . implode(", ", $values); $stmt = $pdo->prepare($sql); $stmt->execute($params); // Commit transaksi $pdo->commit(); $totalSuccess = count($successVoucher); $totalError = count($failVoucher); sweetAlert("$totalSuccess voucher berhasil dibuat. Gagal: $totalError", "success"); } catch (Exception $e) { $pdo->rollBack(); // sweetAlert("Gagal membuat voucher: " . $e->getMessage(), "error"); } } ?>

Akumulasi Keuangan Voucher

0

Total Penjualan

0

Saldo Ditahan

0

Saldo Tersedia

set_list("setting_mikrotik", $SqlDataWHId); ?>
Mikrotik
Login Page Script
    Loading script...
  

Voucher List

Server Voucher Harga Biaya Saldo Status Dibuat Aktif Expired