public static TimeTrackErrorViewModel UpdateClockInOutTime(int timeTrackId, string stampDate, string selectedUser, string clockInTime, string clockOutTime, string updatedBy)
{
using (var dbContext = new TimeTrackingEntities())
{
var startDate = DateTime.Parse(stampDate);
var endDate = startDate.AddDays(1);
var userTimeTrackRecordForStampedDate = dbContext.UserTimeTrackHistories
.Where(utsh => utsh.IsDeleted == false && utsh.UserName.ToLower().Equals(selectedUser.ToLower()) && (utsh.StampDate >= startDate && utsh.StampDate < endDate))
.ToList();
var userTimeTrackRecord = userTimeTrackRecordForStampedDate.FirstOrDefault(utsh => utsh.TimeTrackId == timeTrackId);
var indexOfSelectedRecord = userTimeTrackRecordForStampedDate.IndexOf(userTimeTrackRecord);
var errorMessage = new StringBuilder();
var errorCount = 0;
var sDate = new DateTime();
if (userTimeTrackRecord != null)
{
DateTime updatedClockInDateTime;
DateTime updatedClockOutDateTime;
if (DateTime.TryParse(clockInTime, out updatedClockInDateTime) && DateTime.TryParse(clockOutTime, out updatedClockOutDateTime))
{
var updatedClockInTime = updatedClockInDateTime.TimeOfDay;
var updatedClockOutTime = updatedClockOutDateTime.TimeOfDay;
// CHECK IF userTimeTrackRecord object has CloclOutTime set. IF NOT SET IT WITH PROVIDED ClockOutTime
if (string.IsNullOrEmpty(userTimeTrackRecord.ClockOutTime))
userTimeTrackRecord.ClockOutTime = String.Format("{0:t}", sDate.Add(updatedClockOutTime));
var previousTimeTrackClockOutTimeRecord = string.Empty;
var nextTimeTrackClockInTimeRecord = string.Empty;
if (indexOfSelectedRecord > 0 && (indexOfSelectedRecord - 1) >= 0)
previousTimeTrackClockOutTimeRecord =
userTimeTrackRecordForStampedDate[indexOfSelectedRecord - 1].ClockOutTime;
if ((indexOfSelectedRecord + 1) < userTimeTrackRecordForStampedDate.Count)
nextTimeTrackClockInTimeRecord =
userTimeTrackRecordForStampedDate[indexOfSelectedRecord + 1].ClockInTime;
if (updatedClockOutTime.CompareTo(updatedClockInTime) == -1)
{
errorMessage.Append("Updated Clock Out time can not be earlier than Updated Clock In time.");
errorCount += 1;
}
else if (!updatedClockInTime.Equals(DateTime.Parse(userTimeTrackRecord.ClockInTime).TimeOfDay))
{
if ((!string.IsNullOrEmpty(previousTimeTrackClockOutTimeRecord) &&
updatedClockInTime.CompareTo(
DateTime.Parse(previousTimeTrackClockOutTimeRecord).TimeOfDay) == -1) ||
(!string.IsNullOrEmpty(nextTimeTrackClockInTimeRecord) &&
updatedClockInTime.CompareTo(DateTime.Parse(nextTimeTrackClockInTimeRecord).TimeOfDay) ==
1))
{
// error clock in time cannot be earlier then previous checkout time and can not be later then next clockout time
errorMessage.Append(
"Updated Clock In time can not be earlier than previous clock out time or later than earlier clock in time");
errorCount += 1;
}
}
else if (!updatedClockOutTime.Equals(DateTime.Parse(userTimeTrackRecord.ClockOutTime).TimeOfDay))
{
// Clock Out time has changed
if ((!string.IsNullOrEmpty(previousTimeTrackClockOutTimeRecord) &&
updatedClockOutTime.CompareTo(
DateTime.Parse(previousTimeTrackClockOutTimeRecord).TimeOfDay) == -1) ||
(!string.IsNullOrEmpty(nextTimeTrackClockInTimeRecord) &&
updatedClockOutTime.CompareTo(
DateTime.Parse(nextTimeTrackClockInTimeRecord).TimeOfDay) == 1))
{
errorMessage.Append(
"Updated Clock Out time can not be earlier than previous clock out time or later than earlier clock in time");
errorCount += 1;
}
}
else if (
!updatedClockInTime.Equals(DateTime.Parse(userTimeTrackRecord.ClockInTime).TimeOfDay) &&
(!updatedClockOutTime.Equals(
DateTime.Parse(userTimeTrackRecord.ClockOutTime).TimeOfDay)))
{
// Both clock in and out time has been changed
if (
updatedClockInTime.CompareTo(
DateTime.Parse(previousTimeTrackClockOutTimeRecord).TimeOfDay) == -1 ||
updatedClockInTime.CompareTo(
DateTime.Parse(nextTimeTrackClockInTimeRecord).TimeOfDay) == 1)
{
errorMessage.Append(
"Updated Clock Out time can not be earlier than previous clock out time or later than earlier clock in time");
errorCount += 1;
}
if (
updatedClockOutTime.CompareTo(
DateTime.Parse(previousTimeTrackClockOutTimeRecord).TimeOfDay) == -1 ||
updatedClockOutTime.CompareTo(
DateTime.Parse(nextTimeTrackClockInTimeRecord).TimeOfDay) == 1)
{
errorMessage.Append(
"Updated Clock Out time can not be earlier than previous clock out time or later than earlier clock in time");
errorCount += 1;
}
}
if (errorCount == 0)
{
userTimeTrackRecord.ClockInTime = String.Format("{0:t}", sDate.Add(updatedClockInTime));
userTimeTrackRecord.ClockOutTime = String.Format("{0:t}", sDate.Add(updatedClockOutTime));
userTimeTrackRecord.UpdatedBy = updatedBy;
userTimeTrackRecord.UpdatedDate = WebHelpers.GetCurrentDateTimeByTimeZoneId(WebConfigurationManager.AppSettings["UserTimeZoneId"]);
dbContext.SaveChanges();
}
return new TimeTrackErrorViewModel(GetTimeTrackFromUserTimeTrackHistory(dbContext.UserTimeTrackHistories.FirstOrDefault(utsh => utsh.TimeTrackId == timeTrackId)), errorMessage.ToString());
}
return new TimeTrackErrorViewModel(GetTimeTrackFromUserTimeTrackHistory(dbContext.UserTimeTrackHistories.FirstOrDefault(utsh => utsh.TimeTrackId == timeTrackId)), "Please provide a valid Clock In/Clock Out time.");
}
return new TimeTrackErrorViewModel(GetTimeTrackFromUserTimeTrackHistory(dbContext.UserTimeTrackHistories.FirstOrDefault(utsh => utsh.TimeTrackId == timeTrackId)), string.Empty);
}
}