Beispiel #1
0
        /// <summary>
        /// Возвращает строку из емейлов, считанных из первой колонки результата выполнения переданной команды
        /// ВНИМАНИЕ: В список емейлов не включается емейл текущего пользователя
        /// </summary>
        /// <param name="cmd"></param>
        /// <returns></returns>
        private string readEMails(XDbCommand cmd)
        {
            StringBuilder bld     = new StringBuilder();
            ITUser        user    = (ITUser)XSecurityManager.Instance.GetCurrentUser();
            string        sIgnore = null;

            if (user.EMail != null && user.EMail.Length > 0)
            {
                sIgnore = user.EMail;
            }
            using (IDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    if (!reader.IsDBNull(reader.GetOrdinal("EMail")))
                    {
                        string sEmail = reader.GetString(reader.GetOrdinal("EMail"));
                        if (!sEmail.Equals(sIgnore))
                        {
                            if (bld.Length > 0)
                            {
                                bld.Append(";");
                            }
                            bld.Append(sEmail);
                        }
                    }
                }
            }
            return(bld.ToString());
        }
        private void UpdateChildDepartments(XStorageConnection con, DomainObjectDataSet dataSet, Guid objectID, bool IsArchive)
        {
            // Обновляем вложенные департаменты, если мы меняем признак на "Архивный".
            // Если признак "Архивный" снимается, каскадной разархивации не происходит.
            // зачитаем идентификаторы всех подчиненных департаментов, состояние которых отличается от требуемого
            if (IsArchive)
            {
                XDbCommand cmd = con.CreateCommand(@"
				    SELECT d.ObjectID
				    FROM dbo.Department as d_s WITH(NOLOCK)
					    JOIN dbo.Department as d  WITH(NOLOCK) ON d.LIndex > d_s.LIndex AND d.RIndex < d_s.RIndex AND d.Organization = d_s.Organization
				    WHERE d_s.ObjectID = @ObjectID AND d.IsArchive <> @IsArchive
				    "                );
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID);
                cmd.Parameters.Add("IsArchive", DbType.Boolean, ParameterDirection.Input, false, IsArchive);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    DomainObjectData xobjSubDepartment;
                    while (reader.Read())
                    {
                        xobjSubDepartment = dataSet.GetLoadedStub("Department", reader.GetGuid(0));
                        xobjSubDepartment.SetUpdatedPropValue("IsArchive", IsArchive);
                    }
                }
            }
        }
        public override void Execute(XTriggerArgs args, IXExecutionContext context)
        {
            DomainObjectData xobj = args.TriggeredObject;
            // если изменилось значение признака "Архивное", проверим отсутствие у подразделения работающих сотрудников или не архивных департаментов.
            bool bUpdateIsArchive = xobj.HasUpdatedProp("IsArchive");

            if (bUpdateIsArchive)
            {
                bool newValue = (bool)xobj.GetUpdatedPropValue("IsArchive");
                if (!xobj.IsNew && newValue)
                {
                    //	1. Проверим, что все сотрудники (во всех вложенных департаментах) уволены
                    XDbCommand cmd = context.Connection.CreateCommand(@"
							SELECT 1 
							FROM dbo.Department d_s WITH(NOLOCK)
								JOIN dbo.Department d WITH(NOLOCK) ON d.LIndex >= d_s.LIndex AND d.RIndex <= d_s.RIndex AND d.Organization = d_s.Organization
									JOIN Employee e WITH(NOLOCK) ON (d.ObjectID = e.Department) and (e.WorkEndDate is null)
							WHERE d_s.ObjectID = @ObjectID
							"                            );
                    cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, xobj.ObjectID);
                    if (cmd.ExecuteScalar() != null)
                    {
                        throw new XBusinessLogicException("Департамент не может быть переведен с состояние \"Архивное\", так как содержит работающих сотрудников");
                    }
                }
                // добавим в датаграмму подчиненные департаменты
                UpdateChildDepartments(context.Connection, args.DataSet, xobj.ObjectID, newValue);
            }
        }
Beispiel #4
0
        /// <summary>
        /// Возвращает коллекцию ключей и значений вида : "дата","норма сотрудника на дату"
        /// </summary>
        /// <param name="con"></param>
        /// <param name="dtStart">Дата начала периода</param>
        /// <param name="dtEnd">Дата окончания периода</param>
        /// <param name="dtEnd">Идентификатор сотрудника</param>
        private Dictionary <DateTime, int> GetDayRates(XStorageConnection con, DateTime dtStart, DateTime dtEnd, Guid uidUserId)
        {
            if (dtStart > dtEnd)
            {
                throw new ArgumentException("Дата начала периода должна быть меньше даты окончания периода");
            }

            XDbCommand cmd = con.CreateCommand(
                "SELECT CalendarDate, Rate FROM  dbo.GetEmployeeCalendar(@dtStart,@dtEnd,@EmpID) as empCal");

            cmd.Parameters.Add("dtStart", DbType.Date, ParameterDirection.Input, false, dtStart);
            cmd.Parameters.Add("dtEnd", DbType.Date, ParameterDirection.Input, false, dtEnd);
            cmd.Parameters.Add("EmpID", DbType.Guid, ParameterDirection.Input, false, uidUserId);
            Dictionary <DateTime, int> dictDateRates = new Dictionary <DateTime, int>();

            using (IXDataReader reader = cmd.ExecuteXReader())
            {
                while (reader.Read())
                {
                    DateTime dt        = reader.GetDateTime(reader.GetOrdinal("CalendarDate"));
                    int      nDateRate = reader.GetInt16(reader.GetOrdinal("Rate"));
                    dictDateRates.Add(dt, nDateRate);
                }
            }
            return(dictDateRates);
        }
Beispiel #5
0
        private void fillDataSetWithChildFoldersWithUpdatedState(XStorageConnection con, DomainObjectDataSet dataSet, Guid objectID, FolderStates folderState)
        {
            // зачитаем идентификаторы всех подчиненных папок, состояние которых отличается от требуемого
            XDbCommand cmd = con.CreateCommand(@"
				SELECT f.ObjectID
				FROM Folder f_s WITH(NOLOCK)
					JOIN Folder f  WITH(NOLOCK) ON f.LIndex > f_s.LIndex AND f.RIndex < f_s.RIndex AND f.Customer = f_s.Customer
				WHERE f_s.ObjectID = @ObjectID AND f.State <> @TargetState
				"                );

            // закрытие закрывает все вложенные папки без учета их состояния:
            // if (folderState == FolderStates.Closed) - Nothing to do

            // замораживание замораживает открытые и ожидающие закрытия
            if (folderState == FolderStates.Frozen)
            {
                cmd.CommandText = cmd.CommandText + " AND f.State IN (" + FolderStatesItem.Open.IntValue + "," + FolderStatesItem.WaitingToClose.IntValue + ")";
            }
            // перевод в "ожидание закрытие" применим только для открытых (т.е. замороженные и закрытые не трогаются)
            //else if (folderState == FolderStates.WaitingToClose)
            //cmd.CommandText = cmd.CommandText + " AND f.State = " + FolderStatesItem.Open.IntValue;

            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID);
            cmd.Parameters.Add("TargetState", DbType.Int16, ParameterDirection.Input, false, (Int16)folderState);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                DomainObjectData xobjSubFolder;
                while (reader.Read())
                {
                    xobjSubFolder = dataSet.GetLoadedStub("Folder", reader.GetGuid(0));
                    xobjSubFolder.SetUpdatedPropValue("State", folderState);
                }
            }
        }
