import {z} from 'zod' export type AccountingInvoiceLine = {id: number, invoice?: number | undefined, product_name: string, product_bundle_name: string, stripe_product_id: string, product_is_taxable: boolean, anrok_item_id: string, sphere_item_id: string, service_date?: (string | null) | undefined, tags: Array<{[key: string]: unknown}>, department_name: string, department_code: string, withholding_tax_rate_name: string, withholding_tax_rate_value: number | null, description?: (string | null) | undefined, quantity?: number | undefined, rate?: number | undefined, currency?: string | undefined, amount?: number | undefined, tax?: number | undefined, tax_description?: (string | null) | undefined, entity_use_code?: (string | null) | undefined, discount?: number | undefined, discount_percentage?: number | undefined, discount_amount?: number | undefined, tag_ids?: Array | undefined, tag_group_ids?: Array | undefined, created_at: string, last_modified_at: string, customer: number, product?: (number | null) | undefined, product_bundle?: (number | null) | undefined, withholding_tax_rate?: (number | null) | undefined, department?: (number | null) | undefined}; export type Source24dEnum = 'STRIPE' | 'MANUAL'; export type BlankEnum = ''; export type NullEnum = unknown; export type PaymentTypeEnum = 'CREDIT_MEMO' | 'BANK_TRANSACTION' | 'MANUAL_TRANSACTION'; export type AccountingInvoicePayment = {id: number, credit_memo: string, payment_transaction_bank_description: string, payment_journal_entry_order: string, payment_intercompany_journal: string, voided_journal_entry_order: string, withheld_amount: number | null, currency?: string | undefined, amount?: number | undefined, payment_date?: (string | null) | undefined, created_at: string, voided_date?: (string | null) | undefined, source?: (Source24dEnum | BlankEnum | NullEnum | null) | undefined, payment_type: PaymentTypeEnum | NullEnum | null, external_id: string | null, last_modified_at: string, customer: number, invoice: number, payment_journal_entry?: (number | null) | undefined, payment_transaction?: (number | null) | undefined, fx_gain_loss_realized_transaction?: (number | null) | undefined, payment_term_discount_transaction?: (number | null) | undefined, voided_journal_entry?: (number | null) | undefined, payment_transactions?: Array | undefined}; export type AccountingInvoiceJournalEntryTypeEnum = 'reclassification' | 'adjustment' | 'dispute' | 'refund' | 'refund_failure' | 'fx_loss' | 'recoverables'; export type AccountingInvoiceJournalEntry = {id: number, journal_entry: number, journal_entry_order: string, journal_entry_date: string, journal_entry_memo: string, type: AccountingInvoiceJournalEntryTypeEnum, created_at: string}; export type File = {id: number, customer: number, created_at: string, created_by: number | null, created_by_name: string, created_by_email: string, last_modified_at: string, name: string, url: string, s3_content_type?: (string | null) | undefined, s3_content_length?: (number | null) | undefined, s3_path: string, object_id?: (number | null) | undefined, app: string, model: string, is_deleted: boolean, deleted_at: string | null}; export type TermsEnum = '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 type PaymentStatusCdcEnum = 'draft' | 'open' | 'sent' | 'partial' | 'paid' | 'uncollectible' | 'voided'; export type AccountingInvoice = {id: number, lines: Array, emails: Array<{[key: string]: unknown}>, payments: Array, related_journal_entries: Array, payment_journal_entries: Array, journal_entry_intercompany: string, client_name: string, client_campfire_id: string | null, client_email: string, anrok_customer_id: string, client_invoice_message: string, client_use_stripe_auto_bill: boolean, public_invoice_payment_url: string | null, status: string, past_due_days: number | null, entity_name: string, entity_currency: string, entity_invoice_message: string | null, total_amount: number, amount_paid: number, amount_due: number, withholding_info: {[key: string]: unknown} | null, contract_name: string, attachments: Array, invoice_number?: string | undefined, stripe_connection_name: string, stripe_connection_entity: number, stripe_connection_billing_portal_enabled: boolean, avalara_connection_name: string, avalara_connection_company: string, tax_rate_name: string, tax_rate_value: number, payment_term_name: string, revenue_transactions?: Array | undefined, item_date?: (string | null) | undefined, migrated_journal_id?: (number | null) | undefined, voided_journal_entry_order: number | null, contract_custom_fields: Array<{[key: string]: string | boolean | Array}>, department?: (number | null) | undefined, department_name?: (string | null) | undefined, tags?: Array | undefined, last_modified_at: string, is_deleted: boolean, deleted_at: string | null, chat_uuid?: string | undefined, search_vector: string | null, search_text: string | null, auto_send_invoice?: (boolean | null) | undefined, auto_send_invoice_at?: (string | null) | undefined, auto_sent_at: string | null, reminder_sent_dates: unknown, pre_due_reminder_sent_dates: unknown, billing_address?: (string | null) | undefined, billing_addressee?: (string | null) | undefined, shipping_address?: (string | null) | undefined, shipping_addressee?: (string | null) | undefined, terms?: (TermsEnum | BlankEnum | NullEnum | null) | undefined, ref_number?: (string | null) | undefined, purchase_order_number?: (string | null) | undefined, invoice_date: string, due_date: string, shipping_date?: (string | null) | undefined, paid_date?: (string | null) | undefined, uncollectible_date?: (string | null) | undefined, sent_date: string | null, period_start?: (string | null) | undefined, period_end?: (string | null) | undefined, location_of_sale?: (string | null) | undefined, message_on_invoice?: (string | null) | undefined, ita_allocation_number?: (string | null) | undefined, payment_status?: (PaymentStatusCdcEnum | BlankEnum | NullEnum | null) | undefined, anrok_transaction_id?: (string | null) | undefined, warning_message?: (string | null) | undefined, created_at: string, currency?: string | undefined, exchange_rate?: (number | null) | undefined, exchange_rate_book?: (number | null) | undefined, last_sent_at: string | null, integration_id?: (string | null) | undefined, integration_context: unknown, vat_number?: (string | null) | undefined, discount?: (number | null) | undefined, payment_term_applied_discount?: (number | null) | undefined, use_stripe_auto_bill?: (boolean | null) | undefined, stripe_payment_link_id?: (string | null) | undefined, stripe_payment_intent_id?: (string | null) | undefined, stripe_invoice_id?: (string | null) | undefined, stripe_pdf_url?: (string | null) | undefined, stripe_payment_link?: (string | null) | undefined, source?: (string | null) | undefined, source_id?: (string | null) | undefined, is_migrated?: boolean | undefined, voided_date?: (string | null) | undefined, invoice_labels: unknown, invoice_language?: (string | null) | undefined, chat_id?: (number | null) | undefined, customer: number, entity: number, client?: (number | null) | undefined, payment_term?: (number | null) | undefined, bad_debt_journal_entry: number | null, journal_entry: number | null, ar_account: number | null, voided_journal_entry: number | null, entity_transfer_journal_entry: number | null, contract?: (number | null) | undefined, avalara_connection?: (number | null) | undefined, sphere_connection?: (number | null) | undefined, anrok_connection?: (number | null) | undefined, tax_rate?: (number | null) | undefined, stripe_connection?: (number | null) | undefined, source_file?: (number | null) | undefined}; export type CreateApiCoaApiV1InvoiceArgs = {body: AccountingInvoice}; export type CreateApiCoaApiV1InvoiceOptions = {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 source24dEnum = z.enum(["STRIPE", "MANUAL"]); export const blankEnum = z.literal(""); export const nullEnum = z.unknown(); export const paymentTypeEnum = z.enum(["CREDIT_MEMO", "BANK_TRANSACTION", "MANUAL_TRANSACTION"]); export const accountingInvoicePayment = z.object({id: z.number().int(), credit_memo: z.string(), payment_transaction_bank_description: z.string(), payment_journal_entry_order: z.string(), payment_intercompany_journal: z.string(), voided_journal_entry_order: z.string(), withheld_amount: z.number().nullable(), currency: z.string().max(3).optional(), amount: z.number().gt(-1000000000000000000).lt(1000000000000000000).optional(), payment_date: z.string().nullable().optional(), created_at: z.string(), voided_date: z.string().nullable().optional(), source: z.union([source24dEnum, blankEnum, nullEnum]).nullable().optional(), payment_type: z.union([paymentTypeEnum, nullEnum]).nullable(), external_id: z.string().max(256).nullable(), last_modified_at: z.string(), customer: z.number().int(), invoice: z.number().int(), payment_journal_entry: z.number().int().nullable().optional(), payment_transaction: z.number().int().nullable().optional(), fx_gain_loss_realized_transaction: z.number().int().nullable().optional(), payment_term_discount_transaction: z.number().int().nullable().optional(), voided_journal_entry: z.number().int().nullable().optional(), payment_transactions: z.array(z.number().int()).optional()}); export const accountingInvoiceJournalEntryTypeEnum = z.enum(["reclassification", "adjustment", "dispute", "refund", "refund_failure", "fx_loss", "recoverables"]); export const accountingInvoiceJournalEntry = z.object({id: z.number().int(), journal_entry: z.number().int(), journal_entry_order: z.string(), journal_entry_date: z.string(), journal_entry_memo: z.string(), type: accountingInvoiceJournalEntryTypeEnum, created_at: z.string()}); export const file = z.object({id: z.number().int(), customer: z.number().int(), created_at: z.string(), created_by: z.number().int().nullable(), created_by_name: z.string(), created_by_email: z.string(), last_modified_at: z.string(), name: z.string(), url: z.string(), s3_content_type: z.string().nullable().optional(), s3_content_length: z.number().int().gte(0).lte(2147483647).nullable().optional(), s3_path: z.string(), object_id: z.number().int().gte(0).lte(2147483647).nullable().optional(), app: z.string(), model: z.string(), is_deleted: z.boolean(), deleted_at: z.string().nullable()}); 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 paymentStatusCdcEnum = z.enum(["draft", "open", "sent", "partial", "paid", "uncollectible", "voided"]); export const accountingInvoice = z.object({id: z.number().int(), lines: z.array(accountingInvoiceLine), emails: z.array(z.record(z.string(), z.unknown())), payments: z.array(accountingInvoicePayment), related_journal_entries: z.array(accountingInvoiceJournalEntry), payment_journal_entries: z.array(z.number().int()), journal_entry_intercompany: z.string(), client_name: z.string(), client_campfire_id: z.string().nullable(), client_email: z.string(), anrok_customer_id: z.string(), client_invoice_message: z.string(), client_use_stripe_auto_bill: z.boolean(), public_invoice_payment_url: z.string().nullable(), 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(), withholding_info: z.record(z.string(), z.unknown()).nullable(), contract_name: z.string(), attachments: z.array(file), 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(), migrated_journal_id: z.number().int().nullable().optional(), voided_journal_entry_order: z.number().int().nullable(), contract_custom_fields: z.array(z.record(z.string(), z.union([z.string(), z.boolean(), z.array(z.unknown())]))), department: z.number().int().nullable().optional(), department_name: z.string().nullable().optional(), tags: z.array(z.number().int()).optional(), last_modified_at: z.string(), is_deleted: z.boolean(), deleted_at: z.string().nullable(), chat_uuid: z.string().optional(), 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(), journal_entry: z.number().int().nullable(), ar_account: z.number().int().nullable(), voided_journal_entry: z.number().int().nullable(), entity_transfer_journal_entry: z.number().int().nullable(), 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 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 }; /** * Create Invoice * * POST /coa/api/v1/invoice/ */ export const createApiCoaApiV1Invoice = async (args: CreateApiCoaApiV1InvoiceArgs, options?: CreateApiCoaApiV1InvoiceOptions) => { const {baseUrl = "https://api.meetcampfire.com", fetch: fetchFn = fetch, knoxApiToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") 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: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(accountingInvoice, await res.json()) };