feat: TTLockPage — import locks from TTHotel XLS file
- Parse .xls/.xlsx via SheetJS (xlsx package) - Auto-match Door Name → room number; unmatched rows kept with empty room - Preview table: green=matched, amber=unmatched, grey=already mapped - Per-row room dropdown for manual correction before import - room_id nullable in room_lock_mappings (migration 052) - Conflict key changed from (hotel_id, room_id) to (hotel_id, lock_mac) - LEFT JOIN in GET room-locks to show unmatched locks - DELETE by UUID or MAC depending on whether room is assigned Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
18
backend/migrations/052_ttlock_nullable_room.sql
Normal file
18
backend/migrations/052_ttlock_nullable_room.sql
Normal file
@@ -0,0 +1,18 @@
|
||||
-- TTLock: room_id в room_lock_mappings становится необязательным
|
||||
-- Нужно для импорта замков из TTHotel без привязки к номеру в системе
|
||||
|
||||
ALTER TABLE room_lock_mappings
|
||||
ALTER COLUMN room_id DROP NOT NULL;
|
||||
|
||||
-- Добавляем lock_name если не было
|
||||
ALTER TABLE room_lock_mappings
|
||||
ADD COLUMN IF NOT EXISTS lock_name TEXT;
|
||||
|
||||
-- Уникальность теперь по lock_mac (один MAC — одна запись)
|
||||
-- Старый unique(hotel_id, room_id) оставляем (работает с NULL через NULLS NOT DISTINCT в PG15+
|
||||
-- или просто убираем и заменяем на lock_mac)
|
||||
ALTER TABLE room_lock_mappings
|
||||
DROP CONSTRAINT IF EXISTS room_lock_mappings_hotel_id_room_id_key;
|
||||
|
||||
ALTER TABLE room_lock_mappings
|
||||
ADD CONSTRAINT room_lock_mappings_hotel_id_lock_mac_key UNIQUE (hotel_id, lock_mac);
|
||||
Reference in New Issue
Block a user