Files
whatsapp/api/lab/save_domicilio.php
2026-05-27 20:40:17 -05:00

109 lines
4.6 KiB
PHP

<?php
/**
* POST /api/lab/save_domicilio.php
* Crea, actualiza o cambia estado de un domicilio.
* Body JSON:
* { id?, paciente_id, orden_id?, direccion, ciudad?, barrio?,
* indicaciones_dir?, fecha_programada, hora_programada?,
* tipo_servicio?, estado?,
* -- Para cambio de estado solamente:
* solo_estado?: true, nuevo_estado?, motivo_cancelacion?, ... }
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
try {
$datos = inputJson();
$dom = new Domicilio();
$admin = adminId();
// ── Reprogramar ──
if (!empty($datos['id']) && !empty($datos['reprogramar'])) {
$id = (int)$datos['id'];
// Enfermero solo puede reprogramar 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 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);
}