import {z} from 'zod' export type GetApiWorkordersArgs = {locationId?: number | undefined, storeId?: string | undefined, otherLocationId?: Array | undefined, id?: Array | undefined, category?: Array | undefined, categoryId?: Array | undefined, status?: Array | undefined, extendedStatus?: Array | undefined, number?: Array | undefined, serviceId?: Array | undefined, priority?: Array | undefined, purchaseNumber?: Array | undefined, trade?: Array | undefined, tradeId?: Array | undefined, scheduledDate?: Array | undefined, expirationDate?: Array | undefined, callDate?: Array | undefined, sort?: string | undefined, page?: number | undefined, pageSize?: number | undefined}; export type GetApiWorkordersOptions = {baseUrl?: string | undefined, oauth2?: string | undefined, fetch?: typeof fetch | undefined}; export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseSubscriber = z.object({Id: z.number().int().optional(), ShortName: z.string().optional(), Name: z.string().optional(), IsOutsourcedWorkOn: z.boolean().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseProvider = z.object({Id: z.number().int().optional(), Name: z.string().optional(), DoNotDispatch: z.boolean().optional(), Phone: z.string().optional(), IsInternal: z.boolean().optional(), IsOnOffShoreFeatureEnabled: z.boolean().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseLocationNote = z.object({Id: z.number().int().optional(), HeaderId: z.number().int().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseLocation = z.object({Id: z.number().int().optional(), SubscriberId: z.number().int().optional(), StoreId: z.string().optional(), Name: z.string().optional(), ShortName: z.string().optional(), Latitude: z.number().optional(), Longitude: z.number().optional(), Distance: z.number().optional(), Address1: z.string().optional(), Address2: z.string().optional(), City: z.string().optional(), State: z.string().optional(), Zip: z.string().optional(), TimeZoneInfoId: z.number().int().optional(), Notes: z.array(serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseLocationNote).optional(), TimeShiftToEST: z.number().int().optional(), AddressTypeId: z.number().int().optional(), IsInternational: z.boolean().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWorkOrderStatus = z.object({Primary: z.string().optional(), Extended: z.string().optional(), CanCreateInvoice: z.boolean().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseIssueTicketInfo = z.object({Id: z.number().int().optional(), SetupId: z.number().int().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseCurrency = z.object({Id: z.number().int().optional(), AlphabeticalCode: z.string().optional(), Rate: z.number().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWarrantyProvider = z.object({Type: z.enum(["Fixed", "PrimaryRanked", "FixedRanked"]).optional(), Value: z.number().int().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWarrantyExpiration = z.object({Type: z.enum(["FromPurchaseDate", "FromInstallDate"]).optional(), Period: z.number().int().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWarranty = z.object({ExpirationDate: z.string().optional(), ProviderId: z.number().int().optional(), NTE: z.number().optional(), Priority: z.string().optional(), Category: z.string().optional(), CategoryId: z.number().int().optional(), Provider: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWarrantyProvider.optional(), Expiration: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWarrantyExpiration.optional()}); export const systemObject = z.object({}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseEquipmentAttributeDescription = z.object({EquipmentAttributeId: z.number().int().optional(), EquipmentTypeAttributeId: z.number().int().optional(), ValueType: z.number().int().optional(), EquipmentId: z.number().int().optional(), Value: systemObject.optional(), ValueText: z.string().optional(), SelectedOptionsText: z.string().optional(), Visible: z.boolean().optional(), Editable: z.boolean().optional(), Required: z.boolean().optional(), Name: z.string().optional(), Custom: z.boolean().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseAssetResponse = z.object({Id: z.number().int().optional(), Tag: z.string().optional(), Manufacturer: z.string().optional(), ModelNo: z.string().optional(), SerialNo: z.string().optional(), LocationId: z.number().int().optional(), Area: z.string().optional(), StoreId: z.string().optional(), Trade: z.string().optional(), TradeId: z.number().int().optional(), Type: z.string().optional(), AssetTypeId: z.number().int().optional(), BrandId: z.number().int().optional(), InstallDate: z.string().optional(), ManufacturerDate: z.string().optional(), ManufacturerDateStr: z.string().optional(), PurchaseDate: z.string().optional(), UsesRefrigerant: z.number().int().optional(), Active: z.boolean().optional(), IsLeased: z.boolean().optional(), LifeExpectancy: z.number().int().optional(), OriginalValue: z.number().optional(), LeaseDate: z.string().optional(), LeasePeriod: z.number().int().optional(), Condition: z.number().int().optional(), EnergyEfficiency: z.string().optional(), Capacity: z.string().optional(), HasLeakDetector: z.boolean().optional(), Location: z.string().optional(), Warranty: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWarranty.optional(), IsReplaceEquipment: z.boolean().optional(), HasTagged: z.boolean().optional(), AssetTag: z.string().optional(), ParentId: z.number().int().optional(), Description: z.string().optional(), HasComponents: z.boolean().optional(), HasCircuits: z.boolean().optional(), IsCircuit: z.boolean().optional(), SubscriberId: z.number().int().optional(), AssetValidated: z.boolean().optional(), ValidationRequired: z.boolean().optional(), IsLeakDetector: z.boolean().optional(), AssetStatus: z.string().optional(), AssetUpdatesStatus: z.string().optional(), AssetTypeGroupId: z.number().int().optional(), AssetValidationStatus: z.number().int().optional(), CustomAttributes: z.array(serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseEquipmentAttributeDescription).optional(), HasChilds: z.boolean().optional(), ModifiedDateDto: z.string().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseCountDescriptor = z.object({Total: z.number().int().optional(), Own: z.number().int().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseAttachmentsDescriptor = z.object({Count: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseCountDescriptor.optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseNoteInfo = z.object({Id: z.number().int().optional(), DocumentId: z.string().optional(), Number: z.number().int().optional(), NoteData: z.string().optional(), DateCreated: z.string().optional(), ActionRequired: z.boolean().optional(), MailedTo: z.string().optional(), CreatedBy: z.string().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseNotesDescriptor = z.object({WorkOrderId: z.number().int().optional(), Last: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseNoteInfo.optional(), Count: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseCountDescriptor.optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWorkOrderLabel = z.object({Id: z.number().int().optional(), Label: z.string().optional()}); export const serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWorkOrder = z.object({Id: z.number().int().optional(), Number: z.string().optional(), PurchaseNumber: z.string().optional(), Subscriber: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseSubscriber.optional(), Provider: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseProvider.optional(), Location: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseLocation.optional(), LocationId: z.number().int().optional(), Status: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWorkOrderStatus.optional(), IssueTicketInfo: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseIssueTicketInfo.optional(), Caller: z.string().optional(), CreatedBy: z.string().optional(), CallDate: z.string().optional(), CallDate_DTO: z.string().optional(), EstimatedCompletionDate: z.string().optional(), OriginalEstimatedCompletionDate: z.string().optional(), ProjectedCompletionDate: z.string().optional(), OriginalProjectedCompletionDate: z.string().optional(), Priority: z.string().optional(), Trade: z.string().optional(), TradeId: z.number().int().optional(), ApprovalCode: z.string().optional(), ScheduledDate: z.string().optional(), ScheduledDate_DTO: z.string().optional(), CompletedDate: z.string().optional(), CompletedDate_DTO: z.string().optional(), ExpirationDate: z.string().optional(), ExpirationDate_DTO: z.string().optional(), UpdatedDate: z.string().optional(), UpdatedDate_DTO: z.string().optional(), CreatedDate: z.string().optional(), CreatedDate_DTO: z.string().optional(), Description: z.string().optional(), CategoryId: z.number().int().optional(), Category: z.string().optional(), Nte: z.number().optional(), Currency: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseCurrency.optional(), ProblemCode: z.string().optional(), Resolution: z.string().optional(), Asset: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseAssetResponse.optional(), AssetCount: z.number().int().optional(), Attachments: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseAttachmentsDescriptor.optional(), Notes: serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseNotesDescriptor.optional(), PostedId: z.number().int().optional(), IsCheckInDenied: z.boolean().optional(), IsInvoiced: z.boolean().optional(), CheckInDeniedReason: z.string().optional(), IsExpired: z.boolean().optional(), IsEnabledForMobile: z.boolean().optional(), HasWorkActivity: z.boolean().optional(), Source: z.string().optional(), CallerId: z.number().int().optional(), AutoComplete: z.boolean().optional(), Labels: z.array(serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWorkOrderLabel).optional(), AutoInvoice: z.boolean().optional(), ProjectedCompletionDate_DTO: z.string().optional(), OriginalProjectedCompletionDate_DTO: z.string().optional()}); export const getApiWorkordersResponse = z.array(serviceChannelServicesWebApiModelsResponseWorkOrderGetWorkOrdersResponseWorkOrder); 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 }; /** * Search Work Orders * * GET /workorders */ export const getApiWorkorders = async (args: GetApiWorkordersArgs, options?: GetApiWorkordersOptions) => { const {baseUrl = "https://sb2api.servicechannel.com/v3", fetch: fetchFn = fetch, oauth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.locationId != null) query.append("locationId", String(args.locationId)) if (args.storeId != null) query.append("storeId", String(args.storeId)) for (const item of args.otherLocationId ?? []) query.append("otherLocationId", String(item)) for (const item of args.id ?? []) query.append("id", String(item)) for (const item of args.category ?? []) query.append("category", String(item)) for (const item of args.categoryId ?? []) query.append("categoryId", String(item)) for (const item of args.status ?? []) query.append("status", String(item)) for (const item of args.extendedStatus ?? []) query.append("extendedStatus", String(item)) for (const item of args.number ?? []) query.append("number", String(item)) for (const item of args.serviceId ?? []) query.append("serviceId", String(item)) for (const item of args.priority ?? []) query.append("priority", String(item)) for (const item of args.purchaseNumber ?? []) query.append("purchaseNumber", String(item)) for (const item of args.trade ?? []) query.append("trade", String(item)) for (const item of args.tradeId ?? []) query.append("tradeId", String(item)) for (const item of args.scheduledDate ?? []) query.append("scheduledDate", String(item)) for (const item of args.expirationDate ?? []) query.append("expirationDate", String(item)) for (const item of args.callDate ?? []) query.append("callDate", String(item)) if (args.sort != null) query.append("sort", String(args.sort)) if (args.page != null) query.append("page", String(args.page)) if (args.pageSize != null) query.append("pageSize", String(args.pageSize)) if (oauth2 !== undefined) headers.set('authorization', `Bearer ${oauth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/workorders${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiWorkordersResponse, await res.json()) };