Beispiel #6
0
        protected Guid GetScalarObjectPropValueFromDB(XStorageConnection con, string sObjectType, Guid ObjectID, string[] aPathParts, int nStartIndex)
        {
            string sObjectType_cur = sObjectType;
            Guid   oid_cur         = ObjectID;
            string sQuery          = "@ObjectID";
            object vPropValue;                                                                          // значение свойства

            for (int nIndex = nStartIndex; nIndex < aPathParts.Length; ++nIndex)
            {
                sQuery = String.Format("SELECT {0} FROM {1} WHERE ObjectID = ({2})",
                                       con.ArrangeSqlName(aPathParts[nIndex]),  // 0 - свойство-колонка
                                       con.GetTableQName(sObjectType_cur),      // 1 - тип-таблица
                                       sQuery                                   // 2 - вложенное условие
                                       );
                sObjectType_cur = getObjectValueTypeName(sObjectType_cur, aPathParts[nIndex], con);
            }
            XDbCommand cmd = con.CreateCommand(sQuery);

            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, oid_cur);
            vPropValue = cmd.ExecuteScalar();
            if (vPropValue == null)
            {
                return(Guid.Empty);
            }
            else if (vPropValue is DBNull)
            {
                return(Guid.Empty);
            }
            return((Guid)vPropValue);
        }
Beispiel #7
0
        private DomainObjectData loadFolderAndIncident(DomainObjectDataSet dataSet, GetMailMsgInfoRequest request, IXExecutionContext context)
        {
            DomainObjectData xobjFolder;

            if (request.ObjectType == "Folder")
            {
                xobjFolder = dataSet.GetLoadedStub("Folder", request.ObjectID);
                dataSet.LoadProperty(context.Connection, xobjFolder, "Name");
            }
            else
            {
                XDbCommand cmd = context.Connection.CreateCommand(
                    @"SELECT f.ObjectID as FolderID, f.Name as FolderName, i.Name as IncidentName, i.Number as IncidentNumber
					FROM Incident i JOIN Folder f ON i.Folder=f.ObjectID 
					WHERE i.ObjectID = @IncidentID"                    );
                cmd.Parameters.Add("IncidentID", DbType.Guid, ParameterDirection.Input, false, request.ObjectID);
                DomainObjectData xobjIncident = dataSet.GetLoadedStub("Incident", request.ObjectID);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    if (!reader.Read())
                    {
                        throw new XObjectNotFoundException("Incident", request.ObjectID);
                    }
                    xobjFolder = dataSet.GetLoadedStub("Folder", reader.GetGuid(reader.GetOrdinal("FolderID")));
                    xobjFolder.SetLoadedPropValue("Name", reader.GetString(reader.GetOrdinal("FolderName")));
                    xobjIncident.SetLoadedPropValue("Name", reader.GetString(reader.GetOrdinal("IncidentName")));
                    xobjIncident.SetLoadedPropValue("Number", reader.GetInt32(reader.GetOrdinal("IncidentNumber")));
                    xobjIncident.SetLoadedPropValue("Folder", xobjFolder.ObjectID);
                }
            }
            return(xobjFolder);
        }
Beispiel #8
0
        private static List <string> GetMemoTableList(XDbConnection con)
        {
            List <string> lst = new List <string>();
            DataTable     dt  = new DataTable();

            string commandString = string.Format("Exec SP_COLUMNS_EX N'{0}'", XDbEnvironment.CalculateLinkedSrvName(con.InputFile));

            using (DbCommand comm = new XDbCommand(commandString, con))
            {
                using (DbDataReader reader = comm.ExecuteReader())
                {
                    dt.Load(reader, LoadOption.OverwriteChanges);
                }

                // Go through the table rows and search for the memo fields( TYPE_NAME = VarChar && COLUMN_SIZE = 0 )
                foreach (DataRow row in dt.Rows)
                {
                    if ((row["TYPE_NAME"].ToString() == "VarChar") && (row["COLUMN_SIZE"].ToString() == "0"))
                    {
                        if (!lst.Contains(row["TABLE_NAME"].ToString()))
                        {
                            lst.Add(row["TABLE_NAME"].ToString());
                        }
                    }
                }
            }
            return(lst);
        }
