import {z} from 'zod' export type VoidInvoiceRequest = {void_date?: string | undefined}; export type CreateApiCoaApiV1InvoiceInvoiceIdVoidArgs = {invoice_id: number, body: VoidInvoiceRequest}; export type CreateApiCoaApiV1InvoiceInvoiceIdVoidOptions = {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 }; /** * Void Invoice * * POST /coa/api/v1/invoice/{invoice_id}/void/ */ export const createApiCoaApiV1InvoiceInvoiceIdVoid = async (args: CreateApiCoaApiV1InvoiceInvoiceIdVoidArgs, options?: CreateApiCoaApiV1InvoiceInvoiceIdVoidOptions) => { 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/${encodeURIComponent(String(args.invoice_id))}/void/${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()) };