]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
fix(ocpp2.0): inject offline:true in sendTransactionEvent offline path per E04.FR.03
authorJérôme Benoit <jerome.benoit@sap.com>
Thu, 19 Mar 2026 17:29:44 +0000 (18:29 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Thu, 19 Mar 2026 17:29:44 +0000 (18:29 +0100)
src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts
tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-TransactionEvent.test.ts

index 91d57c8522e5efeca7fda5c2cb956a5c135be34f..7f1ef3ecd4723aba481f1faca5e3bac0c9afd362 100644 (file)
@@ -475,13 +475,14 @@ export class OCPP20ServiceUtils extends OCPPServiceUtils {
 
       // Offline: build and queue pre-built payload (sent as-is via rawPayload on reconnect)
       if (!chargingStation.isWebSocketConnectionOpened()) {
+        // E04.FR.03: offline flag SHALL be TRUE for any TransactionEventRequest that occurred while offline
         const transactionEventRequest = buildTransactionEvent(
           chargingStation,
           eventType,
           triggerReason,
           connectorId,
           transactionId,
-          options
+          { ...options, offline: true }
         )
         logger.info(
           `${chargingStation.logPrefix()} ${moduleName}.sendTransactionEvent: Station offline, queueing TransactionEvent with seqNo=${transactionEventRequest.seqNo.toString()}`
index 2db7c17a21c703352cd971dbc548a92227f5c185..1ec7853262535ef70c81b9c980c3a3ff8063100a 100644 (file)
@@ -1625,6 +1625,27 @@ await describe('OCPP20 TransactionEvent ServiceUtils', async () => {
         )
         assert.ok(connector.transactionEventQueue[0].timestamp.getTime() <= afterQueue.getTime())
       })
+
+      await it('should set offline flag to true when queueing transaction event while station is offline', async () => {
+        const connectorId = 1
+        const transactionId = generateUUID()
+
+        setOnline(false)
+        OCPP20ServiceUtils.resetTransactionSequenceNumber(mockStation, connectorId)
+
+        await OCPP20ServiceUtils.sendTransactionEvent(
+          mockStation,
+          OCPP20TransactionEventEnumType.Started,
+          OCPP20TriggerReasonEnumType.Authorized,
+          connectorId,
+          transactionId
+        )
+
+        const connector = mockStation.getConnectorStatus(connectorId)
+        assert.ok(connector?.transactionEventQueue != null)
+        assert.strictEqual(connector.transactionEventQueue.length, 1)
+        assert.strictEqual(connector.transactionEventQueue[0].request.offline, true)
+      })
     })
 
     await describe('Queue draining when coming online', async () => {