Beispiel #9
0
        /// <summary>
        /// ћетод запуска операции на выполнение, Ђвходна¤ї точка операции
        /// ѕ≈–≈√–”∆≈ЌЌџ…, —“–ќ√ќ “»ѕ»«»–ќ¬јЌЌџ… ћ≈“ќƒ
        /// ¬џ«џ¬ј≈“—я яƒ–ќћ ј¬“ќћј“»„≈— »
        /// </summary>
        /// <param name="request">«апрос на выполнение операции</param>
        /// <param name="context"> онтекст выполнени¤ операции</param>
        /// <returns>–езультат выполнени¤</returns>
        public virtual XResponse Execute(UserSubscriptionForEventClassRequest request, IXExecutionContext context)
        {
            // ѕервым делом получим идентификатор пользовател¤
            Guid employeeID = ((ITUser)XSecurityManager.Instance.GetCurrentUser()).EmployeeID;

            // —формируем запрос
            using (XDbCommand cmd = context.Connection.CreateCommand())
            {
                string sParamEmployeeID = context.Connection.GetParameterName("emp");
                string sParamEventClass = context.Connection.GetParameterName("evt");

                // ќтпишем
                StringBuilder sb = new StringBuilder();
                sb.AppendFormat(@"
SET NOCOUNT ON
SET ROWCOUNT 0

DELETE dbo.EventSubscription
WHERE [User]={0} 
	AND
	( 
		([EventCreationRule] IN (SELECT ObjectID FROM dbo.EventType WHERE EventType={1}))
		OR
		{1}=0
	)
", sParamEmployeeID, sParamEventClass);

                if (request.Action == UserSubscriptionForEventClassAction.SwitchToDigestOnly)
                {
                    sb.AppendFormat(@"
INSERT INTO dbo.EventSubscription([User], [IncludeInDigest], [InstantDelivery], [EventCreationRule])
(
	SELECT {0}, 1, 0, ObjectID
	FROM dbo.EventType
	WHERE EventType={1} OR {1}=0
)
", sParamEmployeeID, sParamEventClass);
                }
                else if (request.Action == UserSubscriptionForEventClassAction.Unsubscribe)
                {
                    sb.AppendFormat(@"
INSERT INTO dbo.EventSubscription([User], [IncludeInDigest], [InstantDelivery], [EventCreationRule])
(
	SELECT {0}, 0, 0, ObjectID
	FROM dbo.EventType
	WHERE EventType={1} OR {1}=0
)
", sParamEmployeeID, sParamEventClass);
                }

                cmd.CommandTimeout = int.MaxValue - 128;
                cmd.CommandText    = sb.ToString();
                cmd.Parameters.Add(sParamEmployeeID, employeeID);
                cmd.Parameters.Add(sParamEventClass, request.EventClass);

                cmd.ExecuteNonQuery();
            }
            return(new XResponse());
        }
Beispiel #10
0
        private string getIncidentUsersEMail(Guid IncidentID, IXExecutionContext context)
        {
            XDbCommand cmd = context.Connection.CreateCommand(
                "SELECT emp.EMail FROM Task t JOIN Employee emp ON t.Worker = emp.ObjectID WHERE t.Incident = @IncidentID"
                );

            cmd.Parameters.Add("IncidentID", DbType.Guid, ParameterDirection.Input, false, IncidentID);
            return(readEMails(cmd));
        }
Beispiel #11
0
        private string getFolderUsersEMail(Guid FolderID, IXExecutionContext context)
        {
            XDbCommand cmd = context.Connection.CreateCommand(
                "SELECT emp.EMail FROM ProjectParticipant pp JOIN Employee emp ON pp.Employee = emp.ObjectID WHERE pp.Folder = @FolderID"
                );

            cmd.Parameters.Add("FolderID", DbType.Guid, ParameterDirection.Input, false, FolderID);
            return(readEMails(cmd));
        }
        /// <summary>
        /// Команда получения данных для фильтра списка тендеров
        /// </summary>
        public GetFilterTendersInfoResponse Execute(GetFilterTendersInfoRequest request, IXExecutionContext context)
        {
            GetFilterTendersInfoResponse resp = new GetFilterTendersInfoResponse();

            using (XDbCommand cmd = context.Connection.CreateCommand())
            {
                // Если идентификатор тендера не задан
                if (request.SelectedTenderID == Guid.Empty)
                {
                    cmd.CommandText =
                        @"SELECT TOP 1 ObjectID
						FROM dbo.Organization with (nolock)
						WHERE Home <> 0"                        ;
                    object temp = cmd.ExecuteScalar();
                    resp.OrganizationID = (temp == null) ?
                                          Guid.Empty : (Guid)temp;
                }
                // Если задан
                else
                {
                    cmd.CommandText =
                        @"SELECT TOP 1 O.ObjectID, T.DocFeedingDate
						FROM dbo.Tender AS T with (nolock)
						LEFT JOIN dbo.Lot AS L with (nolock) ON L.Tender = T.ObjectID
						LEFT JOIN dbo.LotParticipant AS P with (nolock) ON P.Lot = L.ObjectID
						LEFT JOIN dbo.Organization AS O with (nolock) ON O.ObjectID = P.ParticipantOrganization
						WHERE O.OwnTenderParticipant <> 0
							AND T.ObjectID = @SelectedTenderID"                            ;
                    // Передадим в параметр ID тендера
                    cmd.Parameters.Add("SelectedTenderID",
                                       DbType.Guid,
                                       ParameterDirection.Input,
                                       false,
                                       request.SelectedTenderID);

                    using (IDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            // Проставим значения ID огранизации и "даты подачи документов"
                            resp.OrganizationID = reader.IsDBNull(0) ?
                                                  Guid.Empty : reader.GetGuid(0);
                            resp.DocFeedingDate = reader.IsDBNull(1) ?
                                                  DateTime.MinValue : reader.GetDateTime(1);
                        }
                        else
                        {
                            resp.OrganizationID = Guid.Empty;
                            resp.DocFeedingDate = DateTime.MinValue;
                        }
                    }
                }
            }

            return(resp);
        }
Beispiel #13
0
        /// <summary>
        /// Возвращает полный путь до инцидента, заданного идентификатором, либо номером
        /// </summary>
        /// <param name="con"></param>
        /// <param name="IncidentNumber">номер инцидента</param>
        /// <param name="IncidentOID">идентификатор инцидента или Guid.Empty</param>
        /// <returns></returns>
        private XTreePath GetIncidentFullPath(XStorageConnection con, Int32 IncidentNumber, Guid IncidentOID)
        {
            Guid organizationID = Guid.Empty;                           // идентификатор организации, в которой расположен инцидент
            Guid activityTypeID = Guid.Empty;                           // идентификатор вида активности,на которую ссылается папка, в которой разположен инцидент

            // сфомируем путь из каталогов
            string sQuery = String.Format(
                @"SELECT i.ObjectID AS IncidentID, f.ObjectID, f_s.Customer, f_s.ActivityType
				FROM Incident i with (nolock)
					JOIN Folder f_s with (nolock) ON i.Folder = f_s.ObjectID
						JOIN Folder f with (nolock) ON f.LIndex <= f_s.LIndex AND f.RIndex >= f_s.RIndex AND f.Customer = f_s.Customer
				WHERE {0}
				ORDER BY f.LRLevel DESC"                ,
                IncidentOID == Guid.Empty ?
                "i.Number = @Number" :
                "i.ObjectID = @ObjectID"
                );
            XDbCommand cmd = con.CreateCommand(sQuery);

            if (IncidentOID == Guid.Empty)
            {
                cmd.Parameters.Add("Number", DbType.Int32, ParameterDirection.Input, false, IncidentNumber);
            }
            else
            {
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, IncidentOID);
            }

            XTreePath path = new XTreePath();                   // путь

            using (IDataReader reader = cmd.ExecuteReader())
            {
                int nObjectIDIndex = -1;                                        // индекс поля ObjectID
                while (reader.Read())
                {
                    if (nObjectIDIndex < 0)
                    {
                        // первая итерация
                        IncidentOID    = reader.GetGuid(reader.GetOrdinal("IncidentID"));
                        organizationID = reader.GetGuid(reader.GetOrdinal("Customer"));
                        activityTypeID = reader.GetGuid(reader.GetOrdinal("ActivityType"));
                        nObjectIDIndex = reader.GetOrdinal("ObjectID");
                    }
                    path.Append(TYPE_Folder, reader.GetGuid(nObjectIDIndex));
                }
            }
            if (path.Length > 0)
            {
                path.Append(GetPathToFolder(con, organizationID, activityTypeID));
                path.InsertAtBeginning(TYPE_Incident, IncidentOID);
            }

            return(path);
        }
 public override XResponse Execute(XRequest request, IXExecutionContext context)
 {
     using (XDbCommand cmd = context.Connection.CreateCommand())
     {
         cmd.CommandType    = CommandType.StoredProcedure;
         cmd.CommandText    = "dbo.app_messagingCheckIncidentsDeadline";
         cmd.CommandTimeout = int.MaxValue - 128;
         cmd.ExecuteNonQuery();
     }
     return(new XResponse());
 }
        /// <summary>
        /// Команда факторизации плановых платежей
        /// </summary>
        public FactorizeProjectOutcomeResponse Execute(FactorizeProjectOutcomeRequest request, IXExecutionContext context)
        {
            FactorizeProjectOutcomeResponse resp = new FactorizeProjectOutcomeResponse();

            using (XDbCommand cmd = context.Connection.CreateCommand())
            {
                /*
                 * // Если идентификатор тендера не задан
                 * if (request.ContractID != Guid.Empty)
                 * {
                 *  cmd.CommandText =
                 *  @"SELECT TOP 1 O.ObjectID, T.DocFeedingDate
                 *                              FROM dbo.Tender AS T with (nolock)
                 *                              LEFT JOIN dbo.Lot AS L with (nolock) ON L.Tender = T.ObjectID
                 *                              LEFT JOIN dbo.LotParticipant AS P with (nolock) ON P.Lot = L.ObjectID
                 *                              LEFT JOIN dbo.Organization AS O with (nolock) ON O.ObjectID = P.ParticipantOrganization
                 *                              WHERE O.OwnTenderParticipant <> 0
                 *                                      AND T.ObjectID = @ContractID";
                 *  // Передадим в параметр ID тендера
                 *  cmd.Parameters.Add("SelectedTenderID",
                 *      DbType.Guid,
                 *      ParameterDirection.Input,
                 *      false,
                 *      request.ContractID);
                 *
                 *  using (IDataReader reader = cmd.ExecuteReader())
                 *  {
                 *
                 *      if (reader.Read())
                 *      {
                 *          // Проставим значения ID огранизации и "даты подачи документов"
                 *          resp.OrganizationID = reader.IsDBNull(0) ?
                 *              Guid.Empty : reader.GetGuid(0);
                 *          resp.DocFeedingDate = reader.IsDBNull(1) ?
                 *              DateTime.MinValue : reader.GetDateTime(1);
                 *      }
                 *      else
                 *      {
                 *          resp.OrganizationID = Guid.Empty;
                 *          resp.DocFeedingDate = DateTime.MinValue;
                 *      }
                 *  }
                 *
                 * }
                 */
            }

            return(resp);
        }
Beispiel #16
0
        private string getUsersEMail(Guid[] aEmployeeIDs, IXExecutionContext context)
        {
            StringBuilder bld = new StringBuilder();

            foreach (Guid oid in aEmployeeIDs)
            {
                if (bld.Length > 0)
                {
                    bld.Append(", ");
                }
                bld.Append(context.Connection.ArrangeSqlGuid(oid));
            }
            XDbCommand cmd = context.Connection.CreateCommand("SELECT Email FROM Employee WHERE ObjectID IN (" + bld.ToString() + ")");

            return(readEMails(cmd));
        }
Beispiel #17
0
        private DataTable GetDataTable(string sql)
        {
            if (!IsConnectionValid)
            {
                return(null);
            }

            using (DbCommand cmd = new XDbCommand(sql, m_XDbConnection))
            {
                using (DbDataReader rd = cmd.ExecuteReader())
                {
                    DataTable data = new DataTable();
                    data.Load(rd);
                    return(data);
                }
            }
        }
Beispiel #18
0
        /// <summary>
        /// Загружает поля State, BlockDate в случае, если они еще не загружены и если они обновлялись.
        /// </summary>
        /// <param name="xobj"></param>
        /// <param name="bUpdatedState">Признак обновления поля State</param>
        /// <param name="bUpdatedBlockDate">Признак обновления поля BlockDate</param>
        /// <param name="context"></param>
        private void preloadProps(DomainObjectData xobj, bool bUpdatedState, bool bUpdateIsLocked, IXExecutionContext context)
        {
            bool bLoadState    = bUpdatedState && !xobj.HasLoadedProp("State");
            bool bLoadIsLocked = bUpdateIsLocked && !xobj.HasLoadedProp("IsLocked");

            // если надо зачитать хотя бы одно свойство
            if (bLoadState || bLoadIsLocked)
            {
                XDbCommand    cmd            = context.Connection.CreateCommand();
                StringBuilder cmdTextBuilder = new StringBuilder();
                cmdTextBuilder.Append("SELECT ");
                if (bLoadState)
                {
                    cmdTextBuilder.Append("[State]");
                }
                if (bLoadIsLocked)
                {
                    if (bLoadState)
                    {
                        cmdTextBuilder.Append(", ");
                    }
                    cmdTextBuilder.Append("[IsLocked]");
                }
                cmdTextBuilder.Append(" FROM ");
                cmdTextBuilder.Append(context.Connection.GetTableQName(xobj.TypeInfo));
                cmdTextBuilder.Append(" WHERE ObjectID = @ObjectID");
                cmd.CommandText = cmdTextBuilder.ToString();
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, xobj.ObjectID);
                using (IXDataReader reader = cmd.ExecuteXReader())
                {
                    if (reader.Read())
                    {
                        if (bLoadState)
                        {
                            xobj.SetLoadedPropValue("State", reader.GetInt16(reader.GetOrdinal("State")));
                        }
                        if (bLoadIsLocked)
                        {
                            xobj.SetLoadedPropValue("IsLocked", reader.GetBoolean(reader.GetOrdinal("IsLocked")));
                        }
                    }
                }
            }
        }
