Exemplo n.º 1
0
    /// <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();
    }
Exemplo n.º 2
0
    /// <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;
    }