/// <summary> /// Возвращает все события пользователя за указанную дату. /// </summary> /// <param name="user">Пользователь.</param> /// <param name="date">Дата.</param> /// <returns>Все события пользователя за указанную дату.</returns> public static MoscowUserEvents[] GetUserEvents(MoscowUser user, DateTime date) { if (user == null) return new MoscowUserEvents[0]; return GetUserEvents(user.USLName, date); }
/// <summary> /// Возвращает дневную норму пользователя за сегодня. /// </summary> /// <param name="user">Пользователь.</param> /// <returns>Дневная норма пользователя за сегодня.</returns> private TimeSpan GetDayRate(MoscowUser user) { if (user == null) return TimeSpan.Zero; CalendarItem cItem = CalendarItem.GetCalendarItem(DateTime.Today); TimeSpan output; if (cItem == null) { output = new TimeSpan(8, 30, 0); } else { output = cItem.WorkTime; } double seconds = output.TotalSeconds; seconds = seconds * user.PartTimeFactor; output = TimeSpan.FromSeconds(seconds); return output; }
/// <summary> /// Возвращает массив постоянных пользователей. /// </summary> /// <returns>Массив постоянных пользователей.</returns> public static MoscowUser[] GetLongServiceUsers() { List<MoscowUser> coll = new List<MoscowUser>(); 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 Name_ld, FirstName, LastName, PartTimeFactor FROM Collaborators WHERE (DateDischarged IS NULL)"; connection.Open(); using( DbDataReader reader = command.ExecuteReader() ) { while( reader.Read() ) { MoscowUser user = new MoscowUser(); user.USLName = (string)reader["Name_ld"]; user.FirstName = (string)reader["FirstName"]; user.LastName = (string)reader["LastName"]; user.PartTimeFactor = (float)reader["PartTimeFactor"]; coll.Add(user); } } } } } catch (Exception ex) { Logger.Log.Error(Resources.Strings.GetUsersListError, 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; }