95 lines
3.1 KiB
PHP
95 lines
3.1 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'] ?? '');
|
|
|
|
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);
|
|
}
|