Пример #1
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);
        }
Пример #2
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);
                }
            }
        }
Пример #3
0
        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);
                    }
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Выполнение команды - типизированный вариант
        /// </summary>
        /// <param name="request">Запрос команды, должен иметь тип XGetPropertyRequest</param>
        /// <param name="context">Контекст выполнения команды</param>
        /// <returns>XGetPropertyResponse</returns>
        public new XGetPropertyResponse Execute(XGetPropertyRequest request, IXExecutionContext context)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            // создадим болванку объекта
            DomainObjectData xobj = dataSet.GetLoadedStub(request.TypeName, request.ObjectID);

            // загрузим свойства
            dataSet.LoadProperty(context.Connection, xobj, request.PropName);
            // создадим форматировщик
            DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);
            // и сериализуем свойство в XML
            XmlElement xmlProperty = formatter.SerializeProperty(xobj, request.PropName);

            // по всем объектам в свойстве (LoadProperty вызывается не только для объектных свойств - еще для bin и text)
            // обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа
            foreach (XmlElement xmlObject in xmlProperty.SelectNodes("*[*]"))
            {
                DomainObjectData xobjValue = xobj.Context.Find(xmlObject.LocalName, new Guid(xmlObject.GetAttribute("oid")));
                if (xobjValue == null)
                {
                    throw new ApplicationException("Не удалось найти в контексте типизированного объекта DomainObjectData для xml-объекта-значения свойства " + xmlProperty.LocalName + " объекта " + xmlObject.LocalName);
                }
                XmlObjectRightsProcessor.ProcessObject(xobjValue, xmlObject);
            }
            XGetPropertyResponse response = new XGetPropertyResponse(xmlProperty);

            return(response);
        }
Пример #5
0
        /// <summary>
        /// ћетод запуска операции на выполнение, Ђвходна¤ї точка операции
        /// </summary>
        /// <param name="request">«апрос на выполнение операции</param>
        /// <param name="context"> онтекст выполнени¤ операции</param>
        /// <returns>–езультат выполнени¤</returns>
        /// <remarks>
        /// -- ѕ≈–≈√–”∆≈ЌЌџ…, —“–ќ√ќ “»ѕ»«»–ќ¬јЌЌџ… ћ≈“ќƒ, ¬џ«џ¬ј≈“—я яƒ–ќћ
        /// -- ѕроверка параметров запроса реализована в методе Validate запроса,
        /// который автоматически вызываетс¤ ядром при получении запроса
        /// </remarks>
        public XGetObjectsRightsResponse Execute(XGetObjectsRightsRequest request, IXExecutionContext context)
        {
            Boolean[]     objectPermissionCheckList = new Boolean[request.Permissions.Length];
            IDictionary   checkedObjects            = new HybridDictionary();
            IDictionary   checkedTypes = new Hashtable();
            XObjectRights rights;

            int nIndex = -1;
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);

            foreach (XObjectPermission permission in request.Permissions)
            {
                bool bHasRight = true;

                if ((permission.Action & XObjectActionEnum.Create) == XObjectActionEnum.Create)
                {
                    if (checkedTypes.Contains(permission.TypeName))
                    {
                        bHasRight = (bool)checkedTypes[permission.TypeName];
                    }
                    else
                    {
                        bHasRight = XSecurityManager.Instance.GetRightsOnNewObject(
                            dataSet.CreateStubNew(permission.TypeName)
                            ).AllowCreate;
                        checkedTypes[permission.TypeName] = bHasRight;
                    }
                }

                if (bHasRight && (
                        ((permission.Action & XObjectActionEnum.Change) > 0) ||
                        ((permission.Action & XObjectActionEnum.Delete) > 0) ||
                        ((permission.Action & XObjectActionEnum.Read) > 0)
                        ))
                {
                    rights = (XObjectRights)checkedObjects[permission.TypeName + ":" + permission.ObjectID];
                    if (rights == null)
                    {
                        rights = XSecurityManager.Instance.GetObjectRights(
                            dataSet.GetLoadedStub(permission.TypeName, permission.ObjectID)
                            );
                        checkedObjects[permission.TypeName + ":" + permission.ObjectID] = rights;
                    }
                    bHasRight = ((permission.Action & XObjectActionEnum.Change) > 0) && rights.AllowParticalOrFullChange ||
                                ((permission.Action & XObjectActionEnum.Delete) > 0) && rights.AllowDelete ||
                                ((permission.Action & XObjectActionEnum.Read) > 0) && rights.AllowParticalOrFullRead;
                }
                // «аписываем полученный флаг в результирующий массив
                objectPermissionCheckList[++nIndex] = bHasRight;
            }

            // ‘ормируем результат операции
            return(new XGetObjectsRightsResponse(objectPermissionCheckList));
        }
