[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); }