import {z} from 'zod' export type CreateApiApiV1InvoicesIdPayArgs = {id: string}; export type CreateApiApiV1InvoicesIdPayOptions = {baseUrl?: string | undefined, bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const cryptoCurrency = z.enum(["usdc", "usdt", "pyusd", "eurc", "brett", "dai", "btc", "eth", "matic", "bnb", "sol", "busd", "trx", "food", "bonk", "wif", "goat", "spx", "truf", "pengu"]); export const addressDetailDto = 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 fullAddressDetailDto = z.object({name: z.string().optional(), email: z.string().optional(), phone: z.string().optional(), organizationName: z.string().optional(), address: addressDetailDto.optional()}); export const taxIdDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), name: z.string().optional(), value: z.string().optional(), country: z.string().optional(), customerId: z.string()}); export const taxIdsDto = z.object({object: z.string().optional(), data: z.array(taxIdDto).optional()}); export const entityVisibility = z.string(); export const customerDto = z.object({name: z.string().optional(), email: z.string().optional(), phone: z.string().optional(), organizationName: z.string().optional(), address: addressDetailDto.optional(), id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), customerReferenceId: z.string().optional(), shipping: fullAddressDetailDto.optional(), taxIds: taxIdsDto.optional(), visibility: entityVisibility.optional(), metadata: z.object({}).optional(), customerNumber: z.string()}); export const invoiceCollectionMethod = z.enum(["charge_automatically", "send_invoice"]); export const invoiceType = z.enum(["one_time", "recurring"]); export const invoiceCustomFieldsDto = z.object({name: z.string(), value: z.string()}); export const invoiceCustomFieldDto = z.object({fields: z.array(invoiceCustomFieldsDto).optional()}); export const paymentMethodType = z.enum(["superfluid", "wallet", "allowance_based_recurring", "stripe", "binance_pay"]); export const checkoutSessionSplitWithdrawalAddressDto = z.object({splitPercentage: z.number().gte(0).lte(100), address: z.string()}); export const paymentSettingChainDto = z.object({chainId: z.number(), blacklistCurrencies: z.array(cryptoCurrency).optional(), withdrawalAddress: z.string().optional(), withdrawalAddresses: z.array(checkoutSessionSplitWithdrawalAddressDto).optional()}); export const paymentSettingDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), paymentMethodTypes: z.array(paymentMethodType).optional(), allowedChains: z.array(paymentSettingChainDto).optional(), allowedCurrencies: z.array(cryptoCurrency).optional(), preferredChainId: z.number().optional(), preferredCurrency: cryptoCurrency.optional(), allowSwap: z.boolean().optional(), applyFee: z.boolean().optional(), feePercentage: z.number().gte(0).lte(100), applyGasFee: z.boolean().optional(), allowSplitPayments: z.boolean().optional(), slippagePercentage: z.number().gte(0).lte(100).optional()}); export const invoiceStatus = z.enum(["draft", "open", "paid", "void", "uncollectible"]); export const billingScheme = z.literal("per_unit"); export const interval = z.enum(["day", "week", "month", "year"]); export const recurringUsageType = z.literal("licensed"); export const priceType = z.enum(["one_time", "recurring", "streaming"]); export const publicProductDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), name: z.string(), description: z.string().optional(), isActive: z.boolean().optional(), images: z.array(z.string()).optional(), publicImages: z.array(z.string()).optional(), unitLabel: z.string().optional(), url: z.string().optional(), defaultPriceId: z.string().optional(), metadata: z.object({}).optional(), visibility: entityVisibility.optional()}); export const publicPriceDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), billingScheme: billingScheme.optional(), currency: cryptoCurrency, productId: z.string(), interval: interval.optional(), intervalCount: z.number().optional(), isActive: z.boolean().optional(), usageType: recurringUsageType.optional(), type: priceType, unitAmount: z.number().int().optional(), unitAmountDecimal: z.string().optional(), customUnitMax: z.number().int().optional(), customUnitMin: z.number().int().optional(), customPreset: z.number().int().optional(), customUnitAmountSuggestions: z.array(z.string()).optional(), product: publicProductDto, metadata: z.object({}).optional(), visibility: entityVisibility.optional()}); export const taxRateType = z.enum(["exclusive", "inclusive"]); export const lineTaxRateDto = z.object({id: z.string(), name: z.string(), description: z.string().optional(), country: z.string().optional(), percentage: z.number().gte(0).lte(100), type: taxRateType, isDefault: z.boolean()}); export const currency = z.enum(["usdc", "usdt", "pyusd", "eurc", "brett", "dai", "btc", "eth", "matic", "bnb", "sol", "busd", "trx", "food", "bonk", "wif", "goat", "spx", "truf", "pengu", "usd", "inr"]); export const invoicePriceItemDto = z.object({description: z.string().optional(), periodStart: z.string().optional(), periodEnd: z.string().optional(), quantity: z.number().optional(), price: publicPriceDto, taxRates: z.array(lineTaxRateDto).optional(), amountTotal: z.number().int().optional(), amountSubtotal: z.number().int().optional(), amountTax: z.number().int().optional(), currency: currency.optional()}); export const invoicePriceItemsDto = z.object({object: z.string().optional(), data: z.array(invoicePriceItemDto).optional()}); export const invoiceBillingReason = z.enum(["subscription_cycle", "subscription_create", "subscription_update", "subscription", "manual", "upcoming", "subscription_threshold"]); export const paymentIntentStatus = z.enum(["requires_payment_method", "requires_confirmation", "requires_action", "processing", "requires_capture", "canceled", "succeeded"]); export const superTokenDto = z.object({address: z.string(), decimals: z.number(), symbol: z.string()}); export const assetDto = z.object({id: z.string(), name: z.string(), chainId: z.number(), address: z.string(), currency: currency, symbol: z.string(), decimals: z.number(), coingeckoId: z.string().optional(), superToken: superTokenDto.optional(), isEIP5827Supported: z.boolean()}); export const paymentMethodDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), assetId: z.string(), asset: assetDto, type: paymentMethodType, accountAddress: z.string().optional(), billingDetails: fullAddressDetailDto.optional(), customerId: z.string().optional(), options: z.object({}).optional()}); export const transactionType = z.enum(["incoming", "outgoing", "event", "transfer"]); export const chainType = z.enum(["evm", "solana", "tron", "stripe", "binance_pay"]); export const chainSlimDto = z.object({id: z.number(), name: z.string(), icon: z.string(), currency: currency, blockExplorerTransactionUrl: z.string(), blockExplorerName: z.string(), type: chainType, isBeta: z.boolean()}); export const checkoutSessionAssetDto = z.object({id: z.string(), name: z.string(), address: z.string(), chainId: z.number(), currency: currency, symbol: z.string(), decimals: z.number(), coingeckoId: z.string().optional(), isPublic: z.boolean(), superToken: superTokenDto.optional(), chain: chainSlimDto}); export const transactionDto = z.object({type: transactionType, transactionRelayId: z.string().optional(), transactionHash: z.string().optional(), nonce: z.number().optional(), gasLimit: z.number().optional(), validUntil: z.string().optional(), fromAddress: z.string(), toAddress: z.string(), currency: currency, createdAt: z.string().optional(), amount: z.number().int().optional(), amountRaw: z.string(), assetId: z.string(), asset: checkoutSessionAssetDto, transactionUrl: z.string().optional()}); export const paymentReceiptDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), organizationId: z.string(), paymentIntentId: z.string(), name: z.string().optional(), receiptNumber: z.string(), uri: z.string().optional()}); export const stripeDataDto = z.object({paymentIntentId: z.string().optional(), receiptUrl: z.string().optional(), cardLast4: z.string().optional(), displayName: z.string().optional()}); export const paymentIntentDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), organizationId: z.string(), amount: z.number().int().optional(), amountReceived: z.number().int().optional(), currency: currency.optional(), status: paymentIntentStatus, paymentMethodId: z.string(), description: z.string().optional(), paymentMethod: paymentMethodDto.optional(), paymentMethodTypes: z.array(paymentMethodType).optional(), transferAccountAddress: z.string().optional(), transactions: z.array(transactionDto), paymentReceipt: paymentReceiptDto.optional(), canceledAt: z.string().optional(), cancellationReason: z.string().optional(), stripe: stripeDataDto.optional(), isMarkRefunded: z.boolean().nullable().optional(), markRefundedAt: z.string().nullable().optional(), markRefundedComment: z.string().nullable().optional()}); export const errorCode = z.enum(["account_closed", "account_information_mismatch", "account_invalid", "account_number_invalid", "amount_too_large", "amount_too_small", "api_key_expired", "authentication_required", "balance_insufficient", "account_bad_routing_numbers", "account_declined", "account_exists", "account_restricted", "account_unusable", "account_unverified", "billing_invalid_mandate", "capture_charge_authorization_expired", "capture_unauthorized_payment", "charge_already_captured", "charge_already_refunded", "charge_disputed", "charge_exceeds_source_limit", "charge_expired_for_capture", "charge_invalid_parameter", "charge_not_refundable", "clearing_code_unsupported", "country_code_invalid", "country_unsupported", "coupon_expired", "customer_max_payment_methods", "customer_max_subscriptions", "debit_not_authorized", "email_invalid", "expired_card", "idempotency_key_in_use", "incorrect_address", "incorrect_number", "insufficient_funds", "intent_invalid_state", "intent_verification_method_missing", "invalid_characters", "invalid_charge_amount", "invalid_source_usage", "invoice_no_customer_line_items", "invoice_no_payment_method_types", "invoice_no_subscription_line_items", "invoice_not_editable", "invoice_on_behalf_of_not_editable", "invoice_payment_intent_requires_action", "invoice_upcoming_none", "livemode_mismatch", "lock_timeout", "missing", "no_account", "parameter_invalid_empty", "parameter_invalid_integer", "parameter_invalid_string_blank", "parameter_invalid_string_empty", "parameter_missing", "parameter_unknown", "parameters_exclusive", "payment_intent_action_required", "payment_intent_authentication_failure", "payment_intent_incompatible_payment_method", "payment_intent_invalid_parameter", "payment_intent_mandate_invalid", "payment_intent_payment_attempt_expired", "payment_intent_payment_attempt_failed", "payment_intent_unexpected_state", "payment_method_billing_details_address_missing", "payment_method_configuration_failures", "payment_method_currency_mismatch", "payment_method_customer_decline", "payment_method_invalid_parameter", "payment_method_invalid_parameter_testmode", "payment_method_not_available", "payment_method_provider_decline", "payment_method_provider_timeout", "payment_method_unactivated", "payment_method_unexpected_state", "payment_method_unsupported_type", "payout_reconciliation_not_ready", "payouts_limit_exceeded", "payouts_not_allowed", "postal_code_invalid", "processing_error", "product_inactive", "progressive_onboarding_limit_exceeded", "rate_limit", "refer_to_customer", "refund_disputed_payment", "resource_already_exists", "resource_missing", "return_intent_already_processed", "routing_number_invalid", "secret_key_required", "setup_attempt_failed", "setup_intent_authentication_failure", "setup_intent_invalid_parameter", "setup_intent_mandate_invalid", "setup_intent_setup_attempt_expired", "setup_intent_unexpected_state", "shipping_calculation_failed", "sku_inactive", "status_transition_invalid", "tax_id_invalid", "taxes_calculation_failed", "testmode_charges_only", "tls_version_unsupported", "token_already_used", "token_in_use", "transfer_source_balance_parameters_mismatch", "transfers_not_allowed", "url_invalid"]); export const paymentIntentErrorType = z.enum(["api_error", "card_error", "idempotency_error", "invalid_request_error", "chain_error", "unknown"]); export const paymentIntentAttemptDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), errorCode: errorCode.optional(), type: paymentIntentErrorType, declineCode: z.string().optional(), paymentIntentId: z.string().optional(), paymentMethodType: paymentMethodType.optional(), docUrl: z.string().optional(), status: paymentIntentStatus}); export const invoiceDto = z.object({id: z.string(), createdAt: z.string().optional(), updatedAt: z.string().optional(), organizationId: z.string(), description: z.string().optional(), total: z.number().int().optional(), subTotal: z.number().int().optional(), currency: cryptoCurrency.optional(), customerId: z.string(), customer: customerDto, autoAdvance: z.boolean(), collectionMethod: invoiceCollectionMethod, invoiceType: invoiceType.optional(), customFields: invoiceCustomFieldDto.optional(), paymentSettingId: z.string(), paymentSetting: paymentSettingDto, status: invoiceStatus, attempted: z.boolean(), attemptCount: z.number().optional(), nextPaymentAttempt: z.string().optional(), dueDate: z.string().optional(), footer: z.string().optional(), fromInvoiceId: z.string().optional(), latestRevisionId: z.string().optional(), invoicePdfUrl: z.string().optional(), invoiceNumber: z.string().optional(), paid: z.boolean(), paidOutOfBand: z.boolean().optional(), metadata: z.object({}).optional(), clientReferenceId: z.string().optional(), lineItems: invoicePriceItemsDto, finalizedAt: z.string().optional(), paidAt: z.string().optional(), markedUncollectibleAt: z.string().optional(), visibility: entityVisibility.optional(), paymentIntentId: z.string().optional(), url: z.string(), subscriptionId: z.string().optional(), periodStart: z.string().optional(), periodEnd: z.string().optional(), billingReason: invoiceBillingReason, allowPromotionCodes: z.boolean().optional(), finalizeScheduleAt: z.string().optional(), totalTax: z.number().int().optional(), paymentIntent: paymentIntentDto.optional(), paymentIntentAttempt: z.array(paymentIntentAttemptDto).optional(), taxRateIds: z.array(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 }; /** * Mark an open invoice as paid. * * POST /api/v1/invoices/{id}/pay */ export const createApiApiV1InvoicesIdPay = async (args: CreateApiApiV1InvoicesIdPayArgs, options?: CreateApiApiV1InvoicesIdPayOptions) => { const {baseUrl = "https://api.copperx.dev", fetch: fetchFn = fetch, bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (bearer !== undefined) headers.set('authorization', `Bearer ${bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/invoices/${encodeURIComponent(String(args.id))}/pay${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(invoiceDto, await res.json()) };