import { amiBillingReadyStatuses, anodeTypes, connectionStates, costDetailItemKinds, enrollmentStatuses, phaseCodes, pnodeTypes, powerOfTenMultipliers, serviceCategoryKinds, unitsOfMeasurement } from './lookups.js' import type { GreenButtonCostAdditionalDetail, GreenButtonFunctionBlock, GreenButtonSummaryMeasurement, GreenButtonTariffRider, GreenButtonUsagePoint } from './types/objectTypes.js' import { ensureArray } from './utilities.js' export function updateSummaryMeasurement( measurement?: GreenButtonSummaryMeasurement ): void { if (measurement === undefined) { return } if (measurement.powerOfTenMultiplier !== undefined) { measurement.powerOfTenMultiplier_value = powerOfTenMultipliers[measurement.powerOfTenMultiplier] } if (measurement.uom !== undefined) { measurement.uom_value = unitsOfMeasurement[measurement.uom] } } export function updateTariffRider(tariffRider: GreenButtonTariffRider): void { tariffRider.enrollmentStatus_value = enrollmentStatuses[tariffRider.enrollmentStatus] } export function updateUsagePoint(usagePoint: GreenButtonUsagePoint): void { if (usagePoint.ServiceCategory !== undefined) { usagePoint.ServiceCategory.kind_value = serviceCategoryKinds[usagePoint.ServiceCategory.kind] } if ( usagePoint.ServiceDeliveryPoint?.tariffRiderRefs?.tariffRiderRef !== undefined ) { ensureArray( usagePoint.ServiceDeliveryPoint.tariffRiderRefs, 'tariffRiderRef' ) for (const tariffRider of usagePoint.ServiceDeliveryPoint.tariffRiderRefs .tariffRiderRef) { updateTariffRider(tariffRider) } } if (usagePoint.amiBillingReady !== undefined) { usagePoint.amiBillingReady_value = amiBillingReadyStatuses[usagePoint.amiBillingReady] } if (usagePoint.connectionState !== undefined) { usagePoint.connectionState_value = connectionStates[usagePoint.connectionState] } updateSummaryMeasurement(usagePoint.estimatedLoad) updateSummaryMeasurement(usagePoint.nominalServiceVoltage) if (usagePoint.phaseCode !== undefined) { usagePoint.phaseCode_value = phaseCodes[usagePoint.phaseCode] } updateSummaryMeasurement(usagePoint.ratedCurrent) updateSummaryMeasurement(usagePoint.ratedPower) if (usagePoint.pnodeRefs !== undefined) { ensureArray(usagePoint.pnodeRefs, 'pnodeRef') for (const pnode of usagePoint.pnodeRefs.pnodeRef) { pnode.apnodeType_value = pnodeTypes[pnode.apnodeType] } } if (usagePoint.aggregateNodeRefs !== undefined) { ensureArray(usagePoint.aggregateNodeRefs, 'aggregateNodeRef') for (const anode of usagePoint.aggregateNodeRefs.aggregateNodeRef) { anode.anodeType_value = anodeTypes[anode.anodeType] } } } export function updateCostAdditionalDetail( additionalDetail: GreenButtonCostAdditionalDetail ): void { additionalDetail.itemKind_value = costDetailItemKinds[additionalDetail.itemKind] updateSummaryMeasurement(additionalDetail.measurement) updateSummaryMeasurement(additionalDetail.unitCost) updateSummaryMeasurement(additionalDetail.itemPeriod) } export function parseAuthorizationScope( scope: string ): GreenButtonFunctionBlock { const scopeString = scope + ';' const functionBlockPieces = scopeString .slice(3, scopeString.indexOf(';')) .split('_') const functionBlocks: number[] = [] for (const functionBlockPiece of functionBlockPieces) { functionBlocks.push(Number.parseInt(functionBlockPiece, 10)) } return { functionBlocks, common: functionBlocks.includes(1), downloadMyData: functionBlocks.includes(2), connectMyData: functionBlocks.includes(3), intervalMetering: functionBlocks.includes(4), intervalElectricityMetering: functionBlocks.includes(5), demandElectricityMetering: functionBlocks.includes(6), netMetering: functionBlocks.includes(7), forwardAndReverseMetering: functionBlocks.includes(8), registerValues: functionBlocks.includes(9), gas: functionBlocks.includes(10), water: functionBlocks.includes(11), costOfIntervalData: functionBlocks.includes(12), securityAndPrivacyClasses: functionBlocks.includes(13), usageSummary: functionBlocks.includes(15), usageSummaryWithCost: functionBlocks.includes(16), powerQualitySummary: functionBlocks.includes(17), multipleUsagePoints: functionBlocks.includes(18), partialUpdateData: functionBlocks.includes(19), usageSummaryWithDemandsAndPreviousDayAttributes: functionBlocks.includes(27), usageSummaryCostsForCurrentBillingPeriod: functionBlocks.includes(28), temperatureIntervalMetering: functionBlocks.includes(29), commonUserExperience: functionBlocks.includes(30), authorizationAndAuthentication: functionBlocks.includes(31), resourceLevelRest: functionBlocks.includes(32), managementRestServices: functionBlocks.includes(33), sftpForBulk: functionBlocks.includes(34), restForBulk: functionBlocks.includes(35), thirdPartyDynamicRegistration: functionBlocks.includes(36), queryParameters: functionBlocks.includes(37), onDemandRequests: functionBlocks.includes(38), pushModel: functionBlocks.includes(39), offlineAuthorization: functionBlocks.includes(40), manageApplicationInformationResource: functionBlocks.includes(41), manageAuthorizationResource: functionBlocks.includes(44), retailCustomerManagementRest: functionBlocks.includes(49), retailCustomerResourceLevelRest: functionBlocks.includes(50), retailCustomerCommon: functionBlocks.includes(51), retailCustomerDownloadMyData: functionBlocks.includes(52), retailCustomerConnectMyData: functionBlocks.includes(53), retailCustomerBasicInformation: functionBlocks.includes(54), retailCustomerDemographicInformation: functionBlocks.includes(55), retailCustomerBillingInformation: functionBlocks.includes(56), retailCustomerAccountAgreementInformation: functionBlocks.includes(57), retailCustomerServiceLocationInformation: functionBlocks.includes(58), retailCustomerServiceSupplierInformation: functionBlocks.includes(59), retailCustomerMeterInformation: functionBlocks.includes(60), retailCustomerEndDeviceInformation: functionBlocks.includes(61), retailCustomerProgramDateIdMappingsInformation: functionBlocks.includes(62), retailCustomerSecurityAndPrivacy: functionBlocks.includes(64), retailCustomerAuthorizationAndAuthentication: functionBlocks.includes(65), sftpForRetailCustomerBulk: functionBlocks.includes(66), restForRetailCustomerBulk: functionBlocks.includes(67), retailCustomerQueryParameters: functionBlocks.includes(68), retailCustomerPushModel: functionBlocks.includes(69), retailCustomerOfflineAuthorization: functionBlocks.includes(70) } satisfies GreenButtonFunctionBlock }