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);
        }
 private string getUsersEMail(GetMailMsgInfoRequest request, IXExecutionContext context)
 {
     // если заданы идентификаторы сотрудников, чьи адреса требуется получить
     if (request.EmployeeIDs != null && request.EmployeeIDs.Length > 0)
     {
         return(getUsersEMail(request.EmployeeIDs, context));
     }
     // если сотрудники явно не заданы, и задан идентификатор инцидента, то получим всех исполнителей инцидента
     if (request.ObjectType == "Incident")
     {
         return(getIncidentUsersEMail(request.ObjectID, context));
     }
     // иначе получим всех участников проекта
     return(getFolderUsersEMail(request.ObjectID, context));
 }
        public GetMailMsgInfoResponse Execute(GetMailMsgInfoRequest request, IXExecutionContext context)
        {
            if (request.ObjectType != "Incident" && request.ObjectType != "Folder")
            {
                throw new ArgumentException("Поддерживается два типа Incident и Folder, передано: " + request.ObjectType);
            }
            bool bLinkToIncident        = request.ObjectType == "Incident";
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            // загрузим Папку и Инцидент
            DomainObjectData xobjFolder   = loadFolderAndIncident(dataSet, request, context);
            DomainObjectData xobjIncident = null;

            if (bLinkToIncident)
            {
                xobjIncident = dataSet.Find("Incident", request.ObjectID);
            }

            // Получим путь к папке от корневой
            XDataSource ds       = context.Connection.GetDataSource("GetFolderPath");
            Hashtable   dsParams = new Hashtable();

            dsParams.Add("FolderID", xobjFolder.ObjectID);
            ds.SubstituteNamedParams(dsParams, true);
            GetMailMsgInfoResponse response = new GetMailMsgInfoResponse();

            response.FolderPath = "Проект: " + (string)ds.ExecuteScalar();

            StringBuilder bld = new StringBuilder();

            // заголовок - наименование инцидента или проекта
            bld.Append("ITRACKER: ");
            if (bLinkToIncident)
            {
                bld.Append("Инцидент №");
                bld.Append(xobjIncident.GetLoadedPropValue("Number"));
                bld.Append(" - ");
                bld.Append(xobjIncident.GetLoadedPropValue("Name"));
            }
            else
            {
                bld.Append(xobjFolder.GetLoadedPropValue("Name"));
            }
            response.Subject = bld.ToString();

            XmlNodeList xmlNodes = context.Config.SelectNodes("it:app-data/it:system-location/*");

            string[] aAppInstanceUrls = new string[xmlNodes.Count];
            for (int i = 0; i < xmlNodes.Count; ++i)
            {
                aAppInstanceUrls[i] = xmlNodes[i].InnerText;
                if (!aAppInstanceUrls[i].EndsWith("/"))
                {
                    aAppInstanceUrls[i] = aAppInstanceUrls[i] + "/";
                }
            }

            // ссылки на проект
            bld.Length = 0;
            bld.Append("Просмотр проекта:");
            bld.Append(Environment.NewLine);
            foreach (string sAppUrl in aAppInstanceUrls)
            {
                bld.AppendFormat("\t{0}x-get-report.aspx?Name=r-Folder.xml&ID={1}{2}", sAppUrl, xobjFolder.ObjectID, Environment.NewLine);
            }
            bld.Append("Открыть в дереве:");
            bld.Append(Environment.NewLine);
            foreach (string sAppUrl in aAppInstanceUrls)
            {
                bld.AppendFormat("\t{0}x-tree.aspx?METANAME=Main&LocateFolderByID={1}{2}", sAppUrl, xobjFolder.ObjectID, Environment.NewLine);
            }
            response.ProjectLinks = bld.ToString();

            // ссылки на инцидент
            bld.Length = 0;
            if (bLinkToIncident)
            {
                bld.Append("Редактирование инцидента:");
                bld.Append(Environment.NewLine);
                foreach (string sAppUrl in aAppInstanceUrls)
                {
                    bld.AppendFormat("\t{0}x-list.aspx?OT=Incident&METANAME=IncidentSearchingList&OpenEditorByIncidentID={1}{2}", sAppUrl, xobjIncident.ObjectID, Environment.NewLine);
                }
                bld.Append("Просмотр инцидента:");
                bld.Append(Environment.NewLine);
                foreach (string sAppUrl in aAppInstanceUrls)
                {
                    bld.AppendFormat("\t{0}x-get-report.aspx?NAME=r-Incident.xml&DontCacheXslfo=true&IncidentID={1}{2}", sAppUrl, xobjIncident.ObjectID, Environment.NewLine);
                }
                bld.Append("Открыть в дереве:");
                bld.Append(Environment.NewLine);
                foreach (string sAppUrl in aAppInstanceUrls)
                {
                    bld.AppendFormat("\t{0}x-tree.aspx?METANAME=Main&LocateIncidentByID={1}{2}", sAppUrl, xobjIncident.ObjectID, Environment.NewLine);
                }
                response.IncidentLinks = bld.ToString();
            }
            response.To = getUsersEMail(request, context);

            return(response);
        }