$datos['motivo_cancelacion'] ?? null, 'fecha_reprogramada' => $datos['fecha_reprogramada'] ?? null, 'hora_llegada' => $datos['hora_llegada'] ?? null, 'hora_salida' => $datos['hora_salida'] ?? null, 'observaciones' => $datos['observaciones'] ?? null, 'muestras_tomadas' => $datos['muestras_tomadas'] ?? null, ]); $dom->cambiarEstado($id, $nuevoEstado, $admin, $extras); jsonOk(['id' => $id], 'Estado actualizado'); } if (!empty($datos['id'])) { // Actualización general $id = (int)$datos['id']; unset($datos['id'], $datos['solo_estado']); // Normalizar orden_id: vacío o 0 → null if (isset($datos['orden_id']) && ($datos['orden_id'] === '' || (int)$datos['orden_id'] === 0)) { $datos['orden_id'] = null; } $dom->actualizar($id, $datos, $admin); jsonOk(['id' => $id], 'Domicilio actualizado correctamente'); } else { // Creación foreach (['paciente_id', 'direccion', 'fecha_programada'] as $req) { if (empty($datos[$req])) { jsonError("El campo $req es obligatorio"); } } // Normalizar orden_id: vacío o 0 → null (evita FK constraint) if (isset($datos['orden_id']) && ($datos['orden_id'] === '' || (int)$datos['orden_id'] === 0)) { $datos['orden_id'] = null; } // Si el creador es un enfermero y no vino enfermera_id, auto-asignarlo desde la sesión if (empty($datos['enfermera_id']) && userRole() === 'enfermero') { $eid = enfermeraId(); if ($eid) $datos['enfermera_id'] = $eid; } $id = $dom->crear($datos, $admin); // Crear asignación automática si se indicó enfermera_id if (!empty($datos['enfermera_id'])) { $asig = new Asignacion(); $asig->asignar($id, (int)$datos['enfermera_id'], $admin); } jsonOk(['id' => $id], 'Domicilio creado correctamente'); } } catch (InvalidArgumentException $e) { jsonError($e->getMessage()); } catch (Exception $e) { jsonError($e->getMessage(), 500); }