85 lines
2.8 KiB
PHP
85 lines
2.8 KiB
PHP
<?php
|
|
/**
|
|
* API: Reporte de domicilios agrupado por enfermero, año y mes.
|
|
*
|
|
* GET params (todos opcionales):
|
|
* anio Año a filtrar (ej. 2026). Si se omite, devuelve todos.
|
|
* mes Mes 1-12. Sólo funciona junto con anio.
|
|
* enfermera_id ID de la enfermera. Si se omite, devuelve todas.
|
|
*/
|
|
require_once __DIR__ . '/../../config/config.php';
|
|
require_once __DIR__ . '/../../classes/Database.php';
|
|
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
header('X-Content-Type-Options: nosniff');
|
|
|
|
requireAuthentication();
|
|
|
|
$db = Database::getInstance();
|
|
|
|
$anio = isset($_GET['anio']) && ctype_digit($_GET['anio']) ? (int)$_GET['anio'] : null;
|
|
$mes = isset($_GET['mes']) && ctype_digit($_GET['mes']) ? (int)$_GET['mes'] : null;
|
|
$enfermeraId = isset($_GET['enfermera_id'])&& ctype_digit($_GET['enfermera_id']) ? (int)$_GET['enfermera_id']: null;
|
|
|
|
$wheres = [];
|
|
$params = [];
|
|
|
|
if ($anio !== null) {
|
|
$wheres[] = 'YEAR(d.fecha_programada) = ?';
|
|
$params[] = $anio;
|
|
if ($mes !== null) {
|
|
$wheres[] = 'MONTH(d.fecha_programada) = ?';
|
|
$params[] = $mes;
|
|
}
|
|
}
|
|
|
|
if ($enfermeraId !== null) {
|
|
$wheres[] = 'e.id = ?';
|
|
$params[] = $enfermeraId;
|
|
}
|
|
|
|
$where = $wheres ? 'WHERE ' . implode(' AND ', $wheres) : '';
|
|
|
|
$filas = $db->fetchAll(
|
|
"SELECT
|
|
e.id AS enfermera_id,
|
|
e.nombre_completo AS enfermera,
|
|
YEAR(d.fecha_programada) AS anio,
|
|
MONTH(d.fecha_programada) AS mes,
|
|
COUNT(*) AS total,
|
|
SUM(d.estado = 'completado') AS completados,
|
|
SUM(d.estado = 'cancelado') AS cancelados,
|
|
SUM(d.estado NOT IN ('completado','cancelado')) AS en_proceso
|
|
FROM lab_domicilios d
|
|
JOIN lab_asignaciones a ON a.domicilio_id = d.id
|
|
AND a.estado NOT IN ('liberada')
|
|
JOIN lab_enfermeras e ON e.id = a.enfermera_id
|
|
$where
|
|
GROUP BY e.id, YEAR(d.fecha_programada), MONTH(d.fecha_programada)
|
|
ORDER BY e.nombre_completo, YEAR(d.fecha_programada) DESC, MONTH(d.fecha_programada) DESC",
|
|
$params
|
|
);
|
|
|
|
$meses_es = [
|
|
1=>'Ene',2=>'Feb',3=>'Mar',4=>'Abr',5=>'May',6=>'Jun',
|
|
7=>'Jul',8=>'Ago',9=>'Sep',10=>'Oct',11=>'Nov',12=>'Dic',
|
|
];
|
|
|
|
foreach ($filas as &$f) {
|
|
$t = (int)$f['total'];
|
|
$f['tasa_pct'] = $t ? round((int)$f['completados'] / $t * 100) : 0;
|
|
$f['mes_nombre'] = $meses_es[(int)$f['mes']] ?? $f['mes'];
|
|
}
|
|
unset($f);
|
|
|
|
// Lista de enfermeras para el selector del filtro
|
|
$enfermeras = $db->fetchAll(
|
|
"SELECT id, nombre_completo FROM lab_enfermeras WHERE is_active = 1 ORDER BY nombre_completo"
|
|
);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'filas' => $filas,
|
|
'enfermeras' => $enfermeras,
|
|
], JSON_UNESCAPED_UNICODE);
|