import {z} from 'zod' export type LodgifyApiPublicReservationsModelsV2ReservationsBookingsStayFilterEnum = 'Upcoming' | 'Current' | 'Historic' | 'All' | 'ArrivalDate' | 'DepartureDate'; export type LodgifyApiPublicReservationsModelsV2ReservationsBookingsTrashEnum = 'False' | 'True' | 'All'; export type GetApiV2ReservationsBookingsArgs = {page?: number | undefined, size?: number | undefined, includeCount?: boolean | undefined, stayFilter?: LodgifyApiPublicReservationsModelsV2ReservationsBookingsStayFilterEnum | undefined, updatedSince?: string | undefined, includeTransactions?: boolean | undefined, includeExternal?: boolean | undefined, includeQuoteDetails?: boolean | undefined, trash?: LodgifyApiPublicReservationsModelsV2ReservationsBookingsTrashEnum | undefined, stayFilterDate?: string | undefined}; export type GetApiV2ReservationsBookingsOptions = {baseUrl?: string | undefined, ApiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const lodgifyApiPublicReservationsModelsV12GuestBreakdownDto = z.object({adults: z.number().int().gte(0).lte(2147483647).optional(), children: z.number().int().gte(0).lte(2147483647).optional(), infants: z.number().int().gte(0).lte(2147483647).optional(), pets: z.number().int().gte(0).lte(2147483647).optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsBookingRoomDto = z.object({room_type_id: z.number().int().optional(), guest_breakdown: lodgifyApiPublicReservationsModelsV12GuestBreakdownDto, people: z.number().int().optional(), key_code: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsGuestDto = z.object({name: z.string().nullable().optional(), email: z.string().nullable().optional(), phone: z.string().nullable().optional(), country_code: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsStatusEnum = z.enum(["Open", "Tentative", "Booked", "Declined"]); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsSourceEnum = z.enum(["Manual", "OH", "NineFlats", "Airbnb", "AirbnbIntegration", "HomeAway", "BookingCom", "Expedia", "ICal", "Email", "FacebookMessenger", "PublicApi", "Other"]); export const lodgifyAppTypesMoney1 = z.object({}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsSubtotalDto = z.object({stay: lodgifyAppTypesMoney1.optional(), promotions: lodgifyAppTypesMoney1.optional(), fees: lodgifyAppTypesMoney1.optional(), taxes: lodgifyAppTypesMoney1.optional(), addons: lodgifyAppTypesMoney1.optional(), vat: lodgifyAppTypesMoney1.optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesPolicyDto = z.object({name: z.string().nullable().optional(), payments: z.string().nullable().optional(), cancellation: z.string().nullable().optional(), damage_deposit: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesQuoteStatusEnum = z.enum(["Null", "NotScheduled", "NotSent", "Agreed", "CancelledByOwner", "CancelledByGuest", "Rejected", "Deactivated", "ExpiredByGuest", "ExpiredByOwner", "PendingForOwner", "PendingForGuest", "PendingForPayment", "RedirectedToOffsitePayment", "ChangeRequested", "Changed", "Disconnected"]); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesScheduledTransactionTypeEnum = z.enum(["PrePayment", "InterimPayment", "BalancePayment", "PrecedingPayment", "Cancellation", "DamageDepositAuthorization", "DamageDepositVoid", "SecurityDepositCharge", "SecurityDepositRefund"]); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesScheduledTransactionStatusEnum = z.enum(["Scheduled", "Overdue", "Pending", "Partial", "Aborted", "Paid", "Refunded", "Authorized", "Voided", "Captured", "Shown"]); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesScheduledTransactionDto = z.object({id: z.number().int().optional(), type: lodgifyApiPublicReservationsModelsV2ReservationsQuotesScheduledTransactionTypeEnum.optional(), status: lodgifyApiPublicReservationsModelsV2ReservationsQuotesScheduledTransactionStatusEnum.optional(), amount: lodgifyAppTypesMoney1.optional(), due_at: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesBookingQuotePriceItemDto = z.object({type: z.string().nullable().optional(), amount: lodgifyAppTypesMoney1.optional(), description: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesBookingQuoteRoomTypeItemDto = z.object({room_type_id: z.number().int().optional(), subtotal: lodgifyAppTypesMoney1.optional(), prices: z.array(lodgifyApiPublicReservationsModelsV2ReservationsQuotesBookingQuotePriceItemDto).nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesRentalContractUidDto = z.object({hash: z.string().optional(), uid: z.string().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsQuotesQuoteDto = z.object({id: z.number().int().optional(), policy: lodgifyApiPublicReservationsModelsV2ReservationsQuotesPolicyDto.optional(), status: lodgifyApiPublicReservationsModelsV2ReservationsQuotesQuoteStatusEnum.optional(), scheduled_transactions: z.array(lodgifyApiPublicReservationsModelsV2ReservationsQuotesScheduledTransactionDto).nullable().optional(), scheduled_damage_protection: z.array(lodgifyApiPublicReservationsModelsV2ReservationsQuotesScheduledTransactionDto).nullable().optional(), room_type_items: z.array(lodgifyApiPublicReservationsModelsV2ReservationsQuotesBookingQuoteRoomTypeItemDto).nullable().optional(), addon_items: z.array(lodgifyApiPublicReservationsModelsV2ReservationsQuotesBookingQuotePriceItemDto).nullable().optional(), other_items: z.array(lodgifyApiPublicReservationsModelsV2ReservationsQuotesBookingQuotePriceItemDto).nullable().optional(), vat_items: z.array(lodgifyApiPublicReservationsModelsV2ReservationsQuotesBookingQuotePriceItemDto).nullable().optional(), rental_contract_uid: lodgifyApiPublicReservationsModelsV2ReservationsQuotesRentalContractUidDto.optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsTransactionTypeEnum = z.enum(["Payment", "Refund", "Show", "Authorization", "Void", "Capture"]); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsTransactionStatusEnum = z.enum(["Requested", "Processing", "Done", "Failed", "Canceled", "Abandoned", "Unknown"]); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsPaymentTypeEnum = z.enum(["None", "PaypalWallet", "BankAccount", "StripeSpreedly", "Payyo", "AuthorizeNetSpreedly", "BraintreeSpreedly", "PayPalProSpreedly", "PciProxy", "SpreedlyTestSpreedly", "StripeSca", "LodgifyPaymentsStripe"]); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsTransactionDto = z.object({id: z.number().int().optional(), type: lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsTransactionTypeEnum.optional(), status: lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsTransactionStatusEnum.optional(), payment_type: lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsPaymentTypeEnum.optional(), description: z.string().nullable().optional(), amount: lodgifyAppTypesMoney1.optional(), processed_at: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsCheckInViewModel = z.object({time: z.string().nullable().optional(), initiator: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsCheckOutViewModel = z.object({time: z.string().nullable().optional(), initiator: z.string().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsBookingDto = z.object({id: z.number().int().optional(), user_id: z.number().int().optional(), arrival: z.string().optional(), departure: z.string().optional(), property_id: z.number().int().optional(), rooms: z.array(lodgifyApiPublicReservationsModelsV2ReservationsBookingsBookingRoomDto).nullable().optional(), guest: lodgifyApiPublicReservationsModelsV2ReservationsBookingsGuestDto.optional(), language: z.string().nullable().optional(), status: lodgifyApiPublicReservationsModelsV2ReservationsBookingsStatusEnum.optional(), is_unavailable: z.boolean().optional(), is_overbooked: z.boolean().optional(), tentative_expires_at: z.string().nullable().optional(), source: lodgifyApiPublicReservationsModelsV2ReservationsBookingsSourceEnum.optional(), source_text: z.string().nullable().optional(), created_from_ip: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), canceled_at: z.string().nullable().optional(), is_new: z.boolean().optional(), is_deleted: z.boolean().optional(), currency_code: z.string().nullable().optional(), total_amount: lodgifyAppTypesMoney1.optional(), subtotals: lodgifyApiPublicReservationsModelsV2ReservationsBookingsSubtotalDto.optional(), amount_paid: lodgifyAppTypesMoney1.optional(), amount_due: lodgifyAppTypesMoney1.optional(), quote: lodgifyApiPublicReservationsModelsV2ReservationsQuotesQuoteDto.optional(), transactions: z.array(lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsTransactionDto).nullable().optional(), damage_protection: z.array(lodgifyApiPublicReservationsModelsV2ReservationsBookingTransactionsTransactionDto).nullable().optional(), notes: z.string().nullable().optional(), thread_uid: z.string().optional(), external_booking: z.string().nullable().optional(), check_in: lodgifyApiPublicReservationsModelsV2ReservationsBookingsCheckInViewModel.optional(), check_out: lodgifyApiPublicReservationsModelsV2ReservationsBookingsCheckOutViewModel.optional(), upgraded_enquiry_id: z.number().int().nullable().optional()}); export const lodgifyApiPublicReservationsModelsV2ReservationsBookingsBookingSetDto = z.object({count: z.number().int().nullable().optional(), items: z.array(lodgifyApiPublicReservationsModelsV2ReservationsBookingsBookingDto).nullable().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 }; /** * List of bookings * * GET /v2/reservations/bookings */ export const getApiV2ReservationsBookings = async (args: GetApiV2ReservationsBookingsArgs, options?: GetApiV2ReservationsBookingsOptions) => { const {baseUrl = "https://api.lodgify.com", fetch: fetchFn = fetch, ApiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.page != null) query.append("page", String(args.page)) if (args.size != null) query.append("size", String(args.size)) if (args.includeCount != null) query.append("includeCount", String(args.includeCount)) if (args.stayFilter != null) query.append("stayFilter", String(args.stayFilter)) if (args.updatedSince != null) query.append("updatedSince", String(args.updatedSince)) if (args.includeTransactions != null) query.append("includeTransactions", String(args.includeTransactions)) if (args.includeExternal != null) query.append("includeExternal", String(args.includeExternal)) if (args.includeQuoteDetails != null) query.append("includeQuoteDetails", String(args.includeQuoteDetails)) if (args.trash != null) query.append("trash", String(args.trash)) if (args.stayFilterDate != null) query.append("stayFilterDate", String(args.stayFilterDate)) if (ApiKey !== undefined) headers.set("X-ApiKey", ApiKey) const url = `${baseUrl.replace(/\/+$/, '')}/v2/reservations/bookings${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(lodgifyApiPublicReservationsModelsV2ReservationsBookingsBookingSetDto, await res.json()) };