ALTER TABLE qipai_rooms ADD COLUMN full_day_price_cents INT UNSIGNED NOT NULL DEFAULT 0 AFTER overnight_price_cents, ADD COLUMN minimum_spend_cents INT UNSIGNED NOT NULL DEFAULT 0 AFTER full_day_price_cents; ALTER TABLE qipai_orders ADD COLUMN hold_expires_at DATETIME(3) NULL AFTER end_at; CREATE TABLE IF NOT EXISTS qipai_holiday_calendar ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, tenant_id BIGINT UNSIGNED NOT NULL, holiday_date DATE NOT NULL, name VARCHAR(128) NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), CONSTRAINT fk_qipai_holiday_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id), UNIQUE KEY uq_qipai_holiday_date (tenant_id, holiday_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS qipai_order_price_snapshots ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, tenant_id BIGINT UNSIGNED NOT NULL, order_id BIGINT UNSIGNED NOT NULL, currency CHAR(3) NOT NULL DEFAULT 'CNY', pricing_mode VARCHAR(16) NOT NULL, duration_minutes INT UNSIGNED NOT NULL, unit_price_cents INT UNSIGNED NOT NULL, subtotal_cents INT UNSIGNED NOT NULL, minimum_spend_cents INT UNSIGNED NOT NULL DEFAULT 0, deposit_cents INT UNSIGNED NOT NULL DEFAULT 0, discount_cents INT UNSIGNED NOT NULL DEFAULT 0, package_credit_cents INT UNSIGNED NOT NULL DEFAULT 0, total_cents INT UNSIGNED NOT NULL, rules JSON NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), CONSTRAINT fk_qipai_price_snapshot_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id), CONSTRAINT fk_qipai_price_snapshot_order FOREIGN KEY (order_id) REFERENCES qipai_orders(id), UNIQUE KEY uq_qipai_price_snapshot_order (tenant_id, order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS qipai_room_reservations ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, tenant_id BIGINT UNSIGNED NOT NULL, order_id BIGINT UNSIGNED NOT NULL, room_id BIGINT UNSIGNED NOT NULL, starts_at DATETIME(3) NOT NULL, ends_at DATETIME(3) NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'HELD', expires_at DATETIME(3) NOT NULL, released_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), CONSTRAINT fk_qipai_reservation_tenant FOREIGN KEY (tenant_id) REFERENCES qipai_tenants(id), CONSTRAINT fk_qipai_reservation_order FOREIGN KEY (order_id) REFERENCES qipai_orders(id), CONSTRAINT fk_qipai_reservation_room FOREIGN KEY (room_id) REFERENCES qipai_rooms(id), UNIQUE KEY uq_qipai_reservation_order (tenant_id, order_id), KEY idx_qipai_reservation_overlap (tenant_id, room_id, status, starts_at, ends_at), KEY idx_qipai_reservation_expiry (status, expires_at), CONSTRAINT chk_qipai_reservation_window CHECK (ends_at > starts_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT IGNORE INTO qipai_schema_migrations (version, name) VALUES ('2026061811', 'm04a_pricing_reservations');