fetchOne("SELECT creado_por FROM lab_domicilios WHERE id = ?", [$id]); if (!$chk || (int)($chk['creado_por'] ?? 0) !== adminId()) { jsonError('Solo puedes reprogramar domicilios que tú mismo agendaste.'); } } $nuevaFecha = trim($datos['nueva_fecha'] ?? ''); $nuevaHora = trim($datos['nueva_hora'] ?? ''); $motivo = trim($datos['motivo'] ?? ''); if (!$nuevaFecha) jsonError('nueva_fecha es obligatoria'); $nuevoId = $dom->reprogramar($id, $nuevaFecha, $nuevaHora, $motivo, $admin); jsonOk(['id_origen' => $id, 'id_nuevo' => $nuevoId], 'Domicilio reprogramado correctamente'); } // Solo cambio de estado if (!empty($datos['id']) && !empty($datos['solo_estado'])) { $id = (int)$datos['id']; $nuevoEstado = $datos['nuevo_estado'] ?? ''; $extras = array_filter([ 'motivo_cancelacion' => $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']; // Enfermero solo puede editar domicilios que él mismo creó if (userRole() === 'enfermero') { $dbCheck = Database::getInstance(); $chk = $dbCheck->fetchOne("SELECT creado_por FROM lab_domicilios WHERE id = ?", [$id]); if (!$chk || (int)($chk['creado_por'] ?? 0) !== adminId()) { jsonError('Solo puedes editar domicilios que tú mismo agendaste.'); } } 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"); } } // Validar formato mínimo de dirección $dirVal = trim($datos['direccion'] ?? ''); if (strlen($dirVal) < 5) { jsonError('La dirección es muy corta. Ingresa una dirección completa. Ej: Cra 15 # 32-10.'); } // 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); }