/// <summary> /// Копирующий конструктор. /// </summary> /// <param name="usInfo">Информация о статусе пользователя.</param> public XMLSerializableUserStatusInfo( UserStatusInfo usInfo ) { if( usInfo == null ) throw new ArgumentNullException( "usInfo" ); UserID = usInfo.UserID; UserName = usInfo.UserName; USLName = usInfo.USLName; Status = usInfo.Status; BeginWork = usInfo.BeginWork; EndWork = usInfo.EndWork; EventType = (WorkEventType) usInfo.EventType.ID; }
/// <summary> /// Возвращает список информаций о статусах пользователей за указанную дату. /// </summary> /// <param name="date">Дата для получения информации о пользователях.</param> /// <returns>Список информаций о статусах пользователей за указанную дату.</returns> public static UserStatusInfo[] GetStatusesList( DateTime date ) { List<UserStatusInfo> usersList = new List<UserStatusInfo>(); Person[] activeUsers = GetEmployeeList(); if( ( activeUsers == null ) || ( activeUsers.Length == 0 ) ) return usersList.ToArray(); foreach( Person user in activeUsers ) { // Отсеять московских служащих. if( user.EmployeesUlterSYSMoscow ) continue; // Получить последнее событие пользователя. WorkEvent lastEvent = WorkEvent.GetCurrentEventOfDate( user.ID.Value, date, true ); // Для получения времени рабочего периода. WorkEvent workEvent = null; // Получить статус пользователя. UptimeEventType status; if( lastEvent == null ) { // Нет событий за сегодня. Человек не приходил. status = UptimeEventType.GetEventType( (int) WorkEventType.TimeOff ); } else { switch( lastEvent.EventType ) { case WorkEventType.BusinessTrip: case WorkEventType.Ill: case WorkEventType.TrustIll: case WorkEventType.Vacation: status = UptimeEventType.GetEventType( lastEvent.EventTypeID ); break; case WorkEventType.MainWork: workEvent = lastEvent; if( lastEvent.IsOpen ) { status = UptimeEventType.GetEventType( (int) WorkEventType.MainWork ); } else { status = UptimeEventType.GetEventType( (int) WorkEventType.TimeOff ); } break; default: workEvent = WorkEvent.GetMainWorkEvent( user.ID.Value, date ); if( lastEvent.IsOpen ) { status = UptimeEventType.GetEventType( lastEvent.EventTypeID ); } else { if( workEvent == null ) { status = UptimeEventType.GetEventType( (int) WorkEventType.TimeOff ); } else { if( workEvent.IsOpen ) { status = UptimeEventType.GetEventType( (int) WorkEventType.MainWork ); } else { status = UptimeEventType.GetEventType( (int) WorkEventType.TimeOff ); } } } break; } } // Создать информацию о пользователе. String loginName = string.Empty; IList<string> dnNames = user.DomainNames; if( dnNames != null && dnNames.Count > 0 ) { loginName = dnNames[ 0 ]; int startIndex = loginName.LastIndexOf( "\\" ); if( !string.IsNullOrEmpty( loginName ) && ( startIndex > 0 ) ) loginName = loginName.Substring( startIndex + 1, 3 ); } UserStatusInfo info; if( workEvent == null ) info = new UserStatusInfo( user.ID.Value, user.FullName, loginName, status ); else { UserTimeCalculator timesCalc = new UserTimeCalculator( user.ID.Value ); // Время до окончания дня. TimeSpan todayRest = timesCalc.GetRateWithLunch( DateTime.Today ); // Окончание работы (расчётное или фактическое). /* if (workEvent.BeginTime == workEvent.EndTime) workEvent.EndTime = (todayRest.TotalMilliseconds > 0) ? workEvent.BeginTime.Add(todayRest) : DateTime.Now;*/ /*if( todayRest.TotalMilliseconds > 0 ) workEvent.EndTime = DateTime.Now.Add( todayRest ); else workEvent.EndTime = DateTime.Now;*/ info = new UserStatusInfo( user.ID.Value, user.FullName, loginName, status, workEvent.BeginTime, workEvent.EndTime ); } usersList.Add( info ); } return usersList.ToArray(); }