UNPKG

@vulog/aima-billing

Version:

Invoice management, credits, wallets, and refunds.

152 lines (151 loc) 7.12 kB
import { z } from "zod"; //#region src/chargeProduct.ts const schema$6 = z.object({ productId: z.string().trim().min(1).uuid(), serviceId: z.string().trim().min(1).uuid().nullable().optional(), amount: z.number().min(0), userId: z.string().trim().min(1).uuid(), entityId: z.string().trim().min(1).uuid(), subscriptionId: z.string().trim().min(1).uuid().nullable().optional(), productNotes: z.string().trim().nullable().optional(), originId: z.string().trim().nullable().optional(), chargeProductRequestId: z.string().trim().min(1).uuid().nullable().optional(), additionalInfo: z.object({ manualPayment: z.boolean().optional() }).optional() }); const chargeProduct = async (client, info) => { const result = schema$6.safeParse(info); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); return client.post(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/invoices/product`, info).then(({ data }) => data); }; //#endregion //#region src/getUserCreditsByEntityId.ts const getUserCreditsByEntityId = async (client, id) => { const result = z.string().trim().min(1).uuid().safeParse(id); if (!result.success) throw new TypeError("Invalid id", { cause: result.error.issues }); return client.get(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/wallet/entity/${id}`).then(({ data }) => data); }; //#endregion //#region src/addCredits.ts const schema$5 = z.object({ initialAmount: z.number().min(0), validityStartDate: z.string().datetime(), validityEndDate: z.string().datetime(), notes: z.string().trim().nullable().optional(), discountCategory: z.enum(["CREDITS", "PERCENTAGE"]), oneTimeUsage: z.boolean().optional(), entityId: z.string().trim().min(1).uuid(), type: z.enum([ "LOCAL", "GLOBAL", "PERIODIC" ]), usage: z.enum([ "TRIP", "REGISTRATION", "PRODUCTS", "ALL" ]) }); const addCredits = async (client, payload) => { const result = schema$5.safeParse(payload); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); return client.post(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/entities/${payload.entityId}/wallets`, result.data).then(({ data }) => data); }; //#endregion //#region src/getInvoiceById.ts const getInvoiceById = async (client, id) => { if (!z.string().trim().min(1).uuid().safeParse(id).success) throw new Error("Invalid invoice ID"); return client.get(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/invoices/${id}`).then(({ data }) => data); }; //#endregion //#region src/getInvoicePdf.ts const getInvoicePdf = async (client, invoiceId) => { const result = z.string().trim().min(1).uuid().safeParse(invoiceId); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); const { data } = await client.get(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/invoices/${invoiceId}/pdf`, { responseType: "arraybuffer" }); return data && data.byteLength > 0 ? data : null; }; //#endregion //#region src/getInvoicesByTripId.ts const getInvoicesByTripId = async (client, tripId) => { const result = z.string().trim().min(1).safeParse(tripId); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); return client.get(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/trips/${result.data}/invoices`).then(({ data }) => data); }; //#endregion //#region src/getRefundableAmount.ts const schema$4 = z.string().trim().min(1); const getRefundableAmount = async (client, invoiceId) => { const result = schema$4.safeParse(invoiceId); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); return client.get(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/invoices/${invoiceId}/refundableAmount`).then(({ data }) => data); }; //#endregion //#region src/refund.ts const schema$3 = z.object({ amount: z.number().min(0).optional(), note: z.string().trim().nullable().optional(), paymentIntentPspReference: z.string().trim().min(1).optional() }); const refund = async (client, payload) => { const result = schema$3.safeParse(payload); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); const filteredData = Object.fromEntries(Object.entries(result.data).filter(([_, value]) => value !== void 0 && value !== null)); return client.post(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/invoices/${payload.invoiceId}/refund`, filteredData).then(({ data }) => data); }; //#endregion //#region src/getWalletsByEntity.ts const getWalletsByEntity = async (client, entityId) => { const result = z.string().trim().min(1).uuid().safeParse(entityId); if (!result.success) throw new TypeError("Invalid entityId", { cause: result.error.issues }); return client.get(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/wallet/entity/${entityId}`).then(({ data }) => data); }; //#endregion //#region src/updateWallet.ts const schema$2 = z.object({ walletId: z.string().trim().min(1).uuid(), actions: z.array(z.object({ op: z.enum(["replace"]), path: z.enum(["/availableAmount", "/percentage"]), value: z.string().min(1) })).min(1).max(1) }); const updateWallet = async (client, walletId, actions) => { const result = schema$2.safeParse({ walletId, actions }); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); await client.patch(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/wallets/${walletId}`, actions, { headers: { "Content-Type": "application/json-patch+json" } }); }; //#endregion //#region src/payInvoice.ts const schema$1 = z.object({ invoiceId: z.string().trim().min(1).uuid(), manualPayment: z.object({ requiresActionReturnUrl: z.string().default(""), online: z.boolean().default(true), scope: z.enum(["RENTAL", "DEPOSIT"]) }) }); const payInvoice = async (client, invoiceId, manualPayment) => { const result = schema$1.safeParse({ invoiceId, manualPayment }); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); return client.post(`/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/invoices/${result.data.invoiceId}/payment`, result.data.manualPayment).then(({ data }) => data); }; //#endregion //#region src/retry-payment.ts const schema = z.object({ invoiceId: z.string().trim().min(1).uuid() }); /** * Retry an invoices payment stuck in REFUSED and ERROR status, move the status to PENDING or PENDING_MANUAL_PAYMENT */ const retryPayment = async (client, invoiceId) => { const result = schema.safeParse({ invoiceId }); if (!result.success) throw new TypeError("Invalid args", { cause: result.error.issues }); return client.post(`/boapi/proxy/user/billing/fleets/${client.clientOptions.fleetId}/invoices/${result.data.invoiceId}/retry-payment`, {}).then(({ data }) => data); }; //#endregion export { addCredits, chargeProduct, getInvoiceById, getInvoicePdf, getInvoicesByTripId, getRefundableAmount, getUserCreditsByEntityId, getWalletsByEntity, payInvoice, refund, retryPayment, updateWallet };