cloneObject,
convertToDate,
convertToInt,
+ isArraySorted,
isEmptyObject,
isEmptyString,
isNotEmptyArray,
// Check if the charging profile is active
if (
isValidDate(chargingSchedule.startSchedule) &&
- isAfter(addSeconds(chargingSchedule.startSchedule!, chargingSchedule.duration!), currentDate)
+ isWithinInterval(currentDate, {
+ start: chargingSchedule.startSchedule!,
+ end: addSeconds(chargingSchedule.startSchedule!, chargingSchedule.duration!),
+ })
) {
if (isNotEmptyArray(chargingSchedule.chargingSchedulePeriod)) {
- // Handling of only one schedule period
+ const chargingSchedulePeriodCompareFn = (
+ a: ChargingSchedulePeriod,
+ b: ChargingSchedulePeriod,
+ ) => a.startPeriod - b.startPeriod;
if (
- chargingSchedule.chargingSchedulePeriod.length === 1 &&
- chargingSchedule.chargingSchedulePeriod[0].startPeriod === 0
+ isArraySorted<ChargingSchedulePeriod>(
+ chargingSchedule.chargingSchedulePeriod,
+ chargingSchedulePeriodCompareFn,
+ ) === false
) {
+ logger.warn(
+ `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} schedule periods are not sorted by start period`,
+ );
+ chargingSchedule.chargingSchedulePeriod.sort(chargingSchedulePeriodCompareFn);
+ }
+ // Check if the first schedule period start period is equal to 0
+ if (chargingSchedule.chargingSchedulePeriod[0].startPeriod !== 0) {
+ logger.error(
+ `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} first schedule period start period ${chargingSchedule.chargingSchedulePeriod[0].startPeriod} is not equal to 0`,
+ );
+ continue;
+ }
+ // Handling of only one schedule period
+ if (chargingSchedule.chargingSchedulePeriod.length === 1) {
const result: ChargingProfilesLimit = {
limit: chargingSchedule.chargingSchedulePeriod[0].limit,
matchingChargingProfile: chargingProfile,
logger.debug(debugLogMsg, result);
return result;
}
- chargingSchedule.chargingSchedulePeriod.sort((a, b) => a.startPeriod - b.startPeriod);
let lastButOneSchedule: ChargingSchedulePeriod | undefined;
// Search for the right schedule period
- for (const schedulePeriod of chargingSchedule.chargingSchedulePeriod) {
+ for (const [index, schedulePeriod] of chargingSchedule.chargingSchedulePeriod.entries()) {
// Find the right schedule period
if (
isAfter(
}
// Keep it
lastButOneSchedule = schedulePeriod;
- // Handle the last schedule period
+ // Handle the last schedule period within the charging profile duration
if (
- schedulePeriod.startPeriod ===
- chargingSchedule.chargingSchedulePeriod[
- chargingSchedule.chargingSchedulePeriod.length - 1
- ].startPeriod
+ index === chargingSchedule.chargingSchedulePeriod.length - 1 ||
+ (index < chargingSchedule.chargingSchedulePeriod.length - 1 &&
+ chargingSchedule.duration! >
+ differenceInSeconds(
+ addSeconds(
+ chargingSchedule.startSchedule!,
+ chargingSchedule.chargingSchedulePeriod[index + 1].startPeriod,
+ ),
+ chargingSchedule.startSchedule!,
+ ))
) {
const result: ChargingProfilesLimit = {
limit: lastButOneSchedule.limit,
) {
chargingSchedule.startSchedule = addDays(
chargingSchedule.startSchedule!,
- differenceInDays(chargingSchedule.startSchedule!, recurringInterval.end),
+ differenceInDays(currentDate, recurringInterval.start),
);
recurringInterval = {
start: chargingSchedule.startSchedule,
) {
chargingSchedule.startSchedule = addWeeks(
chargingSchedule.startSchedule!,
- differenceInWeeks(chargingSchedule.startSchedule!, recurringInterval.end),
+ differenceInWeeks(currentDate, recurringInterval.start),
);
recurringInterval = {
start: chargingSchedule.startSchedule,
interval.start,
)}`,
);
+ chargingProfile.chargingSchedule.duration = differenceInSeconds(interval.end, interval.start);
}
};