import {z} from 'zod' export type GetApiTransactionsTransactionIdArgs = {transactionId: string}; export type GetApiTransactionsTransactionIdOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiTransactionsTransactionIdResponse = z.object({transactionId: z.string().optional(), organizationId: z.string().optional(), cardholderId: z.string().optional(), cardId: z.string().optional(), status: z.enum(["DECLINED", "PENDING", "REVERSED", "CONFIRMED", "BOOKED"]).optional(), type: z.enum(["PURCHASE", "CASH_WITHDRAWAL", "REFUND", "CHARGEBACK", "RECHARGE", "STATUS_INQUIRY"]).optional(), partnerSubmissionStatus: z.enum(["NOT_SYNCED", "SYNCED", "TEMP_LOCKED", "LOCKED"]).optional(), partnerSubmissionStatusSyncedAt: z.string().nullable().optional(), partnerSubmissionStatusTempLockedAt: z.string().nullable().optional(), partnerSubmissionStatusLockedAt: z.string().nullable().optional(), category: z.enum(["ADVERTISING_AND_MARKETING", "COMPUTING_AND_SOFTWARE", "EDUCATION_AND_TRAINING", "ELECTRONICS_AND_IT_EQUIPMENT", "ENTERTAINMENT_AND_WELLNESS", "FOOD_AND_DRINKS", "GIFTS_AND_VOUCHERS", "MATERIALS_AND_PACKAGING", "OFFICE_SUPPLIES_AND_EQUIPMENT", "SERVICES", "TRAVEL_AND_ACCOMMODATION", "HEALTHCARE", "OTHER"]).optional(), billingAmount: z.object({value: z.number().optional(), currency: z.string().optional()}).optional(), transactionAmount: z.object({value: z.number().optional(), currency: z.string().optional()}).optional(), transactionCountry: z.string().min(3).max(3).optional(), transactionLocalTime: z.string().nullable().optional(), createdAt: z.string().optional(), authorizedAt: z.string().nullable().optional(), confirmedAt: z.string().nullable().optional(), bookedAt: z.string().nullable().optional(), reversedAt: z.string().nullable().optional(), declineReason: z.object({type: z.enum(["CARD_ACCEPTANCE_NOT_ALLOWED", "CARD_CONTROLS_DATETIME_LOCKED", "CREDIT_ORG_LIMIT_EXCEEDED", "DECLINE_REASON_NOT_DETECTED", "DISALLOWED_MCC", "DO_NOT_HONOUR", "EXCEED_AMOUNT_VELOCITY_LIMIT", "EXCEED_FREQUENCY_VELOCITY_LIMIT", "EXCEED_ATM_AMOUNT_VELOCITY_LIMIT", "EXPIRED_CARD", "INCORRECT_CVV2", "INCORRECT_EXPIRY_DATE", "INCORRECT_PIN", "INSUFFICIENT_FUNDS", "INSUFFICIENT_FUNDS_GPS", "INVALID_AMOUNT", "INVALID_CARD_NUMBER", "ISSUER_INOPERATIVE", "LOCKED_CARD", "LOST_CARD", "MONTHLY_CARD_LIMIT_EXCEEDED", "PENDING_CARD", "PIN_TRIES_EXCEEDED", "PIN_VALIDATION_FAILURE", "POSTAL_CODE_NOT_ALLOWED", "PREFUND_ORG_LIMIT_EXCEEDED", "SCA_REQUIRED_PHYSICAL", "SCA_REQUIRED_PHYSICAL_OFFLINE", "SCA_REQUIRED_PHYSICAL_ONLINE", "SCA_REQUIRED_VIRTUAL", "SINGLE_USE_CARD", "STOLEN_CARD", "TERMINATED_CARD", "TRANSACTION_LIMIT_EXCEEDED", "TRANSACTION_TYPE_NOT_ALLOWED", "TRANSACTION_CATEGORY_NOT_ALLOWED", "TRANSACTION_COUNT_EXCEEDED", "TRANSACTION_MERCH_STRING_NOT_ALLOWED", "TRANSACTION_MERCHIDDE42_NOT_ALLOWED", "TRANSACTION_MCC_NOT_ALLOWED", "ACCEPTANCE_METHOD_NOT_ALLOWED", "MERCHANT_COUNTRY_NOT_ALLOWED_US", "MERCHANT_COUNTRY_MISSING", "MERCHANT_COUNTRY_NOT_ALLOWED", "TRANSACTION_CURRENCY_NOT_ALLOWED", "THREDD_FRAUD_ALERT", "ADDITIONAL_LIMIT_EXCEEDED"]).optional(), title: z.record(z.string(), z.string()).optional(), description: z.record(z.string(), z.string()).optional()}).nullable().optional(), linkedTransactionId: z.string().nullable().optional(), receiptCount: z.number().int().optional(), receiptIds: z.array(z.string()).optional(), receiptUploadEnabled: z.boolean().optional(), comment: z.string().nullable().optional(), merchantData: z.object({pliantMerchantId: z.string().optional(), displayName: z.string().optional(), logoPath: z.string().nullable().optional()}).optional(), merchantRawData: z.object({mcc: z.string().nullable().optional(), mccDesc: z.string().nullable().optional(), merchantStreet: z.string().nullable().optional(), merchantCity: z.string().nullable().optional(), merchantRegion: z.string().nullable().optional(), merchantPostcode: z.string().nullable().optional(), merchantCountry: z.string().min(3).max(3).nullable().optional(), merchantPhone: z.string().nullable().optional(), merchantUrl: z.string().nullable().optional(), merchantNameOther: z.string().nullable().optional(), merchantLegalName: z.string().nullable().optional(), merchantTaxId: z.string().nullable().optional(), merchantContact: z.string().nullable().optional(), merchantTerminalId: z.string().nullable().optional(), descriptionAuthorization: z.string().nullable().optional(), descriptionConfirmation: z.string().nullable().optional()}).optional(), authCode: z.string().nullable().optional(), paymentDate: z.string().nullable().optional(), paymentReference: z.string().nullable().optional(), wallet: z.enum(["APPLE", "ANDROID", "OTHER"]).optional(), fxFee: z.object({fxFeePercentage: z.number().gte(0).lte(100).nullable().optional(), fxFeeAmount: z.object({value: z.number().optional(), currency: z.string().optional()}).nullable().optional()}).optional(), personal: z.boolean().optional(), acquirerReferenceNumber: 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 }; /** * Transaction Details (Single) * * GET /transactions/{transactionId} */ export const getApiTransactionsTransactionId = async (args: GetApiTransactionsTransactionIdArgs, options?: GetApiTransactionsTransactionIdOptions) => { const {baseUrl = "https://partner-api.getpliant.com/api", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/transactions/${encodeURIComponent(String(args.transactionId))}${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(getApiTransactionsTransactionIdResponse, await res.json()) };