Files
whatsapp/api/get_terms_acceptances.php
T
2026-03-10 18:42:51 -05:00

115 lines
4.3 KiB
PHP

<?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()]);
}