Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Function Call
- DueBusinessDate(Max(0, Value(txtCycleTime.Text)), 8, 17, Now())DueBusinessDate(Max(0, Value(txtCycleTime.Text)), 8, 17, Now())
- //UDFS
- //Choose the correct business-hours start based on a reference datetime
- NextBusinessStart(
- Reference: DateTime,
- StartHour: Number,
- EndHour: Number
- ): DateTime =
- With(
- {
- weekdayMon1: Weekday(Reference, StartOfWeek.Monday),
- today: DateValue(Reference),
- timeNow: Time(Hour(Reference), Minute(Reference), Second(Reference))
- },
- Switch(
- true,
- // Weekend -> next Monday 08:00
- weekdayMon1 >= 6,
- DateAdd(today, 8 - weekdayMon1, TimeUnit.Days) + Time(StartHour, 0, 0),
- // After hours -> next business day 08:00
- timeNow >= Time(EndHour, 0, 0),
- With(
- { d1: DateAdd(today, 1, TimeUnit.Days) },
- If(
- Weekday(d1, StartOfWeek.Monday) >= 6,
- DateAdd(d1, 8 - Weekday(d1, StartOfWeek.Monday), TimeUnit.Days),
- d1
- ) + Time(StartHour, 0, 0)
- ),
- // Before hours -> today 08:00
- timeNow < Time(StartHour, 0, 0),
- today + Time(StartHour, 0, 0),
- // Otherwise -> now
- Reference
- )
- );
- //Add business minutes starting from a given start datetime (Mon–Fri, StartHour–EndHour)
- AddBusinessMinutes(
- StartDateTime: DateTime,
- MinutesToAdd: Number,
- StartHour: Number,
- EndHour: Number
- ): DateTime =
- With(
- {
- DayMins: (EndHour - StartHour) * 60,
- MinsLeftToday:
- Max(
- 0,
- DateDiff(
- StartDateTime,
- DateValue(StartDateTime) + Time(EndHour, 0, 0),
- TimeUnit.Minutes
- )
- )
- },
- If(
- MinutesToAdd <= MinsLeftToday,
- DateAdd(StartDateTime, MinutesToAdd, TimeUnit.Minutes),
- With(
- {
- FullDays: RoundDown(MinutesToAdd - MinsLeftToday / DayMins, 0),
- Leftover: Mod(MinutesToAdd - MinsLeftToday, DayMins)
- },
- With(
- {
- FirstFull:
- With(
- { d0: DateAdd(DateValue(StartDateTime), 1, TimeUnit.Days) },
- If(
- Weekday(d0, StartOfWeek.Monday) >= 6,
- DateAdd(d0, 8 - Weekday(d0, StartOfWeek.Monday), TimeUnit.Days),
- d0
- )
- )
- },
- With(
- {
- TargetDay:
- DateAdd(
- FirstFull,
- FullDays
- + RoundDown(
- (Weekday(FirstFull, StartOfWeek.Monday) - 1 + FullDays) / 5,
- 0
- ) * 2,
- TimeUnit.Days
- )
- },
- If(
- Leftover = 0,
- TargetDay + Time(EndHour, 0, 0),
- DateAdd(TargetDay + Time(StartHour, 0, 0), Leftover, TimeUnit.Minutes)
- )
- )
- )
- )
- )
- );
- // Function
- DueBusinessDate(
- PlannedHours: Number,
- StartHour: Number,
- EndHour: Number,
- Reference: DateTime
- ): DateTime =
- With(
- {
- StartTime: NextBusinessStart(Reference, StartHour, EndHour),
- PlannedMins: Round(PlannedHours * 60, 0)
- },
- AddBusinessMinutes(StartTime, PlannedMins, StartHour, EndHour)
- );//Choose the correct business-hours start based on a reference datetime
- NextBusinessStart(
- Reference: DateTime,
- StartHour: Number,
- EndHour: Number
- ): DateTime =
- With(
- {
- weekdayMon1: Weekday(Reference, StartOfWeek.Monday),
- today: DateValue(Reference),
- timeNow: Time(Hour(Reference), Minute(Reference), Second(Reference))
- },
- Switch(
- true,
- // Weekend -> next Monday 08:00
- weekdayMon1 >= 6,
- DateAdd(today, 8 - weekdayMon1, TimeUnit.Days) + Time(StartHour, 0, 0),
- // After hours -> next business day 08:00
- timeNow >= Time(EndHour, 0, 0),
- With(
- { d1: DateAdd(today, 1, TimeUnit.Days) },
- If(
- Weekday(d1, StartOfWeek.Monday) >= 6,
- DateAdd(d1, 8 - Weekday(d1, StartOfWeek.Monday), TimeUnit.Days),
- d1
- ) + Time(StartHour, 0, 0)
- ),
- // Before hours -> today 08:00
- timeNow < Time(StartHour, 0, 0),
- today + Time(StartHour, 0, 0),
- // Otherwise -> now
- Reference
- )
- );
- //Add business minutes starting from a given start datetime (Mon–Fri, StartHour–EndHour)
- AddBusinessMinutes(
- StartDateTime: DateTime,
- MinutesToAdd: Number,
- StartHour: Number,
- EndHour: Number
- ): DateTime =
- With(
- {
- DayMins: (EndHour - StartHour) * 60,
- MinsLeftToday:
- Max(
- 0,
- DateDiff(
- StartDateTime,
- DateValue(StartDateTime) + Time(EndHour, 0, 0),
- TimeUnit.Minutes
- )
- )
- },
- If(
- MinutesToAdd <= MinsLeftToday,
- DateAdd(StartDateTime, MinutesToAdd, TimeUnit.Minutes),
- With(
- {
- FullDays: RoundDown(MinutesToAdd - MinsLeftToday / DayMins, 0),
- Leftover: Mod(MinutesToAdd - MinsLeftToday, DayMins)
- },
- With(
- {
- FirstFull:
- With(
- { d0: DateAdd(DateValue(StartDateTime), 1, TimeUnit.Days) },
- If(
- Weekday(d0, StartOfWeek.Monday) >= 6,
- DateAdd(d0, 8 - Weekday(d0, StartOfWeek.Monday), TimeUnit.Days),
- d0
- )
- )
- },
- With(
- {
- TargetDay:
- DateAdd(
- FirstFull,
- FullDays
- + RoundDown(
- (Weekday(FirstFull, StartOfWeek.Monday) - 1 + FullDays) / 5,
- 0
- ) * 2,
- TimeUnit.Days
- )
- },
- If(
- Leftover = 0,
- TargetDay + Time(EndHour, 0, 0),
- DateAdd(TargetDay + Time(StartHour, 0, 0), Leftover, TimeUnit.Minutes)
- )
- )
- )
- )
- )
- );
- // Function
- DueBusinessDate(
- PlannedHours: Number,
- StartHour: Number,
- EndHour: Number,
- Reference: DateTime
- ): DateTime =
- With(
- {
- StartTime: NextBusinessStart(Reference, StartHour, EndHour),
- PlannedMins: Round(PlannedHours * 60, 0)
- },
- AddBusinessMinutes(StartTime, PlannedMins, StartHour, EndHour)
- );
Advertisement
Add Comment
Please, Sign In to add comment