Beispiel #19
0
 public GetKassBallanceResponse Execute(GetKassBallanceRequest request, IXExecutionContext context)
 {
     using (XDbCommand cmd = context.Connection.CreateCommand())
     {
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.CommandText = "[dbo].[app_GetKassBallance]";
         GetKassBallanceResponse response = new GetKassBallanceResponse();
         using (IDataReader reader = cmd.ExecuteReader())
         {
             if (0 != reader.FieldCount)
             {
                 while (reader.Read())
                 {
                     response.sKassBallance = reader.GetString(0);
                 }
             }
             return(response);
         }
     }
 }
        /// <summary>
        /// Метод получения идентификатора объекта "Сотрудник" по идентификатору объекта "Пользователь приложения"
        /// </summary>
        private Guid getEmployeeID(XStorageConnection con, Guid objectID)
        {
            Guid uidEmployeeID = Guid.Empty;  // идентификатор сотрудника
            // Зачитаем идентификатор
            XDbCommand cmd = con.CreateCommand(@"SELECT e.ObjectID
                    FROM [dbo].[Employee] e
	                JOIN [dbo].[SystemUser] su ON e.SystemUser = su.ObjectID
                    WHERE su.ObjectID = @ObjectID
            ");

            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    uidEmployeeID = reader.GetGuid(0);
                }
            }
            return(uidEmployeeID);
        }
Beispiel #21
0
        private void readUserManagedOrganizations(ITUser user, XStorageConnection con)
        {
            XDbCommand cmd = con.CreateCommand();

            cmd.CommandText = @"
				SELECT o.ObjectID
				FROM Organization o WITH (nolock)
					JOIN Organization o_p WITH (nolock) ON o_p.LIndex <= o.LIndex AND o_p.RIndex >= o.RIndex and o_p.Director = @EmployeeID		
			"            ;
            cmd.Parameters.Add("EmployeeID", DbType.Guid, ParameterDirection.Input, false, user.EmployeeID);
            using (IXDataReader reader = cmd.ExecuteXReader())
            {
                ArrayList aOrgIDs = new ArrayList();
                while (reader.Read())
                {
                    aOrgIDs.Add(reader.GetGuid(0));
                }
                user.ManagedOrganizations = new Guid[aOrgIDs.Count];
                aOrgIDs.CopyTo(user.ManagedOrganizations);
            }
        }
