prepare('SELECT * FROM turnero_lugares WHERE id = ?'); $row->execute([$id]); $data = $row->fetch(PDO::FETCH_ASSOC); if (!$data) jsonError('Lugar no encontrado', 404); // Incluir formularios de consentimiento vinculados $stmtFc = db()->prepare('SELECT formulario_id FROM turnero_lugar_consentimientos WHERE lugar_id = ?'); $stmtFc->execute([$id]); $data['formulario_ids'] = $stmtFc->fetchAll(PDO::FETCH_COLUMN); jsonOk(['data' => $data]); } requireMethod('POST'); $input = inputJson(); $id = (int)($input['id'] ?? 0); $delete = !empty($input['_delete']); // ── ELIMINAR ───────────────────────────────────────────────── if ($delete) { if (!$id) jsonError('ID requerido'); // Bloquear si tiene turnos asignados $stmt = db()->prepare('SELECT COUNT(*) FROM turnero_turnos WHERE lugar_destino_id = ?'); $stmt->execute([$id]); if ($stmt->fetchColumn() > 0) { jsonError('No se puede eliminar: tiene turnos asignados. Desactívelo en su lugar.'); } $stmt = db()->prepare('DELETE FROM turnero_lugares WHERE id = ?'); $stmt->execute([$id]); (new ActividadAdmin())->registrar(adminId(), 'turnero_config', 'eliminar_lugar', $id, ['lugar_id' => $id]); jsonOk([], 'Lugar eliminado'); } // ── CREAR / ACTUALIZAR ─────────────────────────────────────── $nombre = trim($input['nombre'] ?? ''); $desc = trim($input['descripcion'] ?? ''); $sortOrder = (int)($input['sort_order'] ?? 99); $activo = (int)($input['activo'] ?? 1); $tipo = in_array($input['tipo'] ?? '', ['recepcion', 'muestras'], true) ? $input['tipo'] : 'muestras'; $formModo = in_array($input['formulario_modo'] ?? '', ['link', 'embebido'], true) ? $input['formulario_modo'] : 'link'; $formularioIds = isset($input['formulario_ids']) && is_array($input['formulario_ids']) ? array_filter(array_map('intval', $input['formulario_ids']), fn($v) => $v > 0) : []; if ($nombre === '') jsonError('El nombre es requerido'); if ($sortOrder < 1) jsonError('El orden debe ser mayor a 0'); $pdo = db(); $pdo->beginTransaction(); try { if ($id) { $stmt = $pdo->prepare( 'UPDATE turnero_lugares SET nombre=?, tipo=?, descripcion=?, sort_order=?, activo=?, formulario_modo=? WHERE id=?' ); $stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo, $formModo, $id]); $lugarId = $id; } else { $stmt = $pdo->prepare( 'INSERT INTO turnero_lugares (nombre, tipo, descripcion, sort_order, activo, formulario_modo) VALUES (?, ?, ?, ?, ?, ?)' ); $stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo, $formModo]); $lugarId = (int) $pdo->lastInsertId(); } // Sincronizar formularios de consentimiento $pdo->prepare('DELETE FROM turnero_lugar_consentimientos WHERE lugar_id = ?')->execute([$lugarId]); if (!empty($formularioIds)) { $stmtIns = $pdo->prepare( 'INSERT IGNORE INTO turnero_lugar_consentimientos (lugar_id, formulario_id) VALUES (?, ?)' ); foreach ($formularioIds as $fid) { $stmtIns->execute([$lugarId, $fid]); } } $pdo->commit(); // Auditoría: registrar quién guardó el lugar y con qué formularios try { $fNombres = []; if (!empty($formularioIds)) { $ph = implode(',', array_fill(0, count($formularioIds), '?')); $fNombres = db()->prepare("SELECT id, nombre FROM lab_formularios WHERE id IN ($ph)"); $fNombres->execute(array_values($formularioIds)); $fNombres = $fNombres->fetchAll(PDO::FETCH_KEY_PAIR); } (new ActividadAdmin())->registrar( adminId(), 'turnero_config', $id ? 'editar_lugar' : 'crear_lugar', $lugarId, ['nombre' => $nombre, 'tipo' => $tipo, 'activo' => $activo, 'formularios' => $fNombres] ); } catch (\Throwable $_) {} jsonOk(['id' => $lugarId], $id ? 'Lugar actualizado' : 'Lugar creado'); } catch (\Throwable $e) { $pdo->rollBack(); jsonError('Error al guardar lugar: ' . $e->getMessage(), 500); }