fix: migration 036 — delete old channels before altering constraint + remove TravelLine refs + hide hotel_admin from roles tab

This commit is contained in:
2026-03-26 01:10:48 +03:00
parent 566c6a5e41
commit 17012ae3ca
3 changed files with 10 additions and 8 deletions

View File

@@ -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 DROP CONSTRAINT IF EXISTS channels_name_check;
ALTER TABLE channels ADD CONSTRAINT channels_name_check ALTER TABLE channels ADD CONSTRAINT channels_name_check
CHECK (name IN ( CHECK (name IN (
@@ -12,9 +15,6 @@ ALTER TABLE channels ADD CONSTRAINT channels_name_check
'onetwotrip' '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) -- Add new Russian channels for all existing hotels (skip if already exists)
INSERT INTO channels (hotel_id, name) INSERT INTO channels (hotel_id, name)
SELECT h.id, c.name SELECT h.id, c.name

View File

@@ -8,9 +8,9 @@ import { Badge } from '../components/ui/Badge'
const CHANNEL_META: Record<string, { icon: string; label: string; description: string; integration: string }> = { const CHANNEL_META: Record<string, { icon: string; label: string; description: string; integration: string }> = {
booking_com: { icon: '🔵', label: 'Booking.com', description: 'Крупнейшая международная OTA', integration: 'XML API' }, 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' }, 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' }, avito: { icon: '🟢', label: 'Авито', description: 'Крупнейшая площадка объявлений в РФ', integration: 'XML фид / REST' },
bronevik: { icon: '🔷', label: 'Bronevik.com', description: 'Корпоративное бронирование командировок', integration: 'SOAP/XML API' }, bronevik: { icon: '🔷', label: 'Bronevik.com', description: 'Корпоративное бронирование командировок', integration: 'SOAP/XML API' },
hotels101: { icon: '🟡', label: '101hotels.ru', description: 'Российский агрегатор отелей', integration: 'OTA XML' }, hotels101: { icon: '🟡', label: '101hotels.ru', description: 'Российский агрегатор отелей', integration: 'OTA XML' },

View File

@@ -445,8 +445,10 @@ function UserModal({
// ── Roles & Permissions Tab ──────────────────────────────────────────────────── // ── Roles & Permissions Tab ────────────────────────────────────────────────────
function RolesTab() { function RolesTab() {
const [roles, setRoles] = useState<RolePermissions[]>(INITIAL_ROLE_PERMISSIONS) // hotel_admin always has all permissions — excluded from the editable list
const [selectedRoleId, setSelectedRoleId] = useState<string>(INITIAL_ROLE_PERMISSIONS[0].id) const editableRoles = INITIAL_ROLE_PERMISSIONS.filter(r => r.id !== 'rp_hotel_admin')
const [roles, setRoles] = useState<RolePermissions[]>(editableRoles)
const [selectedRoleId, setSelectedRoleId] = useState<string>(editableRoles[0].id)
const [newRoleName, setNewRoleName] = useState('') const [newRoleName, setNewRoleName] = useState('')
const [addingRole, setAddingRole] = useState(false) const [addingRole, setAddingRole] = useState(false)
const [deleteId, setDeleteId] = useState<string | null>(null) const [deleteId, setDeleteId] = useState<string | null>(null)