import {z} from 'zod' export type Booking = {id?: string | undefined, type?: string | undefined, attributes?: ({customer_desires_downpayment?: boolean | undefined, booker_desires_downpayment?: boolean | undefined, after_payment_return_url?: string | undefined, redeemable_codes?: Array | undefined, option_validity?: number | undefined, remote_booking_nr?: string | undefined, reference_nr?: string | undefined, locale?: ('cs' | 'da-DK' | 'de' | 'de-AT' | 'de-CH' | 'en-US' | 'en-GB' | 'es' | 'fr' | 'fr-BE' | 'fr-LU' | 'it' | 'nb' | 'nl' | 'nl-BE' | 'pl' | 'pt' | 'tr' | 'en' | 'da') | undefined, memo?: string | undefined, currency?: ('EUR' | 'USD' | 'CHF' | 'CZK' | 'TRY' | 'CVE' | 'XCG' | 'GBP' | 'NOK' | 'DKK' | 'ZAR') | undefined, cancel_date?: string | undefined, cancel_reason?: string | undefined, state?: ('initial' | 'concept' | 'concept_to_be_accepted' | 'concept_option' | 'concept_to_be_accepted_option' | 'temporary' | 'temporary_to_be_accepted' | 'temporary_to_be_checked' | 'temporary_to_be_accepted_and_checked' | 'temporary_option' | 'temporary_to_be_accepted_option' | 'to_be_accepted' | 'to_be_accepted_option' | 'to_be_checked' | 'to_be_accepted_and_checked' | 'option' | 'rejected' | 'cancelling' | 'confirmed' | 'imported' | 'cancelled') | undefined, token?: string | undefined, confirmed_at?: string | undefined, paid_by_customer?: boolean | undefined, deposit_completed?: boolean | undefined, booking_nr?: string | undefined, owner_reservation?: boolean | undefined, original_total?: ({currency?: string | undefined, value?: string | undefined}) | undefined, total?: ({currency?: string | undefined, value?: string | undefined}) | undefined, total_without_vat?: ({currency?: string | undefined, value?: string | undefined}) | undefined, total_without_vat_without_deposit?: ({currency?: string | undefined, value?: string | undefined}) | undefined, guest_payment_due?: ({currency?: string | undefined, value?: string | undefined}) | undefined, guest_total_paid?: ({currency?: string | undefined, value?: string | undefined}) | undefined, deposit?: ({currency?: string | undefined, value?: string | undefined}) | undefined, rent_turnover?: ({currency?: string | undefined, value?: string | undefined}) | undefined, rent_turnover_without_vat?: ({currency?: string | undefined, value?: string | undefined}) | undefined, provision?: ({currency?: string | undefined, value?: string | undefined}) | undefined, payment_deadlines?: (Array<{date?: string | undefined, open_amount?: ({currency?: string | undefined, value?: string | undefined}) | undefined, paid_amount?: ({currency?: string | undefined, value?: string | undefined}) | undefined}>) | undefined, payment_deadlines_with_deposit?: (Array<{date?: string | undefined, open_amount?: ({currency?: string | undefined, value?: string | undefined}) | undefined, paid_amount?: ({currency?: string | undefined, value?: string | undefined}) | undefined, included_security_deposits?: (Array<{pay_on_arrival?: boolean | undefined, amount?: ({currency?: string | undefined, value?: string | undefined}) | undefined}>) | undefined}>) | undefined, pending_vouchers?: (Array<{code?: string | undefined, balance?: ({currency?: string | undefined, value?: string | undefined}) | undefined, amount?: ({currency?: string | undefined, value?: string | undefined}) | undefined}>) | undefined, created_at?: string | undefined, updated_at?: string | undefined}) | undefined, links?: ({self?: string | undefined, url?: string | undefined, payment_portal_url?: string | undefined, pay_url?: string | undefined}) | undefined, relationships?: ({customer?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, owner?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, traffic_source?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, conversation?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, credit_cards?: ({data?: (Array<{id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}>) | undefined}) | undefined, security_deposits?: ({data?: (Array<{id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}>) | undefined}) | undefined, administration?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, channel?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, guest_invoice?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, customer_invoice?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, channel_invoice?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined, reservations?: ({data?: (Array<{id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}>) | undefined}) | undefined, payments?: ({data?: (Array<{id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}>) | undefined}) | undefined}) | undefined, meta?: ({temp_id?: string | undefined}) | undefined}; export type CreateApiV3AdministrationsAdministrationIdConversationsArgs = {administration_id: string, 'fields[conversation]'?: string | undefined, include?: string | undefined, 'Accept-Language'?: string | undefined, body: {data?: ({type?: string | undefined, attributes?: ({rid: string, is_open?: boolean | undefined}) | undefined, relationships?: ({booking?: ({data?: ({id?: string | undefined, type?: string | undefined, meta?: ({temp_id?: string | undefined, method?: string | undefined}) | undefined}) | undefined}) | undefined}) | undefined, meta?: ({temp_id?: string | undefined}) | undefined}) | undefined, included?: Array | undefined}}; export type CreateApiV3AdministrationsAdministrationIdConversationsOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const conversation = z.object({id: z.string().optional(), type: z.string().optional(), attributes: z.object({rid: z.string(), is_open: z.boolean().optional()}).optional(), relationships: z.object({booking: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional()}).optional(), meta: z.object({temp_id: z.string().optional()}).optional()}); export const booking = z.object({id: z.string().optional(), type: z.string().optional(), attributes: z.object({customer_desires_downpayment: z.boolean().optional(), booker_desires_downpayment: z.boolean().optional(), after_payment_return_url: z.string().optional(), redeemable_codes: z.array(z.string()).optional(), option_validity: z.number().int().optional(), remote_booking_nr: z.string().max(255).optional(), reference_nr: z.string().max(255).optional(), locale: z.enum(["cs", "da-DK", "de", "de-AT", "de-CH", "en-US", "en-GB", "es", "fr", "fr-BE", "fr-LU", "it", "nb", "nl", "nl-BE", "pl", "pt", "tr", "en", "da"]).optional(), memo: z.string().optional(), currency: z.enum(["EUR", "USD", "CHF", "CZK", "TRY", "CVE", "XCG", "GBP", "NOK", "DKK", "ZAR"]).optional(), cancel_date: z.string().optional(), cancel_reason: z.string().optional(), state: z.enum(["initial", "concept", "concept_to_be_accepted", "concept_option", "concept_to_be_accepted_option", "temporary", "temporary_to_be_accepted", "temporary_to_be_checked", "temporary_to_be_accepted_and_checked", "temporary_option", "temporary_to_be_accepted_option", "to_be_accepted", "to_be_accepted_option", "to_be_checked", "to_be_accepted_and_checked", "option", "rejected", "cancelling", "confirmed", "imported", "cancelled"]).optional(), token: z.string().max(255).optional(), confirmed_at: z.string().optional(), paid_by_customer: z.boolean().optional(), deposit_completed: z.boolean().optional(), booking_nr: z.string().max(255).optional(), owner_reservation: z.boolean().optional(), original_total: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), total: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), total_without_vat: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), total_without_vat_without_deposit: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), guest_payment_due: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), guest_total_paid: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), deposit: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), rent_turnover: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), rent_turnover_without_vat: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), provision: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), payment_deadlines: z.array(z.object({date: z.string().optional(), open_amount: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), paid_amount: z.object({currency: z.string().optional(), value: z.string().optional()}).optional()})).optional(), payment_deadlines_with_deposit: z.array(z.object({date: z.string().optional(), open_amount: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), paid_amount: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), included_security_deposits: z.array(z.object({pay_on_arrival: z.boolean().optional(), amount: z.object({currency: z.string().optional(), value: z.string().optional()}).optional()})).optional()})).optional(), pending_vouchers: z.array(z.object({code: z.string().optional(), balance: z.object({currency: z.string().optional(), value: z.string().optional()}).optional(), amount: z.object({currency: z.string().optional(), value: z.string().optional()}).optional()})).optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), links: z.object({self: z.string().optional(), url: z.string().optional(), payment_portal_url: z.string().optional(), pay_url: z.string().optional()}).optional(), relationships: z.object({customer: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), owner: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), traffic_source: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), conversation: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), credit_cards: z.object({data: z.array(z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()})).optional()}).optional(), security_deposits: z.object({data: z.array(z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()})).optional()}).optional(), administration: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), channel: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), guest_invoice: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), customer_invoice: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), channel_invoice: z.object({data: z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()}).optional()}).optional(), reservations: z.object({data: z.array(z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()})).optional()}).optional(), payments: z.object({data: z.array(z.object({id: z.string().optional(), type: z.string().optional(), meta: z.object({temp_id: z.string().optional(), method: z.string().optional()}).optional()})).optional()}).optional()}).optional(), meta: z.object({temp_id: z.string().optional()}).optional()}); export const createApiV3AdministrationsAdministrationIdConversationsResponse = z.object({data: conversation.optional(), included: z.array(booking).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 }; /** * POST conversation * * POST /v3/administrations/{administration_id}/conversations * * Also accepts auth: OAuth2 */ export const createApiV3AdministrationsAdministrationIdConversations = async (args: CreateApiV3AdministrationsAdministrationIdConversationsArgs, options?: CreateApiV3AdministrationsAdministrationIdConversationsOptions) => { const {baseUrl = "https://api.bookingexperts.com", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/vnd.api+json") headers.set('accept', "application/vnd.api+json") if (args['fields[conversation]'] != null) query.append("fields[conversation]", String(args['fields[conversation]'])) if (args.include != null) query.append("include", String(args.include)) if (args['Accept-Language'] != null) headers.set("Accept-Language", String(args['Accept-Language'])) if (ApiKeyAuth !== undefined) headers.set("X-API-KEY", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/v3/administrations/${encodeURIComponent(String(args.administration_id))}/conversations${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(createApiV3AdministrationsAdministrationIdConversationsResponse, await res.json()) };