]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
fix(ocpp2.0): reset transaction sequence number before new transaction per E01.FR.07
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 19 Mar 2026 17:41:30 +0000 (18:41 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 19 Mar 2026 17:41:30 +0000 (18:41 +0100)
src/charging-station/ocpp/2.0/OCPP20IncomingRequestService.ts
tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStartTransaction.test.ts

index 02fd5234c518c9580b1d83d3fae46852d9606803..ea0fabce78ce3bf02b94f8a8b1961877a76bb929 100644 (file)
@@ -2468,6 +2468,8 @@ export class OCPP20IncomingRequestService extends OCPPIncomingRequestService {
     const transactionId = generateUUID()
 
     try {
+      // E01.FR.07 + E01.FR.16 + E03.FR.01: ensure clean transaction state for new transaction
+      OCPP20ServiceUtils.resetTransactionSequenceNumber(chargingStation, connectorId)
       logger.debug(
         `${chargingStation.logPrefix()} ${moduleName}.handleRequestStartTransaction: Setting transaction state for connector ${connectorId.toString()}, transaction ID: ${transactionId}`
       )
index 4a65d95b5f2a96e528c61cf712e8863b3f3e06e8..60eb3de08c482079ae9a1db9f25d4c13f5579e45 100644 (file)
@@ -581,5 +581,40 @@ await describe('F01 & F02 - Remote Start Transaction', async () => {
 
       assert.strictEqual(transactionEventCallCount, 1)
     })
+
+    // E01.FR.07 + E01.FR.16 + E03.FR.01: Verify transaction sequence number reset
+    await it('should reset transaction sequence number before setting up new transaction state', async () => {
+      const connectorStatus = mockStation.getConnectorStatus(1)
+      if (connectorStatus == null) {
+        assert.fail('Expected connectorStatus to be defined')
+      }
+
+      // Set stale transaction state values
+      connectorStatus.transactionSeqNo = 5
+      connectorStatus.transactionEvseSent = true
+      connectorStatus.transactionIdTokenSent = true
+
+      const validRequest: OCPP20RequestStartTransactionRequest = {
+        evseId: 1,
+        idToken: {
+          idToken: 'RESET_SEQ_TOKEN',
+          type: OCPP20IdTokenEnumType.ISO14443,
+        },
+        remoteStartId: 1,
+      }
+
+      const response = await testableService.handleRequestStartTransaction(
+        mockStation,
+        validRequest
+      )
+
+      assert.strictEqual(response.status, RequestStartStopStatusEnumType.Accepted)
+      assert.notStrictEqual(response.transactionId, undefined)
+
+      // Verify transaction sequence number was reset
+      assert.strictEqual(connectorStatus.transactionSeqNo, undefined)
+      assert.strictEqual(connectorStatus.transactionEvseSent, undefined)
+      assert.strictEqual(connectorStatus.transactionIdTokenSent, undefined)
+    })
   })
 })