124 lines
3.7 KiB
PHP
124 lines
3.7 KiB
PHP
<?php
|
|
/**
|
|
* API - Exportar conversaciones a CSV
|
|
*/
|
|
|
|
require_once '../config/config.php';
|
|
|
|
// Verificar autenticación
|
|
requireAuthentication();
|
|
|
|
// Parámetros de filtro opcionales
|
|
$phone = trim($_GET['phone'] ?? '');
|
|
$direction = trim($_GET['direction'] ?? ''); // incoming | outgoing | ''
|
|
$dateFrom = trim($_GET['date_from'] ?? '');
|
|
$dateTo = trim($_GET['date_to'] ?? '');
|
|
|
|
// Construir WHERE
|
|
$where = [];
|
|
$params = [];
|
|
|
|
if ($phone !== '') {
|
|
$where[] = 'u.phone_number LIKE :phone';
|
|
$params[':phone'] = '%' . $phone . '%';
|
|
}
|
|
if (in_array($direction, ['incoming', 'outgoing'], true)) {
|
|
$where[] = 'c.direction = :direction';
|
|
$params[':direction'] = $direction;
|
|
}
|
|
if ($dateFrom !== '') {
|
|
$where[] = 'c.created_at >= :date_from';
|
|
$params[':date_from'] = $dateFrom . ' 00:00:00';
|
|
}
|
|
if ($dateTo !== '') {
|
|
$where[] = 'c.created_at <= :date_to';
|
|
$params[':date_to'] = $dateTo . ' 23:59:59';
|
|
}
|
|
|
|
$whereSQL = $where ? ('WHERE ' . implode(' AND ', $where)) : '';
|
|
|
|
// Nombre de archivo dinámico
|
|
$filename = 'conversaciones_' . date('Y-m-d');
|
|
if ($dateFrom || $dateTo) $filename .= '_' . ($dateFrom ?: 'inicio') . '_a_' . ($dateTo ?: 'hoy');
|
|
$filename .= '.csv';
|
|
|
|
// Headers para descarga
|
|
header('Content-Type: text/csv; charset=utf-8');
|
|
header('Content-Disposition: attachment; filename="' . $filename . '"');
|
|
header('Cache-Control: no-cache, must-revalidate');
|
|
|
|
try {
|
|
$db = Database::getInstance();
|
|
$pdo = $db->getConnection();
|
|
|
|
$sql = "
|
|
SELECT
|
|
c.id AS id,
|
|
u.phone_number AS telefono,
|
|
COALESCE(u.name, 'Sin nombre') AS nombre_usuario,
|
|
c.direction AS direccion,
|
|
c.message_type AS tipo_mensaje,
|
|
c.status AS estado,
|
|
CASE WHEN c.is_read = 1 THEN 'Sí' ELSE 'No' END AS leido,
|
|
REPLACE(REPLACE(COALESCE(c.content,''), '\r\n', ' '), '\n', ' ')
|
|
AS contenido,
|
|
c.media_url AS url_media,
|
|
c.filename AS archivo,
|
|
c.created_at AS fecha_hora
|
|
FROM conversations c
|
|
INNER JOIN users u ON u.id = c.user_id
|
|
$whereSQL
|
|
ORDER BY c.created_at DESC
|
|
LIMIT 50000
|
|
";
|
|
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute($params);
|
|
|
|
$output = fopen('php://output', 'w');
|
|
|
|
// BOM UTF-8 para compatibilidad con Excel
|
|
fprintf($output, chr(0xEF) . chr(0xBB) . chr(0xBF));
|
|
|
|
// Encabezados CSV
|
|
fputcsv($output, [
|
|
'ID',
|
|
'Teléfono',
|
|
'Nombre Usuario',
|
|
'Dirección',
|
|
'Tipo Mensaje',
|
|
'Estado',
|
|
'Leído',
|
|
'Contenido',
|
|
'URL Media',
|
|
'Archivo',
|
|
'Fecha y Hora',
|
|
], ';');
|
|
|
|
// Filas
|
|
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
|
fputcsv($output, [
|
|
$row['id'],
|
|
$row['telefono'],
|
|
$row['nombre_usuario'],
|
|
$row['direccion'],
|
|
$row['tipo_mensaje'],
|
|
$row['estado'],
|
|
$row['leido'],
|
|
$row['contenido'],
|
|
$row['url_media'] ?? '',
|
|
$row['archivo'] ?? '',
|
|
$row['fecha_hora'] ? date('d/m/Y H:i:s', strtotime($row['fecha_hora'])) : '',
|
|
], ';');
|
|
}
|
|
|
|
fclose($output);
|
|
|
|
} catch (Exception $e) {
|
|
error_log('export_conversations.php error: ' . $e->getMessage());
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
header('Content-Disposition: inline');
|
|
http_response_code(500);
|
|
echo json_encode(['error' => 'Error al exportar conversaciones']);
|
|
}
|