import {z} from 'zod' export type RedirectResponse = {param?: (string | null) | undefined, json_payload?: (Record | null) | undefined}; export type RecurringPaymentIntervalUnit = 'year' | 'month' | 'day' | 'hour' | 'minute'; export type ApplePayRegularBillingDetails = {label: string, recurring_payment_start_date?: (string | null) | undefined, recurring_payment_end_date?: (string | null) | undefined, recurring_payment_interval_unit?: (RecurringPaymentIntervalUnit | null) | undefined, recurring_payment_interval_count?: (number | null) | undefined}; export type ApplePayRecurringDetails = {payment_description: string, regular_billing: ApplePayRegularBillingDetails, billing_agreement?: (string | null) | undefined, management_url: string}; export type PixKey = {type: 'cpf', value: string} | {type: 'cnpj', value: string} | {type: 'email', value: string} | {type: 'phone', value: string} | {type: 'evp_token', value: string}; export type ImmediateExpirationTime = {time: number, pix_key?: (PixKey | null) | undefined}; export type ScheduledExpirationTime = {date: string, validity_after_expiration?: (number | null) | undefined, pix_key?: (PixKey | null) | undefined}; export type PixAdditionalDetails = {immediate: ImmediateExpirationTime} | {scheduled: ScheduledExpirationTime}; export type BoletoDocumentKind = 'commercial_invoice' | 'service_invoice' | 'promissory_note' | 'rural_promissory_note' | 'receipt' | 'insurance_policy' | 'credit_card_invoice' | 'proposal' | 'deposit_or_funding' | 'cheque' | 'direct_promissory_note' | 'other'; export type BoletoPaymentType = 'fixed_amount' | 'flexible_amount' | 'installment'; export type DiscountType = 'standard' | 'fixed_date' | 'daily_calendar' | 'daily_business'; export type DiscountTier = {amount?: (string | null) | undefined, end_date?: (string | null) | undefined}; export type SantanderPaymentDiscountRules = {discount_type?: (DiscountType | null) | undefined, tiers: Array}; export type PenaltyDetail = {value?: (string | null) | undefined, grace_period_days?: (number | null) | undefined}; export type InterestDetail = {interest_percentage?: (string | null) | undefined, iof_percentage?: (string | null) | undefined}; export type PenaltyRules = {fixed_penalty?: (PenaltyDetail | null) | undefined, interest?: (InterestDetail | null) | undefined}; export type ProtestType = 'disabled' | 'calendar_days' | 'business_days' | 'contract_default'; export type ProtestRules = {protest_type: ProtestType, days_after_due_date: number}; export type CollectionActions = {legal_protest?: (ProtestRules | null) | undefined, auto_write_off_days?: (number | null) | undefined}; export type CalculationType = 'percentage' | 'flat_amount'; export type FlexibleAmountDetails = {min_value?: (string | null) | undefined, max_value?: (string | null) | undefined, value_type?: (CalculationType | null) | undefined}; export type InstallmentDetails = {max_partial_payments?: (number | null) | undefined, value_type?: (CalculationType | null) | undefined}; export type BoletoPaymentTypeConstraints = {type: 'fixed_amount'} | {type: 'flexible_amount', details: FlexibleAmountDetails} | {type: 'installment', details: InstallmentDetails}; export type DocumentKind = 'cpf' | 'cnpj' | 'psn' | 'other'; export type BeneficiaryDetails = {name?: (string | null) | undefined, document_number?: (string | null) | undefined, document_type?: (DocumentKind | null) | undefined}; export type BoletoAdditionalDetails = {due_date?: (string | null) | undefined, document_kind?: (BoletoDocumentKind | null) | undefined, payment_type?: (BoletoPaymentType | null) | undefined, covenant_code?: (string | null) | undefined, pix_key?: (PixKey | null) | undefined, discount_rules?: (SantanderPaymentDiscountRules | null) | undefined, penalties?: (PenaltyRules | null) | undefined, collection_actions?: (CollectionActions | null) | undefined, payment_constraints?: (BoletoPaymentTypeConstraints | null) | undefined, beneficiary?: (BeneficiaryDetails | null) | undefined}; export type SantanderMandatePeriodicity = 'weekly' | 'monthly' | 'quarterly' | 'semiannually' | 'annually'; export type SantanderMandateDetails = {fixed_recurring_amount?: (number | null) | undefined, min_recurring_amount?: (number | null) | undefined, start_date?: (string | null) | undefined, end_date?: (string | null) | undefined, periodicity?: (SantanderMandatePeriodicity | null) | undefined}; export type AccountType = 'current' | 'savings' | 'payment'; export type SantanderPixAutomaticoReceiverDetails = {branch_code?: (string | null) | undefined, account_number?: (string | null) | undefined, account_type?: (AccountType | null) | undefined}; export type PixAutomaticoAdditionalDetails = {time: number, retry_policy?: (boolean | null) | undefined, mandate_details?: (SantanderMandateDetails | null) | undefined, type: 'pix_automatico_push'} | {retry_policy?: (boolean | null) | undefined, mandate_details?: (SantanderMandateDetails | null) | undefined, type: 'pix_automatico_qr'} | {receiver_details?: (SantanderPixAutomaticoReceiverDetails | null) | undefined, mandate_execution_date?: (string | null) | undefined, auto_adjust_date?: (boolean | null) | undefined, type: 'pix_automatico_mit'}; export type FinixAdditionalDetails = {fraud_session_id?: (string | null) | undefined}; export type FeatureMetadata = {redirect_response?: (RedirectResponse | null) | undefined, search_tags?: (Array | null) | undefined, apple_pay_recurring_details?: (ApplePayRecurringDetails | null) | undefined, pix_additional_details?: (PixAdditionalDetails | null) | undefined, boleto_additional_details?: (BoletoAdditionalDetails | null) | undefined, pix_automatico_additional_details?: (PixAutomaticoAdditionalDetails | null) | undefined, finix_additional_details?: (FinixAdditionalDetails | null) | undefined}; export type PaymentsUpdateMetadataRequest = {metadata: Record, feature_metadata?: (FeatureMetadata | null) | undefined}; export type CreateApiPaymentsPaymentIdUpdateMetadataArgs = {payment_id: string, body: PaymentsUpdateMetadataRequest}; export type CreateApiPaymentsPaymentIdUpdateMetadataOptions = {baseUrl: string, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const intentStatus = z.enum(["succeeded", "failed", "cancelled", "cancelled_post_capture", "processing", "requires_customer_action", "requires_merchant_action", "requires_payment_method", "requires_confirmation", "requires_capture", "partially_captured", "partially_captured_and_capturable", "partially_authorized_and_requires_capture", "partially_captured_and_processing", "conflicted", "expired", "review"]); export const redirectResponse = z.object({param: z.string().nullable().optional(), json_payload: z.object({}).nullable().optional()}); export const recurringPaymentIntervalUnit = z.enum(["year", "month", "day", "hour", "minute"]); export const applePayRegularBillingDetails = z.object({label: z.string(), recurring_payment_start_date: z.string().nullable().optional(), recurring_payment_end_date: z.string().nullable().optional(), recurring_payment_interval_unit: recurringPaymentIntervalUnit.nullable().optional(), recurring_payment_interval_count: z.number().int().nullable().optional()}); export const applePayRecurringDetails = z.object({payment_description: z.string(), regular_billing: applePayRegularBillingDetails, billing_agreement: z.string().nullable().optional(), management_url: z.string()}); export const pixKey = z.discriminatedUnion("type", [z.object({type: z.literal("cpf"), value: z.string()}), z.object({type: z.literal("cnpj"), value: z.string()}), z.object({type: z.literal("email"), value: z.string()}), z.object({type: z.literal("phone"), value: z.string()}), z.object({type: z.literal("evp_token"), value: z.string()})]); export const immediateExpirationTime = z.object({time: z.number().int().gte(0), pix_key: pixKey.nullable().optional()}); export const scheduledExpirationTime = z.object({date: z.string(), validity_after_expiration: z.number().int().gte(0).nullable().optional(), pix_key: pixKey.nullable().optional()}); export const pixAdditionalDetails = z.union([z.object({immediate: immediateExpirationTime}), z.object({scheduled: scheduledExpirationTime})]); export const boletoDocumentKind = z.enum(["commercial_invoice", "service_invoice", "promissory_note", "rural_promissory_note", "receipt", "insurance_policy", "credit_card_invoice", "proposal", "deposit_or_funding", "cheque", "direct_promissory_note", "other"]); export const boletoPaymentType = z.enum(["fixed_amount", "flexible_amount", "installment"]); export const discountType = z.enum(["standard", "fixed_date", "daily_calendar", "daily_business"]); export const discountTier = z.object({amount: z.string().nullable().optional(), end_date: z.string().nullable().optional()}); export const santanderPaymentDiscountRules = z.object({discount_type: discountType.nullable().optional(), tiers: z.array(discountTier)}); export const penaltyDetail = z.object({value: z.string().nullable().optional(), grace_period_days: z.number().int().gte(0).nullable().optional()}); export const interestDetail = z.object({interest_percentage: z.string().nullable().optional(), iof_percentage: z.string().nullable().optional()}); export const penaltyRules = z.object({fixed_penalty: penaltyDetail.nullable().optional(), interest: interestDetail.nullable().optional()}); export const protestType = z.enum(["disabled", "calendar_days", "business_days", "contract_default"]); export const protestRules = z.object({protest_type: protestType, days_after_due_date: z.number().int().gte(0)}); export const collectionActions = z.object({legal_protest: protestRules.nullable().optional(), auto_write_off_days: z.number().int().gte(0).nullable().optional()}); export const calculationType = z.enum(["percentage", "flat_amount"]); export const flexibleAmountDetails = z.object({min_value: z.string().nullable().optional(), max_value: z.string().nullable().optional(), value_type: calculationType.nullable().optional()}); export const installmentDetails = z.object({max_partial_payments: z.number().int().gte(0).nullable().optional(), value_type: calculationType.nullable().optional()}); export const boletoPaymentTypeConstraints = z.discriminatedUnion("type", [z.object({type: z.literal("fixed_amount")}), z.object({type: z.literal("flexible_amount"), details: flexibleAmountDetails}), z.object({type: z.literal("installment"), details: installmentDetails})]); export const documentKind = z.enum(["cpf", "cnpj", "psn", "other"]); export const beneficiaryDetails = z.object({name: z.string().nullable().optional(), document_number: z.string().nullable().optional(), document_type: documentKind.nullable().optional()}); export const boletoAdditionalDetails = z.object({due_date: z.string().nullable().optional(), document_kind: boletoDocumentKind.nullable().optional(), payment_type: boletoPaymentType.nullable().optional(), covenant_code: z.string().nullable().optional(), pix_key: pixKey.nullable().optional(), discount_rules: santanderPaymentDiscountRules.nullable().optional(), penalties: penaltyRules.nullable().optional(), collection_actions: collectionActions.nullable().optional(), payment_constraints: boletoPaymentTypeConstraints.nullable().optional(), beneficiary: beneficiaryDetails.nullable().optional()}); export const santanderMandatePeriodicity = z.enum(["weekly", "monthly", "quarterly", "semiannually", "annually"]); export const santanderMandateDetails = z.object({fixed_recurring_amount: z.number().int().gte(0).nullable().optional(), min_recurring_amount: z.number().int().gte(0).nullable().optional(), start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional(), periodicity: santanderMandatePeriodicity.nullable().optional()}); export const accountType = z.enum(["current", "savings", "payment"]); export const santanderPixAutomaticoReceiverDetails = z.object({branch_code: z.string().nullable().optional(), account_number: z.string().nullable().optional(), account_type: accountType.nullable().optional()}); export const pixAutomaticoAdditionalDetails = z.discriminatedUnion("type", [z.object({time: z.number().int().gte(0), retry_policy: z.boolean().nullable().optional(), mandate_details: santanderMandateDetails.nullable().optional(), type: z.literal("pix_automatico_push")}), z.object({retry_policy: z.boolean().nullable().optional(), mandate_details: santanderMandateDetails.nullable().optional(), type: z.literal("pix_automatico_qr")}), z.object({receiver_details: santanderPixAutomaticoReceiverDetails.nullable().optional(), mandate_execution_date: z.string().nullable().optional(), auto_adjust_date: z.boolean().nullable().optional(), type: z.literal("pix_automatico_mit")})]); export const finixAdditionalDetails = z.object({fraud_session_id: z.string().nullable().optional()}); export const featureMetadata = z.object({redirect_response: redirectResponse.nullable().optional(), search_tags: z.array(z.string()).nullable().optional(), apple_pay_recurring_details: applePayRecurringDetails.nullable().optional(), pix_additional_details: pixAdditionalDetails.nullable().optional(), boleto_additional_details: boletoAdditionalDetails.nullable().optional(), pix_automatico_additional_details: pixAutomaticoAdditionalDetails.nullable().optional(), finix_additional_details: finixAdditionalDetails.nullable().optional()}); export const paymentsUpdateMetadataResponse = z.object({payment_id: z.string(), metadata: z.object({}).nullable().optional(), status: intentStatus.nullable().optional(), feature_metadata: featureMetadata.nullable().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 }; /** * Payments - Update Metadata * * POST /payments/{payment_id}/update_metadata */ export const createApiPaymentsPaymentIdUpdateMetadata = async (args: CreateApiPaymentsPaymentIdUpdateMetadataArgs, options: CreateApiPaymentsPaymentIdUpdateMetadataOptions) => { 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(/\/+$/, '')}/payments/${encodeURIComponent(String(args.payment_id))}/update_metadata${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(paymentsUpdateMetadataResponse, await res.json()) };