收口V4 OWNER RATE目录数据

This commit is contained in:
andy
2026-07-21 19:11:57 +07:00
parent f3b6adda17
commit 6e97778633
19 changed files with 520 additions and 188 deletions

View File

@@ -25,7 +25,8 @@ import org.springframework.transaction.annotation.Transactional;
@Order(Ordered.HIGHEST_PRECEDENCE + 100)
public class ReservationV4CatalogBootstrapRunner implements ApplicationRunner {
private static final String SEED_CATALOG_VERSION = "seed-20260719-v1";
private static final String ACCOUNT_SEED_CATALOG_VERSION = "seed-20260719-v1";
private static final String OWNER_RATE_CATALOG_VERSION = "owner-rate-20260721-v1";
private static final String MARKET_CODE = "LEISURE";
private static final String SOURCE_CODE = "TRAVEL_AGENT";
@@ -35,21 +36,112 @@ public class ReservationV4CatalogBootstrapRunner implements ApplicationRunner {
new AccountSeed("HANATOUR_TD", "HANATOUR TD CO., LTD."));
private static final List<CodeSeed> CODE_SEEDS = List.of(
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "TWN", "TWN", 10, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "KING", "KING", 20, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "DBL", "DBL", 30, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "SGL", "SGL", 40, "{\"adult_capacity\":1}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "TRP", "TRP", 50, "{\"adult_capacity\":3}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "RM1", "RM1", 60, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "RM2", "RM2", 70, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "RM3", "RM3", 80, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "BAR", "BAR", 10, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "RACK", "RACK", 20, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "PACKAGE", "PACKAGE", 30, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GROUP", "GROUP", 40, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "FIT", "FIT", 50, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.MARKET.name(), MARKET_CODE, MARKET_CODE, 10, null),
new CodeSeed(ReservationV4CatalogType.SOURCE.name(), SOURCE_CODE, SOURCE_CODE, 10, null));
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "RM2", "RM2", 10,
OWNER_RATE_CATALOG_VERSION, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "RM3", "RM3", 20,
OWNER_RATE_CATALOG_VERSION, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "RM4", "RM4", 30,
OWNER_RATE_CATALOG_VERSION, "{\"adult_capacity\":4}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "SU1", "SU1", 40,
OWNER_RATE_CATALOG_VERSION, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "SU2", "SU2", 50,
OWNER_RATE_CATALOG_VERSION, "{\"adult_capacity\":2}"),
new CodeSeed(ReservationV4CatalogType.ROOM_TYPE.name(), "SU3", "SU3", 60,
OWNER_RATE_CATALOG_VERSION, "{\"adult_capacity\":4}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA2-850UP", "GRPA2-850UP", 10,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA2-1275", "GRPA2-1275", 20,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA2-1400", "GRPA2-1400", 30,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA2-1800", "GRPA2-1800", 40,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA2-2400", "GRPA2-2400", 50,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA1-900", "GRPA1-900", 60,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA1-1400", "GRPA1-1400", 70,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA1-1300", "GRPA1-1300", 80,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA1-1150", "GRPA1-1150", 90,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA1-1725", "GRPA1-1725", 100,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRPA1-2300", "GRPA1-2300", 110,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA3-1200*B'FAST BUALUANG", "GRPA3-1200*B'FAST BUALUANG", 120,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA3-2000*B'FAST BUALUANG", "GRPA3-2000*B'FAST BUALUANG", 130,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA3-1400*B'FAST BUALUANG", "GRPA3-1400*B'FAST BUALUANG", 140,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA3-1800*B'FAST BUALUANG", "GRPA3-1800*B'FAST BUALUANG", 150,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA3-2400*B'FAST BUALUANG", "GRPA3-2400*B'FAST BUALUANG", 160,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA4-1200*B'FAST LEELA", "GRPA4-1200*B'FAST LEELA", 170,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA4-2000*B'FAST LEELA", "GRPA4-2000*B'FAST LEELA", 180,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA4-1400*B'FAST LEELA", "GRPA4-1400*B'FAST LEELA", 190,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA4-1800*B'FAST LEELA", "GRPA4-1800*B'FAST LEELA", 200,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(),
"GRPA4-2400*B'FAST LEELA", "GRPA4-2400*B'FAST LEELA", 210,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO1-850UP", "WHO1-850UP", 220,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO1-1275", "WHO1-1275", 230,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO1-1400", "WHO1-1400", 240,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO1-1800", "WHO1-1800", 250,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO1-2400", "WHO1-2400", 260,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRP1-900", "GRP1-900", 270,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRP1-1400", "GRP1-1400", 280,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRP1-1300", "GRP1-1300", 290,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRP1-1800", "GRP1-1800", 300,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "GRP1-2400", "GRP1-2400", 310,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO2-1100", "WHO2-1100", 320,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO2-1600", "WHO2-1600", 330,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO2-1400", "WHO2-1400", 340,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO2-1800", "WHO2-1800", 350,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO2-2400", "WHO2-2400", 360,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO3-1200", "WHO3-1200", 370,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO3-1800", "WHO3-1800", 380,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO3-1400", "WHO3-1400", 390,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.RATE_CODE.name(), "WHO3-2400", "WHO3-2400", 400,
OWNER_RATE_CATALOG_VERSION, "{\"pricing_available\":false}"),
new CodeSeed(ReservationV4CatalogType.MARKET.name(), MARKET_CODE, MARKET_CODE, 10,
ACCOUNT_SEED_CATALOG_VERSION, null),
new CodeSeed(ReservationV4CatalogType.SOURCE.name(), SOURCE_CODE, SOURCE_CODE, 10,
ACCOUNT_SEED_CATALOG_VERSION, null));
private final PlatformHotelRepository hotelRepository;
private final ReservationV4CatalogRepository catalogRepository;
@@ -112,7 +204,7 @@ public class ReservationV4CatalogBootstrapRunner implements ApplicationRunner {
entity.setSourceCode(SOURCE_CODE);
entity.setStatus(ReservationV4CatalogStatus.ACTIVE.name());
entity.setSourceSystem(ReservationV4CatalogSourceSystem.FIXED_SEED_IMPORT.name());
entity.setCatalogVersion(SEED_CATALOG_VERSION);
entity.setCatalogVersion(ACCOUNT_SEED_CATALOG_VERSION);
entity.setVersion(0L);
entity.setCreatedAt(now);
entity.setUpdatedAt(now);
@@ -131,7 +223,7 @@ public class ReservationV4CatalogBootstrapRunner implements ApplicationRunner {
entity.setStatus(ReservationV4CatalogStatus.ACTIVE.name());
entity.setSourceSystem(ReservationV4CatalogSourceSystem.FIXED_SEED_IMPORT.name());
entity.setSortOrder(seed.sortOrder());
entity.setCatalogVersion(SEED_CATALOG_VERSION);
entity.setCatalogVersion(seed.catalogVersion());
entity.setMetadataJson(seed.metadataJson());
entity.setVersion(0L);
entity.setCreatedAt(now);
@@ -152,6 +244,12 @@ public class ReservationV4CatalogBootstrapRunner implements ApplicationRunner {
private record AccountSeed(String accountCode, String accountName) {
}
private record CodeSeed(String catalogType, String code, String displayName, int sortOrder, String metadataJson) {
private record CodeSeed(
String catalogType,
String code,
String displayName,
int sortOrder,
String catalogVersion,
String metadataJson) {
}
}

View File

@@ -0,0 +1,105 @@
-- M002 V4 OWNER RATE 目录收口:替换系统固定 Room Type / Rate Code 种子不清理账号、权限、SourceMessage 或 V4 业务数据。
DELETE FROM workflow_reservation_catalog_code
WHERE catalog_type IN ('ROOM_TYPE', 'RATE_CODE')
AND source_system = 'FIXED_SEED_IMPORT'
AND (
hotel_id IN ('HOTEL-TEST', 'HOTEL-DEV')
OR hotel_id IN (
SELECT hotel_id
FROM platform_hotel
WHERE hotel_status = 'ACTIVE'
)
);
INSERT INTO workflow_reservation_catalog_code (
id, hotel_id, catalog_type, code, display_name, status, source_system, external_id, sort_order,
catalog_version, last_synced_at, metadata_json, version, created_at, updated_at, logic_deleted_at,
logic_deleted_reason
)
SELECT
2500000000000000 + ROW_NUMBER() OVER (ORDER BY owner_rate_hotels.hotel_id, seed.sort_order),
owner_rate_hotels.hotel_id,
seed.catalog_type,
seed.code,
seed.display_name,
'ACTIVE',
'FIXED_SEED_IMPORT',
NULL,
seed.sort_order,
'owner-rate-20260721-v1',
NULL,
seed.metadata_json,
0,
'2026-07-21 00:00:00.000000',
'2026-07-21 00:00:00.000000',
NULL,
NULL
FROM (
SELECT hotel_id
FROM (
SELECT 'HOTEL-TEST' AS hotel_id
UNION ALL SELECT 'HOTEL-DEV'
UNION ALL
SELECT hotel_id
FROM platform_hotel
WHERE hotel_status = 'ACTIVE'
) raw_hotels
WHERE hotel_id IS NOT NULL
AND hotel_id <> ''
GROUP BY hotel_id
) owner_rate_hotels
JOIN (
SELECT 10 AS sort_order, 'ROOM_TYPE' AS catalog_type, 'RM2' AS code, 'RM2' AS display_name, '{"adult_capacity":2}' AS metadata_json
UNION ALL SELECT 20, 'ROOM_TYPE', 'RM3', 'RM3', '{"adult_capacity":2}'
UNION ALL SELECT 30, 'ROOM_TYPE', 'RM4', 'RM4', '{"adult_capacity":4}'
UNION ALL SELECT 40, 'ROOM_TYPE', 'SU1', 'SU1', '{"adult_capacity":2}'
UNION ALL SELECT 50, 'ROOM_TYPE', 'SU2', 'SU2', '{"adult_capacity":2}'
UNION ALL SELECT 60, 'ROOM_TYPE', 'SU3', 'SU3', '{"adult_capacity":4}'
UNION ALL SELECT 70, 'RATE_CODE', 'GRPA2-850UP', 'GRPA2-850UP', '{"pricing_available":false}'
UNION ALL SELECT 80, 'RATE_CODE', 'GRPA2-1275', 'GRPA2-1275', '{"pricing_available":false}'
UNION ALL SELECT 90, 'RATE_CODE', 'GRPA2-1400', 'GRPA2-1400', '{"pricing_available":false}'
UNION ALL SELECT 100, 'RATE_CODE', 'GRPA2-1800', 'GRPA2-1800', '{"pricing_available":false}'
UNION ALL SELECT 110, 'RATE_CODE', 'GRPA2-2400', 'GRPA2-2400', '{"pricing_available":false}'
UNION ALL SELECT 120, 'RATE_CODE', 'GRPA1-900', 'GRPA1-900', '{"pricing_available":false}'
UNION ALL SELECT 130, 'RATE_CODE', 'GRPA1-1400', 'GRPA1-1400', '{"pricing_available":false}'
UNION ALL SELECT 140, 'RATE_CODE', 'GRPA1-1300', 'GRPA1-1300', '{"pricing_available":false}'
UNION ALL SELECT 150, 'RATE_CODE', 'GRPA1-1150', 'GRPA1-1150', '{"pricing_available":false}'
UNION ALL SELECT 160, 'RATE_CODE', 'GRPA1-1725', 'GRPA1-1725', '{"pricing_available":false}'
UNION ALL SELECT 170, 'RATE_CODE', 'GRPA1-2300', 'GRPA1-2300', '{"pricing_available":false}'
UNION ALL SELECT 180, 'RATE_CODE', 'GRPA3-1200*B''FAST BUALUANG', 'GRPA3-1200*B''FAST BUALUANG', '{"pricing_available":false}'
UNION ALL SELECT 190, 'RATE_CODE', 'GRPA3-2000*B''FAST BUALUANG', 'GRPA3-2000*B''FAST BUALUANG', '{"pricing_available":false}'
UNION ALL SELECT 200, 'RATE_CODE', 'GRPA3-1400*B''FAST BUALUANG', 'GRPA3-1400*B''FAST BUALUANG', '{"pricing_available":false}'
UNION ALL SELECT 210, 'RATE_CODE', 'GRPA3-1800*B''FAST BUALUANG', 'GRPA3-1800*B''FAST BUALUANG', '{"pricing_available":false}'
UNION ALL SELECT 220, 'RATE_CODE', 'GRPA3-2400*B''FAST BUALUANG', 'GRPA3-2400*B''FAST BUALUANG', '{"pricing_available":false}'
UNION ALL SELECT 230, 'RATE_CODE', 'GRPA4-1200*B''FAST LEELA', 'GRPA4-1200*B''FAST LEELA', '{"pricing_available":false}'
UNION ALL SELECT 240, 'RATE_CODE', 'GRPA4-2000*B''FAST LEELA', 'GRPA4-2000*B''FAST LEELA', '{"pricing_available":false}'
UNION ALL SELECT 250, 'RATE_CODE', 'GRPA4-1400*B''FAST LEELA', 'GRPA4-1400*B''FAST LEELA', '{"pricing_available":false}'
UNION ALL SELECT 260, 'RATE_CODE', 'GRPA4-1800*B''FAST LEELA', 'GRPA4-1800*B''FAST LEELA', '{"pricing_available":false}'
UNION ALL SELECT 270, 'RATE_CODE', 'GRPA4-2400*B''FAST LEELA', 'GRPA4-2400*B''FAST LEELA', '{"pricing_available":false}'
UNION ALL SELECT 280, 'RATE_CODE', 'WHO1-850UP', 'WHO1-850UP', '{"pricing_available":false}'
UNION ALL SELECT 290, 'RATE_CODE', 'WHO1-1275', 'WHO1-1275', '{"pricing_available":false}'
UNION ALL SELECT 300, 'RATE_CODE', 'WHO1-1400', 'WHO1-1400', '{"pricing_available":false}'
UNION ALL SELECT 310, 'RATE_CODE', 'WHO1-1800', 'WHO1-1800', '{"pricing_available":false}'
UNION ALL SELECT 320, 'RATE_CODE', 'WHO1-2400', 'WHO1-2400', '{"pricing_available":false}'
UNION ALL SELECT 330, 'RATE_CODE', 'GRP1-900', 'GRP1-900', '{"pricing_available":false}'
UNION ALL SELECT 340, 'RATE_CODE', 'GRP1-1400', 'GRP1-1400', '{"pricing_available":false}'
UNION ALL SELECT 350, 'RATE_CODE', 'GRP1-1300', 'GRP1-1300', '{"pricing_available":false}'
UNION ALL SELECT 360, 'RATE_CODE', 'GRP1-1800', 'GRP1-1800', '{"pricing_available":false}'
UNION ALL SELECT 370, 'RATE_CODE', 'GRP1-2400', 'GRP1-2400', '{"pricing_available":false}'
UNION ALL SELECT 380, 'RATE_CODE', 'WHO2-1100', 'WHO2-1100', '{"pricing_available":false}'
UNION ALL SELECT 390, 'RATE_CODE', 'WHO2-1600', 'WHO2-1600', '{"pricing_available":false}'
UNION ALL SELECT 400, 'RATE_CODE', 'WHO2-1400', 'WHO2-1400', '{"pricing_available":false}'
UNION ALL SELECT 410, 'RATE_CODE', 'WHO2-1800', 'WHO2-1800', '{"pricing_available":false}'
UNION ALL SELECT 420, 'RATE_CODE', 'WHO2-2400', 'WHO2-2400', '{"pricing_available":false}'
UNION ALL SELECT 430, 'RATE_CODE', 'WHO3-1200', 'WHO3-1200', '{"pricing_available":false}'
UNION ALL SELECT 440, 'RATE_CODE', 'WHO3-1800', 'WHO3-1800', '{"pricing_available":false}'
UNION ALL SELECT 450, 'RATE_CODE', 'WHO3-1400', 'WHO3-1400', '{"pricing_available":false}'
UNION ALL SELECT 460, 'RATE_CODE', 'WHO3-2400', 'WHO3-2400', '{"pricing_available":false}'
) seed ON 1 = 1
WHERE NOT EXISTS (
SELECT 1
FROM workflow_reservation_catalog_code existing
WHERE existing.hotel_id = owner_rate_hotels.hotel_id
AND existing.catalog_type = seed.catalog_type
AND existing.code = seed.code
);