import {z} from 'zod' export type QuoteNumber = number; export type RevisionNumber = number; export type PatchApiQuotesPublicQuoteNumberArgs = {quoteNumber: QuoteNumber, revision?: RevisionNumber | undefined, body: {erp_code?: (string | null) | undefined}}; export type PatchApiQuotesPublicQuoteNumberOptions = {baseUrl?: string | undefined, appId?: string | undefined, fetch?: typeof fetch | undefined}; export const quoteContact = z.object({account: z.object({erp_code: z.string().nullable().optional(), id: z.number().optional(), notes: z.string().nullable().optional(), name: z.string().optional()}).optional(), email: z.string().optional(), first_name: z.string().optional(), id: z.number().optional(), last_name: z.string().optional(), notes: z.string().nullable().optional(), phone: z.string().nullable().optional(), phone_ext: z.string().nullable().optional()}); export const quoteCustomer = z.object({first_name: z.string().optional(), last_name: z.string().optional(), email: z.string().optional(), notes: z.string().nullable().optional(), company: z.object({notes: z.string().nullable().optional(), metrics: z.object({order_revenue_all_time: z.number().optional(), order_revenue_last_thirty_days: z.number().optional(), quotes_sent_all_time: z.number().int().optional(), quotes_sent_last_thirty_days: z.number().int().optional()}).optional(), business_name: z.string().optional(), erp_code: z.string().optional()}).optional()}); export const salesPerson = z.object({uuid: z.string().optional(), first_name: z.string().optional(), last_name: z.string().optional(), email: z.string().optional(), erp_code: z.string().optional()}); export const address = z.object({id: z.number().int().optional(), address1: z.string().max(250).optional(), address2: z.string().max(250).nullable().optional(), city: z.string().max(100).optional(), state: z.string().optional(), postal_code: z.string().optional(), country: z.string().max(3).optional(), erp_code: z.string().max(50).optional()}); export const facility = z.object({account_id: z.number().int().optional(), address: address.optional(), attention: z.string().optional(), id: z.number().int().optional(), name: z.string().optional(), salesperson: salesPerson.optional()}).nullable(); export const quoteNumber = z.number().int(); export const orderNumber = z.number().int(); export const orderNumberArray = z.array(orderNumber); export const parentQuote = z.object({id: z.number().int().optional(), number: z.number().int().optional(), status: z.string().optional()}); export const parentSupplierOrder = z.object({id: z.number().int().optional(), number: z.number().int().optional(), status: z.string().optional()}); 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 requestForQuote = z.object({id: z.number().int().optional(), email: z.string().optional(), first_name: z.string().optional(), last_name: z.string().optional(), business_name: z.string().optional(), phone: z.string().optional(), phone_ext: z.string().optional(), requested_delivery_date: z.string().optional(), contact_info_conflict: z.boolean().optional(), marketing_source: z.string().optional()}); export const revisionNumber = z.number().int(); export const quote = z.object({uuid: z.string().optional(), authenticated_pdf_quote_url: z.string().nullable().optional(), contact: quoteContact.optional(), created: z.string().optional(), customer: quoteCustomer.optional(), digital_last_viewed_on: z.string().nullable().optional(), due_date: z.string().nullable().optional(), erp_code: z.string().nullable().optional(), estimator: salesPerson.optional(), metadata: z.object({}).nullable().optional(), ordered_date: z.string().nullable().optional(), priority: z.number().int().nullable().optional(), rfq_number: z.string().nullable().optional(), send_from_facility: facility.optional(), expired: z.boolean().optional(), expired_date: z.string().optional(), export_controlled: z.boolean().optional(), id: z.number().int().optional(), is_unviewed_drafted_rfq: z.boolean().optional(), number: quoteNumber.optional(), order_numbers: orderNumberArray.optional(), parent_quote: parentQuote.optional(), parent_supplier_order: parentSupplierOrder.optional(), private_notes: z.string().nullable().optional(), quote_items: z.array(quoteItem).optional(), quote_notes: z.string().nullable().optional(), request_for_quote: requestForQuote.optional(), revision_number: revisionNumber.optional(), sales_person: salesPerson.optional(), salesperson: salesPerson.optional(), sent_date: z.string().nullable().optional(), status: z.enum(["draft", "outstanding", "expired", "cancelled", "partially_accepted", "accepted", "trash", "lost"]).optional(), tax_cost: z.number().optional(), tax_rate: z.number().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 }; /** * Update fields on a Quote * * PATCH /quotes/public/{quoteNumber} */ export const patchApiQuotesPublicQuoteNumber = async (args: PatchApiQuotesPublicQuoteNumberArgs, options?: PatchApiQuotesPublicQuoteNumberOptions) => { 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 (args.revision != null) query.append("revision", String(args.revision)) if (appId !== undefined) headers.set("Authorization", appId) const url = `${baseUrl.replace(/\/+$/, '')}/quotes/public/${encodeURIComponent(String(args.quoteNumber))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PATCH", 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(quote, await res.json()) };