import {z} from 'zod' export type ApiPublicdtoAmount = {amountInCents?: number | undefined, currency?: string | undefined}; export type DtoTransactionStatus = 'TRANSACTION_STATUS_UNKNOWN' | 'TRANSACTION_STATUS_PENDING' | 'TRANSACTION_STATUS_SETTLED'; export type ApiPublicdtoTransactionType = 'TRANSACTION_TYPE_UNKNOWN' | 'TRANSACTION_TYPE_DEBIT_CARD' | 'TRANSACTION_TYPE_CREDIT_CARD' | 'TRANSACTION_TYPE_ATM' | 'TRANSACTION_TYPE_ACH' | 'TRANSACTION_TYPE_TRANSFER' | 'TRANSACTION_TYPE_CREDIT_ATM' | 'TRANSACTION_TYPE_CREDIT_ACH' | 'TRANSACTION_TYPE_CREDIT_TRANSFER'; export type DtoTransactionNetwork = 'TRANSACTION_NETWORK_UNKNOWN' | 'TRANSACTION_NETWORK_VISA' | 'TRANSACTION_NETWORK_MASTERCARD' | 'TRANSACTION_NETWORK_AMEX' | 'TRANSACTION_NETWORK_DISCOVER' | 'TRANSACTION_NETWORK_PULSE' | 'TRANSACTION_NETWORK_STAR' | 'TRANSACTION_NETWORK_MAESTRO' | 'TRANSACTION_NETWORK_ALLPOINT' | 'TRANSACTION_NETWORK_ACCEL'; export type DtoCardType = 'CARD_TYPE_UNKNOWN' | 'CARD_TYPE_PHYSICAL' | 'CARD_TYPE_VIRTUAL'; export type ApiPublicdtoTransactionDetail = {uuid?: string | undefined, settledTimestamp?: unknown | undefined, authorizedTimestamp?: unknown | undefined, amount?: ApiPublicdtoAmount | undefined, merchant?: string | undefined, status?: DtoTransactionStatus | undefined, type?: ApiPublicdtoTransactionType | undefined, network?: DtoTransactionNetwork | undefined, arn?: string | undefined, location?: string | undefined, cardId?: string | undefined, visaTransactionId?: string | undefined, transactionSettledAmount?: ApiPublicdtoAmount | undefined, typeCode?: string | undefined, ica?: string | undefined, cardType?: DtoCardType | undefined, rrn?: string | undefined}; export type DtoAddress = {line1?: string | undefined, line2?: string | undefined, city?: string | undefined, state?: string | undefined, postalCode?: string | undefined, country?: string | undefined}; export type ApiPublicdtoCustomer = {uuid?: string | undefined, name?: string | undefined, email?: string | undefined, phone?: string | undefined, accountUuid?: string | undefined, address?: DtoAddress | undefined, externalIds?: {[key: string]: string} | undefined}; export type ApiPublicdtoDisputeReason = 'DISPUTE_REASON_UNKNOWN' | 'DISPUTE_REASON_UNAUTH' | 'DISPUTE_REASON_MERCHANT_ISSUE' | 'DISPUTE_REASON_ATM_ISSUE' | 'DISPUTE_REASON_ACH_ISSUE' | 'DISPUTE_REASON_TRANSFER_ISSUE' | 'DISPUTE_REASON_ATM_ISSUE_CASH_NOT_DISPENSED' | 'DISPUTE_REASON_MERCHANT_ISSUE_GOODS_OR_SERVICES_NOT_RECEIVED' | 'DISPUTE_REASON_MERCHANT_ISSUE_GOODS_OR_SERVICES_NOT_AS_DESCRIBED' | 'DISPUTE_REASON_MERCHANT_ISSUE_RETURNED' | 'DISPUTE_REASON_MERCHANT_ISSUE_CANCELED_SUBSCRIPTION' | 'DISPUTE_REASON_MERCHANT_ISSUE_REFUND_NOT_RECEIVED' | 'DISPUTE_REASON_MERCHANT_ISSUE_CHARGED_INCORRECT_AMOUNT' | 'DISPUTE_REASON_MERCHANT_ISSUE_PAID_BY_OTHER_MEANS' | 'DISPUTE_REASON_TRANSFER_ISSUE_NOT_RECEIVED' | 'DISPUTE_REASON_TRANSFER_ISSUE_INCORRECT_RECIPIENT' | 'DISPUTE_REASON_TRANSFER_ISSUE_INCORRECT_AMOUNT' | 'DISPUTE_REASON_TRANSFER_ISSUE_DUPLICATE_CHARGE' | 'DISPUTE_REASON_ATM_ISSUE_PARTIAL_CASH' | 'DISPUTE_REASON_MERCHANT_ISSUE_DUPLICATE_CHARGE' | 'DISPUTE_REASON_ATM_ISSUE_CASH_NOT_DEPOSITED' | 'DISPUTE_REASON_TRANSFER_ISSUE_FAILED_CANCELLATION' | 'DISPUTE_REASON_ACH_ISSUE_REVOKED' | 'DISPUTE_REASON_ACH_ISSUE_GOODS_OR_SERVICES' | 'DISPUTE_REASON_ACH_ISSUE_INCOMPLETE_TRANSACTION' | 'DISPUTE_REASON_ACH_ISSUE_IMPROPER_CHECK_PROCESSED' | 'DISPUTE_REASON_ACH_ISSUE_INCORRECT_AMOUNT' | 'DISPUTE_REASON_ACH_ISSUE_INCORRECT_DATE' | 'DISPUTE_REASON_ACH_ISSUE_DEBITED_MORE_THAN_ONCE' | 'DISPUTE_REASON_ACH_ISSUE_UNPROMPTED_DEBIT' | 'DISPUTE_REASON_ATM_ISSUE_DEPOSIT_NOT_POSTED' | 'DISPUTE_REASON_IN_STORE_CASH_NOT_DEPOSITED' | 'DISPUTE_REASON_CHECK_ISSUE' | 'DISPUTE_REASON_CHECK_ISSUE_FORGED_DRAWER' | 'DISPUTE_REASON_CHECK_ISSUE_ENDORSEMENT_FORGED' | 'DISPUTE_REASON_CHECK_ISSUE_PAYEE_NAME_ALTERED' | 'DISPUTE_REASON_CHECK_ISSUE_NOT_ENDORSED_BY_PAYEE' | 'DISPUTE_REASON_CHECK_ISSUE_ALTERED_AMOUNT' | 'DISPUTE_REASON_CHECK_ISSUE_COUNTERFEIT_CHECK' | 'DISPUTE_REASON_CHECK_ISSUE_UNAUTHORIZED_DRAFT' | 'DISPUTE_REASON_ACH_CREDIT_ISSUE' | 'DISPUTE_REASON_CREDIT_NOT_PROCESSED' | 'DISPUTE_REASON_CANCELLED_TRANSACTION' | 'DISPUTE_REASON_MERCHANDISE_RETURNED' | 'DISPUTE_REASON_MERCHANT_ISSUE_SERVICES_CANCELLED'; export type CreateDisputeRequestQuestionnaireAnswer = {question?: string | undefined, answer?: string | undefined, questionId?: string | undefined, questionUuid?: string | undefined}; export type V1CreateDisputeRequest = {orgUuid?: string | undefined, transactionDetails?: Array | undefined, customer?: ApiPublicdtoCustomer | undefined, reason?: ApiPublicdtoDisputeReason | undefined, questionnaireAnswers?: Array | undefined, transactionIds?: Array | undefined}; export type CreateApiV1DisputesArgs = {body: V1CreateDisputeRequest}; export type CreateApiV1DisputesOptions = {baseUrl: string, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const dtoAddress = z.object({line1: z.string().optional(), line2: z.string().optional(), city: z.string().optional(), state: z.string().optional(), postalCode: z.string().optional(), country: z.string().optional()}); export const apiPublicdtoCustomer = z.object({uuid: z.string().optional(), name: z.string().optional(), email: z.string().optional(), phone: z.string().optional(), accountUuid: z.string().optional(), address: dtoAddress.optional(), externalIds: z.record(z.string(), z.string()).optional()}); export const dtoAgent = z.object({uuid: z.string().optional(), name: z.string().optional(), email: z.string().optional(), phone: z.string().optional()}); export const dtoDisputeStatus = z.enum(["DISPUTE_STATUS_UNKNOWN", "DISPUTE_STATUS_OPEN", "DISPUTE_STATUS_CLOSED"]); export const apiPublicdtoAmount = z.object({amountInCents: z.number().int().optional(), currency: z.string().optional()}); export const dtoDisputedTransactionStatus = z.enum(["DISPUTED_TRANSACTION_STATUS_UNKNOWN", "DISPUTED_TRANSACTION_STATUS_OPEN", "DISPUTED_TRANSACTION_STATUS_INVESTIGATING", "DISPUTED_TRANSACTION_STATUS_CHARGEBACK", "DISPUTED_TRANSACTION_STATUS_FINAL_DECISION", "DISPUTED_TRANSACTION_STATUS_CLOSED"]); export const dtoTransactionEventType = z.enum(["TRANSACTION_EVENT_TYPE_UNKNOWN", "TRANSACTION_EVENT_TYPE_ISSUE_PROVISIONAL_CREDIT", "TRANSACTION_EVENT_TYPE_START_CHARGEBACK", "TRANSACTION_EVENT_TYPE_RECORD_REPRESENTMENT", "TRANSACTION_EVENT_TYPE_CHALLENGE_REPRESENTMENT", "TRANSACTION_EVENT_TYPE_FILE_PRE_ARB", "TRANSACTION_EVENT_TYPE_RECORD_PRE_ARB_RESPONSE", "TRANSACTION_EVENT_TYPE_CHALLENGE_PRE_ARB_RESPONSE", "TRANSACTION_EVENT_TYPE_FILE_ARB", "TRANSACTION_EVENT_TYPE_RECORD_ARB_RESPONSE", "TRANSACTION_EVENT_TYPE_CLOSE_CHARGEBACK", "TRANSACTION_EVENT_TYPE_RECORD_FINAL_DECISION", "TRANSACTION_EVENT_TYPE_REVERSE_PROVISIONAL_CREDIT", "TRANSACTION_EVENT_TYPE_SUBMIT_PC_FORM", "TRANSACTION_EVENT_TYPE_APPROVE_WSUD_REVIEW", "TRANSACTION_EVENT_TYPE_CLOSE_CHARGBACK", "TRANSACTION_EVENT_TYPE_SUBMIT_WSUD", "TRANSACTION_EVENT_TYPE_UPLOAD_WSUD_FILE", "TRANSACTION_EVENT_TYPE_RECORD_ODFI_RESPONSE", "TRANSACTION_EVENT_TYPE_CHECK_CHARGEBACK", "TRANSACTION_EVENT_TYPE_SUBMIT_FRAUD_REPORT", "TRANSACTION_EVENT_TYPE_REQUEST_MORE_INFO"]); export const apiPublicdtoAction = z.enum(["ACTION_NONE", "ACTION_ISSUE_PROVISIONAL_CREDIT", "ACTION_ISSUE_FINAL_CREDIT", "ACTION_REVERSE_PROVISIONAL_CREDIT", "ACTION_REPLACE_CARD"]); export const dtoTransactionAuditLogIssueProvisionalCredit = z.object({amount: apiPublicdtoAmount.optional(), actions: z.array(apiPublicdtoAction).optional()}); export const transactionAuditLogRecordFinalDecisionType = z.enum(["RECORD_FINAL_DECISION_TYPE_UNKNOWN", "RECORD_FINAL_DECISION_TYPE_ACCEPTED", "RECORD_FINAL_DECISION_TYPE_DENIED", "RECORD_FINAL_DECISION_TYPE_CANCELED"]); export const transactionAuditLogRecordFinalDecisionAcceptedType = z.enum(["ACCEPTED_TYPE_UNKNOWN", "ACCEPTED_TYPE_ACCOUNT_TAKEOVER", "ACCEPTED_TYPE_CHARGEBACK_WON", "ACCEPTED_TYPE_MERCHANT_CREDITED", "ACCEPTED_TYPE_WRITE_OFF", "ACCEPTED_TYPE_WSUD_ACCEPTED", "ACCEPTED_TYPE_OTHER"]); export const transactionAuditLogRecordFinalDecisionAcceptedMerchantCredited = z.object({amount: apiPublicdtoAmount.optional(), date: z.string().optional()}); export const transactionAuditLogRecordFinalDecisionAccepted = z.object({type: transactionAuditLogRecordFinalDecisionAcceptedType.optional(), merchantCredited: transactionAuditLogRecordFinalDecisionAcceptedMerchantCredited.optional(), partialMerchantCreditMadeWhole: z.boolean().optional()}); export const transactionAuditLogRecordFinalDecisionDeniedType = z.enum(["DENIED_TYPE_UNKNOWN", "DENIED_TYPE_CHARGEBACK_LOST", "DENIED_TYPE_FRIENDLY_FRAUD", "DENIED_TYPE_INSUFFICIENT_EVIDENCE", "DENIED_TYPE_WSUD_REJECTED", "DENIED_TYPE_OTHER", "DENIED_TYPE_FIRST_PARTY_FRAUD"]); export const transactionAuditLogRecordFinalDecisionDenied = z.object({type: transactionAuditLogRecordFinalDecisionDeniedType.optional()}); export const transactionAuditLogRecordFinalDecisionCanceledType = z.enum(["CANCELED_TYPE_UNKNOWN", "CANCELED_TYPE_CUSTOMER_REQUESTED", "CANCELED_TYPE_MERCHANT_CREDITED", "CANCELED_TYPE_AGENT_ERROR", "CANCELED_TYPE_OTHER"]); export const transactionAuditLogRecordFinalDecisionCanceled = z.object({type: transactionAuditLogRecordFinalDecisionCanceledType.optional()}); export const dtoTransactionAuditLogRecordFinalDecision = z.object({type: transactionAuditLogRecordFinalDecisionType.optional(), actions: z.array(apiPublicdtoAction).optional(), accepted: transactionAuditLogRecordFinalDecisionAccepted.optional(), denied: transactionAuditLogRecordFinalDecisionDenied.optional(), canceled: transactionAuditLogRecordFinalDecisionCanceled.optional()}); export const dtoTransactionAuditLog = z.object({timestamp: z.string().optional(), eventType: dtoTransactionEventType.optional(), agentEmail: z.string().optional(), issueProvisionalCredit: dtoTransactionAuditLogIssueProvisionalCredit.optional(), recordFinalDecision: dtoTransactionAuditLogRecordFinalDecision.optional()}); export const dtoTransactionStatus = z.enum(["TRANSACTION_STATUS_UNKNOWN", "TRANSACTION_STATUS_PENDING", "TRANSACTION_STATUS_SETTLED"]); export const dtoFinalDecisionType = z.enum(["RECORD_FINAL_DECISION_TYPE_UNKNOWN", "RECORD_FINAL_DECISION_TYPE_ACCEPTED", "RECORD_FINAL_DECISION_TYPE_DENIED", "RECORD_FINAL_DECISION_TYPE_CANCELED"]); export const dtoRequiredAction = z.enum(["REQUIRED_ACTION_NONE", "REQUIRED_ACTION_PROVIDE_MORE_INFO"]); export const dtoDisputedTransaction = z.object({uuid: z.string().optional(), settledTimestamp: z.string().optional(), amount: apiPublicdtoAmount.optional(), merchant: z.string().optional(), status: dtoDisputedTransactionStatus.optional(), auditLog: z.array(dtoTransactionAuditLog).optional(), transactionStatus: dtoTransactionStatus.optional(), provisionalCreditAmount: apiPublicdtoAmount.optional(), finalCreditAmount: apiPublicdtoAmount.optional(), reverseCreditAmount: apiPublicdtoAmount.optional(), transactionFinalStatus: dtoFinalDecisionType.optional(), requiredActions: z.array(dtoRequiredAction).optional()}); export const apiPublicdtoDisputeEventType = z.enum(["DISPUTE_EVENT_TYPE_UNKNOWN", "DISPUTE_EVENT_TYPE_CREATE", "DISPUTE_EVENT_TYPE_ASSIGN_AGENT", "DISPUTE_EVENT_TYPE_ADD_COMMENT", "DISPUTE_EVENT_TYPE_UNASSIGN_AGENT", "DISPUTE_EVENT_TYPE_UPLOAD_PAN_TOKEN", "DISPUTE_EVENT_TYPE_UPDATE_PRIORITY", "DISPUTE_EVENT_TYPE_REOPEN", "DISPUTE_EVENT_TYPE_REPLACE_CARD", "DISPUTE_EVENT_TYPE_UPLOAD_WSUD", "DISPUTE_EVENT_TYPE_RECORD_ODFI_RESPONSE", "DISPUTE_EVENT_TYPE_UPDATE_DISPUTE_REASON", "DISPUTE_EVENT_TYPE_UPLOAD_FILE", "DISPUTE_EVENT_TYPE_COMMUNICATION"]); export const dtoDisputeAuditLogCreateDispute = z.object({actions: z.array(apiPublicdtoAction).optional()}); export const dtoDisputeAuditLog = z.object({timestamp: z.string().optional(), eventType: apiPublicdtoDisputeEventType.optional(), agentEmail: z.string().optional(), createDispute: dtoDisputeAuditLogCreateDispute.optional()}); export const apiPublicdtoDisputeReason = z.enum(["DISPUTE_REASON_UNKNOWN", "DISPUTE_REASON_UNAUTH", "DISPUTE_REASON_MERCHANT_ISSUE", "DISPUTE_REASON_ATM_ISSUE", "DISPUTE_REASON_ACH_ISSUE", "DISPUTE_REASON_TRANSFER_ISSUE", "DISPUTE_REASON_ATM_ISSUE_CASH_NOT_DISPENSED", "DISPUTE_REASON_MERCHANT_ISSUE_GOODS_OR_SERVICES_NOT_RECEIVED", "DISPUTE_REASON_MERCHANT_ISSUE_GOODS_OR_SERVICES_NOT_AS_DESCRIBED", "DISPUTE_REASON_MERCHANT_ISSUE_RETURNED", "DISPUTE_REASON_MERCHANT_ISSUE_CANCELED_SUBSCRIPTION", "DISPUTE_REASON_MERCHANT_ISSUE_REFUND_NOT_RECEIVED", "DISPUTE_REASON_MERCHANT_ISSUE_CHARGED_INCORRECT_AMOUNT", "DISPUTE_REASON_MERCHANT_ISSUE_PAID_BY_OTHER_MEANS", "DISPUTE_REASON_TRANSFER_ISSUE_NOT_RECEIVED", "DISPUTE_REASON_TRANSFER_ISSUE_INCORRECT_RECIPIENT", "DISPUTE_REASON_TRANSFER_ISSUE_INCORRECT_AMOUNT", "DISPUTE_REASON_TRANSFER_ISSUE_DUPLICATE_CHARGE", "DISPUTE_REASON_ATM_ISSUE_PARTIAL_CASH", "DISPUTE_REASON_MERCHANT_ISSUE_DUPLICATE_CHARGE", "DISPUTE_REASON_ATM_ISSUE_CASH_NOT_DEPOSITED", "DISPUTE_REASON_TRANSFER_ISSUE_FAILED_CANCELLATION", "DISPUTE_REASON_ACH_ISSUE_REVOKED", "DISPUTE_REASON_ACH_ISSUE_GOODS_OR_SERVICES", "DISPUTE_REASON_ACH_ISSUE_INCOMPLETE_TRANSACTION", "DISPUTE_REASON_ACH_ISSUE_IMPROPER_CHECK_PROCESSED", "DISPUTE_REASON_ACH_ISSUE_INCORRECT_AMOUNT", "DISPUTE_REASON_ACH_ISSUE_INCORRECT_DATE", "DISPUTE_REASON_ACH_ISSUE_DEBITED_MORE_THAN_ONCE", "DISPUTE_REASON_ACH_ISSUE_UNPROMPTED_DEBIT", "DISPUTE_REASON_ATM_ISSUE_DEPOSIT_NOT_POSTED", "DISPUTE_REASON_IN_STORE_CASH_NOT_DEPOSITED", "DISPUTE_REASON_CHECK_ISSUE", "DISPUTE_REASON_CHECK_ISSUE_FORGED_DRAWER", "DISPUTE_REASON_CHECK_ISSUE_ENDORSEMENT_FORGED", "DISPUTE_REASON_CHECK_ISSUE_PAYEE_NAME_ALTERED", "DISPUTE_REASON_CHECK_ISSUE_NOT_ENDORSED_BY_PAYEE", "DISPUTE_REASON_CHECK_ISSUE_ALTERED_AMOUNT", "DISPUTE_REASON_CHECK_ISSUE_COUNTERFEIT_CHECK", "DISPUTE_REASON_CHECK_ISSUE_UNAUTHORIZED_DRAFT", "DISPUTE_REASON_ACH_CREDIT_ISSUE", "DISPUTE_REASON_CREDIT_NOT_PROCESSED", "DISPUTE_REASON_CANCELLED_TRANSACTION", "DISPUTE_REASON_MERCHANDISE_RETURNED", "DISPUTE_REASON_MERCHANT_ISSUE_SERVICES_CANCELLED"]); export const dtoAttachedFile = z.object({fileUuid: z.string().optional(), filename: z.string().optional(), contentType: z.string().optional(), uploadedAt: z.string().optional(), size: z.string().optional()}); export const dtoDisputeReasonOption = z.object({reason: apiPublicdtoDisputeReason.optional(), displayMessage: z.string().optional()}); export const dtoDisputeSummary = z.object({uuid: z.string().optional(), customer: apiPublicdtoCustomer.optional(), resolutionDeadline: z.string().optional(), agent: dtoAgent.optional(), status: dtoDisputeStatus.optional(), transactions: z.array(dtoDisputedTransaction).optional(), auditLog: z.array(dtoDisputeAuditLog).optional(), shortId: z.string().optional(), reason: apiPublicdtoDisputeReason.optional(), actions: z.array(apiPublicdtoAction).optional(), files: z.array(dtoAttachedFile).optional(), disputeReason: dtoDisputeReasonOption.optional()}); export const v1CreateDisputeResponse = z.object({dispute: dtoDisputeSummary.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 }; /** * Create Dispute * * POST /v1/disputes */ export const createApiV1Disputes = async (args: CreateApiV1DisputesArgs, options: CreateApiV1DisputesOptions) => { const {baseUrl, fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (apiKey !== undefined) headers.set("Authorization", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/v1/disputes${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(v1CreateDisputeResponse, await res.json()) };