up
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
<?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'] ?? '');
|
||||
|
||||
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 ($estado === 'completado') {
|
||||
$campos['hora_salida'] = date('H:i:s');
|
||||
}
|
||||
if ($estado === 'en_domicilio') {
|
||||
$campos['hora_llegada'] = 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);
|
||||
}
|
||||
Reference in New Issue
Block a user