diff --git a/backend/migrations/036_channels_ru.sql b/backend/migrations/036_channels_ru.sql index 6cfa18b..d0cef01 100644 --- a/backend/migrations/036_channels_ru.sql +++ b/backend/migrations/036_channels_ru.sql @@ -1,4 +1,7 @@ --- Replace old channel constraint with Russian market channels +-- Remove old non-RU channels FIRST (before changing constraint) +DELETE FROM channels WHERE name IN ('airbnb', 'expedia', 'vrbo'); + +-- Now safely replace constraint ALTER TABLE channels DROP CONSTRAINT IF EXISTS channels_name_check; ALTER TABLE channels ADD CONSTRAINT channels_name_check CHECK (name IN ( @@ -12,9 +15,6 @@ ALTER TABLE channels ADD CONSTRAINT channels_name_check 'onetwotrip' )); --- Remove old non-RU channels from all hotels -DELETE FROM channels WHERE name IN ('airbnb', 'expedia', 'vrbo'); - -- Add new Russian channels for all existing hotels (skip if already exists) INSERT INTO channels (hotel_id, name) SELECT h.id, c.name diff --git a/src/pages/ChannelsPage.tsx b/src/pages/ChannelsPage.tsx index 45545e1..5bf0f2d 100644 --- a/src/pages/ChannelsPage.tsx +++ b/src/pages/ChannelsPage.tsx @@ -8,9 +8,9 @@ import { Badge } from '../components/ui/Badge' const CHANNEL_META: Record = { booking_com: { icon: '🔵', label: 'Booking.com', description: 'Крупнейшая международная OTA', integration: 'XML API' }, - yandex_travel: { icon: '🔴', label: 'Яндекс Путешествия', description: 'Ведущая платформа бронирования в РФ', integration: 'TravelLine' }, + yandex_travel: { icon: '🔴', label: 'Яндекс Путешествия', description: 'Ведущая платформа бронирования в РФ', integration: 'XML API' }, ostrovok: { icon: '🟣', label: 'Островок', description: 'Один из крупнейших российских OTA', integration: 'REST API' }, - sutochno: { icon: '🟠', label: 'Суточно.ру', description: 'Посуточная аренда и гостиницы', integration: 'iCal / TravelLine' }, + sutochno: { icon: '🟠', label: 'Суточно.ру', description: 'Посуточная аренда и гостиницы', integration: 'iCal / API' }, avito: { icon: '🟢', label: 'Авито', description: 'Крупнейшая площадка объявлений в РФ', integration: 'XML фид / REST' }, bronevik: { icon: '🔷', label: 'Bronevik.com', description: 'Корпоративное бронирование командировок', integration: 'SOAP/XML API' }, hotels101: { icon: '🟡', label: '101hotels.ru', description: 'Российский агрегатор отелей', integration: 'OTA XML' }, diff --git a/src/pages/UsersPage.tsx b/src/pages/UsersPage.tsx index d22f9cb..d68a961 100644 --- a/src/pages/UsersPage.tsx +++ b/src/pages/UsersPage.tsx @@ -445,8 +445,10 @@ function UserModal({ // ── Roles & Permissions Tab ──────────────────────────────────────────────────── function RolesTab() { - const [roles, setRoles] = useState(INITIAL_ROLE_PERMISSIONS) - const [selectedRoleId, setSelectedRoleId] = useState(INITIAL_ROLE_PERMISSIONS[0].id) + // hotel_admin always has all permissions — excluded from the editable list + const editableRoles = INITIAL_ROLE_PERMISSIONS.filter(r => r.id !== 'rp_hotel_admin') + const [roles, setRoles] = useState(editableRoles) + const [selectedRoleId, setSelectedRoleId] = useState(editableRoles[0].id) const [newRoleName, setNewRoleName] = useState('') const [addingRole, setAddingRole] = useState(false) const [deleteId, setDeleteId] = useState(null)