Beispiel #22
0
        /// <summary>
        /// Возвращает полный путь к проекту: Folder|oid|..|Folder|{oid}|ActivitType|{oid}|Organization|{oid}
        /// </summary>
        /// <param name="con"></param>
        /// <param name="FolderExID">Код проекта</param>
        /// <returns></returns>
        public XTreePath GetFolderFullPath(XStorageConnection con, string FolderExID)
        {
            // сфомируем путь из каталогов
            XDbCommand cmd = con.CreateCommand(@"
				SELECT f.ObjectID, f.Customer, f_s.ActivityType
				FROM Folder f_s with (nolock)
						JOIN Folder f with (nolock) ON f.LIndex <= f_s.LIndex AND f.RIndex >= f_s.RIndex AND f.Customer = f_s.Customer
				WHERE f_s.ExternalID = @FolderExID
				ORDER BY f.LRLevel DESC"
                                               );

            cmd.Parameters.Add("FolderExID", DbType.String, ParameterDirection.Input, false, FolderExID);
            XTreePath path           = new XTreePath(); // путь
            Guid      organizationID = Guid.Empty;      // идентификатор организации, в которой расположен инцидент
            Guid      activityTypeID = Guid.Empty;      // идентификатор вида активности,на которую ссылается папка, в которой разположен инцидент

            using (IDataReader reader = cmd.ExecuteReader())
            {
                int nObjectIDIndex = -1;                        // индекс поля ObjectID
                while (reader.Read())
                {
                    if (nObjectIDIndex < 0)
                    {
                        organizationID = reader.GetGuid(reader.GetOrdinal("Customer"));
                        activityTypeID = reader.GetGuid(reader.GetOrdinal("ActivityType"));
                        nObjectIDIndex = reader.GetOrdinal("ObjectID");
                    }
                    path.Append(TYPE_Folder, reader.GetGuid(nObjectIDIndex));
                }
            }
            // Сформируем путь из организаций и типов проектных затрат
            if (path.Length > 0)
            {
                XTreePath pathToFolder = GetPathToFolder(con, organizationID, activityTypeID);
                path.Append(pathToFolder);
            }
            return(path);
        }
Beispiel #23
0
        private void readUserActivityTypes(ITUser user, XStorageConnection con)
        {
            XDbCommand cmd = con.CreateCommand();

            cmd.CommandText = @"
				SELECT at.ObjectID, at.Name, at.Code, at.AccountRelated, at.FolderType, at.StartDate, at.EndDate 
				FROM dbo.SystemUser_ActivityTypes su_at WITH (nolock)
					JOIN dbo.ActivityType at WITH (nolock) ON su_at.Value = at.ObjectID
				WHERE su_at.ObjectID = @ObjectID
				UNION
				SELECT at.ObjectID, at.Name, at.Code, at.AccountRelated, at.FolderType, at.StartDate, at.EndDate 
				FROM dbo.SystemUser_SystemRoles su_sr WITH (nolock)
					JOIN dbo.SystemRole_ActivityTypes sr_at WITH (nolock) ON su_sr.Value = sr_at.ObjectID
						JOIN dbo.ActivityType at WITH (nolock) ON sr_at.Value = at.ObjectID
				WHERE su_sr.ObjectID = @ObjectID
				"                ;
            cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, user.SystemUserID);
            using (IXDataReader reader = cmd.ExecuteXReader())
            {
                user.ActivityTypes = new Hashtable();
                while (reader.Read())
                {
                    DomainObject_ActivityType xobj = new DomainObject_ActivityType();
                    xobj.ObjectID       = reader.GetGuid(reader.GetOrdinal("ObjectID"));
                    xobj.Name           = reader.GetString(reader.GetOrdinal("Name"));
                    xobj.Code           = reader.GetString(reader.GetOrdinal("Code"));
                    xobj.AccountRelated = reader.GetBoolean(reader.GetOrdinal("AccountRelated"));
                    xobj.FolderType     = (FolderTypeFlags)reader.GetInt16(reader.GetOrdinal("FolderType"));
                    xobj.StartDate      = reader.GetDateTime(reader.GetOrdinal("StartDate"));
                    if (!reader.IsDBNull(reader.GetOrdinal("EndDate")))
                    {
                        xobj.EndDate = reader.GetDateTime(reader.GetOrdinal("EndDate"));
                    }
                    user.ActivityTypes.Add(xobj.ObjectID, xobj);
                }
            }
        }
        public override void ProcessParams(IDictionary paramsValues, Dictionary <string, StringBuilder> hashConditions, XDbCommand cmd)
        {
            string searchString_1 = "i.Type = it.ObjectID";

            // если клиент не задал параметр Folders - список идентификаторов проектов,
            // то выкусим параметр RecursiveFolderSearch, определяющий режим подстановки параметра Folders
            if (!paramsValues.Contains("Folders"))
            {
                paramsValues.Remove("RecursiveFolderSearch");
            }

            // если клиент не задал параметр Participants- список идентификаторов исполнителей и значение признака ExceptParticipants равно false,
            // то выкусим параметр ExceptParticipants, определяющий режим подстановки параметра Participants
            if (!paramsValues.Contains("Participants"))
            {
                if (!paramsValues.Contains("ExceptParticipants"))
                {
                    paramsValues.Remove("ExceptParticipants");
                }
                else if ((bool)paramsValues["ExceptParticipants"] == false)
                {
                    paramsValues.Remove("ExceptParticipants");
                }
            }
        }
        internal static bool fillEmployeeInfoSection(XMenuSection sec, Guid EmployeeID, XStorageConnection cn)
        {
            using (XDbCommand cmd = cn.CreateCommand(
                       "SELECT " +
                       "	emp.EMail, emp.Phone, emp.PhoneExt, p.Name AS PositionName, o.Home "+
                       "FROM Employee emp " +
                       "	LEFT JOIN Position p ON emp.Position = p.ObjectID "+
                       "	JOIN Organization o ON emp.Organization = o.ObjectID "+
                       "WHERE emp.ObjectID = @ObjectID"
                       ))
            {
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, EmployeeID);
                bool   bIsHome;
                string sEMail        = null;
                string sPhone        = null;
                string sPhoneExt     = null;
                string sPositionName = null;
                using (IXDataReader reader = cmd.ExecuteXReader())
                {
                    if (reader.Read())
                    {
                        bIsHome = reader.GetBoolean(reader.GetOrdinal("Home"));
                        if (!reader.IsDBNull(reader.GetOrdinal("EMail")))
                        {
                            sEMail = reader.GetString(reader.GetOrdinal("EMail"));
                        }
                        if (!reader.IsDBNull(reader.GetOrdinal("Phone")))
                        {
                            sPhone = reader.GetString(reader.GetOrdinal("Phone"));
                        }
                        if (!reader.IsDBNull(reader.GetOrdinal("PhoneExt")))
                        {
                            sPhoneExt = reader.GetString(reader.GetOrdinal("PhoneExt"));
                        }
                        if (!reader.IsDBNull(reader.GetOrdinal("PositionName")))
                        {
                            sPositionName = reader.GetString(reader.GetOrdinal("PositionName"));
                        }

                        sec.Items.AddInfoItem("EMail", sEMail);
                        if (bIsHome && sPhoneExt != null)
                        {
                            sec.Items.AddInfoItem("Внутренний телефон", sPhoneExt);
                        }
                        else
                        {
                            sec.Items.AddInfoItem("Телефон",
                                                  (sPhone != null && sPhone.Length > 0 ? sPhone : "") +
                                                  (sPhoneExt != null && sPhoneExt.Length > 0 ? "(" + sPhoneExt + ")" : "")
                                                  );
                        }
                        if (sPositionName != null)
                        {
                            sec.Items.AddInfoItem("Должность", sPositionName);
                        }
                        return(true);
                    }
                }
                return(false);
            }
        }
        /// <summary>
        /// Метод вызова команды ядром
        /// </summary>
        public TreeLocatorResponse Execute(EmployeeLocatorInCompanyTreeRequest request, IXExecutionContext context)
        {
            string             sTreePath = "";          // путь в дереве до найденного объекта
            Guid               foundOID  = Guid.Empty;  // идентификатор найденного объекта
            bool               bMore     = false;       // признак того, что есть еще объекты удовлетворяющие заданному условию
            XStorageConnection con       = context.Connection;

            string sQuery =
                @"SELECT emp.ObjectID, d.ObjectID as DepID, d.LIndex, d.RIndex, emp.Organization
FROM Employee emp 
	LEFT JOIN Department d ON emp.Department = d.ObjectID
WHERE emp.LastName LIKE " + con.GetParameterName("LastName");

            // если задан список игнорируемых объектов, добавим ограничение
            if (request.IgnoredObjects != null && request.IgnoredObjects.Length > 0)
            {
                StringBuilder bld = new StringBuilder();
                bld.Append("\n\tAND NOT emp.ObjectID IN (");
                foreach (Guid oid in request.IgnoredObjects)
                {
                    bld.Append(con.ArrangeSqlGuid(oid));
                    bld.Append(", ");
                }
                bld.Length -= 2;
                bld.Append(")");
                sQuery = sQuery + bld.ToString();
            }
            // по умолчанию выводим (и, следовательно, ищем среди) неархивных сотрудников и сотрудников без временной нетрудоспособности.
            if (!request.AllowArchive)
            {
                sQuery = sQuery + " AND (emp.WorkEndDate IS NULL) AND (emp.TemporaryDisability  = 0)";
            }

            sQuery = sQuery + "\nORDER BY emp.Organization, emp.Department, emp.FirstName";

            XDbCommand cmd = con.CreateCommand(sQuery);

            cmd.Parameters.Add("LastName", DbType.String, ParameterDirection.Input, false, request.LastName + "%");
            using (IDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    foundOID = reader.GetGuid(reader.GetOrdinal("ObjectID"));
                    Guid OrgOID = reader.GetGuid(reader.GetOrdinal("Organization"));
                    Guid DepID;
                    int  nLIndex = -1;
                    int  nRIndex = -1;
                    sTreePath = "Employee|" + foundOID.ToString();

                    if (!reader.IsDBNull(reader.GetOrdinal("DepID")))
                    {
                        // если сотрудник входит в подразделение, то сформируем путь по всем подразделениям к корневому
                        int nLIndexOrdinal = reader.GetOrdinal("LIndex");
                        int nRIndexOrdinal = reader.GetOrdinal("RIndex");
                        if (!reader.IsDBNull(nLIndexOrdinal) && !reader.IsDBNull(nRIndexOrdinal))
                        {
                            nLIndex = reader.GetInt32(nLIndexOrdinal);
                            nRIndex = reader.GetInt32(nRIndexOrdinal);
                        }
                        DepID = reader.GetGuid(reader.GetOrdinal("DepID"));
                        bMore = reader.Read();
                        reader.Close();
                        if (nLIndex > -1 && nRIndex > -1)
                        {
                            sQuery =
                                @"SELECT ObjectID FROM Department 
WHERE LIndex < @LIndex AND RIndex > @RIndex AND Organization = @OrgID
ORDER BY [LRLevel] DESC";
                            cmd = context.Connection.CreateCommand(sQuery);
                            cmd.Parameters.Add("LIndex", DbType.Int32, ParameterDirection.Input, false, nLIndex);
                            cmd.Parameters.Add("RIndex", DbType.Int32, ParameterDirection.Input, false, nRIndex);
                            cmd.Parameters.Add("OrgID", DbType.Guid, ParameterDirection.Input, false, OrgOID);
                            sTreePath = sTreePath + "|Department|" + DepID.ToString();
                            using (IDataReader reader2 = cmd.ExecuteReader())
                            {
                                while (reader2.Read())
                                {
                                    sTreePath = sTreePath + "|Department|" + reader2.GetGuid(0);
                                }
                            }
                        }
                    }
                    else
                    {
                        bMore = reader.Read();
                    }
                    // на корневом уровне организации
                    sTreePath = sTreePath + "|Organization|" + OrgOID.ToString();
                }
            }
            return(new TreeLocatorResponse(sTreePath, foundOID, bMore));
        }
