+ },
+ );
+ }
+
+ public getReservationOnConnectorId0Enabled(): boolean {
+ return convertToBoolean(
+ getConfigurationKey(this, StandardParametersKey.ReserveConnectorZeroSupported)!.value,
+ );
+ }
+
+ public async addReservation(reservation: Reservation): Promise<void> {
+ const [exists, reservationFound] = this.doesReservationExists(reservation);
+ if (exists) {
+ await this.removeReservation(
+ reservationFound!,
+ ReservationTerminationReason.REPLACE_EXISTING,
+ );
+ }
+ this.getConnectorStatus(reservation.connectorId)!.reservation = reservation;
+ await OCPPServiceUtils.sendAndSetConnectorStatus(
+ this,
+ reservation.connectorId,
+ ConnectorStatusEnum.Reserved,
+ undefined,
+ { send: reservation.connectorId !== 0 },
+ );
+ }
+
+ public async removeReservation(
+ reservation: Reservation,
+ reason?: ReservationTerminationReason,
+ ): Promise<void> {
+ const connector = this.getConnectorStatus(reservation.connectorId)!;
+ switch (reason) {
+ case ReservationTerminationReason.CONNECTOR_STATE_CHANGED:
+ delete connector.reservation;
+ break;
+ case ReservationTerminationReason.TRANSACTION_STARTED:
+ delete connector.reservation;
+ break;
+ case ReservationTerminationReason.RESERVATION_CANCELED:
+ case ReservationTerminationReason.REPLACE_EXISTING:
+ case ReservationTerminationReason.EXPIRED:
+ await OCPPServiceUtils.sendAndSetConnectorStatus(
+ this,
+ reservation.connectorId,
+ ConnectorStatusEnum.Available,
+ undefined,
+ { send: reservation.connectorId !== 0 },
+ );
+ delete connector.reservation;
+ break;
+ default:
+ break;
+ }
+ }
+
+ public getReservationBy(
+ filterKey: ReservationFilterKey,
+ value: number | string,
+ ): Reservation | undefined {
+ if (this.hasEvses) {
+ for (const evseStatus of this.evses.values()) {
+ for (const connectorStatus of evseStatus.connectors.values()) {
+ if (connectorStatus?.reservation?.[filterKey as keyof Reservation] === value) {
+ return connectorStatus.reservation;
+ }
+ }
+ }
+ } else {
+ for (const connectorStatus of this.connectors.values()) {
+ if (connectorStatus?.reservation?.[filterKey as keyof Reservation] === value) {
+ return connectorStatus.reservation;
+ }