import {z} from 'zod' export type InfoOrdering = {ordering_by?: string | undefined, ordering_type?: string | undefined}; export type InfoPagination = {page_number?: number | undefined, page_size?: number | undefined}; export type InfoDateRange = {from_date?: string | undefined, to_date?: string | undefined}; export type InfoSearch = {cancelled_at?: InfoDateRange | undefined, checkin_at?: InfoDateRange | undefined, checkout_at?: InfoDateRange | undefined, created_at?: InfoDateRange | undefined, free_cancellation_before?: InfoDateRange | undefined, modified_at?: InfoDateRange | undefined, order_ids?: Array | undefined, paid_at?: InfoDateRange | undefined, partner_order_ids?: Array | undefined, payment_due?: InfoDateRange | undefined, payment_pending?: InfoDateRange | undefined, source?: string | undefined, status?: string | undefined}; export type InfoRequest = {language?: string | undefined, ordering?: InfoOrdering | undefined, pagination?: InfoPagination | undefined, search?: InfoSearch | undefined}; export type CreateApiApiB2bV3HotelOrderInfoArgs = {body: InfoRequest}; export type CreateApiApiB2bV3HotelOrderInfoOptions = {baseUrl: string, BasicAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const partnerMoney = z.object({amount: z.string().optional(), currency_code: z.string().optional()}); export const infoB2BAmountInfo = z.object({amount_commission: z.string().optional(), amount_gross: z.string().optional(), amount_net: z.string().optional()}); export const infoB2BPenalty = z.object({amount: z.string().optional(), amount_info: infoB2BAmountInfo.optional(), currency_code: z.string().optional()}); export const infoB2BCancellationPolicyData = z.object({end_at: z.string().optional(), penalty: infoB2BPenalty.optional(), start_at: z.string().optional()}); export const infoB2BCancellationInfoData = z.object({free_cancellation_before: z.string().optional(), policies: z.array(infoB2BCancellationPolicyData).optional()}); export const infoHotelData = z.object({hid: z.number().int().optional(), id: z.string().optional(), order_id: z.string().optional()}); export const infoMetaData = z.object({voucher_order_comment: z.string().optional()}); export const infoPartnerData = z.object({order_comment: z.string().optional(), order_id: z.string().optional()}); export const infoB2BPaymentData = z.object({invoice_id: z.number().int().optional(), invoice_id_v2: z.string().optional(), paid_at: z.string().optional(), payment_by: z.string().optional(), payment_due: z.string().optional(), payment_pending: z.string().optional(), payment_type: z.string().optional()}); export const infoGuestData = z.object({age: z.number().int().optional(), first_name: z.string().optional(), first_name_original: z.string().optional(), id: z.number().int().optional(), is_child: z.boolean().optional(), last_name: z.string().optional(), last_name_original: z.string().optional()}); export const infoRoomGuestData = z.object({adults_number: z.number().int().optional(), children_number: z.number().int().optional(), guests: z.array(infoGuestData).optional()}); export const infoRoomData = z.object({bedding_name: z.array(z.string()).optional(), guest_data: infoRoomGuestData.optional(), has_breakfast: z.boolean().optional(), meal_name: z.string().optional(), no_child_meal: z.boolean().optional(), room_idx: z.number().int().optional(), room_name: z.string().optional()}); export const infoSupplierData = z.object({confirmation_id: z.string().optional(), name: z.string().optional(), order_id: z.string().optional()}); export const infoTaxData = z.object({amount_tax: partnerMoney.optional(), is_included: z.boolean().optional(), name: z.string().optional()}); export const infoTotalVat = z.object({amount: z.string().optional(), currency_code: z.string().optional(), included: z.boolean().optional()}); export const infoUpsellData = z.object({amount_payable: partnerMoney.optional(), amount_payable_vat: partnerMoney.optional(), amount_refunded: partnerMoney.optional(), amount_sell: partnerMoney.optional(), amount_sell_b2b2c: partnerMoney.optional(), cancelled_at: z.string().optional(), created_at: z.string().optional(), free_cancellation_before: z.string().optional(), info: z.unknown(), order_id: z.number().int().optional(), order_type: z.string().optional(), payment_data: infoB2BPaymentData.optional(), status: z.string().optional(), type: z.string().optional()}); export const infoB2BUserData = z.object({arrival_datetime: z.string().optional(), email: z.string().optional(), user_comment: z.string().optional()}); export const infoOrderB2B = z.object({agreement_number: z.string().optional(), amount_payable: partnerMoney.optional(), amount_payable_vat: partnerMoney.optional(), amount_payable_with_upsells: partnerMoney.optional(), amount_refunded: partnerMoney.optional(), amount_sell: partnerMoney.optional(), amount_sell_b2b2c: partnerMoney.optional(), amount_sell_b2b2c_commission: partnerMoney.optional(), api_auth_key_id: z.number().int().optional(), cancellation_info: infoB2BCancellationInfoData.optional(), cancelled_at: z.string().optional(), checkin_at: z.string().optional(), checkout_at: z.string().optional(), contract_slug: z.string().optional(), created_at: z.string().optional(), has_tickets: z.boolean().optional(), hotel_data: infoHotelData.optional(), invoice_id: z.string().optional(), is_cancellable: z.boolean().optional(), is_checked: z.boolean().optional(), is_package: z.boolean().optional(), meta_data: infoMetaData.optional(), modified_at: z.string().optional(), nights: z.number().int().optional(), order_id: z.number().int().optional(), order_type: z.string().optional(), partner_data: infoPartnerData.optional(), payment_data: infoB2BPaymentData.optional(), roomnights: z.number().int().optional(), rooms_data: z.array(infoRoomData).optional(), source: z.string().optional(), status: z.string().optional(), supplier_data: infoSupplierData.optional(), taxes: z.array(infoTaxData).optional(), total_vat: infoTotalVat.optional(), upsells: z.array(infoUpsellData).optional(), user_data: infoB2BUserData.optional()}); export const infoResponseB2B = z.object({current_page_number: z.number().int().optional(), found_orders: z.number().int().optional(), found_pages: z.number().int().optional(), orders: z.array(infoOrderB2B).optional(), total_orders: z.number().int().optional(), total_pages: z.number().int().optional()}); export const v3DebugEndpoint = z.object({endpoint: z.string().optional(), is_active: z.boolean().optional(), is_limited: z.boolean().optional(), remaining: z.number().int().optional(), requests_number: z.number().int().optional(), reset: z.string().optional(), seconds_number: z.number().int().optional()}); export const v3Debug = z.object({api_endpoint: v3DebugEndpoint.optional(), api_key_id: z.number().int().optional(), key_id: z.number().int().optional(), method: z.string().optional(), real_ip: z.string().optional(), request: z.array(z.number().int()).optional(), request_id: z.string().optional(), utcnow: z.string().optional(), validation_error: z.string().optional()}); export const createApiApiB2bV3HotelOrderInfoResponse = z.object({data: infoResponseB2B.optional(), debug: v3Debug.optional(), error: z.string().optional(), status: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get info about hotel order(s) * * POST /api/b2b/v3/hotel/order/info */ export const createApiApiB2bV3HotelOrderInfo = async (args: CreateApiApiB2bV3HotelOrderInfoArgs, options: CreateApiApiB2bV3HotelOrderInfoOptions) => { const {baseUrl, fetch: fetchFn = fetch, BasicAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (BasicAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${BasicAuth.username}:${BasicAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/b2b/v3/hotel/order/info${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiApiB2bV3HotelOrderInfoResponse, await res.json()) };