fix: migration 036 — delete old channels before altering constraint + remove TravelLine refs + hide hotel_admin from roles tab
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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' },
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user