up
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
/**
|
||||
* GET api/get_terms_acceptances.php
|
||||
* Lista paginada de aceptaciones de T&C con stats y filtros.
|
||||
*
|
||||
* Query params:
|
||||
* estado = aceptado | rechazado | pendiente (opcional)
|
||||
* fecha = YYYY-MM-DD (filtra por fecha de envío, día completo)
|
||||
* phone = string parcial o completo del número
|
||||
* page = int (default 1)
|
||||
* per_page = int (default 50, máx 200)
|
||||
*/
|
||||
|
||||
session_start();
|
||||
require_once __DIR__ . '/../config/config.php';
|
||||
|
||||
requireAuthentication();
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
try {
|
||||
$db = Database::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
// ── Parámetros ────────────────────────────────────────────────────────
|
||||
$estado = in_array($_GET['estado'] ?? '', ['aceptado', 'rechazado', 'pendiente'])
|
||||
? $_GET['estado'] : null;
|
||||
$fecha = !empty($_GET['fecha']) && preg_match('/^\d{4}-\d{2}-\d{2}$/', $_GET['fecha'])
|
||||
? $_GET['fecha'] : null;
|
||||
$phone = isset($_GET['phone']) ? trim($_GET['phone']) : '';
|
||||
$page = max(1, (int)($_GET['page'] ?? 1));
|
||||
$perPage = min(200, max(1, (int)($_GET['per_page'] ?? 50)));
|
||||
$offset = ($page - 1) * $perPage;
|
||||
|
||||
// ── WHERE ─────────────────────────────────────────────────────────────
|
||||
$where = [];
|
||||
$params = [];
|
||||
|
||||
if ($estado !== null) {
|
||||
$where[] = "ta.estado COLLATE utf8mb4_unicode_ci = :estado";
|
||||
$params[':estado'] = $estado;
|
||||
}
|
||||
if ($fecha !== null) {
|
||||
$where[] = 'DATE(ta.fecha_envio) = :fecha';
|
||||
$params[':fecha'] = $fecha;
|
||||
}
|
||||
if ($phone !== '') {
|
||||
$where[] = "ta.phone_number COLLATE utf8mb4_unicode_ci LIKE :phone";
|
||||
$params[':phone'] = '%' . $phone . '%';
|
||||
}
|
||||
|
||||
$whereClause = $where ? 'WHERE ' . implode(' AND ', $where) : '';
|
||||
|
||||
// ── Stats (sin filtro de paginación) ──────────────────────────────────
|
||||
$statsSQL = "
|
||||
SELECT
|
||||
COALESCE(SUM(ta.estado COLLATE utf8mb4_unicode_ci = 'aceptado'), 0) AS aceptado,
|
||||
COALESCE(SUM(ta.estado COLLATE utf8mb4_unicode_ci = 'rechazado'), 0) AS rechazado,
|
||||
COALESCE(SUM(ta.estado COLLATE utf8mb4_unicode_ci = 'pendiente'), 0) AS pendiente,
|
||||
COUNT(*) AS total
|
||||
FROM terms_acceptance ta
|
||||
$whereClause
|
||||
";
|
||||
$stmtStats = $pdo->prepare($statsSQL);
|
||||
$stmtStats->execute($params);
|
||||
$statsRow = $stmtStats->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
$stats = [
|
||||
'aceptado' => (int)($statsRow['aceptado'] ?? 0),
|
||||
'rechazado' => (int)($statsRow['rechazado'] ?? 0),
|
||||
'pendiente' => (int)($statsRow['pendiente'] ?? 0),
|
||||
];
|
||||
$total = (int)($statsRow['total'] ?? 0);
|
||||
|
||||
// ── Datos paginados ───────────────────────────────────────────────────
|
||||
$dataSQL = "
|
||||
SELECT
|
||||
ta.id,
|
||||
ta.phone_number,
|
||||
u.name AS user_name,
|
||||
ta.estado,
|
||||
tv.version AS terms_version,
|
||||
ta.fecha_envio,
|
||||
ta.fecha_respuesta
|
||||
FROM terms_acceptance ta
|
||||
LEFT JOIN users u ON u.phone_number COLLATE utf8mb4_unicode_ci = ta.phone_number COLLATE utf8mb4_unicode_ci
|
||||
LEFT JOIN terms_versions tv ON tv.id = ta.terms_version_id
|
||||
$whereClause
|
||||
ORDER BY ta.fecha_envio DESC
|
||||
LIMIT :limit OFFSET :offset
|
||||
";
|
||||
|
||||
$stmtData = $pdo->prepare($dataSQL);
|
||||
foreach ($params as $k => $v) {
|
||||
$stmtData->bindValue($k, $v);
|
||||
}
|
||||
$stmtData->bindValue(':limit', $perPage, PDO::PARAM_INT);
|
||||
$stmtData->bindValue(':offset', $offset, PDO::PARAM_INT);
|
||||
$stmtData->execute();
|
||||
$rows = $stmtData->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'data' => $rows,
|
||||
'stats' => $stats,
|
||||
'total' => $total,
|
||||
'page' => $page,
|
||||
'pages' => (int)ceil($total / $perPage),
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
|
||||
} catch (Exception $e) {
|
||||
http_response_code(500);
|
||||
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
||||
}
|
||||
Reference in New Issue
Block a user