import {z} from 'zod' export type LoadDraftPayload = {loadDraftId: string, referenceNumbers?: ({shipmentNumber?: string | undefined, customerReferenceNumber?: string | undefined, customerLoadNumber?: string | undefined, releaseNumber?: string | undefined, bolNumber?: string | undefined, poNumber?: string | undefined, proNumber?: string | undefined, driverNumber?: string | undefined, tractorNumber?: string | undefined, trailerNumber?: string | undefined, others?: (Array<{type?: string | undefined, value?: string | undefined}>) | undefined}) | undefined, customerInformation?: ({name?: string | undefined, contact?: ({email?: string | undefined, phone?: string | undefined}) | undefined, address?: ({name?: string | undefined, streetAddress?: string | undefined, city?: string | undefined, state?: string | undefined, zip?: string | undefined, country?: string | undefined}) | undefined, notes?: string | undefined, internalNotes?: string | undefined, shipperId?: string | undefined, divisionTerm?: string | undefined}) | undefined, stops?: (Array<{stopNumber?: number | undefined, stopType?: ('PICKUP' | 'DELIVERY') | undefined, referenceNumber?: string | undefined, facilityName?: string | undefined, facilityCode?: string | undefined, facilityAddress?: ({name?: string | undefined, streetAddress?: string | undefined, city?: string | undefined, state?: string | undefined, zip?: string | undefined, country?: string | undefined}) | undefined, facilityContact?: ({email?: string | undefined, phone?: string | undefined}) | undefined, handlingType?: ('LIVE' | 'DROP_TRAILER') | undefined, appointmentType?: ('APPOINTMENT' | 'FIRST_COME_FIRST_SERVE') | undefined, appointmentTime?: ({start?: string | undefined, end?: string | undefined, timezone?: string | undefined}) | undefined, dropTime?: ({start?: string | undefined, end?: string | undefined, timezone?: string | undefined}) | undefined, driverInstructions?: string | undefined, notes?: string | undefined, internalNotes?: string | undefined, shippingHours?: string | undefined, receivingHours?: string | undefined, operatingHours?: string | undefined, timezone?: string | undefined}>) | undefined, loadDetails?: ({handlingUnit?: ({unitType?: ('PALLET' | 'PIECE' | 'CARTON' | 'TOTE' | 'SKID' | 'CRATE' | 'BOX' | 'DRUM' | 'CASE' | 'FLOOR_LOADED' | 'ROLL' | 'SHEET') | undefined, unitCount?: string | undefined}) | undefined, packagingUnit?: ({unitType?: ('PALLET' | 'PIECE' | 'CARTON' | 'TOTE' | 'SKID' | 'CRATE' | 'BOX' | 'DRUM' | 'CASE' | 'FLOOR_LOADED' | 'ROLL' | 'SHEET') | undefined, unitCount?: string | undefined}) | undefined, commodity?: string | undefined, description?: string | undefined, dimensions?: ({length?: string | undefined, lengthUnit?: string | undefined, width?: string | undefined, widthUnit?: string | undefined, height?: string | undefined, heightUnit?: string | undefined, volume?: string | undefined, volumeUnit?: string | undefined}) | undefined, weight?: ({value?: string | undefined, unit?: string | undefined}) | undefined, valueAmount?: ({value?: string | undefined, unit?: string | undefined}) | undefined, cargoCharacteristics?: ({stackable?: boolean | undefined, hazmat?: boolean | undefined, perishable?: boolean | undefined, hazardousDetails?: ({name?: string | undefined, nameQualifier?: string | undefined, unCode?: string | undefined, contact?: string | undefined, number?: string | undefined, hazardClass?: string | undefined, placardsNeeded?: string | undefined, placardNumber?: string | undefined, packingGroup?: string | undefined, flashpointTemp?: string | undefined, controlTemp?: string | undefined, emergencyTemp?: string | undefined, tempQualifier?: string | undefined}) | undefined}) | undefined, freightClass?: ('50' | '55' | '60' | '65' | '70' | '77.5' | '85' | '92.5' | '100' | '110' | '125' | '150' | '175' | '200' | '250' | '300' | '400' | '500') | undefined, nmfc?: string | undefined, cargoItems?: (Array<{handlingUnit?: ({unitType?: ('PALLET' | 'PIECE' | 'CARTON' | 'TOTE' | 'SKID' | 'CRATE' | 'BOX' | 'DRUM' | 'CASE' | 'FLOOR_LOADED' | 'ROLL' | 'SHEET') | undefined, unitCount?: string | undefined}) | undefined, packagingUnit?: ({unitType?: ('PALLET' | 'PIECE' | 'CARTON' | 'TOTE' | 'SKID' | 'CRATE' | 'BOX' | 'DRUM' | 'CASE' | 'FLOOR_LOADED' | 'ROLL' | 'SHEET') | undefined, unitCount?: string | undefined}) | undefined, commodity?: string | undefined, description?: string | undefined, dimensions?: ({length?: string | undefined, lengthUnit?: string | undefined, width?: string | undefined, widthUnit?: string | undefined, height?: string | undefined, heightUnit?: string | undefined, volume?: string | undefined, volumeUnit?: string | undefined}) | undefined, weight?: ({value?: string | undefined, unit?: string | undefined}) | undefined, valueAmount?: ({value?: string | undefined, unit?: string | undefined}) | undefined, cargoCharacteristics?: ({stackable?: boolean | undefined, hazmat?: boolean | undefined, perishable?: boolean | undefined, hazardousDetails?: ({name?: string | undefined, nameQualifier?: string | undefined, unCode?: string | undefined, contact?: string | undefined, number?: string | undefined, hazardClass?: string | undefined, placardsNeeded?: string | undefined, placardNumber?: string | undefined, packingGroup?: string | undefined, flashpointTemp?: string | undefined, controlTemp?: string | undefined, emergencyTemp?: string | undefined, tempQualifier?: string | undefined}) | undefined}) | undefined, freightClass?: ('50' | '55' | '60' | '65' | '70' | '77.5' | '85' | '92.5' | '100' | '110' | '125' | '150' | '175' | '200' | '250' | '300' | '400' | '500') | undefined, nmfc?: string | undefined}>) | undefined}) | undefined, loadRequirements?: ({mode?: ('FTL' | 'LTL' | 'DRAYAGE') | undefined, loadType?: ('SPOT' | 'CONTRACT' | 'DEDICATED' | 'PROJECT') | undefined, equipment?: ({equipmentType?: ('DRY_VAN' | 'FLATBED' | 'REEFER' | 'CONTAINER' | 'CONESTOGA' | 'CONTAINERS' | 'DECKS_SPECIALIZED' | 'DECKS_STANDARD' | 'DRY_BULK' | 'FLATBEDS' | 'HAZARDOUS_MATERIALS' | 'OTHER_EQUIPMENT' | 'REEFERS' | 'TANKERS' | 'VANS_SPECIALIZED' | 'VANS_STANDARD' | 'AUTO_CARRIER' | 'B_TRAIN' | 'CONTAINER_INSULATED' | 'CONTAINER_REFRIGERATED' | 'CONVEYOR' | 'DOUBLE_DROP' | 'DUMP_TRAILER' | 'DROP_DECK_LANDOLL' | 'FLATBED_AIR_RIDE' | 'FLATBED_CONESTOGA' | 'FLATBED_DOUBLE' | 'FLATBED_HAZMAT' | 'FLATBED_HOTSHOT' | 'FLATBED_MAXI' | 'FLATBED_OR_STEP_DECK' | 'FLATBED_OVERDIMENSION' | 'FLATBED_VAN_REEFER' | 'FLATBED_WITH_CHAINS' | 'FLATBED_WITH_SIDES' | 'FLATBED_WITH_TARPS' | 'FLATBED_WITH_TEAM' | 'HOPPER_BOTTOM' | 'INSULATED_VAN_OR_REEFER' | 'LOWBOY' | 'LOWBOY_OR_REM_GOOSENECK_RGN' | 'LOWBOY_OVERDIMENSION' | 'MOVING_VAN' | 'OTHER' | 'PNEUMATIC' | 'POWER_ONLY' | 'POWER_ONLY_LOAD_OUT' | 'POWER_ONLY_TOW_AWAY' | 'REEFER_AIR_RIDE' | 'REEFER_DOUBLE' | 'REEFER_HAZMAT' | 'REEFER_INTERMODAL' | 'REEFER_LOGISTICS' | 'REEFER_OR_VENTED_VAN' | 'REEFER_PALLET_EXCHANGE' | 'REEFER_WITH_TEAM' | 'REMOVABLE_GOOSENECK' | 'SPRINTER_VAN' | 'SPRINTER_VAN_HAZMAT' | 'SPRINTER_VAN_TEMP_CONTROLLED' | 'SPRINTER_VAN_WITH_TEAM' | 'STEP_DECK' | 'STEP_DECK_OR_REM_GOOSENECK_RGN' | 'STEPDECK_CONESTOGA' | 'STRAIGHT_BOX_TRUCK' | 'STRAIGHT_BOX_TRUCK_HAZMAT' | 'STRAIGHT_BOX_TRUCK_REEFER' | 'STRETCH_TRAILER' | 'TANKER_ALUMINUM' | 'TANKER_INTERMODAL' | 'TANKER_STEEL' | 'TRUCK_AND_TRAILER' | 'VAN' | 'VAN_AIR_RIDE' | 'VAN_BLANKET_WRAP' | 'VAN_CONESTOGA' | 'VAN_DOUBLE' | 'VAN_HOTSHOT' | 'VAN_INSULATED' | 'VAN_INTERMODAL' | 'VAN_LIFT_GATE' | 'VAN_LOGISTICS' | 'VAN_OPEN_TOP' | 'VAN_OR_FLATBED' | 'VAN_OR_FLATBED_WITH_TARPS' | 'VAN_OR_REEFER' | 'VAN_PALLET_EXCHANGE' | 'VAN_ROLLER_BED' | 'VAN_TRIPLE' | 'VAN_VENTED' | 'VAN_WITH_CURTAINS' | 'VAN_WITH_TEAM' | 'VAN_HAZMAT' | 'HOTSHOT_FLATBED' | 'STRAIGHT_TRUCK' | 'VAN_SPRINTER' | 'REMOVABLE_GOOSE_NECK' | 'TANKER' | 'BOX_TRUCK') | undefined, size?: string | undefined, unit?: string | undefined}) | undefined, additionalRequiredServices?: Array | undefined, tarpSize?: (string | null) | undefined, temperatureRequirement?: ({required?: boolean | undefined, hasBulkhead?: boolean | undefined, zones?: (Array<{zoneId?: string | undefined, minTemp?: ({value?: number | undefined, unit?: ('F' | 'C') | undefined} | null) | undefined, maxTemp?: ({value?: number | undefined, unit?: ('F' | 'C') | undefined} | null) | undefined}>) | undefined} | null) | undefined}) | undefined, rates?: ({baseRate?: string | undefined, lineHaul?: string | undefined, accessorials?: (Array<{type?: string | undefined, rate?: string | undefined}>) | undefined, totalRate?: string | undefined, collectionMethod?: ('PrePaid' | 'Collect' | 'ThirdParty' | 'CollectOnDelivery') | undefined}) | undefined, documentDates?: Array | undefined}; export type LoadDraftEvent = {id: string, workflow: 'TRACK_AND_TRACE' | 'CARRIER_SUPPORT' | 'POD_COLLECTION' | 'LOAD_BUILDING' | 'CARRIER_SELECTION' | 'SCHEDULING' | 'CUSTOMER_SUPPORT' | 'null' | null, occurredAt: string, loadNumber: string | null, customerLoadInternalId: string | null, eventType: 'LOAD_DRAFT', data: LoadDraftPayload}; export type CreateApiLOADDRAFTArgs = {body: LoadDraftEvent}; export type CreateApiLOADDRAFTOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const loadDraftCreationResponse = z.object({loadNum: z.string(), message: z.string().optional(), referenceNumbers: z.object({shipmentNumber: z.string().optional(), customerReferenceNumber: z.string().optional(), customerLoadNumber: z.string().optional(), releaseNumber: z.string().optional(), bolNumber: z.string().optional(), poNumber: z.string().optional(), proNumber: z.string().optional(), driverNumber: z.string().optional(), tractorNumber: z.string().optional(), trailerNumber: z.string().optional(), others: z.array(z.object({type: z.string().optional(), value: z.string().optional()})).optional()}).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 }; /** * Load Draft * * POST /LOAD_DRAFT */ export const createApiLOADDRAFT = async (args: CreateApiLOADDRAFTArgs, options: CreateApiLOADDRAFTOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/LOAD_DRAFT${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(loadDraftCreationResponse, await res.json()) };