feat: 6 nuevas funcionalidades - notas obligatorias turno, reporte enfermero, plantilla WhatsApp, adjuntar orden modal, roles solo lectura, fix valores copago
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
<?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 activa = 1 ORDER BY nombre_completo"
|
||||
);
|
||||
|
||||
echo json_encode([
|
||||
'success' => true,
|
||||
'filas' => $filas,
|
||||
'enfermeras' => $enfermeras,
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
Reference in New Issue
Block a user