Пример #6
0
        private XTreeMenuInfo getMenuForEmployee(Guid ObjectID, DomainObjectDataSet dataSet, IXExecutionContext context)
        {
            XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true);

            menu.CacheMode = XTreeMenuCacheMode.NoCache;
            menu.ExecutionHandlers.Add(new XUserCodeWeb("CompanyTree_Menu_ExecutionHandler"));

            // просмотр
            // Раскоментировать после удаления ссылок на НСИ
            //menu.Items.AddActionItem("Просмотр", StdActions.DoView).Parameters.Add("ReportURL", StdMenuUtils.GetEmployeeReportURL(context.Config,  ObjectID));

            DomainObjectData xobj   = dataSet.GetLoadedStub("Employee", ObjectID);
            XObjectRights    rights = XSecurityManager.Instance.GetObjectRights(xobj);

            // Редактировать
            if (rights.AllowParticalOrFullChange)
            {
                menu.Items.AddActionItem("Редактировать", StdActions.DoEdit).Default = true;
            }
            // Удалить
            if (rights.AllowDelete)
            {
                menu.Items.AddActionItem("Удалить", StdActions.DoDelete);
            }

            // Секция "Отчеты"
            //XMenuActionItem item;
            //XMenuSection sec = menu.Items.AddSection("Отчеты");
            //item = sec.Items.AddActionItem("Сальдо ДС", "DoView");
            //item.Parameters.Add("ReportURL", "x-get-report.aspx?name=r-EmployeeSaldoDS.xml&amp;EmployeeID=@@ObjectID");

            /*
             * item = sec.Items.AddActionItem("Инциденты и списания времени сотрудника", "DoRunReport");
             *          item.Parameters.Add("ReportName", "ReportEmployeeExpensesList");
             *          item.Parameters.Add("UrlParams", ".Employee=" + ObjectID);
             *          item = sec.Items.AddActionItem("Баланс списаний сотрудника", "DoRunReport");
             *          item.Parameters.Add("ReportName", "EmployeeExpensesBalance");
             *          item.Parameters.Add("UrlParams", ".Employee=" + ObjectID);
             * item = sec.Items.AddActionItem("Плановая занятость сотрудников", "DoRunReport");
             * item.Parameters.Add("ReportName", "Employment");
             * item.Parameters.Add("UrlParams", ".Employees=" + ObjectID + "&.Organizations=&.Departments=");
             */

            // Секция "Информация"
            XMenuSection sec = menu.Items.AddSection("Информация");

            fillEmployeeInfoSection(sec, ObjectID, context.Connection);
            return(menu);
        }
Пример #7
0
        /// <summary>
        /// Получение меню в runtime для уровня (treeLevelInfo задан) или пустой иерархии (treeLevelInfo равен null)
        /// </summary>
        /// <param name="treeLevelInfo">описание уровня, для которого запрашивается меню, или null</param>
        /// <param name="request">параметры с клиента</param>
        /// <returns></returns>
        public XTreeMenuInfo GetMenu(XTreeLevelInfoIT treeLevelInfo, XGetTreeMenuRequest request, IXExecutionContext context)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectData    xobj    = dataSet.GetLoadedStub(request.Path.PathNodes[0].ObjectType, request.Path.PathNodes[0].ObjectID);

            XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true);

            menu.CacheMode = XTreeMenuCacheMode.NoCache;
            XMenuActionItem item;

            XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj);

            if (rights.AllowParticalOrFullChange)
            {
                item        = menu.Items.AddActionItem("Редактировать", StdActions.DoEdit);
                item.Hotkey = "VK_ENTER";
                item.Parameters.Add("RefreshFlags", "TRM_NODE+TRM_PARENTNODE");
            }

            XNewObjectRights create_rights = XSecurityManager.Instance.GetRightsOnNewObject(dataSet.CreateNew(xobj.ObjectType, true));

            if (create_rights.AllowCreate)
            {
                item        = menu.Items.AddActionItem("Создать", StdActions.DoCreate);
                item.Hotkey = "VK_INS";
                item.Parameters.Add("RefreshFlags", "TRM_TREE");
                if (rights.AllowDelete)
                {
                    menu.Items.AddSeparatorItem();
                }
            }

            if (rights.AllowDelete)
            {
                item        = menu.Items.AddActionItem("Удалить", StdActions.DoDelete);
                item.Hotkey = "VK_DEL";
                item.Parameters.Add("RefreshFlags", "TRM_TREE");
            }

            return(menu);
        }
