Files
whatsapp/api/lab/update_domicilio_enfermero.php
2026-05-11 14:55:17 -05:00

102 lines
3.5 KiB
PHP

<?php
/**
* POST /api/lab/update_domicilio_enfermero.php
* El enfermero actualiza el estado de un domicilio asignado.
*
* Body JSON:
* { domicilio_id, nuevo_estado, notas? }
*
* Transiciones permitidas al enfermero:
* programado → confirmado
* confirmado → en_camino
* en_camino → en_domicilio
* en_domicilio → completado
* cualquiera → cancelado (con notas obligatorias)
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
// Flujo permitido enfermero: estado_actual => [estados_siguientes_posibles]
const TRANSICIONES_ENFERMERO = [
'programado' => ['confirmado'],
'confirmado' => ['en_camino', 'cancelado'],
'en_camino' => ['en_domicilio', 'cancelado'],
'en_domicilio' => ['completado', 'cancelado'],
];
try {
$datos = inputJson();
$domId = (int)($datos['domicilio_id'] ?? 0);
$estado = trim($datos['nuevo_estado'] ?? '');
$notas = trim($datos['notas'] ?? '');
$tempIn = isset($datos['temperatura_inicio']) ? (float)$datos['temperatura_inicio'] : null;
$tempOut= isset($datos['temperatura_salida']) ? (float)$datos['temperatura_salida'] : null;
if (!$domId) jsonError('domicilio_id requerido');
if (!$estado) jsonError('nuevo_estado requerido');
$db = Database::getInstance();
// Verificar domicilio y obtener estado actual
$dom = $db->fetch(
'SELECT id, estado, paciente_id FROM lab_domicilios WHERE id = ?',
[$domId]
);
if (!$dom) jsonError('Domicilio no encontrado', 404);
// Verificar que el enfermero tenga asignación activa
if (userRole() === 'enfermero') {
$eid = enfermeraId();
$asig = $db->fetch(
"SELECT a.id FROM lab_asignaciones a
WHERE a.domicilio_id = ? AND a.enfermera_id = ?
AND a.estado NOT IN ('liberada','completada')",
[$domId, $eid]
);
if (!$asig) jsonError('No tienes asignación activa para este domicilio', 403);
// Validar transición
$estadoActual = $dom['estado'];
$permitidos = TRANSICIONES_ENFERMERO[$estadoActual] ?? [];
if (!in_array($estado, $permitidos)) {
jsonError("No puedes pasar de '$estadoActual' a '$estado'");
}
}
if ($estado === 'cancelado' && !$notas) {
jsonError('Las notas son obligatorias al cancelar');
}
// Actualizar domicilio
$campos = ['estado' => $estado];
if ($notas) $campos['notas_admin'] = $notas;
if ($tempIn !== null) $campos['temperatura_inicio'] = $tempIn;
if ($tempOut !== null) $campos['temperatura_salida'] = $tempOut;
if ($estado === 'completado') {
$campos['hora_salida'] = date('H:i:s');
}
if ($estado === 'en_domicilio') {
$campos['hora_llegada'] = date('H:i:s');
}
if ($estado === 'en_camino') {
$campos['hora_en_camino'] = date('H:i:s');
}
$db->update('lab_domicilios', $campos, 'id = ?', [$domId]);
// Actualizar asignación si completado/cancelado
if (in_array($estado, ['completado', 'cancelado']) && userRole() === 'enfermero') {
$estAsig = $estado === 'completado' ? 'completada' : 'liberada';
$db->update(
'lab_asignaciones',
['estado' => $estAsig],
'domicilio_id = ? AND enfermera_id = ?',
[$domId, enfermeraId()]
);
}
jsonOk(['domicilio_id' => $domId, 'estado' => $estado], 'Estado actualizado correctamente');
} catch (Exception $e) {
jsonError($e->getMessage(), 500);
}