import {z} from 'zod' export type GetApiAssetsAssetIdArgs = {assetId: number, locationId?: number | undefined, storeId?: string | undefined, tagId?: string | undefined, trackingNumber?: number | undefined}; export type GetApiAssetsAssetIdOptions = {baseUrl?: string | undefined, oauth2?: string | undefined, fetch?: typeof fetch | undefined}; export const serviceChannelServicesMessagingAssetsWarrantyProvider = z.object({Type: z.enum(["Fixed", "PrimaryRanked", "FixedRanked"]).optional(), Value: z.number().int().optional(), ProviderName: z.string().optional()}); export const serviceChannelServicesMessagingAssetsWarrantyExpiration = z.object({Type: z.enum(["FromPurchaseDate", "FromInstallDate"]).optional(), Period: z.number().int().optional()}); export const serviceChannelServicesMessagingAssetsWarranty = z.object({ExpirationDate: z.string().optional(), ProviderId: z.number().int().optional(), NTE: z.number().optional(), Priority: z.string().optional(), PriorityId: z.number().int().optional(), Category: z.string().optional(), CategoryId: z.number().int().optional(), Provider: serviceChannelServicesMessagingAssetsWarrantyProvider.optional(), Expiration: serviceChannelServicesMessagingAssetsWarrantyExpiration.optional()}); export const serviceChannelServicesMessagingRefrigerantTrackingAssetRefrigerant = z.object({Id: z.number().int().optional(), AssetId: z.number().int().optional(), RefrigerantUsageType: z.number().int().optional(), RackId: z.string().optional(), RackEntityId: z.number().int().optional(), CarbID: z.string().optional(), IsCarbReporting: z.boolean().optional(), SystemLocation: z.string().optional(), OperationalStatus: z.string().optional(), RefrigerantPartNumber: z.string().optional(), PartNumberId: z.number().int().optional(), RackTypeId: z.number().int().optional(), CurrentCharge: z.number().optional(), CurrentChargeMetrics: z.number().optional(), CurrentChargeOunces: z.number().optional(), ChargeDescriptionId: z.number().int().optional(), ChargeProviderName: z.string().optional(), EffectiveChargeDate: z.string().optional(), RefrigerantChargeOptionId: z.number().int().optional(), RackTypeName: z.string().optional(), UserId: z.number().int().optional(), TagId: z.string().optional(), AssetTypeId: z.number().int().optional(), RefrigerantPurposeId: z.number().int().optional(), RefrigerantPurposeName: z.string().optional(), ParentId: z.number().int().optional(), CreateOperationalStatusHistory: z.boolean().optional(), OperationStatusDate: z.string().optional(), HasLeakDetector: z.boolean().optional(), AssetLeakDetectorId: z.number().int().optional(), InitialCharge: z.boolean().optional(), RackType: z.string().optional(), NeedsRetrofitRetirement: z.boolean().optional(), RequiresAutomaticLeakDetector: z.boolean().optional(), ConnectedRackId: z.number().int().optional(), PreviousConnectedRackId: z.number().int().optional(), UpdatedDate: z.string().optional()}); export const serviceChannelServicesMessagingAssetsAssetAttributesMap = z.object({StandardAttributesMap: z.number().int().optional(), ViewableForProvidersAttributesMap: z.number().int().optional(), EditableForProvidersAttributesMap: z.number().int().optional(), RequiredStandardAttributesMap: z.number().int().optional()}); export const systemObject = z.object({}); export const serviceChannelServicesMessagingEquipmentsEquipmentAttributeDescription = 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 serviceChannelServicesMessagingAssetsAssetResponse = 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(), WorkOrderArea: 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(), InstallDateVal: 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(), ConditionString: z.string().optional(), EnergyEfficiency: z.string().optional(), Capacity: z.string().optional(), HasLeakDetector: z.boolean().optional(), AssetLeakDetectorConnectionId: z.number().int().optional(), Location: z.string().optional(), Warranty: serviceChannelServicesMessagingAssetsWarranty.optional(), IsReplaceEquipment: z.boolean().optional(), HasTagged: z.boolean().optional(), LastModifiedUseDate: z.string().optional(), LastModifiedUserName: z.string().optional(), SubName: z.string().optional(), AssetRefrigerant: serviceChannelServicesMessagingRefrigerantTrackingAssetRefrigerant.optional(), AssetAttributesMap: serviceChannelServicesMessagingAssetsAssetAttributesMap.optional(), AssetTag: z.string().optional(), ImportedFrom: z.number().int().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(), AdditionalTradesNames: z.string().optional(), AdditionalTradeIds: z.array(z.number().int()).optional(), CreatedDate: z.string().optional(), ModifiedDate: z.string().optional(), AssetTypeGroupId: z.number().int().optional(), Spend: z.number().optional(), IsCarbReporting: z.boolean().optional(), AssetValidationStatus: z.number().int().optional(), UnableToScanReason: z.string().optional(), UnableToScanReasonCustomText: z.string().optional(), UnableToScanReasonId: z.number().int().optional(), CustomAttributes: z.array(serviceChannelServicesMessagingEquipmentsEquipmentAttributeDescription).optional(), HasChilds: z.boolean().optional(), Currency: z.number().int().optional(), ModifiedDateDto: z.string().optional(), RetiredDate: z.string().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 }; /** * Get an asset * * GET /assets/{assetId} */ export const getApiAssetsAssetId = async (args: GetApiAssetsAssetIdArgs, options?: GetApiAssetsAssetIdOptions) => { 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)) if (args.tagId != null) query.append("tagId", String(args.tagId)) if (args.trackingNumber != null) query.append("trackingNumber", String(args.trackingNumber)) if (oauth2 !== undefined) headers.set('authorization', `Bearer ${oauth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/assets/${encodeURIComponent(String(args.assetId))}${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(serviceChannelServicesMessagingAssetsAssetResponse, await res.json()) };