Beispiel #27
0
        /// <summary>
        /// Метод запуска операции на выполнение, <входная> точка операции
        /// ПЕРЕГРУЖЕННЫЙ, СТРОГО ТИПИЗИРОВАННЫЙ МЕТОД
        /// ВЫЗЫВАЕТСЯ ЯДРОМ АВТОМАТИЧЕСКИ
        /// </summary>
        /// <param name="request">Запрос на выполнение операции</param>
        /// <param name="context">Контекст выполнения операции</param>
        /// <returns>Результат выполнения</returns>
        public GetEmployeesExpensesResponse Execute(GetEmployeesExpensesRequest request, IXExecutionContext context)
        {
            // Проверка / коррекция параметров
            if (null == request.ExceptDepartmentIDsList)
            {
                request.ExceptDepartmentIDsList = String.Empty;
            }

            // Результат операции - массив экземпляров EmployeeExpenseInfo; все
            // экземплряры, полученные в результате расчетов (таких итераций может
            // быть несколько - см. далее), будут накапливаться в общем "массиве":
            ArrayList arrResults = new ArrayList();

            // Собственно расчет данных выполняется на уровне БД; создаем команду:
            using (XDbCommand cmd = context.Connection.CreateCommand())
            {
                // ... команда - вызов хранимой процедцуры. Процедура принимает
                // список идентификаторов в том же виде - как строку; но ее длина,
                // в случае SQL, ограничена макс. размерностью. Вероятность передачи
                // строки с перечнем идентификаторов, общая длина которой превышает
                // размероность параметра, велика (скажем, для 1000 сотрудников со
                // средней длиной логина в 10 символов длина строки списка - уже
                // 10000, при том что макс. длина значения параметра - 4000).
                //
                // Поэтому весь список разбивается на части, по длине соотв. макс.
                // длине значения параметра. Процедура, т.о., выполняется итеративно,
                // пока не будет обработан весь список идентификаторов.

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "[dbo].[app_GetEmployeesExpenses]";

                // Все остальные параметры при повторных вызовах не изменяются;
                // поэтому задаются только один раз:
                cmd.Parameters.Add("nIdentificationMethod", DbType.Int32, ParameterDirection.Input, false, (int)request.IdentificationMethod);
                cmd.Parameters.Add("sExceptedDepIDs", DbType.String, ParameterDirection.Input, false, request.ExceptDepartmentIDsList);
                cmd.Parameters.Add("dtPeriodBeginDate", DbType.Date, ParameterDirection.Input, false, request.PeriodBegin);
                cmd.Parameters.Add("dtPeriodEndDate", DbType.Date, ParameterDirection.Input, false, request.PeriodEnd);
                // ... пустая строка - недопустимый параметр; здесь задается для
                // того, чтоб сразу добавить параетр в коллекцию:
                cmd.Parameters.Add("sEmployeesIDs", DbType.String, ParameterDirection.Input, false, String.Empty);

                // Далее - итерации по "частям" списка; до тех пор, пока не будет обработан весь список:
                string sSrcEmpIDsList = request.EmployeesIDsList;
                for (int nCurrPos = 0; nCurrPos < sSrcEmpIDsList.Length;)
                {
                    // Выделение "части" списка:
                    string sCurrIDsListPart;
                    if (sSrcEmpIDsList.Length - nCurrPos < DEF_EmployeesIDsList_MaxLength)
                    {
                        sCurrIDsListPart = (0 == nCurrPos ? sSrcEmpIDsList : sSrcEmpIDsList.Substring(nCurrPos));
                        nCurrPos        += sCurrIDsListPart.Length;
                    }
                    else
                    {
                        int nNextPartPos = sSrcEmpIDsList.LastIndexOf(",", nCurrPos + DEF_EmployeesIDsList_MaxLength, DEF_EmployeesIDsList_MaxLength - 1);
                        if (-1 == nNextPartPos)
                        {
                            throw new ArgumentException(
                                      String.Format(
                                          "Список идентификаторов включает идентификатор, длина которого недопустима (более {0})",
                                          DEF_EmployeesIDsList_MaxLength),
                                      "[request].EmployeesIDsList");
                        }

                        sCurrIDsListPart = sSrcEmpIDsList.Substring(nCurrPos, nNextPartPos - nCurrPos);
                        nCurrPos         = nNextPartPos + 1;
                    }
                    // Выделенная "часть" задается как значение параметра:
                    cmd.Parameters["sEmployeesIDs"].Value = sCurrIDsListPart;

                    using (IDataReader reader = cmd.ExecuteReader())
                    {
                        if (0 != reader.FieldCount)
                        {
                            if (reader.FieldCount < 4)
                            {
                                throw new ApplicationException("Некорректные данные расчета (SQL): недостататочное количество колонок в результирующем наборе (" + reader.FieldCount + ")");
                            }

                            // Результат выполнения процедуры - рекордсет, каждая строка
                            // которого содержит идентификатор сотрудника, требуемое время для
                            // списания и реальное списанное время:
                            int nOrd_EmployeeID   = reader.GetOrdinal("EmployeeID");
                            int nOrd_RateExpenses = reader.GetOrdinal("RateExpenses");
                            int nOrd_RealExpenses = reader.GetOrdinal("RealExpenses");

                            while (reader.Read())
                            {
                                EmployeeExpenseInfo info = new EmployeeExpenseInfo();
                                info.EmployeeID  = reader.GetString(nOrd_EmployeeID);
                                info.RateExpense = reader.GetInt32(nOrd_RateExpenses);
                                info.RealExpense = reader.GetInt32(nOrd_RealExpenses);
                                arrResults.Add(info);
                            }
                        }
                    }
                }
            }

            // Итоговый результат операции:
            GetEmployeesExpensesResponse response = new GetEmployeesExpensesResponse();

            response.PeriodBegin = request.PeriodBegin;
            response.PeriodEnd   = request.PeriodEnd;
            response.Expenses    = new EmployeeExpenseInfo[arrResults.Count];
            if (arrResults.Count > 0)
            {
                arrResults.CopyTo(0, response.Expenses, 0, arrResults.Count);
            }

            return(response);
        }
