132 lines
4.3 KiB
PHP
132 lines
4.3 KiB
PHP
<?php
|
|
ini_set('display_errors', 1);
|
|
error_reporting(E_ALL);
|
|
|
|
include __DIR__ . "/../config/connect.php"; // koneksi DB
|
|
|
|
try {
|
|
$potonganPersen = 10; // Potongan 10%
|
|
$potongan = $potonganPersen / 100; // Konversi ke desimal (0.1)
|
|
|
|
// Ambil parameter DataTables
|
|
$draw = intval($_GET['draw'] ?? 1);
|
|
$start = intval($_GET['start'] ?? 0);
|
|
$length = intval($_GET['length'] ?? 10);
|
|
$searchValue = $_GET['search']['value'] ?? '';
|
|
$svid = $_GET['i'] ?? '';
|
|
$statusFilter = $_GET['s'] ?? '';
|
|
|
|
// Kolom yang bisa diurutkan
|
|
$columns = ['nama_server', 'voucher', 'harga', 'status', 'create_time', 'active_time', 'expaired_time'];
|
|
$orderColumnIndex = $_GET['order'][0]['column'] ?? 0;
|
|
$orderColumnDir = $_GET['order'][0]['dir'] ?? 'desc';
|
|
$orderColumn = $columns[$orderColumnIndex] ?? 'create_time';
|
|
|
|
// Kondisi dasar (statis)
|
|
$baseCondition = "id_data_server IN (".$svid.") AND status = '" . $statusFilter . "'";
|
|
|
|
// Hitung total data
|
|
$totalQuery = $pdo->query("SELECT COUNT(*) FROM v_generate_voucher_manual WHERE $baseCondition");
|
|
$totalRecords = $totalQuery->fetchColumn();
|
|
|
|
// Query data + search
|
|
$sql = "SELECT *
|
|
FROM v_generate_voucher_manual
|
|
WHERE $baseCondition";
|
|
$params = [];
|
|
|
|
if (!empty($searchValue)) {
|
|
$sql .= " AND (
|
|
nama_server LIKE :search OR
|
|
nama_mikrotik LIKE :search OR
|
|
create_time LIKE :search OR
|
|
voucher LIKE :search OR
|
|
jenis LIKE :search OR
|
|
active_time LIKE :search OR
|
|
expaired_time LIKE :search
|
|
)";
|
|
$params[':search'] = "%$searchValue%";
|
|
}
|
|
|
|
// Hitung total setelah filter
|
|
$filteredSql = str_replace(
|
|
"SELECT *",
|
|
"SELECT COUNT(*)",
|
|
$sql
|
|
);
|
|
$stmtFiltered = $pdo->prepare($filteredSql);
|
|
$stmtFiltered->execute($params);
|
|
$filteredRecords = $stmtFiltered->fetchColumn();
|
|
|
|
// Tambahkan ORDER BY dan LIMIT
|
|
$sql .= " ORDER BY $orderColumn $orderColumnDir LIMIT :start, :length";
|
|
$stmt = $pdo->prepare($sql);
|
|
|
|
// Binding parameter
|
|
foreach ($params as $key => $value) {
|
|
$stmt->bindValue($key, $value);
|
|
}
|
|
$stmt->bindValue(':start', $start, PDO::PARAM_INT);
|
|
$stmt->bindValue(':length', $length, PDO::PARAM_INT);
|
|
|
|
$stmt->execute();
|
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Hitung biaya & saldo, lalu format angka
|
|
$data = [];
|
|
foreach ($rows as $row) {
|
|
$harga = floatval($row['harga']);
|
|
if (($row['jenis'] === 'api-pw' || $row['jenis'] === 'rad-api-pw') && $row['status'] == 'LUNAS') {
|
|
$biaya = $harga * $potongan;
|
|
$active = $row['active_time'];
|
|
$expired = $row['expaired_time'];
|
|
$saldo = $harga - $biaya;
|
|
} else {
|
|
if (($row['jenis'] != 'api-pw' || $row['jenis'] != 'rad-api-pw') && $row['status'] == NULL) {
|
|
$biaya = 0; // Tidak ada biaya jika bukan sv-radius
|
|
$active = $row['active_time'];
|
|
$expired = $row['expaired_time'];
|
|
$saldo = 0;
|
|
} else {
|
|
$biaya = 0; // Tidak ada biaya jika bukan sv-radius
|
|
$active = "";
|
|
$expired = "";
|
|
$saldo = 0;
|
|
}
|
|
}
|
|
|
|
|
|
$data[] = [
|
|
$row['nama_server'] . '<br>' . $row['nama_mikrotik'],
|
|
$row['voucher'],
|
|
number_format((float)$harga, 0, ',', '.'),
|
|
number_format((float)$biaya, 0, ',', '.'),
|
|
number_format((float)$saldo, 0, ',', '.'),
|
|
// number_format($harga), // harga
|
|
// number_format($biaya), // biaya
|
|
// number_format($saldo), // saldo
|
|
$row['jenis'] . '<br>' . $row['status'],
|
|
$row['create_time'],
|
|
$active,
|
|
$expired,
|
|
];
|
|
}
|
|
|
|
// Kirim response JSON ke DataTables
|
|
$response = [
|
|
"draw" => $draw,
|
|
"recordsTotal" => $totalRecords,
|
|
"recordsFiltered" => $filteredRecords,
|
|
"data" => $data,
|
|
];
|
|
|
|
header('Content-Type: application/json');
|
|
echo json_encode($response);
|
|
} catch (Exception $e) {
|
|
// Tangani error
|
|
header('Content-Type: application/json');
|
|
echo json_encode([
|
|
"error" => $e->getMessage()
|
|
]);
|
|
}
|