/// <summary> /// Возвращает все события пользователя за указанную дату. /// </summary> /// <param name="userCode">Код пользователя.</param> /// <param name="date">Дата.</param> /// <returns>Все события пользователя за указанную дату.</returns> public static MoscowUserEvents[] GetUserEvents(string userCode, DateTime date) { if (string.IsNullOrEmpty(userCode)) return new MoscowUserEvents[0]; List<MoscowUserEvents> coll = new List<MoscowUserEvents>(); try { DbProviderFactory dbFactory = DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["DBConnStr"].ProviderName); using (DbConnection connection = dbFactory.CreateConnection()) { connection.ConnectionString = ConfigurationManager.ConnectionStrings["DBConnStr"].ConnectionString; using (DbCommand command = dbFactory.CreateCommand()) { command.Connection = connection; command.CommandText = "SELECT DaySign, ComeTime, LeaveTime FROM [ET Work Table] WHERE (USICode = @prmUserCode) AND (RegDate >= @prmBeginDate) AND (RegDate <= @prmEndDate)"; DbParameter prmUserCode = dbFactory.CreateParameter(); prmUserCode.ParameterName = "@prmUserCode"; prmUserCode.Value = userCode; command.Parameters.Add(prmUserCode); DbParameter prmBeginDate = dbFactory.CreateParameter(); prmBeginDate.ParameterName = "@prmBeginDate"; prmBeginDate.DbType = DbType.DateTime; prmBeginDate.Value = date.Date; command.Parameters.Add(prmBeginDate); DbParameter prmEndDate = dbFactory.CreateParameter(); prmEndDate.ParameterName = "@prmEndDate"; prmEndDate.DbType = DbType.DateTime; prmEndDate.Value = date.Date.AddDays(1).AddSeconds(-1); command.Parameters.Add(prmEndDate); connection.Open(); using (DbDataReader reader = command.ExecuteReader()) { while( reader.Read() ) { MoscowUserEvents curEvent = new MoscowUserEvents(); curEvent.USLName = userCode; curEvent.Date = date.Date; curEvent.EventTypeCode = (short)reader["DaySign"]; if (reader["ComeTime"] != DBNull.Value) { curEvent.BeginTime = (DateTime)reader["ComeTime"]; } else { curEvent.BeginTime = null; } if (reader["LeaveTime"] != DBNull.Value) { curEvent.EndTime = (DateTime)reader["LeaveTime"]; } else { curEvent.EndTime = null; } coll.Add(curEvent); } } } } } catch (Exception ex) { Logger.Log.Error(String.Format(Resources.Strings.GerUserEventsError, userCode, date.ToShortDateString()), ex); } return coll.ToArray(); }
/// <summary> /// Возвращает статус пользователя. /// </summary> /// <param name="user">Пользователь.</param> /// <param name="userEvents">События пользователя.</param> /// <returns>Статус пользователя.</returns> private XMLSerializableUserStatusInfo GetUserStatus(MoscowUser user, MoscowUserEvents[] userEvents) { if (user == null) return null; if ((userEvents == null) || (userEvents.Length == 0)) { XMLSerializableUserStatusInfo absentInfo = new XMLSerializableUserStatusInfo(); absentInfo.UserID = -1; // Не определен общий идентификатор пользователя. absentInfo.USLName = user.USLName; absentInfo.UserName = user.FullName; absentInfo.EventType = WorkEventType.TimeOff; absentInfo.Status = GetEventName(absentInfo.EventType); return absentInfo; } XMLSerializableUserStatusInfo usInfo = new XMLSerializableUserStatusInfo(); usInfo.UserID = -1; // Не определен общий идентификатор пользователя. usInfo.USLName = user.USLName; usInfo.UserName = user.FullName; WorkEventType? eventType = null; DateTime begin = DateTime.MaxValue; DateTime now = DateTime.Now; TimeSpan workDuration = TimeSpan.Zero; bool userWorked = false; bool workEventClosed = true; foreach (MoscowUserEvents curEvent in userEvents) { switch (curEvent.EventType) { case MoscowEventType.BusinessTrip: eventType = WorkEventType.BusinessTrip; break; case MoscowEventType.Ill: eventType = WorkEventType.Ill; break; case MoscowEventType.TrustIll: eventType = WorkEventType.TrustIll; break; case MoscowEventType.Vacation: eventType = WorkEventType.Vacation; break; case MoscowEventType.OffDay: eventType = WorkEventType.Vacation; break; case MoscowEventType.TakenDay: eventType = WorkEventType.Vacation; break; case MoscowEventType.WorkDay: if (curEvent.BeginTime != null) { userWorked = true; if (begin > curEvent.BeginTime.Value) begin = curEvent.BeginTime.Value; if (curEvent.EndTime != null) { workDuration += (curEvent.EndTime.Value - curEvent.BeginTime.Value); } else { DateTime bt = new DateTime(now.Year, now.Month, now.Day, curEvent.BeginTime.Value.Hour, curEvent.BeginTime.Value.Minute, curEvent.BeginTime.Value.Second); workDuration += (now - bt); workEventClosed = false; } } break; } } if (eventType != null) { usInfo.EventType = eventType.Value; usInfo.Status = GetEventName(usInfo.EventType); } else { // Пользователь не работал. if (!userWorked) { usInfo.EventType = WorkEventType.TimeOff; usInfo.Status = GetEventName( WorkEventType.TimeOff ); } else { // Пользователь работал usInfo.BeginWork = begin; if (workEventClosed) { // Если рабочий интервал закрыт. usInfo.EventType = WorkEventType.TimeOff; usInfo.Status = GetEventName( WorkEventType.TimeOff ); } else { // Если рабочий интервал не закрыт. usInfo.EventType = WorkEventType.MainWork; usInfo.Status = GetEventName( WorkEventType.MainWork ); } // Расчет времени окончания работы. TimeSpan restTime = GetDayRate(user) - workDuration; if (restTime < TimeSpan.Zero) restTime = TimeSpan.Zero; usInfo.EndWork = now + restTime; } } return usInfo; }