Beispiel #28
0
        /// <summary>
        /// Конструирует описание пользователя по наименованию.
        /// Если пользователя с таким наименованием не найдено, то возвращает null
        /// </summary>
        /// <param name="sUserName">Наименование пользователя</param>
        /// <returns></returns>
        public XUser CreateUser(string sUserName)
        {
            ITUser user;

            using (XStorageConnection con = getConnection())
            {
                con.Open();
                XDbCommand cmd = con.CreateCommand();
                cmd.CommandText =

                    /* Получим описание пользователя (который может быть сотрудником),
                     * системные привилегии (как выданные явно, так и полученные через роли).
                     * Примечания:	- пользователь приложения может не быть сотрудником.
                     *				- для пользователя приложения могут быть не заданы роли
                     *				- GetWorkdayDuration возвращает количество минут
                     *  */
                    @"SELECT su.ObjectID AS SysUserID, su.IsAdmin, su.IsServiceAccount,
	emp.ObjectID AS EmpID, emp.LastName, emp.FirstName, emp.EMail, 
	su.SystemPrivileges, 
	sr.Name as RoleName, 
	sr.Description as RoleDescription, 
	sr.Priviliges as RolePrivileges,
	dbo.GetWorkdayGlobalDuration() as WorkingMinutesInDay,
	CASE WHEN emp.WorkEndDate < getDate() THEN 0 ELSE 1 END as AccessPermitted
FROM SystemUser su WITH (nolock)
	LEFT JOIN Employee emp WITH (nolock) ON emp.SystemUser = su.ObjectID
	LEFT JOIN (SystemUser_SystemRoles su_sr WITH (nolock)
		JOIN SystemRole sr WITH (nolock) ON su_sr.Value = sr.ObjectID
	) ON su.ObjectID = su_sr.ObjectID
WHERE su.Login = @UserLogin";
                cmd.Parameters.Add("UserLogin", DbType.String, ParameterDirection.Input, false, sUserName);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    XRole[] roles;                                      // массив системных ролей
                    Guid    SystemUserID;                               // идентификатор пользователя
                    Guid    EmployeeID = Guid.Empty;                    // идентификатор сотрудника
                    string  sLastName  = null;                          // фамилия сотрудника
                    string  sFirstName = null;                          // имя сотрудника
                    string  sEMail     = null;                          // email сотрудника
                    bool    bIsAdmin;                                   // признак админа (необграниченного пользователя)
                    bool    bIsServiceAccount;                          // признак сервисного аккаунта
                    int     nIndex;                                     // временная - индекс колонки
                    int     nPrivileges;                                // числовая маска привилегий (в БД привилегии лежат как флаги)
                    int     nWorkingMinutesInDay;                       // количество рабочих часов в сутках
                    bool    bAccesssPermitted = true;

                    if (reader.Read())
                    {
                        // получим маску привилегий, выданных пользователю явно
                        nPrivileges          = reader.GetInt32(reader.GetOrdinal("SystemPrivileges"));                          // поле SystemPrivileges - not null
                        SystemUserID         = reader.GetGuid(reader.GetOrdinal("SysUserID"));
                        bIsAdmin             = reader.GetBoolean(reader.GetOrdinal("IsAdmin"));
                        bIsServiceAccount    = reader.GetBoolean(reader.GetOrdinal("IsServiceAccount"));
                        nWorkingMinutesInDay = reader.GetInt32(reader.GetOrdinal("WorkingMinutesInDay"));
                        nIndex = reader.GetOrdinal("EmpID");
                        if (!reader.IsDBNull(nIndex))
                        {
                            // если пользователь является сотрудником
                            EmployeeID        = reader.GetGuid(nIndex);
                            sLastName         = reader.GetString(reader.GetOrdinal("LastName"));
                            sFirstName        = reader.GetString(reader.GetOrdinal("FirstName"));
                            bAccesssPermitted = reader.GetInt32(reader.GetOrdinal("AccessPermitted")) == 1;
                            nIndex            = reader.GetOrdinal("EMail");
                            if (!reader.IsDBNull(nIndex))
                            {
                                sEMail = reader.GetString(nIndex);
                            }
                        }
                    }
                    else
                    {
                        // не нашли пользователя
                        return(CreateAnonymousUser());
                    }

                    // зачитаем все роли текущего юзера
                    ArrayList aRoles                 = new ArrayList();                 // список объектов XRole - роли пользователя
                    int       nIndex_RoleName        = reader.GetOrdinal("RoleName");
                    int       nIndex_RoleDescription = reader.GetOrdinal("RoleDescription");
                    int       nIndex_RolePrivileges  = reader.GetOrdinal("RolePrivileges");
                    if (!reader.IsDBNull(nIndex_RoleName))
                    {
                        // по всем ролям пользователя
                        do
                        {
                            string sDescription = String.Empty;
                            if (!reader.IsDBNull(nIndex_RoleDescription))
                            {
                                sDescription = reader.GetString(nIndex_RoleDescription);
                            }
                            // объединим маску привилегий с привилегиями текущей роли
                            nPrivileges = nPrivileges | reader.GetInt32(nIndex_RolePrivileges);
                            aRoles.Add(new XRole(reader.GetString(nIndex_RoleName), sDescription));
                        } while(reader.Read());
                    }
                    roles = new XRole[aRoles.Count];
                    aRoles.CopyTo(roles);
                    // превратим маску привилегий в массив объектов
                    XPrivilegeSet privilege_set = PrivilegesHelper.CreatePrivilegeSet((SystemPrivileges)nPrivileges);

                    // создадим описание пользователя и дополним атрибуты, специфичные для нашего приложения
                    user = new ITUser(sUserName, roles, privilege_set);
                    user.SystemUserID     = SystemUserID;
                    user.IsUnrestricted   = bIsAdmin;
                    user.IsServiceAccount = bIsServiceAccount;
                    user.AccessPermitted  = bAccesssPermitted;
                    if (EmployeeID != Guid.Empty)
                    {
                        // если пользователь - сотрудник
                        user.EmployeeID      = EmployeeID;
                        user.LastName        = sLastName;
                        user.FirstName       = sFirstName;
                        user.EMail           = sEMail;
                        user.WorkdayDuration = nWorkingMinutesInDay;
                    }
                }
                readUserActivityTypes(user, con);
                readUserManagedOrganizations(user, con);
            }
            return(user);
        }
