import {z} from 'zod' export type CreateApiApiV1ChargePointsChargePointIdTransferTeamsTeamIdArgs = {chargePointId: number, teamId: number}; export type CreateApiApiV1ChargePointsChargePointIdTransferTeamsTeamIdOptions = {baseUrl?: string | undefined, BearerAccessToken?: string | undefined, fetch?: typeof fetch | undefined}; export const operator = z.object({id: z.number().int().optional(), name: z.string(), identifier: z.string(), partnerId: z.number().int().nullable().optional(), vatNumber: z.string().nullable().optional()}); export const chargePointState = z.enum(["available", "busy", "busy-blocked", "busy-charging", "busy-non-charging", "busy-non-released", "busy-reserved", "busy-scheduled", "error", "disconnected", "passive", "maintenance", "other"]); export const coordinates = z.object({latitude: z.number().optional(), longitude: z.number().optional()}); export const partialAddress = z.object({address1: z.string().nullable().optional(), address2: z.string().nullable().optional(), address3: z.string().nullable().optional(), zip: z.string().nullable().optional(), city: z.string().nullable().optional(), province: z.string().nullable().optional(), countrySubdivisionCode: z.string().nullable().optional(), country: z.string().nullable().optional(), countryAreaId: z.number().int().nullable().optional()}); export const location = z.object({coordinates: coordinates.nullable().optional(), addressLabel: z.string().nullable().optional(), address: partialAddress.nullable().optional()}); export const chargePointConnector = z.object({id: z.number().int().optional(), identifier: z.string(), name: z.string()}); export const chargePointDeeplinks = z.object({app: z.string(), web: z.string()}); export const chargePointIntegrationType = z.enum(["oicp", "ocpi", "ocpp", "other"]); export const simCard = z.object({imsi: z.string().nullable().optional(), iccid: z.string().nullable().optional()}); export const chargePointOcppStatus = z.enum(["available", "online", "not-connected", "error", "offline", "occupied", "preparing", "paused-ev", "paused-evse", "charging", "suspended-evse", "suspended-ev", "finishing", "reserved", "unavailable", "faulted", "idle", "ev-connected", "unknown"]); export const chargePointOcpp = z.object({status: chargePointOcppStatus.nullable().optional(), updatedAt: z.string().nullable().optional(), errorCode: z.string().nullable().optional(), info: z.string().nullable().optional(), vendorErrorCode: z.string().nullable().optional(), vendorId: z.string().nullable().optional()}); export const chargePointProtocolData = z.object({ocpp: chargePointOcpp.nullable().optional()}); export const hdvParkingSpot = z.object({height: z.number().int().nullable().optional(), width: z.number().int().nullable().optional(), length: z.number().int().nullable().optional(), weight: z.number().int().nullable().optional(), angledOrientation: z.boolean().nullable().optional(), driveThroughOrientation: z.boolean().nullable().optional(), parallelOrientation: z.boolean().nullable().optional(), perpendicularOrientation: z.boolean().nullable().optional(), turningRadius: z.number().nullable().optional(), cpPosition: z.string().nullable().optional()}); export const chargePointMetadata = z.object({busCompatible: z.boolean().nullable().optional(), motorcycleCompatible: z.boolean().nullable().optional(), lorryCompatible: z.boolean().nullable().optional(), lorryWithDangerousGoodsCompatible: z.boolean().nullable().optional(), lorryWithTrailerCompatible: z.boolean().nullable().optional(), personalVehicleCompatible: z.boolean().nullable().optional(), personalVehicleWithTrailerCompatible: z.boolean().nullable().optional(), rigidLoryCompatible: z.boolean().nullable().optional(), vanCompatible: z.boolean().nullable().optional(), vehicleWithDisabilityPermitCompatible: z.boolean().nullable().optional(), additionalParkingFeesPolicy: z.boolean().nullable().optional(), buildingTenantsOnlyPolicy: z.boolean().nullable().optional(), customersOnlyPolicy: z.boolean().nullable().optional(), disabilityPermitPolicy: z.boolean().nullable().optional(), evOnlyPolicy: z.boolean().nullable().optional(), employeesOnlyPolicy: z.boolean().nullable().optional(), overnightParkingPolicy: z.boolean().nullable().optional(), parkingOnlyWhileChargingPolicy: z.boolean().nullable().optional(), reservationPolicy: z.boolean().nullable().optional(), taxisOnlyPolicy: z.boolean().nullable().optional(), floorLevel: z.string().nullable().optional(), cableLength: z.number().nullable().optional(), behindBarrierPolicy: z.boolean().nullable().optional(), hdvParkingSpot: hdvParkingSpot.nullable().optional(), dangerousGoodsAllowed: z.boolean().nullable().optional(), rigidVehiclesAllowed: z.boolean().nullable().optional(), twoWheeledStation: z.boolean().nullable().optional(), vehicleAccessibility: z.string().nullable().optional(), heightRestriction: z.boolean().nullable().optional(), reservationRequired: z.boolean().nullable().optional(), overnightParkingAllowed: z.boolean().nullable().optional(), accessConditions: z.string().nullable().optional(), barrier: z.boolean().nullable().optional(), chargingWhenClosed: z.boolean().nullable().optional(), trailerPullThrough: z.boolean().nullable().optional()}); export const autoStartStatus = z.enum(["on", "off", "not-available"]); export const chargePoint = z.object({id: z.number().int(), teamId: z.number().int(), partnerExternalId: z.string().nullable().optional(), partnerCustomPayload: z.record(z.string(), z.unknown()).nullable().optional(), siteId: z.number().int().nullable().optional(), operator: operator.nullable().optional(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string().nullable().optional(), activeAt: z.string().nullable().optional(), serialNumber: z.string().nullable().optional(), name: z.string().nullable().optional(), visibility: z.enum(["private", "public"]), maxKW: z.number().nullable().optional(), maxKw: z.number().nullable().optional(), type: z.enum(["ac", "dc"]).nullable().optional(), note: z.string().nullable().optional(), operatorNote: z.string().nullable().optional(), state: chargePointState.nullable().optional(), location: location, connectors: z.array(chargePointConnector), deeplinks: chargePointDeeplinks, lastMeterReadingKwh: z.number().nullable().optional(), meterId: z.string().nullable().optional(), cablePluggedIn: z.boolean(), chargePointModelId: z.number().int().nullable().optional(), brandName: z.string().nullable().optional(), modelName: z.string().nullable().optional(), firmwareVersion: z.string().nullable().optional(), integrationType: chargePointIntegrationType.nullable().optional(), evseId: z.string(), priceGroupId: z.number().int().nullable().optional(), costGroupId: z.number().int().nullable().optional(), roamingPriceGroupId: z.number().int().nullable().optional(), sponsoredPriceGroupId: z.number().int().nullable().optional(), scheduleId: z.number().int().nullable().optional(), isActive: z.boolean(), reservable: z.boolean(), reservationTime: z.number().int().nullable().optional(), simCard: simCard.nullable().optional(), roaming: z.boolean(), lastConnectedAt: z.string().nullable().optional(), disconnectedAt: z.string().nullable().optional(), occupied: z.boolean().nullable().optional(), protocolData: chargePointProtocolData, metadata: chargePointMetadata.nullable().optional(), showOnMap: z.boolean(), smartChargeSetting: z.enum(["off", "optional", "forced", "forced-setting"]).nullable().optional(), autoStart: autoStartStatus.nullable().optional(), userId: z.number().int().nullable().optional(), autoRegisterRfid: z.boolean().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 }; /** * Transfer a charge point to another team * * POST /api/v1/charge-points/{chargePointId}/transfer/teams/{teamId} */ export const createApiApiV1ChargePointsChargePointIdTransferTeamsTeamId = async (args: CreateApiApiV1ChargePointsChargePointIdTransferTeamsTeamIdArgs, options?: CreateApiApiV1ChargePointsChargePointIdTransferTeamsTeamIdOptions) => { const {baseUrl = "https://partner-api.monta.com", fetch: fetchFn = fetch, BearerAccessToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (BearerAccessToken !== undefined) headers.set('authorization', `Bearer ${BearerAccessToken}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/charge-points/${encodeURIComponent(String(args.chargePointId))}/transfer/teams/${encodeURIComponent(String(args.teamId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(chargePoint, await res.json()) };