import {z} from 'zod' export type GetApiV1ReportingTransactionsArgs = {transaction_id?: string | undefined, transaction_type?: string | undefined, transaction_status?: string | undefined, transaction_amount?: string | undefined, transaction_currency?: string | undefined, start_date: string, end_date: string, payment_instrument_type?: string | undefined, store_id?: string | undefined, terminal_id?: string | undefined, fields?: string | undefined, balance_affecting_records_only?: string | undefined, page_size?: number | undefined, page?: number | undefined}; export type GetApiV1ReportingTransactionsOptions = {baseUrl?: string | undefined, Oauth2?: string | undefined, fetch?: typeof fetch | undefined}; export const dateTime = z.string().min(20).max(64); export const currencyCode = z.string().min(3).max(3); export const money = z.object({currency_code: currencyCode, value: z.string().max(32)}); export const percentage = z.string(); export const transactionInfo = z.object({paypal_account_id: z.string().min(1).max(24).optional(), transaction_id: z.string().min(1).max(24).optional(), paypal_reference_id: z.string().min(1).max(24).optional(), paypal_reference_id_type: z.enum(["ODR", "TXN", "SUB", "PAP"]).min(3).max(3).optional(), transaction_event_code: z.string().min(1).max(5).optional(), transaction_initiation_date: dateTime.optional(), transaction_updated_date: dateTime.optional(), transaction_amount: money.optional(), fee_amount: money.optional(), discount_amount: money.optional(), insurance_amount: money.optional(), sales_tax_amount: money.optional(), shipping_amount: money.optional(), shipping_discount_amount: money.optional(), shipping_tax_amount: money.optional(), other_amount: money.optional(), tip_amount: money.optional(), transaction_status: z.string().min(1).max(1).optional(), transaction_subject: z.string().min(1).max(256).optional(), transaction_note: z.string().min(1).max(4000).optional(), payment_tracking_id: z.string().min(1).max(127).optional(), bank_reference_id: z.string().min(1).max(127).optional(), ending_balance: money.optional(), available_balance: money.optional(), invoice_id: z.string().min(1).max(127).optional(), custom_field: z.string().min(1).max(127).optional(), protection_eligibility: z.string().min(1).max(2).optional(), credit_term: z.string().min(1).max(25).optional(), credit_transactional_fee: money.optional(), credit_promotional_fee: money.optional(), annual_percentage_rate: percentage.optional(), payment_method_type: z.string().min(1).max(20).optional(), instrument_type: z.string().min(1).max(64).optional(), instrument_sub_type: z.string().min(1).max(64).optional()}); export const emailAddress = z.string().min(3).max(254); export const phone = z.object({country_code: z.string().min(1).max(3), national_number: z.string().min(1).max(14), extension_number: z.string().min(1).max(15).optional()}); export const name = z.object({prefix: z.string().max(140).optional(), given_name: z.string().max(140).optional(), surname: z.string().max(140).optional(), middle_name: z.string().max(140).optional(), suffix: z.string().max(140).optional(), alternate_full_name: z.string().max(300).optional(), full_name: z.string().max(300).optional()}); export const countryCode = z.string().min(2).max(2); export const address = z.object({line1: z.string(), line2: z.string().optional(), city: z.string(), state: z.string().optional(), country_code: countryCode, postal_code: z.string().optional()}); export const payerInfo = z.object({account_id: z.string().min(1).max(13).optional(), email_address: emailAddress.optional(), phone_number: phone.optional(), address_status: z.string().min(1).max(1).optional(), payer_status: z.string().min(1).max(1).optional(), payer_name: name.optional(), country_code: countryCode.optional(), address: address.optional()}); export const shippingInfo = z.object({name: z.string().min(1).max(500).optional(), method: z.string().min(1).max(500).optional(), address: address.optional(), secondary_shipping_address: address.optional()}); export const itemDetailTaxAmount = z.object({tax_amount: money.optional()}); export const itemDetailTaxAmountList = z.array(itemDetailTaxAmount); export const checkoutOption = z.object({checkout_option_name: z.string().min(1).max(200).optional(), checkout_option_value: z.string().min(1).max(200).optional()}); export const checkoutOptionList = z.array(checkoutOption); export const itemDetail = z.object({item_code: z.string().min(1).max(1000).optional(), item_name: z.string().min(1).max(200).optional(), item_description: z.string().min(1).max(2000).optional(), item_options: z.string().min(1).max(4000).optional(), item_quantity: z.string().min(1).max(4000).optional(), item_unit_price: money.optional(), item_amount: money.optional(), discount_amount: money.optional(), adjustment_amount: money.optional(), gift_wrap_amount: money.optional(), tax_percentage: percentage.optional(), tax_amounts: itemDetailTaxAmountList.optional(), basic_shipping_amount: money.optional(), extra_shipping_amount: money.optional(), handling_amount: money.optional(), insurance_amount: money.optional(), total_item_amount: money.optional(), invoice_number: z.string().min(1).max(200).optional(), checkout_options: checkoutOptionList.optional()}); export const itemDetailList = z.array(itemDetail); export const cartInfo = z.object({item_details: itemDetailList.optional(), tax_inclusive: z.boolean().optional(), paypal_invoice_id: z.string().min(1).max(127).optional()}); export const storeInfo = z.object({store_id: z.string().min(1).max(100).optional(), terminal_id: z.string().min(1).max(60).optional()}); export const auctionInfo = z.object({auction_site: z.string().min(1).max(200).optional(), auction_item_site: z.string().min(1).max(4000).optional(), auction_buyer_id: z.string().min(1).max(500).optional(), auction_closing_date: dateTime.optional()}); export const incentiveDetail = z.object({incentive_type: z.string().min(1).max(500).optional(), incentive_code: z.string().min(1).max(200).optional(), incentive_amount: money.optional(), incentive_program_code: z.string().min(1).max(100).optional()}); export const incentiveDetailList = z.array(incentiveDetail); export const incentiveInfo = z.object({incentive_details: incentiveDetailList.optional()}); export const transactionDetail = z.object({transaction_info: transactionInfo.optional(), payer_info: payerInfo.optional(), shipping_info: shippingInfo.optional(), cart_info: cartInfo.optional(), store_info: storeInfo.optional(), auction_info: auctionInfo.optional(), incentive_info: incentiveInfo.optional()}); export const transactionDetailList = z.array(transactionDetail); export const linkDescription = z.object({href: z.string(), rel: z.string(), method: z.enum(["GET", "POST", "PUT", "DELETE", "HEAD", "CONNECT", "OPTIONS", "PATCH"]).optional()}); export const linkDescriptionList = z.array(linkDescription); export const searchResponse = z.object({transaction_details: transactionDetailList.optional(), account_number: z.string().min(1).max(255).optional(), start_date: dateTime.optional(), end_date: dateTime.optional(), last_refreshed_datetime: dateTime.optional(), page: z.number().int().gte(0).lte(2147483647).optional(), total_items: z.number().int().gte(0).lte(2147483647).optional(), total_pages: z.number().int().gte(0).lte(2147483647).optional(), links: linkDescriptionList.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 }; /** * List transactions * * GET /v1/reporting/transactions */ export const getApiV1ReportingTransactions = async (args: GetApiV1ReportingTransactionsArgs, options?: GetApiV1ReportingTransactionsOptions) => { const {baseUrl = "https://api-m.paypal.com", fetch: fetchFn = fetch, Oauth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.transaction_id != null) query.append("transaction_id", String(args.transaction_id)) if (args.transaction_type != null) query.append("transaction_type", String(args.transaction_type)) if (args.transaction_status != null) query.append("transaction_status", String(args.transaction_status)) if (args.transaction_amount != null) query.append("transaction_amount", String(args.transaction_amount)) if (args.transaction_currency != null) query.append("transaction_currency", String(args.transaction_currency)) if (args.start_date != null) query.append("start_date", String(args.start_date)) if (args.end_date != null) query.append("end_date", String(args.end_date)) if (args.payment_instrument_type != null) query.append("payment_instrument_type", String(args.payment_instrument_type)) if (args.store_id != null) query.append("store_id", String(args.store_id)) if (args.terminal_id != null) query.append("terminal_id", String(args.terminal_id)) if (args.fields != null) query.append("fields", String(args.fields)) if (args.balance_affecting_records_only != null) query.append("balance_affecting_records_only", String(args.balance_affecting_records_only)) if (args.page_size != null) query.append("page_size", String(args.page_size)) if (args.page != null) query.append("page", String(args.page)) if (Oauth2 !== undefined) headers.set('authorization', `Bearer ${Oauth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/reporting/transactions${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(searchResponse, await res.json()) };