import {z} from 'zod' export type With = 'authorization' | 'buyer' | 'capture' | 'fees' | 'payMethod' | 'mcp'; export type GetApiApiV21OrdersOrderIdArgs = {orderId: string, 'Content-Type': string, Authorization: string, with?: With | undefined}; export type GetApiApiV21OrdersOrderIdOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const delivery = z.object({street: z.string().max(255).optional(), postalBox: z.string().max(255).optional(), postalCode: z.string().max(255).optional(), city: z.string().max(255).optional(), state: z.string().max(255).optional(), countryCode: z.string().optional(), name: z.string().max(255).optional(), recipientName: z.string().max(255).optional(), recipientEmail: z.string().optional(), recipientPhone: z.string().optional()}); export const buyer = z.object({extCustomerId: z.string().min(1).max(255).optional(), email: z.string().min(1).max(255).optional(), phone: z.string().min(1).max(255).optional(), firstName: z.string().min(1).max(100).optional(), lastName: z.string().min(1).max(100).optional(), nin: z.string().optional(), language: z.string().optional(), birthDate: z.string().optional(), delivery: delivery.optional()}); export const products = z.array(z.object({name: z.string().max(255), unitPrice: z.string(), quantity: z.string(), virtual: z.boolean().optional()})); export const shippingMethods = z.array(z.object({country: z.string(), price: z.number(), name: z.string()})); export const shoppingCarts = z.array(z.object({extCustomerId: z.string().max(1024), amount: z.number(), fee: z.string().optional(), shippingMethods: shippingMethods.optional(), products: products})); export const order = z.object({shippingMethod: z.object({country: z.string().optional(), price: z.string().optional(), name: z.string().optional()}).optional(), orderId: z.string().optional(), extOrderId: z.string().optional(), orderCreateDate: z.string().optional(), notifyUrl: z.string().optional(), customerIp: z.string().optional(), merchantPosId: z.string().optional(), description: z.string().optional(), additionalDescription: z.string().optional(), validityTime: z.string().optional(), currencyCode: z.string().optional(), totalAmount: z.string().optional(), capturedAmount: z.string().optional(), buyer: buyer.optional(), payMethod: z.object({amount: z.string().optional(), type: z.enum(["PBL", "CARD_TOKEN", "INSTALLMENTS"]).optional()}).optional(), products: products.optional(), shoppingCarts: shoppingCarts.optional(), merchantFunds: z.array(z.object({type: z.literal("COUPON").optional(), value: z.string().optional(), amount: z.string().optional()})).optional(), status: z.enum(["NEW", "PENDING", "WAITING_FOR_CONFIRMATION", "COMPLETED", "CANCELED"]).optional()}); export const properties = z.array(z.object({name: z.string().optional(), value: z.string().optional()})); export const paymentFlow = z.enum(["APPLE_PAY", "CARD", "CARD_INSTALLMENTS", "CLICK_TO_PAY", "FIRST_ONE_CLICK_CARD", "GOOGLE_PAY", "GOOGLE_PAY_TOKENIZED", "VISA_MOBILE", "ONE_CLICK_CARD", "ONE_CLICK_CARD_RECURRING", "ONE_CLICK_MAIL_ORDER", "ONE_CLICK_MAIL_RECURRING", "ONE_CLICK_PHONE_ORDER", "ONE_CLICK_PHONE_RECURRING", "BLIK_PBL", "BLIK_AUTHORIZATION_CODE", "BLIK_AUTHORIZATION_CODE_WITH_UID_TOKEN_REGISTERING", "BLIK_UID_TOKEN", "BLIK_AUTHORIZATION_CODE_WITH_PAYID_TOKEN_TYPE_O_REGISTERING", "BLIK_PAYID_TOKEN_TYPE_O", "PBL"]); export const card = z.object({maskedNumber: z.string().optional(), scheme: z.string().optional(), issuerName: z.string().optional(), issuerCountryCode: z.string().optional(), countryCode: z.string().optional(), classification: z.string().optional(), profile: z.string().optional()}); export const authentication = z.object({eci: z.string().optional(), threeDs: z.object({status: z.string().optional(), description: z.string().optional(), frictionlessIndicator: z.string().optional()}).optional()}); export const authorization = z.object({amount: z.string().optional(), currencyCode: z.string().optional(), serviceProcessingType: z.enum(["PSP", "TSP"]).optional(), status: z.enum(["AUTHORIZED", "SOFT_DECLINED", "REJECTED", "PENDING"]).optional(), createDate: z.string().optional(), resultDate: z.string().optional(), validUntil: z.string().optional(), payType: z.string().optional(), paymentFlow: paymentFlow.optional(), payTypeDetails: z.union([z.object({responseCode: z.string().optional(), responseCodeDescription: z.string().optional(), firstTransactionId: z.string().optional(), schemeTransactionId: z.string().optional(), schemeResponseCode: z.string().optional(), retrievalReferenceNumber: z.string().optional(), acquirerCode: z.string().optional(), card: card.optional(), authentication: authentication.optional()}), z.object({resultCode: z.string().optional(), txRef: z.string().optional(), extTxRef: z.string().optional(), buid: z.string().optional()}), z.object({orderId: z.string().optional(), invoiceId: z.string().optional()})]).optional()}); export const capture = z.object({amount: z.string().optional(), currencyCode: z.string().optional(), date: z.string().optional(), payTypeDetails: z.union([z.object({retrievalReferenceNumber: z.string().optional(), acquirerCode: z.string().optional()}), z.object({orderId: z.string().optional(), invoiceId: z.string().optional(), feeAmount: z.string().optional(), sellerProtectionStatus: z.string().optional(), sellerProtectionDisputeCategories: z.array(z.string()).optional()})]).optional()}); export const fee = z.object({amount: z.string().optional(), currencyCode: z.string().optional(), type: z.string().optional()}); export const enrichedOrder = z.object({shippingMethod: z.object({country: z.string().optional(), price: z.string().optional(), name: z.string().optional()}).optional(), orderId: z.string().optional(), extOrderId: z.string().optional(), orderCreateDate: z.string().optional(), notifyUrl: z.string().optional(), customerIp: z.string().optional(), merchantPosId: z.string().optional(), description: z.string().optional(), additionalDescription: z.string().optional(), validityTime: z.string().optional(), currencyCode: z.string().optional(), totalAmount: z.string().optional(), orderUrl: z.string().optional(), capturedAmount: z.string().optional(), buyer: buyer.optional(), payMethod: z.object({amount: z.string().optional(), type: z.enum(["PBL", "CARD_TOKEN", "INSTALLMENTS"]).optional()}).optional(), products: products.optional(), shoppingCarts: shoppingCarts.optional(), merchantFunds: z.array(z.object({type: z.literal("COUPON").optional(), value: z.string().optional(), amount: z.string().optional()})).optional(), authorization: authorization.optional(), capture: capture.optional(), fees: z.array(fee).optional(), mcpData: z.object({amount: z.string().optional(), currencyCode: z.string().optional(), rate: z.string().optional()}).optional(), status: z.enum(["NEW", "PENDING", "WAITING_FOR_CONFIRMATION", "COMPLETED", "CANCELED"]).optional()}); export const getApiApiV21OrdersOrderIdResponse = z.union([z.object({orders: z.array(order).optional(), properties: properties.optional()}), z.object({orders: z.array(enrichedOrder).optional(), properties: properties.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 }; /** * Retrieve an Order * * GET /api/v2_1/orders/{orderId} */ export const getApiApiV21OrdersOrderId = async (args: GetApiApiV21OrdersOrderIdArgs, options?: GetApiApiV21OrdersOrderIdOptions) => { const {baseUrl = "https://secure.payu.com", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['Content-Type'] != null) headers.set("Content-Type", String(args['Content-Type'])) if (args.Authorization != null) headers.set("Authorization", String(args.Authorization)) if (args.with != null) query.append("with", String(args.with)) if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v2_1/orders/${encodeURIComponent(String(args.orderId))}${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(getApiApiV21OrdersOrderIdResponse, await res.json()) };