prepare($sqlFiltered); $stmt->execute($params); $totalFiltered = (int)$stmt->fetchColumn(); // ===================== // TOTAL TANPA SEARCH // ===================== $whereNoSearch = []; $paramsNoSearch = []; // wajib $whereNoSearch[] = "v_tagihan.transaction_id IS NOT NULL"; // status if ($status !== 'ALL' && !empty($status)) { $whereNoSearch[] = "payment_winpay.status = ?"; $paramsNoSearch[] = $status; } // server if (!empty($idsv)) { $ids = explode(',', $idsv); $ids = array_filter($ids, 'is_numeric'); if (!empty($ids)) { $placeholder = implode(',', array_fill(0, count($ids), '?')); $whereNoSearch[] = "v_tagihan.id_data_server IN ($placeholder)"; foreach ($ids as $id) { $paramsNoSearch[] = $id; } } } // marketing if (!empty($idmsv) && is_numeric($idmsv)) { $whereNoSearch[] = "v_tagihan.id_marketing = ?"; $paramsNoSearch[] = $idmsv; } // tanggal if (!empty($startDate) && !empty($endDate)) { $whereNoSearch[] = "DATE(payment_winpay.created_at) BETWEEN ? AND ?"; $paramsNoSearch[] = $startDate; $paramsNoSearch[] = $endDate; } $whereNoSearchSql = ''; if (!empty($whereNoSearch)) { $whereNoSearchSql = 'WHERE ' . implode(' AND ', $whereNoSearch); } $sqlTotal = " SELECT COUNT(*) $from $whereNoSearchSql "; $stmt = $pdo->prepare($sqlTotal); $stmt->execute($paramsNoSearch); $total = (int)$stmt->fetchColumn(); // ===================== // DATA // ===================== $sql = " SELECT v_tagihan.nama, v_tagihan.akun, v_tagihan.alamat, v_tagihan.keterangan, v_tagihan.nama_paket, v_tagihan.nama_server, v_tagihan.nama_marketing, v_tagihan.nomor_whatsapp, payment_winpay.id, payment_winpay.trx_id, payment_winpay.channel, payment_winpay.status, payment_winpay.created_at, payment_winpay.paid_at, CAST(payment_winpay.amount AS UNSIGNED) as amount, CAST(payment_winpay.fee AS UNSIGNED) as fee, CAST(payment_winpay.nett AS UNSIGNED) as nett $from $whereSql ORDER BY payment_winpay.created_at DESC LIMIT ?, ? "; $stmt = $pdo->prepare($sql); // bind semua filter $bindIndex = 1; foreach ($params as $param) { $stmt->bindValue($bindIndex++, $param); } // limit $stmt->bindValue($bindIndex++, $start, PDO::PARAM_INT); $stmt->bindValue($bindIndex++, $length, PDO::PARAM_INT); $stmt->execute(); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // ===================== // SUMMARY KHUSUS PAID // ===================== $whereSummary = []; $paramsSummary = []; // wajib $whereSummary[] = "v_tagihan.transaction_id IS NOT NULL"; // server if (!empty($idsv)) { $ids = explode(',', $idsv); $ids = array_filter($ids, 'is_numeric'); if (!empty($ids)) { $placeholder = implode(',', array_fill(0, count($ids), '?')); $whereSummary[] = "v_tagihan.id_data_server IN ($placeholder)"; foreach ($ids as $id) { $paramsSummary[] = $id; } } } // marketing if (!empty($idmsv) && is_numeric($idmsv)) { $whereSummary[] = "v_tagihan.id_marketing = ?"; $paramsSummary[] = $idmsv; } // tanggal if (!empty($startDate) && !empty($endDate)) { $whereSummary[] = "DATE(payment_winpay.created_at) BETWEEN ? AND ?"; $paramsSummary[] = $startDate; $paramsSummary[] = $endDate; } // khusus PAID $whereSummary[] = "payment_winpay.status = 'PAID'"; $whereSummarySql = 'WHERE ' . implode(' AND ', $whereSummary); // ===================== // QUERY SUMMARY // ===================== $sqlSummary = " SELECT CAST(COALESCE(SUM(payment_winpay.amount),0) AS UNSIGNED) as total_amount, CAST(COALESCE(SUM(payment_winpay.fee),0) AS UNSIGNED) as total_fee, CAST(COALESCE(SUM(payment_winpay.nett),0) AS UNSIGNED) as total_nett $from $whereSummarySql "; $stmt = $pdo->prepare($sqlSummary); $stmt->execute($paramsSummary); $summary = $stmt->fetch(PDO::FETCH_ASSOC); // ===================== // OUTPUT // ===================== echo json_encode([ "draw" => $draw, "recordsTotal" => $total, "recordsFiltered" => $totalFiltered, "data" => $data, "summary" => [ "total_amount" => (int)($summary['total_amount'] ?? 0), "total_fee" => (int)($summary['total_fee'] ?? 0), "total_nett" => (int)($summary['total_nett'] ?? 0) ] ]);