import {z} from 'zod' export type CreateApiQuotesPublicItemsArgs = {body: {quote: string, part: string, use_latest_pricing?: boolean | undefined, quantities?: Array | undefined, process?: (string | null) | undefined, material?: (string | null) | undefined, public_notes?: (string | null) | undefined, private_notes?: (string | null) | undefined, estimated_annual_usage?: (number | null) | undefined, metadata?: Record | undefined, unit_price_precision?: number | undefined}}; export type CreateApiQuotesPublicItemsOptions = {baseUrl?: string | undefined, appId?: string | undefined, fetch?: typeof fetch | undefined}; export const quoteAddOnQuantity = z.object({price: z.number().optional(), manual_price: z.number().optional(), quantity: z.number().int().optional()}); export const quoteCostingVariable = z.object({label: z.string().optional(), variable_class: z.enum(["basic", "drop_down", "table"]).optional(), value_type: z.enum(["string", "number", "currency", "boolean"]).optional(), quantity_specific: z.boolean().optional(), quantities: z.array(z.object({stringQuotedQuantity1: z.object({value: z.union([z.number(), z.string(), z.boolean()]).nullable().optional(), row: z.object({}).nullable().optional(), options: z.array(z.union([z.number(), z.string()])).nullable().optional()}).optional(), stringQuotedQuantity2: z.object({value: z.union([z.number(), z.string(), z.boolean()]).nullable().optional(), row: z.object({}).nullable().optional(), options: z.array(z.union([z.number(), z.string()])).nullable().optional()}).optional()})).optional(), type: z.string().optional(), value: z.union([z.string(), z.number(), z.number().int(), z.boolean()]).nullable().optional(), row: z.object({}).nullable().optional()}); export const quoteAddOn = z.object({is_required: z.boolean().optional(), name: z.string().optional(), erp_code: z.string().optional(), notes: z.string().optional(), quantities: z.array(quoteAddOnQuantity).optional(), costing_variables: z.array(quoteCostingVariable).optional()}); export const quoteExpedite = z.object({id: z.number().int().optional(), lead_time: z.number().int().optional(), markup: z.number().optional(), unit_price: z.number().optional(), total_price: z.number().optional()}); export const quoteQuantity = z.object({id: z.number().int().optional(), quantity: z.number().int().optional(), markup_1_price: z.number().nullable().optional(), markup_1_name: z.string().nullable().optional(), markup_2_price: z.number().nullable().optional(), markup_2_name: z.string().nullable().optional(), unit_price: z.number().optional(), total_price: z.number().optional(), total_price_with_required_add_ons: z.number().optional(), lead_time: z.number().int().optional(), expedites: z.array(quoteExpedite).optional(), is_most_likely_won_quantity: z.boolean().optional(), most_likely_won_quantity_percent: z.number().int().optional(), deliver_quantity: z.number().int().optional(), make_quantity: z.number().int().optional(), manual_total_unit_price: z.number().nullable().optional(), total_component_overrides_cost: z.number().nullable().optional(), total_discount: z.number().nullable().optional(), total_discount_percentage: z.number().nullable().optional(), total_inside_processing_cost: z.number().nullable().optional(), total_outside_processing_cost: z.number().nullable().optional(), total_price_before_discounts: z.number().nullable().optional(), total_purchased_component_cost: z.number().nullable().optional(), total_raw_material_cost: z.number().nullable().optional(), unit_price_before_discounts: z.number().nullable().optional(), yield_pct: z.number().nullable().optional()}); export const componentChild = z.object({child_id: z.number().int().optional(), quantity: z.number().int().optional()}); export const orderMaterial = z.object({id: z.number().int().optional(), display_name: z.string().optional(), family: z.string().optional(), material_class: z.string().optional(), name: z.string().optional()}); export const operationQuantity = z.object({price: z.number().optional(), manual_price: z.number().nullable().optional(), lead_time: z.number().int().nullable().optional(), manual_lead_time: z.number().int().nullable().optional(), quantity: z.number().int().optional()}); export const quoteOperation = z.object({id: z.number().int().optional(), category: z.enum(["material", "operation"]).optional(), cost: z.number().optional(), costing_variables: z.array(quoteCostingVariable).optional(), quantities: z.array(operationQuantity).optional(), is_finish: z.boolean().optional(), is_outside_service: z.boolean().optional(), name: z.string().optional(), erp_code: z.string().optional(), operation_definition_name: z.string().optional(), notes: z.string().nullable().optional(), position: z.number().int().optional(), runtime: z.number().nullable().optional(), setup_time: z.number().nullable().optional()}); export const orderProcess = z.object({id: z.number().int().optional(), external_name: z.string().optional(), name: z.string().optional()}); export const purchasedComponentProperty = z.object({name: z.string().optional(), code_name: z.string().optional(), value_type: z.enum(["string", "boolean", "numeric"]).optional(), value: z.union([z.string(), z.number(), z.boolean()]).nullable().optional()}); export const quotePurchasedComponent = z.object({oem_part_number: z.string().optional(), internal_part_number: z.string().nullable().optional(), description: z.string().nullable().optional(), piece_price: z.number().optional(), id: z.string().optional(), properties: z.array(purchasedComponentProperty).optional()}); export const orderSupportingFile = z.object({filename: z.string().optional(), url: z.string().optional()}); export const quoteComponent = z.object({id: z.string().optional(), add_ons: z.array(quoteAddOn).optional(), discounts: z.array(z.object({})).optional(), is_assembly: z.boolean().optional(), obtain_method: z.string().nullable().optional(), part_custom_attrs: z.array(z.object({})).optional(), pricing_items: z.array(z.object({})).optional(), quantities: z.array(quoteQuantity).optional(), child_ids: z.array(z.number().int()).optional(), children: z.array(componentChild).optional(), description: z.string().nullable().optional(), export_controlled: z.boolean().optional(), finishes: z.array(z.string()).optional(), innate_quantity: z.number().int().optional(), is_root_component: z.boolean().optional(), material: orderMaterial.optional(), material_operations: z.array(quoteOperation).optional(), parent_ids: z.array(z.number().int()).optional(), part_name: z.string().optional(), part_number: z.string().nullable().optional(), part_url: z.string().optional(), part_uuid: z.string().optional(), process: orderProcess.optional(), purchased_component: quotePurchasedComponent.optional(), revision: z.string().nullable().optional(), shop_operations: z.array(quoteOperation).optional(), supporting_files: z.array(orderSupportingFile).optional(), thumbnail_url: z.string().nullable().optional(), type: z.enum(["assembled", "manufactured", "purchased"]).optional()}); export const quoteItem = z.object({id: z.number().int().optional(), type: z.enum(["automatic", "manual"]).optional(), root_component_id: z.number().int().optional(), components: z.array(quoteComponent).optional(), position: z.number().int().optional(), export_controlled: z.boolean().optional(), component_ids: z.array(z.number().int()).optional(), metadata: z.object({}).nullable().optional(), private_notes: z.string().nullable().optional(), public_notes: z.string().nullable().optional(), workflow_status: z.string().nullable().optional(), root_component: z.object({}).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 a new quote item * * POST /quotes/public/items */ export const createApiQuotesPublicItems = async (args: CreateApiQuotesPublicItemsArgs, options?: CreateApiQuotesPublicItemsOptions) => { const {baseUrl = "https://api.paperlessparts.com/v1", fetch: fetchFn = fetch, appId} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (appId !== undefined) headers.set("Authorization", appId) const url = `${baseUrl.replace(/\/+$/, '')}/quotes/public/items${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(quoteItem, await res.json()) };