153 lines
5.9 KiB
PHP
153 lines
5.9 KiB
PHP
<?php
|
|
/**
|
|
* modules/turnero/api/export_historial.php
|
|
* Exporta CSV del historial multi-día con los mismos filtros de get_historial.php
|
|
*
|
|
* GET ?fecha_desde=YYYY-MM-DD&fecha_hasta=YYYY-MM-DD&estado=...&lugar_id=...&prioridad_id=...&q=...
|
|
*/
|
|
require_once __DIR__ . '/_helpers.php';
|
|
|
|
requireTurnero();
|
|
requireMethod('GET');
|
|
|
|
$pdo = db();
|
|
|
|
// ── Parámetros ────────────────────────────────────────────────
|
|
$hoy = date('Y-m-d');
|
|
$hace7 = date('Y-m-d', strtotime('-6 days'));
|
|
|
|
$fechaDesde = trim($_GET['fecha_desde'] ?? '');
|
|
$fechaHasta = trim($_GET['fecha_hasta'] ?? '');
|
|
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fechaDesde)) $fechaDesde = $hace7;
|
|
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fechaHasta)) $fechaHasta = $hoy;
|
|
if ($fechaDesde > $fechaHasta) $fechaDesde = $fechaHasta;
|
|
|
|
$estadoFiltro = trim($_GET['estado'] ?? '');
|
|
$lugarId = (int)($_GET['lugar_id'] ?? 0);
|
|
$prioridadId = (int)($_GET['prioridad_id'] ?? 0);
|
|
$q = trim($_GET['q'] ?? '');
|
|
|
|
// ── WHERE ─────────────────────────────────────────────────────
|
|
$where = ['DATE(ses.fecha) BETWEEN ? AND ?'];
|
|
$binds = [$fechaDesde, $fechaHasta];
|
|
|
|
$estadosValidos = ['espera','en_recepcion','en_espera_lugar','en_servicio','finalizado','ausente','cancelado'];
|
|
if ($estadoFiltro && in_array($estadoFiltro, $estadosValidos, true)) {
|
|
$where[] = 't.estado = ?';
|
|
$binds[] = $estadoFiltro;
|
|
}
|
|
if ($lugarId > 0) {
|
|
$where[] = 't.lugar_destino_id = ?';
|
|
$binds[] = $lugarId;
|
|
}
|
|
if ($prioridadId > 0) {
|
|
$where[] = 't.prioridad_id = ?';
|
|
$binds[] = $prioridadId;
|
|
}
|
|
if ($q !== '') {
|
|
$where[] = '(t.codigo LIKE ? OR t.paciente_nombre LIKE ? OR pac.nombre_completo LIKE ?)';
|
|
$like = '%' . $q . '%';
|
|
$binds[] = $like;
|
|
$binds[] = $like;
|
|
$binds[] = $like;
|
|
}
|
|
|
|
$whereStr = 'WHERE ' . implode(' AND ', $where);
|
|
|
|
// ── Consulta ──────────────────────────────────────────────────
|
|
$sql = "
|
|
SELECT
|
|
ses.fecha AS fecha_sesion,
|
|
t.codigo,
|
|
t.numero,
|
|
p.codigo AS prioridad,
|
|
p.nombre AS prioridad_nombre,
|
|
COALESCE(pac.nombre_completo, t.paciente_nombre) AS paciente,
|
|
pac.numero_documento,
|
|
pac.tipo_documento,
|
|
t.paciente_cel AS celular,
|
|
l.nombre AS lugar,
|
|
t.estado,
|
|
t.creado_at,
|
|
t.llamado_recepcion_at,
|
|
t.inicio_recepcion_at,
|
|
t.fin_recepcion_at,
|
|
t.llamado_lugar_at,
|
|
t.inicio_lugar_at,
|
|
t.fin_lugar_at,
|
|
ROUND(TIMESTAMPDIFF(SECOND, t.creado_at,
|
|
COALESCE(t.inicio_recepcion_at, t.fin_recepcion_at)) / 60.0, 1) AS espera_recepcion_min,
|
|
ROUND(TIMESTAMPDIFF(SECOND, t.inicio_lugar_at,
|
|
COALESCE(t.fin_lugar_at, NOW())) / 60.0, 1) AS servicio_lugar_min,
|
|
sol.total_cobrado,
|
|
sol.metodo_pago
|
|
FROM turnero_turnos t
|
|
JOIN turnero_sesiones ses ON ses.id = t.sesion_id
|
|
JOIN turnero_prioridades p ON p.id = t.prioridad_id
|
|
LEFT JOIN turnero_lugares l ON l.id = t.lugar_destino_id
|
|
LEFT JOIN turnero_solicitudes sol ON sol.turno_id = t.id
|
|
LEFT JOIN lab_pacientes pac ON pac.id = sol.paciente_id
|
|
$whereStr
|
|
ORDER BY t.creado_at ASC";
|
|
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute($binds);
|
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// ── Nombre de archivo ─────────────────────────────────────────
|
|
$nombreArchivo = "historial_turnos_{$fechaDesde}_a_{$fechaHasta}.csv";
|
|
|
|
// ── Output ────────────────────────────────────────────────────
|
|
// Limpiar cualquier output previo antes de los headers
|
|
ob_clean();
|
|
|
|
header('Content-Type: text/csv; charset=utf-8');
|
|
header('Content-Disposition: attachment; filename="' . $nombreArchivo . '"');
|
|
header('Cache-Control: no-cache, no-store, must-revalidate');
|
|
header('Pragma: no-cache');
|
|
header('Expires: 0');
|
|
|
|
$out = fopen('php://output', 'w');
|
|
echo "\xEF\xBB\xBF"; // BOM UTF-8 para Excel
|
|
|
|
// Encabezados
|
|
$headers = [
|
|
'Fecha', 'Código', 'Número', 'Prioridad', 'Prioridad nombre',
|
|
'Paciente', 'Documento', 'Tipo doc.', 'Celular',
|
|
'Lugar', 'Estado',
|
|
'Creado', 'Llamado recepción', 'Inicio recepción', 'Fin recepción',
|
|
'Llamado lugar', 'Inicio lugar', 'Fin lugar',
|
|
'Espera recepción (min)', 'Servicio lugar (min)',
|
|
'Total cobrado', 'Método pago',
|
|
];
|
|
fputcsv($out, $headers, ',', '"');
|
|
|
|
$fechaCols = [
|
|
'creado_at','llamado_recepcion_at','inicio_recepcion_at','fin_recepcion_at',
|
|
'llamado_lugar_at','inicio_lugar_at','fin_lugar_at',
|
|
];
|
|
$fields = [
|
|
'fecha_sesion', 'codigo', 'numero', 'prioridad', 'prioridad_nombre',
|
|
'paciente', 'numero_documento', 'tipo_documento', 'celular',
|
|
'lugar', 'estado',
|
|
'creado_at', 'llamado_recepcion_at', 'inicio_recepcion_at', 'fin_recepcion_at',
|
|
'llamado_lugar_at', 'inicio_lugar_at', 'fin_lugar_at',
|
|
'espera_recepcion_min', 'servicio_lugar_min',
|
|
'total_cobrado', 'metodo_pago',
|
|
];
|
|
|
|
foreach ($rows as $row) {
|
|
$line = [];
|
|
foreach ($fields as $f) {
|
|
$v = $row[$f] ?? '';
|
|
if ($v && in_array($f, $fechaCols, true)) {
|
|
$v = date('d/m/Y H:i:s', strtotime($v));
|
|
}
|
|
$line[] = $v;
|
|
}
|
|
fputcsv($out, $line, ',', '"');
|
|
}
|
|
|
|
fclose($out);
|
|
exit;
|