Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/paypal

src/reimbursements.ts

68 lines · 2.1 KB · TypeScript
import { getInvoice, invoiceMatches, searchInvoices, type SearchInvoicesInput } from './invoices.ts'
import { type PayPalAuthInput } from './paypal-helpers.ts'
import { searchTransactions } from './transactions.ts'

export type ReimbursementSearchInput = PayPalAuthInput & {
	invoiceId?: string
	invoiceNumber?: string
	recipientEmail?: string
	amount?: string | number
	currencyCode?: string
	query?: string
	startDate?: string | Date
	endDate?: string | Date
	includeRaw?: boolean
}

/**
 * Search PayPal invoices and transaction activity together for reimbursement investigations.
 * Callers pass recipient, amount, and dates — this package has no baked-in people or templates.
 */
export async function searchInvoicesForReimbursement(input: ReimbursementSearchInput = {}) {
	const invoiceResults = input.invoiceId
		? { items: [await getInvoice({ ...input, id: input.invoiceId })].filter(Boolean), match: null }
		: await searchInvoices({
				...input,
				invoiceNumber: input.invoiceNumber,
				recipientEmail: input.recipientEmail,
				amount: input.amount,
				currencyCode: input.currencyCode,
				pageSize: 20,
			} satisfies SearchInvoicesInput)

	const invoices = (invoiceResults.items as Array<any>).filter((item) =>
		invoiceMatches(input.includeRaw ? item.summary : item, input),
	)
	const shouldSearchTransactions = Boolean(
		input.startDate || input.endDate || input.amount || input.recipientEmail || input.query,
	)
	const transactions = shouldSearchTransactions
		? await searchTransactions({
				...input,
				email: input.recipientEmail,
				amount: input.amount,
				currencyCode: input.currencyCode,
				query: input.query,
				direction: 'incoming',
			})
		: null

	return {
		criteria: {
			invoiceId: input.invoiceId ?? null,
			invoiceNumber: input.invoiceNumber ?? null,
			recipientEmail: input.recipientEmail ?? null,
			amount: input.amount ?? null,
			currencyCode: input.currencyCode ?? null,
			query: input.query ?? null,
		},
		invoices,
		transactions,
		likely_matches: {
			invoice: invoices[0] ?? null,
			transaction: transactions?.matches?.[0] ?? null,
		},
	}
}

export default searchInvoicesForReimbursement