import {z} from 'zod' export type GetApiCoaApiV1InvoiceArgs = {client?: number | undefined, contract?: number | undefined, currency?: string | undefined, download?: boolean | undefined, end_date?: string | undefined, entity?: number | undefined, invoice_number?: string | undefined, limit?: number | undefined, line_tag_group_id?: number | undefined, line_tag_id?: number | undefined, offset?: number | undefined, paid_date_from?: string | undefined, paid_date_to?: string | undefined, parent_client?: number | undefined, q?: string | undefined, ref_number?: string | undefined, sentStatus?: ('not_sent' | 'sent') | undefined, sort?: string | undefined, start_date?: string | undefined, status?: ('1_30' | '31_60' | '61_90' | '91_120' | 'current' | 'over_120' | 'paid' | 'partially_paid' | 'past_due' | 'sent' | 'uncollectible' | 'unpaid' | 'voided') | undefined}; export type GetApiCoaApiV1InvoiceOptions = {baseUrl?: string | undefined, knoxApiToken?: string | undefined, fetch?: typeof fetch | undefined}; export const accountingInvoiceLine = z.object({id: z.number().int(), invoice: z.number().int().optional(), product_name: z.string(), product_bundle_name: z.string(), stripe_product_id: z.string(), product_is_taxable: z.boolean(), anrok_item_id: z.string(), sphere_item_id: z.string(), service_date: z.string().nullable().optional(), tags: z.array(z.record(z.string(), z.unknown())), department_name: z.string(), department_code: z.string(), withholding_tax_rate_name: z.string(), withholding_tax_rate_value: z.number().nullable(), description: z.string().nullable().optional(), quantity: z.number().gt(-10000000000000000).lt(10000000000000000).optional(), rate: z.number().gt(-10000000000000).lt(10000000000000).optional(), currency: z.string().max(3).optional(), amount: z.number().gt(-1000000000000000000).lt(1000000000000000000).optional(), tax: z.number().gt(-1000000000000000000).lt(1000000000000000000).optional(), tax_description: z.string().max(250).nullable().optional(), entity_use_code: z.string().max(25).nullable().optional(), discount: z.number().gt(-1000000000000000000).lt(1000000000000000000).optional(), discount_percentage: z.number().gt(-1000).lt(1000).optional(), discount_amount: z.number().gt(-1000000000000000000).lt(1000000000000000000).optional(), tag_ids: z.array(z.number().int().gte(-9223372036854776000).lte(9223372036854776000)).optional(), tag_group_ids: z.array(z.number().int().gte(-9223372036854776000).lte(9223372036854776000)).optional(), created_at: z.string(), last_modified_at: z.string(), customer: z.number().int(), product: z.number().int().nullable().optional(), product_bundle: z.number().int().nullable().optional(), withholding_tax_rate: z.number().int().nullable().optional(), department: z.number().int().nullable().optional()}); export const termsEnum = z.enum(["custom", "net_5", "net_7", "net_10", "net_15", "net_20", "net_30", "net_40", "net_45", "net_60", "net_90", "net_105", "net_120", "due_on_receipt"]); export const blankEnum = z.literal(""); export const nullEnum = z.unknown(); export const paymentStatusCdcEnum = z.enum(["draft", "open", "sent", "partial", "paid", "uncollectible", "voided"]); export const accountingInvoiceList = z.object({id: z.number().int(), lines: z.array(accountingInvoiceLine), journal_entry_intercompany: z.string(), client_name: z.string(), client_email: z.string(), anrok_customer_id: z.string(), client_invoice_message: z.string(), client_use_stripe_auto_bill: z.boolean(), contract_custom_fields: z.array(z.record(z.string(), z.union([z.string(), z.boolean(), z.array(z.unknown())]))), status: z.string(), past_due_days: z.number().int().nullable(), entity_name: z.string(), entity_currency: z.string(), entity_invoice_message: z.string().nullable(), total_amount: z.number().gt(-1000000000000000000).lt(1000000000000000000), amount_paid: z.number().gt(-1000000000000000000).lt(1000000000000000000), amount_due: z.number(), contract_name: z.string(), invoice_number: z.string().optional(), stripe_connection_name: z.string(), stripe_connection_entity: z.number().int(), stripe_connection_billing_portal_enabled: z.boolean(), avalara_connection_name: z.string(), avalara_connection_company: z.string(), tax_rate_name: z.string(), tax_rate_value: z.number().gt(-1000000).lt(1000000), payment_term_name: z.string(), revenue_transactions: z.array(z.number().int()).optional(), item_date: z.string().nullable().optional(), voided_journal_entry_order: z.number().int().nullable(), last_modified_at: z.string(), is_deleted: z.boolean(), deleted_at: z.string().nullable(), search_vector: z.string().nullable(), search_text: z.string().nullable(), auto_send_invoice: z.boolean().nullable().optional(), auto_send_invoice_at: z.string().nullable().optional(), auto_sent_at: z.string().nullable(), reminder_sent_dates: z.unknown(), pre_due_reminder_sent_dates: z.unknown(), billing_address: z.string().nullable().optional(), billing_addressee: z.string().max(255).nullable().optional(), shipping_address: z.string().nullable().optional(), shipping_addressee: z.string().max(255).nullable().optional(), terms: z.union([termsEnum, blankEnum, nullEnum]).nullable().optional(), ref_number: z.string().max(120).nullable().optional(), purchase_order_number: z.string().max(120).nullable().optional(), invoice_date: z.string(), due_date: z.string(), shipping_date: z.string().nullable().optional(), paid_date: z.string().nullable().optional(), uncollectible_date: z.string().nullable().optional(), sent_date: z.string().nullable(), period_start: z.string().nullable().optional(), period_end: z.string().nullable().optional(), location_of_sale: z.string().nullable().optional(), message_on_invoice: z.string().nullable().optional(), ita_allocation_number: z.string().max(9).nullable().optional(), payment_status: z.union([paymentStatusCdcEnum, blankEnum, nullEnum]).nullable().optional(), anrok_transaction_id: z.string().max(255).nullable().optional(), warning_message: z.string().nullable().optional(), created_at: z.string(), currency: z.string().max(3).optional(), exchange_rate: z.number().gt(-100000000000000).lt(100000000000000).nullable().optional(), exchange_rate_book: z.number().gt(-100000000000000).lt(100000000000000).nullable().optional(), last_sent_at: z.string().nullable(), integration_id: z.string().max(250).nullable().optional(), integration_context: z.unknown(), vat_number: z.string().max(250).nullable().optional(), discount: z.number().gt(-1000000000000000000).lt(1000000000000000000).nullable().optional(), payment_term_applied_discount: z.number().gt(-1000000000000000000).lt(1000000000000000000).nullable().optional(), use_stripe_auto_bill: z.boolean().nullable().optional(), stripe_payment_link_id: z.string().max(500).nullable().optional(), stripe_payment_intent_id: z.string().max(500).nullable().optional(), stripe_invoice_id: z.string().max(500).nullable().optional(), stripe_pdf_url: z.string().max(500).nullable().optional(), stripe_payment_link: z.string().max(500).nullable().optional(), source: z.string().max(250).nullable().optional(), source_id: z.string().nullable().optional(), is_migrated: z.boolean().optional(), voided_date: z.string().nullable().optional(), invoice_labels: z.unknown(), invoice_language: z.string().max(10).nullable().optional(), chat_id: z.number().int().gte(-2147483648).lte(2147483647).nullable().optional(), customer: z.number().int(), entity: z.number().int(), client: z.number().int().nullable().optional(), payment_term: z.number().int().nullable().optional(), bad_debt_journal_entry: z.number().int().nullable().optional(), journal_entry: z.number().int().nullable().optional(), ar_account: z.number().int().nullable().optional(), voided_journal_entry: z.number().int().nullable().optional(), entity_transfer_journal_entry: z.number().int().nullable().optional(), contract: z.number().int().nullable().optional(), avalara_connection: z.number().int().nullable().optional(), sphere_connection: z.number().int().nullable().optional(), anrok_connection: z.number().int().nullable().optional(), tax_rate: z.number().int().nullable().optional(), stripe_connection: z.number().int().nullable().optional(), source_file: z.number().int().nullable().optional()}); export const paginatedAccountingInvoiceListList = z.object({count: z.number().int(), next: z.string().nullable().optional(), previous: z.string().nullable().optional(), results: z.array(accountingInvoiceList)}); 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 }; /** * List Invoices * * GET /coa/api/v1/invoice/ */ export const getApiCoaApiV1Invoice = async (args: GetApiCoaApiV1InvoiceArgs, options?: GetApiCoaApiV1InvoiceOptions) => { const {baseUrl = "https://api.meetcampfire.com", fetch: fetchFn = fetch, knoxApiToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.client != null) query.append("client", String(args.client)) if (args.contract != null) query.append("contract", String(args.contract)) if (args.currency != null) query.append("currency", String(args.currency)) if (args.download != null) query.append("download", String(args.download)) if (args.end_date != null) query.append("end_date", String(args.end_date)) if (args.entity != null) query.append("entity", String(args.entity)) if (args.invoice_number != null) query.append("invoice_number", String(args.invoice_number)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.line_tag_group_id != null) query.append("line_tag_group_id", String(args.line_tag_group_id)) if (args.line_tag_id != null) query.append("line_tag_id", String(args.line_tag_id)) if (args.offset != null) query.append("offset", String(args.offset)) if (args.paid_date_from != null) query.append("paid_date_from", String(args.paid_date_from)) if (args.paid_date_to != null) query.append("paid_date_to", String(args.paid_date_to)) if (args.parent_client != null) query.append("parent_client", String(args.parent_client)) if (args.q != null) query.append("q", String(args.q)) if (args.ref_number != null) query.append("ref_number", String(args.ref_number)) if (args.sentStatus != null) query.append("sentStatus", String(args.sentStatus)) if (args.sort != null) query.append("sort", String(args.sort)) if (args.start_date != null) query.append("start_date", String(args.start_date)) if (args.status != null) query.append("status", String(args.status)) if (knoxApiToken !== undefined) headers.set("Authorization", knoxApiToken) const url = `${baseUrl.replace(/\/+$/, '')}/coa/api/v1/invoice/${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(paginatedAccountingInvoiceListList, await res.json()) };