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