126 lines
4.6 KiB
PHP
126 lines
4.6 KiB
PHP
<?php
|
|
/**
|
|
* modules/turnero/api/export_csv.php
|
|
* GET ?fecha=YYYY-MM-DD → descarga CSV con todos los turnos del día
|
|
*/
|
|
require_once __DIR__ . '/_helpers.php';
|
|
|
|
requireTurnero();
|
|
|
|
$fecha = trim($_GET['fecha'] ?? '');
|
|
if ($fecha === '' || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha)) {
|
|
$fecha = date('Y-m-d');
|
|
}
|
|
|
|
$pdo = db();
|
|
|
|
// Buscar sesión del día
|
|
$stmtS = $pdo->prepare('SELECT id FROM turnero_sesiones WHERE fecha = ? LIMIT 1');
|
|
$stmtS->execute([$fecha]);
|
|
$sesion = $stmtS->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$sesion) {
|
|
// Sin sesión: CSV vacío con encabezado
|
|
header('Content-Type: text/csv; charset=utf-8');
|
|
header('Content-Disposition: attachment; filename="turnero_' . $fecha . '.csv"');
|
|
echo "\xEF\xBB\xBF"; // BOM UTF-8 para Excel
|
|
echo "Sin datos para la fecha {$fecha}\n";
|
|
exit;
|
|
}
|
|
|
|
$sesionId = (int)$sesion['id'];
|
|
|
|
$stmt = $pdo->prepare(
|
|
"SELECT
|
|
t.codigo,
|
|
t.numero,
|
|
p.codigo AS prioridad,
|
|
p.nombre AS prioridad_nombre,
|
|
COALESCE(s.nombre_completo, t.paciente_nombre) AS paciente,
|
|
s.numero_documento,
|
|
s.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, NOW())) / 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,
|
|
GROUP_CONCAT(et.nombre ORDER BY et.nombre SEPARATOR ' | ') AS examenes,
|
|
SUM(CASE WHEN tc.estado = 'firmado' THEN 1 ELSE 0 END) AS consent_firmados,
|
|
SUM(CASE WHEN tc.estado = 'pendiente' THEN 1 ELSE 0 END) AS consent_pendientes
|
|
FROM turnero_turnos t
|
|
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 s ON s.id = sol.paciente_id
|
|
LEFT JOIN turnero_examen_items tei ON tei.solicitud_id = sol.id
|
|
LEFT JOIN exam_tipos et ON et.id = tei.exam_tipo_id
|
|
LEFT JOIN turnero_consentimientos tc ON tc.turno_id = t.id
|
|
WHERE t.sesion_id = ?
|
|
GROUP BY t.id
|
|
ORDER BY t.numero ASC"
|
|
);
|
|
$stmt->execute([$sesionId]);
|
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// ── Encabezados CSV ───────────────────────────────────────────
|
|
$headers = [
|
|
'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',
|
|
'Exámenes',
|
|
'Consentimientos firmados', 'Consentimientos pendientes',
|
|
];
|
|
|
|
$fields = [
|
|
'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',
|
|
'examenes',
|
|
'consent_firmados', 'consent_pendientes',
|
|
];
|
|
|
|
// ── Output ────────────────────────────────────────────────────
|
|
header('Content-Type: text/csv; charset=utf-8');
|
|
header('Content-Disposition: attachment; filename="turnero_' . $fecha . '.csv"');
|
|
header('Cache-Control: no-cache, no-store, must-revalidate');
|
|
|
|
$out = fopen('php://output', 'w');
|
|
echo "\xEF\xBB\xBF"; // BOM UTF-8 para Excel
|
|
|
|
fputcsv($out, $headers, ',', '"');
|
|
|
|
foreach ($rows as $row) {
|
|
$line = [];
|
|
foreach ($fields as $f) {
|
|
$v = $row[$f] ?? '';
|
|
// Formatear fechas: quitar segundos fraccionarios si los hay
|
|
if ($v && in_array($f, ['creado_at','llamado_recepcion_at','inicio_recepcion_at','fin_recepcion_at','llamado_lugar_at','inicio_lugar_at','fin_lugar_at'])) {
|
|
$v = $v ? date('d/m/Y H:i:s', strtotime($v)) : '';
|
|
}
|
|
$line[] = $v ?? '';
|
|
}
|
|
fputcsv($out, $line, ',', '"');
|
|
}
|
|
|
|
fclose($out);
|
|
exit;
|