import {z} from 'zod' export type GetApiTransactionChargesArgs = {'Content-Type': 'application/json' | 'application/json;charset=UTF-8', 'FSV-Interaction-Id': string, Environment: string, 'Institution-Number': string, 'Internal-Merchant-Id': string, chargeStatus?: ('ACTIVE' | 'FUTURE' | 'ALL' | 'INACTIVE') | undefined, serviceIndex?: string | undefined, recordIdNumber?: string | undefined, chargeTierLevel?: string | undefined, chargeCurrencyCode?: string | undefined, chargeModel?: ('INDIVIDUAL' | 'DEFAULT') | undefined, limit?: number | undefined, offset?: number | undefined}; export type GetApiTransactionChargesOptions = {baseUrl?: string | undefined, AppKey?: string | undefined, JWSSignature?: string | undefined, fetch?: typeof fetch | undefined}; export const pagingMetaType = z.object({count: z.number().int().optional(), totalPages: z.number().int().optional(), currentOffset: z.number().int().optional(), currentNumberOfRetrievedRecords: z.number().int().optional(), maxLimit: z.number().int().optional(), hasMoreRecords: z.boolean().optional(), pageNumber: z.number().int().optional()}); export const sortingMetaType = z.object({sort: z.string().optional()}); export const sourceType = z.object({pointer: z.string().optional(), parameter: z.string().optional(), header: z.string().optional()}); export const errorType = z.object({id: z.string().optional(), code: z.string(), title: z.string(), detail: z.string().optional(), source: sourceType.optional()}); export const metaType = z.object({paging: pagingMetaType.optional(), sorting: sortingMetaType.optional(), messages: z.array(errorType).optional()}); export const oPYTransactionChargesRecordIdNumber = z.string().min(10).max(10); export const oPYGenericCode3 = z.string().min(1).max(3); export const oPYGenericDescription = z.string().max(100); export const oPYTransactionChargesCardServiceTypeObj = z.object({cardServiceTypeIndex: oPYGenericCode3.optional(), cardServiceTypeDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesChargeTypeObj = z.object({chargeTypeIndex: oPYGenericCode3.optional(), chargeTypeIndexDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesServiceIDObjV11 = z.object({serviceIndex: oPYGenericCode3.optional(), serviceDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesTransactionTypeObj = z.object({transactionType: oPYGenericCode3.optional(), transactionTypeDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesCaptureMethodObj = z.object({captureMethodIndex: oPYGenericCode3.optional(), captureMethodDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesAreaOfEventObj = z.object({areaOfEventIndex: oPYGenericCode3.optional(), areaOfEventDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesFeeCategoryObj = z.object({feeCategoryIndex: oPYGenericCode3.optional(), feeCategoryIndexDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesEffectiveDate = z.string().min(8).max(8); export const oPYTransactionChargesExpiryDate = z.string().min(8).max(8); export const oPYTransactionChargesFeeMode = z.boolean(); export const oPYTransactionChargesFeePercentage = z.string().max(11); export const oPYTransactionChargesFeeBase = z.string().max(11); export const oPYTransactionChargesFeeMinimum = z.string().max(11); export const oPYTransactionChargesFeeMaximum = z.string().max(11); export const oPYTransactionChargesChargeCurrencyCode = z.string().min(3).max(3); export const oPYTransactionChargesChargeTierLevel = z.string().max(20); export const oPYTransactionChargesFeeTypeObj = z.object({feeTypeIndex: oPYGenericCode3.optional(), feeTypeDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesTransactionCurrencyObj = z.object({transactionCurrencyIndex: oPYGenericCode3.optional(), transactionCurrencyDescription: oPYGenericDescription.optional()}); export const oPYTransactionChargesLastUpdatedBy = z.string().max(60); export const oPYTransactionChargesLastUpdated = z.string().min(8).max(8); export const linksType = z.object({self: z.string().optional(), first: z.string().optional(), last: z.string().optional(), prev: z.string().optional(), next: z.string().optional()}); export const inlineResponse2006 = z.object({meta: metaType.optional(), data: z.array(z.object({chargeModel: z.enum(["INDIVIDUAL", "DEFAULT"]).optional(), chargeStatus: z.enum(["ACTIVE", "FUTURE", "INACTIVE"]).optional(), recordIdNumber: oPYTransactionChargesRecordIdNumber, cardType: oPYTransactionChargesCardServiceTypeObj.optional(), chargeType: oPYTransactionChargesChargeTypeObj.optional(), serviceId: oPYTransactionChargesServiceIDObjV11.optional(), transactionType: oPYTransactionChargesTransactionTypeObj.optional(), captureMethod: oPYTransactionChargesCaptureMethodObj.optional(), areaOfEvent: oPYTransactionChargesAreaOfEventObj.optional(), feeCategory: oPYTransactionChargesFeeCategoryObj.optional(), effectiveDate: oPYTransactionChargesEffectiveDate.optional(), expiryDate: oPYTransactionChargesExpiryDate.optional(), feeMode: oPYTransactionChargesFeeMode.optional(), feePercentage: oPYTransactionChargesFeePercentage.optional(), feeBase: oPYTransactionChargesFeeBase.optional(), feeMinimum: oPYTransactionChargesFeeMinimum.optional(), feeMaximum: oPYTransactionChargesFeeMaximum.optional(), chargeCurrencyCode: oPYTransactionChargesChargeCurrencyCode.optional(), chargeTierLevel: oPYTransactionChargesChargeTierLevel.optional(), feeType: oPYTransactionChargesFeeTypeObj.optional(), transactionCurrency: oPYTransactionChargesTransactionCurrencyObj.optional(), lastUpdatedBy: oPYTransactionChargesLastUpdatedBy.optional(), lastUpdated: oPYTransactionChargesLastUpdated.optional()})), errors: z.array(errorType).optional(), links: linksType.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 }; /** * Retrieves merchant transaction charges * * GET /transaction-charges */ export const getApiTransactionCharges = async (args: GetApiTransactionChargesArgs, options?: GetApiTransactionChargesOptions) => { const {baseUrl = "https://prod.emea.api.fiservapps.com/ipp/omnipay/acquirerprofile/v1.0", fetch: fetchFn = fetch, AppKey, JWSSignature} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['Content-Type'] != null) headers.set("Content-Type", String(args['Content-Type'])) if (args['FSV-Interaction-Id'] != null) headers.set("FSV-Interaction-Id", String(args['FSV-Interaction-Id'])) if (args.Environment != null) headers.set("Environment", String(args.Environment)) if (args['Institution-Number'] != null) headers.set("Institution-Number", String(args['Institution-Number'])) if (args['Internal-Merchant-Id'] != null) headers.set("Internal-Merchant-Id", String(args['Internal-Merchant-Id'])) if (args.chargeStatus != null) query.append("chargeStatus", String(args.chargeStatus)) if (args.serviceIndex != null) query.append("serviceIndex", String(args.serviceIndex)) if (args.recordIdNumber != null) query.append("recordIdNumber", String(args.recordIdNumber)) if (args.chargeTierLevel != null) query.append("chargeTierLevel", String(args.chargeTierLevel)) if (args.chargeCurrencyCode != null) query.append("chargeCurrencyCode", String(args.chargeCurrencyCode)) if (args.chargeModel != null) query.append("chargeModel", String(args.chargeModel)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.offset != null) query.append("offset", String(args.offset)) if (AppKey !== undefined) headers.set("Api-Key", AppKey) if (JWSSignature !== undefined) headers.set("JWS-Signature", JWSSignature) const url = `${baseUrl.replace(/\/+$/, '')}/transaction-charges${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(inlineResponse2006, await res.json()) };