Пример #8
0
        private XTreeMenuInfo getMenuForOrganization(Guid ObjectID, DomainObjectDataSet dataSet, IXExecutionContext context)
        {
            XTreeMenuInfo   menu = new XTreeMenuInfo("@@Title", true);
            XMenuActionItem item;

            menu.CacheMode = XTreeMenuCacheMode.NoCache;
            menu.ExecutionHandlers.Add(new XUserCodeWeb("CompanyTree_Menu_ExecutionHandler"));

            // Создать отдел
            DomainObjectData xobjDep = dataSet.CreateNew("Department", true);

            xobjDep.SetUpdatedPropValue("Organization", ObjectID);
            XNewObjectRights create_right = XSecurityManager.Instance.GetRightsOnNewObject(xobjDep);

            if (create_right.AllowCreate)
            {
                item = menu.Items.AddActionItem("Создать отдел", StdActions.DoCreate);
                item.Parameters.Add("ObjectType", "Department");
                item.Parameters.Add("URLPARAMS", ".Organization=@@ObjectID&IsHomeOrg=@@IsHomeOrg");
                item.Parameters.Add("RefreshFlags", "TRM_CHILDS+TRM_NODE");
            }

            // Создать сотрудника
            DomainObjectData xobj = dataSet.CreateNew("Employee", true);

            xobj.SetUpdatedPropValue("Organization", ObjectID);
            create_right = XSecurityManager.Instance.GetRightsOnNewObject(xobj);
            if (create_right.AllowCreate)
            {
                item = menu.Items.AddActionItem("Создать сотрудника", StdActions.DoCreate);
                item.Parameters.Add("RefreshFlags", "TRM_CHILDS+TRM_NODE");
                item.Parameters.Add("ObjectType", "Employee");
                item.Parameters.Add("URLPARAMS", ".Organization=@@ObjectID&IsHomeOrg=@@IsHomeOrg");
            }

            if (menu.Items.Count > 0)
            {
                menu.Items.AddSeparatorItem();
            }
            xobj = dataSet.GetLoadedStub("Organization", ObjectID);
            XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj);

            // Редактировать
            if (rights.AllowParticalOrFullChange)
            {
                item         = menu.Items.AddActionItem("Редактировать", StdActions.DoEdit);
                item.Default = true;
                item.Hotkey  = "VK_ENTER";
                item.Parameters.Add("RefreshFlags", "TRM_CHILDS+TRM_NODE");
            }

            // Удалить
            if (rights.AllowDelete)
            {
                menu.Items.AddActionItem("Удалить отдел", StdActions.DoDelete).SeparatorBefore = true;
            }

            // Секция "Информация"

            /*
             * XMenuSection sec = menu.Items.AddSection("Информация");
             * sec.Items.AddInfoItem("", "@@IsTemporary");
             * sec = menu.Items.AddSection("Отчеты");
             * item = sec.Items.AddActionItem("Норма рабочего времени", "DoRunReport");
             * item.Parameters.Add("ReportName", "EmployeesRate");
             * item.Parameters.Add("UrlParams", ".Department=" + Guid.Empty + "&.Organization=" + ObjectID);
             * item = sec.Items.AddActionItem("Плановая занятость сотрудников", "DoRunReport");
             * item.Parameters.Add("ReportName", "Employment");
             * item.Parameters.Add("UrlParams", ".Employees=&.Departments=&.Organizations=" + ObjectID);
             */
            return(menu);
        }