]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor(ocpp20): prefix OperationalStatusEnumType with OCPP20
authorJérôme Benoit <jerome.benoit@sap.com>
Mon, 16 Mar 2026 12:11:41 +0000 (13:11 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Mon, 16 Mar 2026 12:11:41 +0000 (13:11 +0100)
Last unprefixed OCPP 2.0 type participating in a common union.
OperationalStatusEnumType → OCPP20OperationalStatusEnumType
matching the OCPP16AvailabilityType counterpart in the
AvailabilityType union.

src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts
src/types/index.ts
src/types/ocpp/2.0/Common.ts
src/types/ocpp/2.0/Requests.ts
src/types/ocpp/Requests.ts
tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-ChangeAvailability.test.ts
tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RemoteStartAuth.test.ts

index 5362441c7d3fac8cf3f1809e8ae63bd46208bd82..5bc9b06184d17b3562e99b694b260cded7aa049b 100644 (file)
@@ -80,6 +80,7 @@ import {
   type OCPP20NotifyCustomerInformationResponse,
   type OCPP20NotifyReportRequest,
   type OCPP20NotifyReportResponse,
+  OCPP20OperationalStatusEnumType,
   OCPP20ReadingContextEnumType,
   OCPP20RequestCommand,
   type OCPP20RequestStartTransactionRequest,
@@ -104,7 +105,6 @@ import {
   type OCPP20UpdateFirmwareRequest,
   type OCPP20UpdateFirmwareResponse,
   OCPPVersion,
-  OperationalStatusEnumType,
   ReasonCodeEnumType,
   RegistrationStatusEnumType,
   ReportBaseEnumType,
@@ -1037,7 +1037,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     chargingStation: ChargingStation,
     evseId: number,
     connectorId: number,
-    operationalStatus: OperationalStatusEnumType,
+    operationalStatus: OCPP20OperationalStatusEnumType,
     newConnectorStatus: OCPP20ConnectorStatusEnumType
   ): OCPP20ChangeAvailabilityResponse {
     if (!chargingStation.evses.has(evseId)) {
@@ -1062,7 +1062,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     }
 
     const resolvedStatus =
-      operationalStatus === OperationalStatusEnumType.Operative
+      operationalStatus === OCPP20OperationalStatusEnumType.Operative
         ? this.getRestoredConnectorStatus(chargingStation, connectorId)
         : newConnectorStatus
 
@@ -1087,7 +1087,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
 
   private handleCsLevelInoperative (
     chargingStation: ChargingStation,
-    operationalStatus: OperationalStatusEnumType,
+    operationalStatus: OCPP20OperationalStatusEnumType,
     newConnectorStatus: OCPP20ConnectorStatusEnumType
   ): OCPP20ChangeAvailabilityResponse | undefined {
     let hasActiveTransactions = false
@@ -1126,7 +1126,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
   private handleEvseChangeAvailability (
     chargingStation: ChargingStation,
     evseId: number,
-    operationalStatus: OperationalStatusEnumType,
+    operationalStatus: OCPP20OperationalStatusEnumType,
     newConnectorStatus: OCPP20ConnectorStatusEnumType
   ): OCPP20ChangeAvailabilityResponse {
     if (!chargingStation.evses.has(evseId)) {
@@ -1145,7 +1145,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     const evseStatus = chargingStation.getEvseStatus(evseId)
     if (
       evseStatus != null &&
-      operationalStatus === OperationalStatusEnumType.Inoperative &&
+      operationalStatus === OCPP20OperationalStatusEnumType.Inoperative &&
       this.hasEvseActiveTransactions(evseStatus)
     ) {
       logger.info(
@@ -1159,7 +1159,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     if (evseStatus != null) {
       evseStatus.availability = operationalStatus
     }
-    if (operationalStatus === OperationalStatusEnumType.Operative) {
+    if (operationalStatus === OCPP20OperationalStatusEnumType.Operative) {
       this.sendRestoredEvseStatusNotifications(chargingStation, evseId)
     } else {
       this.sendEvseStatusNotifications(chargingStation, evseId, newConnectorStatus)
@@ -1334,13 +1334,13 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
       `${chargingStation.logPrefix()} ${moduleName}.handleRequestChangeAvailability: Received ChangeAvailability request with operationalStatus=${operationalStatus}${evseIdLabel}`
     )
 
-    if (operationalStatus === OperationalStatusEnumType.Inoperative) {
+    if (operationalStatus === OCPP20OperationalStatusEnumType.Inoperative) {
       // G03.FR.07: Save current connector statuses before setting Inoperative
       this.savePreInoperativeStatuses(chargingStation, evse?.id)
     }
 
     const newConnectorStatus =
-      operationalStatus === OperationalStatusEnumType.Inoperative
+      operationalStatus === OCPP20OperationalStatusEnumType.Inoperative
         ? OCPP20ConnectorStatusEnumType.Unavailable
         : OCPP20ConnectorStatusEnumType.Available
 
@@ -1365,7 +1365,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     }
 
     // CS-level change (no evse or evse.id === 0)
-    if (operationalStatus === OperationalStatusEnumType.Inoperative) {
+    if (operationalStatus === OCPP20OperationalStatusEnumType.Inoperative) {
       const result = this.handleCsLevelInoperative(
         chargingStation,
         operationalStatus,
@@ -1382,7 +1382,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
         evseStatus.availability = operationalStatus
       }
     }
-    if (operationalStatus === OperationalStatusEnumType.Operative) {
+    if (operationalStatus === OCPP20OperationalStatusEnumType.Operative) {
       this.sendRestoredAllConnectorsStatusNotifications(chargingStation)
     } else {
       this.sendAllConnectorsStatusNotifications(chargingStation, newConnectorStatus)
@@ -3082,7 +3082,7 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
         continue
       }
       if (
-        evseStatus.availability !== OperationalStatusEnumType.Inoperative &&
+        evseStatus.availability !== OCPP20OperationalStatusEnumType.Inoperative &&
         !this.hasEvseActiveTransactions(evseStatus)
       ) {
         return evseId
index 8cf719fca89ccfc7c0ea19760b8b2652b4859c69..f684b1771e050164c30aef4efca643272ef3aca5 100644 (file)
@@ -169,9 +169,9 @@ export {
   type NetworkConnectionProfileType,
   OCPP20ComponentName,
   OCPP20FirmwareStatusEnumType,
+  OCPP20OperationalStatusEnumType,
   OCPP20UnitEnumType,
   type OCSPRequestDataType,
-  OperationalStatusEnumType,
   ReasonCodeEnumType,
   ReportBaseEnumType,
   ResetEnumType,
index cb2b72b875f3903a7cd0567a59e8d48807dfb6c5..21467ce8f8239433d2012ffe3055358c8b0111bc 100644 (file)
@@ -235,6 +235,11 @@ export enum OCPP20FirmwareStatusEnumType {
   SignatureVerified = 'SignatureVerified',
 }
 
+export enum OCPP20OperationalStatusEnumType {
+  Inoperative = 'Inoperative',
+  Operative = 'Operative',
+}
+
 export enum OCPP20UnitEnumType {
   AMP = 'A',
   ARBITRARY_STRENGTH_UNIT = 'ASU',
@@ -295,11 +300,6 @@ export enum OCPPVersionEnumType {
   OCPP20 = 'OCPP20',
 }
 
-export enum OperationalStatusEnumType {
-  Inoperative = 'Inoperative',
-  Operative = 'Operative',
-}
-
 export enum ReasonCodeEnumType {
   CSNotAccepted = 'CSNotAccepted',
   DuplicateProfile = 'DuplicateProfile',
index b22a17b747c957481a0dab83db4b1358012eb5e8..e78790adc99481e0f2ef7f033b85c615989539fc 100644 (file)
@@ -16,8 +16,8 @@ import type {
   MessageTriggerEnumType,
   NetworkConnectionProfileType,
   OCPP20FirmwareStatusEnumType,
+  OCPP20OperationalStatusEnumType,
   OCSPRequestDataType,
-  OperationalStatusEnumType,
   ReportBaseEnumType,
   ResetEnumType,
   UploadLogStatusEnumType,
@@ -88,7 +88,7 @@ export interface OCPP20CertificateSignedRequest extends JsonObject {
 export interface OCPP20ChangeAvailabilityRequest extends JsonObject {
   customData?: CustomDataType
   evse?: OCPP20EVSEType
-  operationalStatus: OperationalStatusEnumType
+  operationalStatus: OCPP20OperationalStatusEnumType
 }
 
 export type OCPP20ClearCacheRequest = EmptyObject
index f7df86a50416f6dfec8fd38812a96ce224c7f79b..9ed571177f09631d01b7c7f0a3921308c85a5ba6 100644 (file)
@@ -21,7 +21,7 @@ import {
   type OCPP16ReserveNowRequest,
   type OCPP16StatusNotificationRequest,
 } from './1.6/Requests.js'
-import { OCPP20FirmwareStatusEnumType, OperationalStatusEnumType } from './2.0/Common.js'
+import { OCPP20FirmwareStatusEnumType, OCPP20OperationalStatusEnumType } from './2.0/Common.js'
 import {
   type OCPP20BootNotificationRequest,
   type OCPP20FirmwareStatusNotificationRequest,
@@ -96,10 +96,10 @@ export type StatusNotificationRequest =
 
 export const AvailabilityType = {
   ...OCPP16AvailabilityType,
-  ...OperationalStatusEnumType,
+  ...OCPP20OperationalStatusEnumType,
 } as const
 // eslint-disable-next-line @typescript-eslint/no-redeclare
-export type AvailabilityType = OCPP16AvailabilityType | OperationalStatusEnumType
+export type AvailabilityType = OCPP16AvailabilityType | OCPP20OperationalStatusEnumType
 
 export type CancelReservationRequest = OCPP16CancelReservationRequest
 
index 5b3262f3391beab08acae595b75159f1a3d82c97..9408511bc34ab972280b44d21a1b6b26f7a7897c 100644 (file)
@@ -12,8 +12,8 @@ import { createTestableIncomingRequestService } from '../../../../src/charging-s
 import { OCPP20IncomingRequestService } from '../../../../src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.js'
 import {
   ChangeAvailabilityStatusEnumType,
+  OCPP20OperationalStatusEnumType,
   OCPPVersion,
-  OperationalStatusEnumType,
 } from '../../../../src/types/index.js'
 import { Constants } from '../../../../src/utils/index.js'
 import {
@@ -55,18 +55,18 @@ await describe('G03 - ChangeAvailability', async () => {
   await it('should accept EVSE-level Inoperative when no ongoing transaction', () => {
     const response = testableService.handleRequestChangeAvailability(station, {
       evse: { id: 1 },
-      operationalStatus: OperationalStatusEnumType.Inoperative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Inoperative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted)
     const evseStatus = station.getEvseStatus(1)
-    assert.strictEqual(evseStatus?.availability, OperationalStatusEnumType.Inoperative)
+    assert.strictEqual(evseStatus?.availability, OCPP20OperationalStatusEnumType.Inoperative)
   })
 
   // FR: G03.FR.02
   await it('should accept CS-level Inoperative when no ongoing transaction', () => {
     const response = testableService.handleRequestChangeAvailability(station, {
-      operationalStatus: OperationalStatusEnumType.Inoperative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Inoperative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted)
@@ -74,7 +74,7 @@ await describe('G03 - ChangeAvailability', async () => {
       if (evseId > 0) {
         assert.strictEqual(
           evseStatus.availability,
-          OperationalStatusEnumType.Inoperative,
+          OCPP20OperationalStatusEnumType.Inoperative,
           `EVSE ${String(evseId)} should be Inoperative`
         )
       }
@@ -89,7 +89,7 @@ await describe('G03 - ChangeAvailability', async () => {
 
     const response = testableService.handleRequestChangeAvailability(station, {
       evse: { id: 1 },
-      operationalStatus: OperationalStatusEnumType.Inoperative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Inoperative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Scheduled)
@@ -102,7 +102,7 @@ await describe('G03 - ChangeAvailability', async () => {
     })
 
     const response = testableService.handleRequestChangeAvailability(station, {
-      operationalStatus: OperationalStatusEnumType.Inoperative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Inoperative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Scheduled)
@@ -111,7 +111,7 @@ await describe('G03 - ChangeAvailability', async () => {
   await it('should reject when EVSE does not exist', () => {
     const response = testableService.handleRequestChangeAvailability(station, {
       evse: { id: 999 },
-      operationalStatus: OperationalStatusEnumType.Inoperative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Inoperative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Rejected)
@@ -122,43 +122,43 @@ await describe('G03 - ChangeAvailability', async () => {
   await it('should accept when already in requested state (idempotent)', () => {
     const evseStatus = station.getEvseStatus(1)
     if (evseStatus != null) {
-      evseStatus.availability = OperationalStatusEnumType.Operative
+      evseStatus.availability = OCPP20OperationalStatusEnumType.Operative
     }
 
     const response = testableService.handleRequestChangeAvailability(station, {
       evse: { id: 1 },
-      operationalStatus: OperationalStatusEnumType.Operative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Operative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted)
-    assert.strictEqual(evseStatus?.availability, OperationalStatusEnumType.Operative)
+    assert.strictEqual(evseStatus?.availability, OCPP20OperationalStatusEnumType.Operative)
   })
 
   await it('should set Operative after Inoperative, connectors return to Available', () => {
     const evseStatus = station.getEvseStatus(1)
     if (evseStatus != null) {
-      evseStatus.availability = OperationalStatusEnumType.Inoperative
+      evseStatus.availability = OCPP20OperationalStatusEnumType.Inoperative
     }
 
     const response = testableService.handleRequestChangeAvailability(station, {
       evse: { id: 1 },
-      operationalStatus: OperationalStatusEnumType.Operative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Operative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted)
-    assert.strictEqual(evseStatus?.availability, OperationalStatusEnumType.Operative)
+    assert.strictEqual(evseStatus?.availability, OCPP20OperationalStatusEnumType.Operative)
   })
 
   await it('should accept CS-level change with evse.id === 0', () => {
     const response = testableService.handleRequestChangeAvailability(station, {
       evse: { id: 0 },
-      operationalStatus: OperationalStatusEnumType.Inoperative,
+      operationalStatus: OCPP20OperationalStatusEnumType.Inoperative,
     })
 
     assert.strictEqual(response.status, ChangeAvailabilityStatusEnumType.Accepted)
     for (const [evseId, evseStatus] of station.evses) {
       if (evseId > 0) {
-        assert.strictEqual(evseStatus.availability, OperationalStatusEnumType.Inoperative)
+        assert.strictEqual(evseStatus.availability, OCPP20OperationalStatusEnumType.Inoperative)
       }
     }
   })
index 867696205d6142df31a24a779a70c4d06c7e0577..257fde13fe526a739dd0b3ae89d38ffe1524675d 100644 (file)
@@ -15,7 +15,7 @@ import {
   type OCPP20RequestStartTransactionRequest,
   RequestStartStopStatusEnumType,
 } from '../../../../src/types/index.js'
-import { OperationalStatusEnumType } from '../../../../src/types/ocpp/2.0/Common.js'
+import { OCPP20OperationalStatusEnumType } from '../../../../src/types/ocpp/2.0/Common.js'
 import {
   OCPP20ChargingProfileKindEnumType,
   OCPP20ChargingProfilePurposeEnumType,
@@ -41,7 +41,7 @@ await describe('G03 - Remote Start Pre-Authorization', async () => {
         ],
       ]),
       getConnectorStatus: (_connectorId: number): ConnectorStatus => ({
-        availability: OperationalStatusEnumType.Operative,
+        availability: OCPP20OperationalStatusEnumType.Operative,
         MeterValues: [],
         status: ConnectorStatusEnum.Available,
         transactionId: undefined,
@@ -240,7 +240,7 @@ await describe('G03 - Remote Start Pre-Authorization', async () => {
       assert(mockStation != null)
       // Given: Connector with active transaction
       mockStation.getConnectorStatus = (): ConnectorStatus => ({
-        availability: OperationalStatusEnumType.Operative,
+        availability: OCPP20OperationalStatusEnumType.Operative,
         MeterValues: [],
         status: ConnectorStatusEnum.Occupied,
         transactionId: 'existing-tx-123',
@@ -266,7 +266,7 @@ await describe('G03 - Remote Start Pre-Authorization', async () => {
       const existingTransactionId = 'existing-tx-456'
       const existingTokenTag = 'EXISTING_TOKEN_002'
       mockStation.getConnectorStatus = (): ConnectorStatus => ({
-        availability: OperationalStatusEnumType.Operative,
+        availability: OCPP20OperationalStatusEnumType.Operative,
         MeterValues: [],
         status: ConnectorStatusEnum.Occupied,
         transactionId: existingTransactionId,