refactor: cleanup RFID authorization code
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16ResponseService.ts
index ae8b6287bd8757e01b134cfd2e50a67167bae383..a1fa0e43aa535ecbae64596431dbe058ef93966a 100644 (file)
@@ -10,6 +10,7 @@ import {
   type ChargingStation,
   addConfigurationKey,
   getConfigurationKey,
+  hasReservationExpired,
   resetConnectorStatus,
 } from '../../../charging-station';
 import { OCPPError } from '../../../exception';
@@ -639,18 +640,31 @@ export class OCPP16ResponseService extends OCPPResponseService {
           transactionConnectorId,
           requestPayload.meterStart,
         );
-      const reservedOnConnectorZero =
-        chargingStation.getConnectorStatus(0)?.status === OCPP16ChargePointStatus.Reserved;
-      if (
-        chargingStation.getConnectorStatus(transactionConnectorId)?.status ===
-          OCPP16ChargePointStatus.Reserved ||
-        reservedOnConnectorZero
-      ) {
+      if (requestPayload.reservationId) {
+        const reservation = chargingStation.getReservationBy(
+          'reservationId',
+          requestPayload.reservationId,
+        )!;
+        if (reservation.idTag !== requestPayload.idTag) {
+          logger.warn(
+            `${chargingStation.logPrefix()} Reserved transaction ${
+              payload.transactionId
+            } started with a different idTag ${requestPayload.idTag} than the reservation one ${
+              reservation.idTag
+            }`,
+          );
+        }
+        if (hasReservationExpired(reservation)) {
+          logger.warn(
+            `${chargingStation.logPrefix()} Reserved transaction ${
+              payload.transactionId
+            } started with expired reservation ${
+              requestPayload.reservationId
+            } (expiry date: ${reservation.expiryDate.toISOString()}))`,
+          );
+        }
         await chargingStation.removeReservation(
-          chargingStation.getReservationBy(
-            'connectorId',
-            reservedOnConnectorZero ? 0 : transactionConnectorId,
-          )!,
+          reservation,
           ReservationTerminationReason.TRANSACTION_STARTED,
         );
       }
@@ -690,8 +704,19 @@ export class OCPP16ResponseService extends OCPPResponseService {
       );
     } else {
       logger.warn(
-        `${chargingStation.logPrefix()} Starting transaction with id ${payload.transactionId.toString()} REJECTED with status '${payload
-          .idTagInfo?.status}', idTag '${requestPayload.idTag}'`,
+        `${chargingStation.logPrefix()} Starting transaction with id ${payload.transactionId.toString()} REJECTED on ${
+          chargingStation.stationInfo.chargingStationId
+        }#${transactionConnectorId.toString()} with status '${payload.idTagInfo?.status}', idTag '${
+          requestPayload.idTag
+        }'${
+          OCPP16ServiceUtils.hasReservation(
+            chargingStation,
+            transactionConnectorId,
+            requestPayload.idTag,
+          )
+            ? `, reservationId '${requestPayload.reservationId}'`
+            : ''
+        }`,
       );
       await this.resetConnectorOnStartTransactionError(chargingStation, transactionConnectorId);
     }
@@ -703,7 +728,6 @@ export class OCPP16ResponseService extends OCPPResponseService {
   ): Promise<void> {
     resetConnectorStatus(chargingStation.getConnectorStatus(connectorId)!);
     chargingStation.stopMeterValues(connectorId);
-    parentPort?.postMessage(buildUpdatedMessage(chargingStation));
     if (
       chargingStation.getConnectorStatus(connectorId)?.status !== OCPP16ChargePointStatus.Available
     ) {
@@ -713,6 +737,7 @@ export class OCPP16ResponseService extends OCPPResponseService {
         OCPP16ChargePointStatus.Available,
       );
     }
+    parentPort?.postMessage(buildUpdatedMessage(chargingStation));
   }
 
   private async handleResponseStopTransaction(