feat: support all recurrency types in charging profiles
authorJérôme Benoit <jerome.benoit@sap.com>
Mon, 24 Jul 2023 11:44:45 +0000 (13:44 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Mon, 24 Jul 2023 11:44:45 +0000 (13:44 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ChargingStationUtils.ts

index 749b876b2d647d5021073093f70a39d0f4b9becc..f6119f3da91580ae65aae62aa7abcb5651f54d6b 100644 (file)
@@ -4,7 +4,23 @@ import { basename, dirname, join } from 'node:path';
 import { fileURLToPath } from 'node:url';
 
 import chalk from 'chalk';
-import { addSeconds, isAfter, isTomorrow, isYesterday } from 'date-fns';
+import {
+  addDays,
+  addMonths,
+  addSeconds,
+  addWeeks,
+  endOfMonth,
+  endOfWeek,
+  isAfter,
+  isBefore,
+  isTomorrow,
+  isYesterday,
+  startOfMonth,
+  startOfWeek,
+  subDays,
+  subMonths,
+  subWeeks,
+} from 'date-fns';
 
 import type { ChargingStation } from './ChargingStation';
 import { BaseError } from '../exception';
@@ -679,19 +695,30 @@ const getLimitFromChargingProfiles = (
       );
       chargingSchedule.startSchedule = convertToDate(chargingSchedule.startSchedule)!;
     }
-    // Adjust the daily recurring schedule to today
-    if (
-      chargingProfile.chargingProfileKind === ChargingProfileKindType.RECURRING &&
-      chargingProfile.recurrencyKind === RecurrencyKindType.DAILY
-    ) {
-      if (isYesterday(chargingSchedule.startSchedule)) {
-        chargingSchedule.startSchedule.setFullYear(
-          currentDate.getFullYear(),
-          currentDate.getMonth(),
-          currentDate.getDate(),
-        );
-      } else if (isTomorrow(chargingSchedule.startSchedule)) {
-        chargingSchedule.startSchedule.setDate(currentDate.getDate() - 1);
+    // Adjust recurring schedule
+    if (chargingProfile.chargingProfileKind === ChargingProfileKindType.RECURRING) {
+      switch (chargingProfile.recurrencyKind) {
+        case RecurrencyKindType.DAILY:
+          if (isYesterday(chargingSchedule.startSchedule)) {
+            addDays(chargingSchedule.startSchedule, 1);
+          } else if (isTomorrow(chargingSchedule.startSchedule)) {
+            subDays(chargingSchedule.startSchedule, 1);
+          }
+          break;
+        case RecurrencyKindType.WEEKLY:
+          if (isBefore(chargingSchedule.startSchedule, startOfWeek(currentDate))) {
+            addWeeks(chargingSchedule.startSchedule, 1);
+          } else if (isAfter(chargingSchedule.startSchedule, endOfWeek(currentDate))) {
+            subWeeks(chargingSchedule.startSchedule, 1);
+          }
+          break;
+        case RecurrencyKindType.MONTHLY:
+          if (isBefore(chargingSchedule.startSchedule, startOfMonth(currentDate))) {
+            addMonths(chargingSchedule.startSchedule, 1);
+          } else if (isAfter(chargingSchedule.startSchedule, endOfMonth(currentDate))) {
+            subMonths(chargingSchedule.startSchedule, 1);
+          }
+          break;
       }
     }
     // Check if the charging profile is active