Beispiel #29
0
        public override void Execute(XTriggerArgs args, Croc.XmlFramework.Core.IXExecutionContext context)
        {
            DomainObjectData xobj            = args.TriggeredObject;
            bool             bUpdatedState   = xobj.HasUpdatedProp("State");
            bool             bUpdateIsLocked = xobj.HasUpdatedProp("IsLocked");

            if (!bUpdatedState && !bUpdateIsLocked)
            {
                return;
            }
            // если здесь значит изменилось хотя бы одно из полей: Состояние (State), Дата блокирования списаний (BlockDate)
            // Теперь надо зачитать предыдущие значения из БД, но только тех свойств, которые обновляются
            preloadProps(xobj, bUpdatedState, bUpdateIsLocked, context);
            if (bUpdateIsLocked)
            {
                bool oldValue = (bool)xobj.GetLoadedPropValue("IsLocked");
                bool newValue = (bool)xobj.GetUpdatedPropValue("IsLocked");
                if (oldValue != newValue)
                {
                    // изменение признака допустимости списания
                    DomainObjectData xobjHistory = getFolderHistoryObject(args.DataSet, xobj);
                    xobjHistory.SetUpdatedPropValue("Event", newValue?FolderHistoryEvents.IsLockedSetToTrue:FolderHistoryEvents.IsLockedSetToFalse);
                }
            }

            if (bUpdatedState)
            {
                FolderStates stateOld = (FolderStates)xobj.GetLoadedPropValue("State");
                FolderStates stateNew = (FolderStates)xobj.GetUpdatedPropValue("State");
                if (stateOld != stateNew)
                {
                    // состояние изменилось
                    //	- проверим на запрещенные переходы
                    checkFolderStateChanging(stateOld, stateNew);
                    DomainObjectData    xobjHistory = getFolderHistoryObject(args.DataSet, xobj);
                    FolderHistoryEvents eventType;
                    if (stateNew == FolderStates.Closed)
                    {
                        eventType = FolderHistoryEvents.Closing;
                    }
                    else if (stateNew == FolderStates.Frozen)
                    {
                        eventType = FolderHistoryEvents.Frozing;
                    }
                    else if (stateNew == FolderStates.WaitingToClose)
                    {
                        eventType = FolderHistoryEvents.WaitingToClose;
                    }
                    else                        // if (stateNew == FolderStates.Open)
                    {
                        eventType = FolderHistoryEvents.Opening;
                    }
                    xobjHistory.SetUpdatedPropValue("Event", eventType);

                    // обработаем переход в состояние "Закрыто":
                    if (!xobj.IsNew && (stateNew == FolderStates.Closed || stateNew == FolderStates.WaitingToClose))
                    {
                        //	1. Проверим, что все инциденты (во всех вложенных папках) находятся в конечных состояниях
                        XDbCommand cmd = context.Connection.CreateCommand(@"
							SELECT 1 
							FROM Folder f_s WITH(NOLOCK)
								JOIN Folder f WITH(NOLOCK) ON f.LIndex >= f_s.LIndex AND f.RIndex <= f_s.RIndex AND f.Customer = f_s.Customer
									JOIN Incident i WITH(NOLOCK) ON f.ObjectID = i.Folder
										JOIN IncidentState i_st WITH(NOLOCK) ON i.State = i_st.ObjectID AND i_st.Category IN (1,2)	
							WHERE f_s.ObjectID = @ObjectID
							"                            );
                        cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, xobj.ObjectID);
                        if (cmd.ExecuteScalar() != null)
                        {
                            throw new XBusinessLogicException("Папка не может быть переведена в состояние \"Закрыто\" или \"Ожидание закрытия\", так как содержит незавершенные инциденты");
                        }
                    }

                    // добавим в датаграмму подчиненные папки с установленным состоянием новым состояние
                    // Обработка папок зависит от нового состояния
                    fillDataSetWithChildFoldersWithUpdatedState(context.Connection, args.DataSet, xobj.ObjectID, stateNew);
                }
            }
        }
        public override void ProcessParams(IDictionary paramsValues, Dictionary <string, StringBuilder> hashConditions, XDbCommand cmd)
        {
            // из текста param-selector'a достанем наименование DB-параметра, который надо создать
            string sPackedParamName = this.DataSourceInfo.Params["Directions"].GetParamProcessors()[0].Xml.InnerText;

            if (paramsValues.Contains("Directions"))
            {
                SQLUniqueidentifierListCreator listCreator = new SQLUniqueidentifierListCreator();
                foreach (Guid value in (IList)paramsValues["Directions"])
                {
                    listCreator.AddValue(value);
                }
                paramsValues.Remove("Directions");
                byte[] data = listCreator.GetListAndReset();
                cmd.Parameters.Add(sPackedParamName, XPropType.vt_bin, ParameterDirection.Input, false, data);
            }
            else
            {
                // иначе в качестве значения параметра передадим NULL
                cmd.Parameters.Add(sPackedParamName, XPropType.vt_bin, ParameterDirection.Input, false, DBNull.Value);
            }
            if (!paramsValues.Contains("ViewAllOrganizations"))
            {
                ITUser user = (ITUser)XSecurityManager.Instance.GetCurrentUser();
                paramsValues.Add("ViewAllOrganizations", user.HasPrivilege(SystemPrivilegesItem.ViewAllOrganizations.Name));
            }
        }