import {z} from 'zod' export type CreateApiApiCatalogMembershipsCreateInvoiceOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiApiCatalogMembershipsCreateInvoiceResponse = z.object({Invoice: z.object({Id: z.string().optional(), InvoiceNumber: z.string().optional(), GroupInvoiceId: z.unknown(), group_name: z.unknown(), ReceiptNumber: z.unknown(), AppointmentGroupId: z.unknown(), ReservationId: z.unknown(), IsRebooking: z.boolean().optional(), Notes: z.unknown(), GuestId: z.unknown(), Guest: z.object({Id: z.string().optional(), Code: z.unknown(), FirstName: z.string().optional(), MiddleName: z.unknown(), LastName: z.string().optional(), Email: z.unknown(), MobileNumber: z.unknown(), MobilePhoneModel: z.object({CountryId: z.number().int().optional(), Number: z.unknown(), DisplayNumber: z.unknown()}).optional(), HomePhone: z.unknown(), HomePhoneModel: z.unknown(), WorkPhone: z.unknown(), WorkPhoneModel: z.unknown(), Gender: z.number().int().optional(), DateOfBirth: z.string().optional(), AnniversaryDate: z.unknown(), Address1: z.string().optional(), Address2: z.unknown(), City: z.unknown(), PostalCode: z.unknown(), State: z.object({Id: z.number().int().optional(), Code: z.unknown(), Name: z.string().optional(), ShortName: z.unknown()}).optional(), Country: z.object({Id: z.number().int().optional(), Code: z.string().optional(), Name: z.string().optional(), PhoneCode: z.number().int().optional(), Nationality: z.string().optional()}).optional(), Nationality: z.unknown(), ReferralSource: z.unknown(), ReferredGuestId: z.unknown(), ReceiveTransactionalSms: z.unknown(), ReceiveMarketingEmail: z.unknown(), ReceiveTransactionalEmail: z.unknown(), ReceiveMarketingSms: z.boolean().optional(), CreationDate: z.unknown(), LastUpdated: z.unknown(), MergeIntoCode: z.unknown(), MergeIntoGuestId: z.unknown(), CenterId: z.string().optional(), CenterCode: z.unknown(), CenterName: z.unknown(), GuestIndicator: z.string().optional(), IsMember: z.number().int().optional(), DOB_IncompleteYear: z.unknown(), Password: z.unknown(), UserName: z.unknown(), FacebookUserId: z.unknown(), SocialFaceBookUserId: z.unknown(), SocialGoogleUserId: z.unknown(), hasZenotiCreds: z.boolean().optional(), OldPassword: z.unknown(), OptInForLoyaltyProgram: z.unknown(), FormDetails: z.array(z.object({AppointmentId: z.string().optional(), FormId: z.string().optional(), ServiceName: z.unknown(), ServiceDisplayName: z.unknown(), ServiceId: z.unknown(), Name: z.string().optional(), Filled: z.boolean().optional(), Submitted: z.boolean().optional(), LastFilledDate: z.string().optional(), FormType: z.number().int().optional(), LastFilledBy: z.unknown(), LatestVersion: z.unknown(), FormHistory: z.array(z.object({})).optional(), Viewonly: z.boolean().optional(), IsFormLocked: z.unknown(), ExpiryDate: z.unknown(), IsEditable: z.boolean().optional(), IsExpired: z.boolean().optional(), OwnerId: z.unknown(), DisplayOrder: z.unknown(), IsServiceForm: z.boolean().optional(), SourceAppointmentDate: z.unknown(), Permissions: z.unknown(), FormFilledStatus: z.number().int().optional(), IsActive: z.boolean().optional(), SendLinkInNotifications: z.boolean().optional()})).optional(), IsMinors: z.boolean().optional(), LpTierInfo: z.string().optional(), GuestIndicatorValue: z.object({HighSpender: z.boolean().optional(), Member: z.number().int().optional(), LowFeedback: z.boolean().optional(), RegularGuest: z.boolean().optional(), FirstTimer: z.boolean().optional(), ReturningCustomer: z.boolean().optional(), NoShow: z.boolean().optional(), HasActivePackages: z.boolean().optional(), HasProfileAlerts: z.boolean().optional(), OtherCenterGuest: z.boolean().optional(), HasCTA: z.boolean().optional(), Dues: z.boolean().optional(), CardOnFile: z.boolean().optional(), AutoPayEnabled: z.boolean().optional()}).optional(), IsMemberbershipAddOnUser: z.number().int().optional(), HasActiveMems: z.number().int().optional(), ReceiveLpStmt: z.boolean().optional(), GenderEnumType: z.unknown(), ReferralCode: z.unknown()}).optional(), Price: z.object({CurrencyId: z.number().int().optional(), Sales: z.number().int().optional(), Tax: z.number().int().optional(), Final: z.number().int().optional(), Final1: z.number().int().optional(), Discount: z.number().int().optional(), Tip: z.number().int().optional(), SSG: z.number().int().optional(), RoundingCorrection: z.number().int().optional(), DiscountedPrice: z.unknown(), environmental_fee: z.unknown(), environmental_fee_label: z.unknown(), can_be_waived: z.boolean().optional()}).optional(), SaleDate: z.string().optional(), FutureRecurringBillDate: z.unknown(), LinkedInvoiceId: z.unknown(), Status: z.number().int().optional(), InvoiceServices: z.array(z.object({})).optional(), InvoiceProducts: z.array(z.object({})).optional(), InvoiceMemberships: z.array(z.object({AppointmentMembership: z.object({Membership: z.object({Id: z.string().optional(), VersionId: z.string().optional(), SetupMembershipId: z.unknown(), Name: z.string().optional(), Price: z.object({CurrencyId: z.number().int().optional(), Sales: z.number().int().optional(), Tax: z.number().int().optional(), Final: z.number().int().optional(), Final1: z.number().int().optional(), Discount: z.number().int().optional(), Tip: z.number().int().optional(), SSG: z.unknown(), RoundingCorrection: z.number().int().optional(), DiscountedPrice: z.unknown(), environmental_fee: z.unknown(), environmental_fee_label: z.unknown(), can_be_waived: z.boolean().optional()}).optional(), SetupPrice: z.unknown(), CanBook: z.boolean().optional(), ShowPrice: z.boolean().optional(), DisplayName: z.string().optional(), DisplayPrice: z.unknown(), ImagePaths: z.unknown(), IsRecurrringMembership: z.boolean().optional(), MembershipType: z.number().int().optional(), FirstCollectionAfter: z.number().int().optional(), Description: z.string().optional(), HTMLDescription: z.string().optional(), TermsandConditions: z.string().optional(), TermsandConditionsAcceptance: z.unknown(), enforce_mandatory_fields: z.boolean().optional(), FrequencyText: z.unknown()}).optional(), InvoiceItemId: z.string().optional(), Employee: z.unknown(), Quantity: z.number().int().optional(), Price: z.object({CurrencyId: z.number().int().optional(), Sales: z.number().int().optional(), Tax: z.number().int().optional(), Final: z.number().int().optional(), Final1: z.number().int().optional(), Discount: z.number().int().optional(), Tip: z.number().int().optional(), SSG: z.unknown(), RoundingCorrection: z.number().int().optional(), DiscountedPrice: z.unknown(), environmental_fee: z.unknown(), environmental_fee_label: z.unknown(), can_be_waived: z.boolean().optional()}).optional(), IsMembershipApplied: z.unknown(), IsPackageApplied: z.unknown(), IsDiscountApplied: z.unknown(), MembershipBillDate: z.unknown(), RecurringMembership: z.unknown(), Signature: z.unknown(), UserMembershipId: z.unknown(), AcceptedOn: z.unknown(), IsTandCAccepted: z.unknown(), PaymentAccountId: z.unknown(), HasMembershipDigitalForm: z.boolean().optional(), HasFilledMembershipForms: z.boolean().optional(), RecurringPaymentType: z.number().int().optional()}).optional(), AppliedMembership: z.unknown(), AppliedPackage: z.unknown(), AppliedDiscount: z.unknown()})).optional(), InvoiceDayPackages: z.array(z.object({})).optional(), InvoiceSeriesPackages: z.array(z.object({})).optional(), InvoiceGiftCards: z.array(z.object({})).optional(), InvoicePrepaidCards: z.array(z.object({})).optional(), Payments: z.array(z.object({})).optional(), Redemptions: z.array(z.object({})).optional(), RefundItems: z.unknown(), Lock: z.boolean().optional(), CanChangeGuest: z.boolean().optional(), CenterId: z.string().optional(), Center: z.object({Id: z.string().optional(), Country: z.object({Id: z.number().int().optional(), Code: z.string().optional(), Name: z.string().optional(), PhoneCode: z.number().int().optional(), Nationality: z.string().optional()}).optional(), State: z.object({Id: z.number().int().optional(), Code: z.string().optional(), Name: z.string().optional(), ShortName: z.string().optional()}).optional(), Name: z.string().optional(), GeoLatitude: z.number().optional(), GeoLongitude: z.number().optional(), Address1: z.string().optional(), Address2: z.string().optional(), City: z.unknown(), ZipCode: z.unknown(), Phone1: z.object({CountryId: z.number().int().optional(), Number: z.unknown(), DisplayNumber: z.unknown()}).optional(), Phone2: z.object({CountryId: z.number().int().optional(), Number: z.unknown(), DisplayNumber: z.unknown()}).optional(), Email: z.unknown(), CenterInfo: z.unknown(), ServiceTaxNo: z.unknown(), TIN: z.unknown(), VAT: z.unknown(), CST: z.unknown(), CanBook: z.boolean().optional(), CenterCode: z.string().optional(), TimeZone: z.object({Id: z.number().int().optional(), Name: z.string().optional(), StandardName: z.string().optional(), Symbol: z.string().optional()}).optional(), CollectFeedback: z.boolean().optional(), working_hours: z.unknown(), AreServicesAvailableInCenter: z.boolean().optional(), FeedBackLink: z.unknown(), FeedBackLabelText: z.unknown(), isPaymentEnabled: z.boolean().optional(), isCenterVoided: z.boolean().optional(), isServiceSaleEnabled: z.boolean().optional(), isMembershipSaleEnabled: z.boolean().optional(), isGiftCardSaleEnabled: z.boolean().optional(), isSeriesPackageSaleEnabled: z.boolean().optional(), isDealsEnabled: z.boolean().optional(), EnableSelfPay: z.boolean().optional(), EnableSelfCheckIn: z.boolean().optional(), EnableAutoPay: z.boolean().optional(), AllowSelfCheckinBefore: z.number().int().optional(), AllowCheckWithinRadius: z.number().int().optional(), Zone: z.object({id: z.string().optional(), name: z.unknown()}).optional()}).optional(), CollectFeedback: z.boolean().optional(), BookingWizardAdvancedMode: z.boolean().optional(), Refunded: z.boolean().optional(), InvoiceAuthStatus: z.number().int().optional(), InvoiceAuthorizationStatus: z.number().int().optional(), InvTransactionStatusForAutoPay: z.number().int().optional(), InvoiceSource: z.number().int().optional(), is_created_from_booking_wizard: z.boolean().optional(), RemoveBuddyServiceFinishSegment: z.unknown(), host_id: z.unknown(), payment_made_by: z.unknown(), entity_name: z.unknown(), email_link: z.unknown(), sms_link: z.unknown()}).optional(), PaymentOptions: z.unknown(), Error: z.unknown()}); 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 }; /** * Create an invoice for the sale of a membership * * POST /api/Catalog/Memberships/CreateInvoice */ export const createApiApiCatalogMembershipsCreateInvoice = async (options?: CreateApiApiCatalogMembershipsCreateInvoiceOptions) => { const {baseUrl = "https://api.zenoti.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/Catalog/Memberships/CreateInvoice${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiApiCatalogMembershipsCreateInvoiceResponse, await res.json()) };