refactor: remove unneeded condition at changing availability
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16ResponseService.ts
index 02c03140e341654ddb8a2c4949cebb1d6d59fa39..ae8b6287bd8757e01b134cfd2e50a67167bae383 100644 (file)
@@ -3,16 +3,17 @@
 import { parentPort } from 'node:worker_threads';
 
 import type { JSONSchemaType } from 'ajv';
+import { secondsToMilliseconds } from 'date-fns';
 
 import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
 import {
   type ChargingStation,
-  ChargingStationConfigurationUtils,
+  addConfigurationKey,
+  getConfigurationKey,
   resetConnectorStatus,
 } from '../../../charging-station';
 import { OCPPError } from '../../../exception';
 import {
-  type ChangeAvailabilityResponse,
   type ChangeConfigurationResponse,
   type ClearChargingProfileResponse,
   ErrorType,
@@ -25,6 +26,7 @@ import {
   type OCPP16AuthorizeRequest,
   type OCPP16AuthorizeResponse,
   type OCPP16BootNotificationResponse,
+  type OCPP16ChangeAvailabilityResponse,
   OCPP16ChargePointStatus,
   type OCPP16DataTransferResponse,
   type OCPP16DiagnosticsStatusNotificationResponse,
@@ -46,6 +48,7 @@ import {
   type OCPP16UpdateFirmwareResponse,
   OCPPVersion,
   RegistrationStatusEnumType,
+  ReservationTerminationReason,
   type ResponseHandler,
   type SetChargingProfileResponse,
   type UnlockConnectorResponse,
@@ -206,7 +209,7 @@ export class OCPP16ResponseService extends OCPPResponseService {
       ],
       [
         OCPP16IncomingRequestCommand.CHANGE_AVAILABILITY,
-        OCPP16ServiceUtils.parseJsonSchemaFile<ChangeAvailabilityResponse>(
+        OCPP16ServiceUtils.parseJsonSchemaFile<OCPP16ChangeAvailabilityResponse>(
           'assets/json-schemas/ocpp/1.6/ChangeAvailabilityResponse.json',
           moduleName,
           'constructor',
@@ -407,14 +410,14 @@ export class OCPP16ResponseService extends OCPPResponseService {
     payload: OCPP16BootNotificationResponse,
   ): void {
     if (payload.status === RegistrationStatusEnumType.ACCEPTED) {
-      ChargingStationConfigurationUtils.addConfigurationKey(
+      addConfigurationKey(
         chargingStation,
         OCPP16StandardParametersKey.HeartbeatInterval,
         payload.interval.toString(),
         {},
         { overwrite: true, save: true },
       );
-      ChargingStationConfigurationUtils.addConfigurationKey(
+      addConfigurationKey(
         chargingStation,
         OCPP16StandardParametersKey.HeartBeatInterval,
         payload.interval.toString(),
@@ -468,8 +471,11 @@ export class OCPP16ResponseService extends OCPPResponseService {
     }
     const authorizeConnectorIdDefined = !isNullOrUndefined(authorizeConnectorId);
     if (payload.idTagInfo.status === OCPP16AuthorizationStatus.ACCEPTED) {
-      authorizeConnectorIdDefined &&
-        (chargingStation.getConnectorStatus(authorizeConnectorId!)!.idTagAuthorized = true);
+      if (authorizeConnectorIdDefined) {
+        // chargingStation.getConnectorStatus(authorizeConnectorId!)!.authorizeIdTag =
+        //   requestPayload.idTag;
+        chargingStation.getConnectorStatus(authorizeConnectorId!)!.idTagAuthorized = true;
+      }
       logger.debug(
         `${chargingStation.logPrefix()} idTag '${requestPayload.idTag}' accepted${
           authorizeConnectorIdDefined ? ` on connector id ${authorizeConnectorId}` : ''
@@ -508,7 +514,7 @@ export class OCPP16ResponseService extends OCPPResponseService {
         true &&
       chargingStation.getAuthorizeRemoteTxRequests() === true &&
       chargingStation.getLocalAuthListEnabled() === true &&
-      chargingStation.hasIdTags() &&
+      chargingStation.hasIdTags() === true &&
       chargingStation.getConnectorStatus(transactionConnectorId)?.idTagLocalAuthorized === false
     ) {
       logger.error(
@@ -523,7 +529,7 @@ export class OCPP16ResponseService extends OCPPResponseService {
       chargingStation.getConnectorStatus(transactionConnectorId)?.transactionRemoteStarted ===
         true &&
       chargingStation.getAuthorizeRemoteTxRequests() === true &&
-      chargingStation.getMustAuthorizeAtRemoteStart() === true &&
+      chargingStation.getRemoteAuthorization() === true &&
       chargingStation.getConnectorStatus(transactionConnectorId)?.idTagLocalAuthorized === false &&
       chargingStation.getConnectorStatus(transactionConnectorId)?.idTagAuthorized === false
     ) {
@@ -607,7 +613,7 @@ export class OCPP16ResponseService extends OCPPResponseService {
       );
       return;
     }
-    if (!Number.isInteger(payload.transactionId)) {
+    if (!Number.isSafeInteger(payload.transactionId)) {
       logger.warn(
         `${chargingStation.logPrefix()} Trying to start a transaction on connector id ${transactionConnectorId.toString()} with a non integer transaction id ${
           payload.transactionId
@@ -618,6 +624,8 @@ export class OCPP16ResponseService extends OCPPResponseService {
 
     if (payload.idTagInfo?.status === OCPP16AuthorizationStatus.ACCEPTED) {
       chargingStation.getConnectorStatus(transactionConnectorId)!.transactionStarted = true;
+      chargingStation.getConnectorStatus(transactionConnectorId)!.transactionStart =
+        requestPayload.timestamp;
       chargingStation.getConnectorStatus(transactionConnectorId)!.transactionId =
         payload.transactionId;
       chargingStation.getConnectorStatus(transactionConnectorId)!.transactionIdTag =
@@ -631,6 +639,21 @@ export class OCPP16ResponseService extends OCPPResponseService {
           transactionConnectorId,
           requestPayload.meterStart,
         );
+      const reservedOnConnectorZero =
+        chargingStation.getConnectorStatus(0)?.status === OCPP16ChargePointStatus.Reserved;
+      if (
+        chargingStation.getConnectorStatus(transactionConnectorId)?.status ===
+          OCPP16ChargePointStatus.Reserved ||
+        reservedOnConnectorZero
+      ) {
+        await chargingStation.removeReservation(
+          chargingStation.getReservationBy(
+            'connectorId',
+            reservedOnConnectorZero ? 0 : transactionConnectorId,
+          )!,
+          ReservationTerminationReason.TRANSACTION_STARTED,
+        );
+      }
       chargingStation.getBeginEndMeterValues() &&
         (await chargingStation.ocppRequestService.requestHandler<
           OCPP16MeterValuesRequest,
@@ -655,15 +678,14 @@ export class OCPP16ResponseService extends OCPPResponseService {
       if (chargingStation.stationInfo.powerSharedByConnectors) {
         ++chargingStation.powerDivider;
       }
-      const configuredMeterValueSampleInterval =
-        ChargingStationConfigurationUtils.getConfigurationKey(
-          chargingStation,
-          OCPP16StandardParametersKey.MeterValueSampleInterval,
-        );
+      const configuredMeterValueSampleInterval = getConfigurationKey(
+        chargingStation,
+        OCPP16StandardParametersKey.MeterValueSampleInterval,
+      );
       chargingStation.startMeterValues(
         transactionConnectorId,
         configuredMeterValueSampleInterval
-          ? convertToInt(configuredMeterValueSampleInterval.value) * 1000
+          ? secondsToMilliseconds(convertToInt(configuredMeterValueSampleInterval.value))
           : Constants.DEFAULT_METER_VALUES_INTERVAL,
       );
     } else {