import {z} from 'zod' export type DeleteApiV6InvoicingInvoicesIdArgs = {id: string}; export type DeleteApiV6InvoicingInvoicesIdOptions = {baseUrl?: string | undefined, EmbedToken?: string | undefined, fetch?: typeof fetch | undefined}; export const invoiceTotals = z.object({subtotal: z.number().int().nullable(), discountedTotal: z.number().int().nullable(), salesTax: z.number().int().nullable(), total: z.number().int().nullable(), paidAmount: z.number().int().nullable(), balance: z.number().int().nullable()}).nullable(); export const customerExpanded = z.object({id: z.string(), name: z.string().optional(), email: z.string().optional()}).nullable(); export const invoiceRecurrenceGetDto = z.object({frequency: z.enum(["ONE_TIME", "DAILY", "WEEKLY", "MONTHLY", "YEARLY"]).nullable(), interval: z.number().int().nullable(), endDate: z.string().nullable()}).nullable(); export const salesTax = z.object({value: z.string(), type: z.enum(["AMOUNT", "PERCENT"])}).nullable(); export const glAccountExpanded = z.object({id: z.string(), name: z.string().optional(), accountNo: z.string().optional(), type: z.enum(["ASSET", "LIABILITY", "EQUITY", "INCOME", "COGS", "EXPENSE", "OTHER_INCOME", "OTHER_EXPENSE", "SUSPENSE"]).optional(), iconUrl: z.string().optional(), displayName: z.string().optional()}); export const invoiceLineItemGetDto = z.object({id: z.string(), description: z.string().nullable(), amount: z.number().int().nullable(), quantity: z.string().nullable(), price: z.string().nullable(), salesTax: salesTax, apiItemId: z.string().nullable(), glAccount: glAccountExpanded.nullable()}); export const discount = z.object({value: z.string().nullable(), type: z.enum(["AMOUNT", "PERCENT"]).nullable(), calculateBeforeSalesTax: z.boolean().nullable()}).nullable(); export const invoiceTerm = z.object({type: z.enum(["NET_10", "NET_15", "NET_30", "NET_60", "OTHER"]).nullable(), dueDate: z.string().nullable()}).nullable(); export const reminderRecurrence = z.object({frequency: z.enum(["ONE_TIME", "DAILY", "WEEKLY", "MONTHLY", "YEARLY"]).optional(), interval: z.number().int().optional()}); export const jsonNode = z.object({empty: z.boolean().optional(), array: z.boolean().optional(), null: z.boolean().optional(), object: z.boolean().optional(), float: z.boolean().optional(), string: z.boolean().optional(), number: z.boolean().optional(), missingNode: z.boolean().optional(), valueNode: z.boolean().optional(), nodeType: z.enum(["ARRAY", "BINARY", "BOOLEAN", "MISSING", "NULL", "NUMBER", "OBJECT", "POJO", "STRING"]).optional(), pojo: z.boolean().optional(), integralNumber: z.boolean().optional(), floatingPointNumber: z.boolean().optional(), short: z.boolean().optional(), int: z.boolean().optional(), long: z.boolean().optional(), double: z.boolean().optional(), bigDecimal: z.boolean().optional(), bigInteger: z.boolean().optional(), textual: z.boolean().optional(), boolean: z.boolean().optional(), binary: z.boolean().optional(), container: z.boolean().optional(), embeddedValue: z.boolean().optional()}).nullable(); export const invoiceCollectionInfoGetDto = z.object({paymentUrl: z.string().nullable(), paymentMethods: z.array(z.enum(["DIRECT", "CREDIT_CARD", "ACH"])).optional(), term: invoiceTerm, sendEmail: z.boolean().nullable(), lastViewedDatetime: z.string().nullable(), reminderRecurrence: reminderRecurrence, emailSentDatetime: z.string().nullable(), emailStatus: z.enum(["SENDING", "NOT_SENT", "SENT", "FAILURE_BOUNCED"]).nullable(), emailErrors: jsonNode}).nullable(); export const amountDue = z.object({value: z.string().nullable(), type: z.enum(["AMOUNT", "PERCENT"]).nullable()}).nullable(); export const installmentGetDto = z.object({id: z.string(), name: z.string().nullable(), dueDate: z.string().nullable(), balance: z.number().int().nullable(), amountDue: amountDue}); export const invoiceGetDto = z.object({id: z.string(), name: z.string().nullable(), invoiceNo: z.number().int().nullable(), status: z.enum(["ACTIVE", "INACTIVE", "REMOVED"]), invoiceStatus: z.enum(["DRAFT", "SCHEDULED", "OPEN", "CLOSED", "CANCELLED", "REFUNDED"]).nullable(), date: z.string().nullable(), totals: invoiceTotals, pdfUrl: z.string().nullable(), customerInvoiceKey: z.string().nullable(), notes: z.string().nullable(), customer: customerExpanded.nullable(), apiName: z.enum(["BOX", "CLOVER", "STRIPE", "PLAID", "KNOX", "UBER", "FRESHBOOKS", "HARVEST", "KW", "FRESHBOOKS2", "CAPITAL_ONE", "SQUARE", "DOTLOOP", "REALOGY", "UPWORK", "SHOPIFY", "DEDUCTR", "ENTERPRISE", "MOXIWORKS", "APPDIRECT", "LONEWOLF", "LONEWOLF_TRANSACTIONDESK", "SAMPLE_BANK", "TAXBOT", "GUSTO", "XERO", "UNIT", "MOOV", "QBO", "QUALPAY", "BENCH", "PARTNER_IMPLEMENTATION", "CHECK", "RUTTER", "WAVE", "MANUAL_ENTRY", "CSV_IMPORT", "ADYEN", "PAYABLI"]).nullable(), apiSourceId: z.string().nullable(), recurrence: invoiceRecurrenceGetDto, lineItems: z.array(invoiceLineItemGetDto).optional(), discount: discount, salesTax: salesTax, collectionInfo: invoiceCollectionInfoGetDto, installments: z.array(installmentGetDto).optional(), customData: jsonNode.optional()}); export const successResponseInvoiceGetDto = z.object({result: z.enum(["SUCCESS", "FAILURE"]).optional(), data: invoiceGetDto.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 }; /** * Delete invoice * * DELETE /v6/invoicing/invoices/{id} */ export const deleteApiV6InvoicingInvoicesId = async (args: DeleteApiV6InvoicingInvoicesIdArgs, options?: DeleteApiV6InvoicingInvoicesIdOptions) => { const {baseUrl = "https://sandbox.tight.com", fetch: fetchFn = fetch, EmbedToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (EmbedToken !== undefined) headers.set('authorization', `Bearer ${EmbedToken}`) const url = `${baseUrl.replace(/\/+$/, '')}/v6/invoicing/invoices/${encodeURIComponent(String(args.id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "DELETE", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(successResponseInvoiceGetDto, await res.json()) };