I have tried to tackle this question as follows:
The program Calculates the next Working day, taking into account: - weekends (Saturdays and Sundays) - holidays happening in the middle of the week param name="OrderDate" the date on which the order is placed param name="workingDays" the number of workingdays to process the order returns the date on which the Order is Requested to Ship
public static DateTime getNextWorkingDay(DateTime OrderDate, int workingDays)
{
DateTime Holiday = new DateTime();
List<DateTime> SelectedHolidays = new List<DateTime>();
List<HolidayList> HolidayList = new List<HolidayList>();
int calculatedWorkingDays=0;
if (workingDays <= 5)
calculatedWorkingDays = workingDays;
else if (workingDays % 6 == 0)
{
calculatedWorkingDays = workingDays + workingDays / 6 * 2;
}
else
{
calculatedWorkingDays = workingDays + workingDays / 7 * 2;
}
HolidayList = "Read the list from Json file";
foreach (var holiday in HolidayList)
{
string year = DateTime.Today.Year.ToString();
Holiday = DateTime.Parse(holiday.MonthAndDayValue + "-" + year);
if (Holiday.Day == 1 && Holiday.Month == 1)
{
year = (DateTime.Today.Year + 1).ToString();
Holiday = DateTime.Parse(holiday.MonthAndDayValue + "-" + year);
}
SelectedHolidays.Add(Holiday.Date);
if (Holiday.DayOfWeek == DayOfWeek.Sunday || Holiday.DayOfWeek == DayOfWeek.Saturday)
{
//do nothing
}
else
{
if (Holiday.Date == OrderDate.Date)
OrderDate.AddDays(1);
if (Holiday.Date > OrderDate.Date)
{
int K = (int)(Holiday.Date - OrderDate.Date).TotalDays;
if (K <= calculatedWorkingDays)
{
calculatedWorkingDays++;
}
}
}
}
if (OrderDate.DayOfWeek == DayOfWeek.Sunday)
{
calculatedWorkingDays++;
}
else if (OrderDate.DayOfWeek == DayOfWeek.Saturday || OrderDate.DayOfWeek == DayOfWeek.Friday)
{
calculatedWorkingDays += 2;
}
// this is required date
DateTime date_OrderRequestedToShip = OrderDate.AddDays(calculatedWorkingDays);
//check if the last date fall on a non working day(holiday or weekend)
calculatedWorkingDays = 0;
foreach (DateTime d in SelectedHolidays)
if (d.Date == date_OrderRequestedToShip.Date)
calculatedWorkingDays++;
date_OrderRequestedToShip = date_OrderRequestedToShip.AddDays(calculatedWorkingDays);
if (date_OrderRequestedToShip.DayOfWeek == DayOfWeek.Sunday)
{
calculatedWorkingDays = 1;
}
else if (date_OrderRequestedToShip.DayOfWeek == DayOfWeek.Saturday)
{
calculatedWorkingDays = 2;
}
return date_OrderRequestedToShip.AddDays(calculatedWorkingDays);
}
The holiday list contains the month and day (MM/dd) part only with out the year part:
{
"holidayName": "Memorial Day",
"MonthAndDayValue": "05-30"
}
Can anyone help to tune up or suggest changes to make the code more efficient?