public int GetActivity(DateTime when) { WorkdayModel day = WorkdayModel.Load(HoursUtil.GetConnection(), Id, when); if (day == null) { if (when.DayOfWeek == DayOfWeek.Sunday || when.DayOfWeek == DayOfWeek.Saturday) { return(WEEKEND); } return(NOT_WORKING); } else { if (day.IsHoliday) { return(HOLIDAY); } if (day.IsPaidTimeOff) { return(PAID_TIME_OFF); } // the load function uses DateTime.MaxValue if the entry hasn't been created yet. // that is, in the database, if there's a value for StartIn, but the others are all // null, they will be represented as DateTime.MaxValue. if (when < day.StartIn) { return(NOT_WORKING); } // if there's a punch out time, it doesn't matter whether lunch occurred. if (when >= day.EndOut) { return(DONE); } if (when == day.StartIn || when < day.LunchOut) { return(MORNING); } if (when == day.LunchOut || when < day.LunchIn) { return(LUNCH); } if (when == day.LunchIn || when < day.EndOut) { return(AFTERNOON); } return(NOT_WORKING); } }
public void Punch(SQLiteConnection conn, DateTime when, String activity) { WorkdayModel day = WorkdayModel.Load(HoursUtil.GetConnection(), Id, when); if (day == null) { day = new WorkdayModel(); day.Day = when.Date; day.User = this; if (activity != PUNCH_START_IN) { string message = string.Format("Record for new day {0} should begin with starting work, not '{1}'", when.ToShortDateString(), activity); throw new ArgumentException(message); } } switch (activity) { case PUNCH_START_IN: day.StartIn = when; break; case PUNCH_LUNCH_OUT: day.LunchOut = when; break; case PUNCH_LUNCH_IN: day.LunchIn = when; break; case PUNCH_END_OUT: day.EndOut = when; break; default: throw new ArgumentException("don't recognize punch activity: " + activity); } day.Save(conn); }