import {z} from 'zod' export type GetApiV1DisputesArgs = {size?: number | undefined, page?: number | undefined, customerUuid?: string | undefined, shortId?: string | undefined}; export type GetApiV1DisputesOptions = {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 v1GetDisputesResponse = z.object({items: z.array(dtoDisputeSummary).optional(), totalItems: z.number().int().optional(), totalPages: z.number().int().optional(), totalInPage: z.number().int().optional(), currentPage: z.number().int().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 }; /** * GET /v1/disputes */ export const getApiV1Disputes = async (args: GetApiV1DisputesArgs, options: GetApiV1DisputesOptions) => { const {baseUrl, fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.size != null) query.append("size", String(args.size)) if (args.page != null) query.append("page", String(args.page)) if (args.customerUuid != null) query.append("customerUuid", String(args.customerUuid)) if (args.shortId != null) query.append("shortId", String(args.shortId)) if (apiKey !== undefined) headers.set("Authorization", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/v1/disputes${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(v1GetDisputesResponse, await res.json()) };