/// <summary>
        /// Пошук листів у яких поле searchTag >= fromDate
        /// </summary>
        /// <param name="fromDate"></param>
        /// <param name="searchTag"></param>
        /// <returns></returns>
        public static IRestrictionHelper GetRestrictionStartDate(DateTime fromDate, TPropertyTag searchTag)
        {
            //relopGE - "більше або дорівнює"
            //relopGT - "більше"

            PropertyRestrictionHelper startDateRestriction = new PropertyRestrictionHelper(searchTag, fromDate, DS.relopGE.ConstVal);

            return(startDateRestriction);
        }
        /// <summary>
        /// Пошук листів, у яких поле searchTag <= toDate
        /// </summary>
        /// <param name="toDate"></param>
        /// <param name="searchTag"></param>
        /// <returns></returns>
        public static IRestrictionHelper GetRestrictionEndDate(DateTime toDate, TPropertyTag searchTag)
        {
            //relopLE - "менше або дорівнює"
            //relopLT - "менше"

            PropertyRestrictionHelper endDateRestriction = new PropertyRestrictionHelper(searchTag, toDate, DS.relopLE.ConstVal);

            return(endDateRestriction);
        }
Beispiel #3
0
        public BaseDocument(ISession session, OID parentFolderID, OID categoryID)
        {
            _Session              = session;
            _ParentFolderID       = parentFolderID;
            _ID                   = Converters.OID.NewOID(parentFolderID._base);
            _CategoryID           = categoryID;
            _CreationContainerTag = Foss.FossDoc.ExternalModules.BusinessLogic.Schema.Folder.Attributes.Documents.Tag;

            _Props[Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.ObjectCategoryOID] = Converters.Properties.ObjectPropertyBuilder.Create(_CategoryID, Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.ObjectCategoryOID);

            if (_GenerateDisplayName)
            {
                //Имя документа сформируем
                string catName = categoryID.ToStringRepresentation();
                var    props   = _Session.ObjectDataManager.GetProperties(categoryID, Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName);
                if (props[0].PropertyTag.IsEquals(Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName))
                {
                    catName = props[0].Value.GetstrVal();
                }

                string docName = string.Format("{0} ({1}) {2}", catName, _Session.ObjectDataManager.GetObjectDisplayName(session.AccessControlManager.CurrentUserOID), DateTime.Now);
                _Props[Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName] = Converters.Properties.ObjectPropertyBuilder.Create(docName, Foss.FossDoc.ApplicationServer.ObjectDataManagment.Schema.PropertyTags.DisplayName);
            }
        }
Beispiel #4
0
        static void Main(string[] args)
        {
            try
            {
                //Строка підключення до сервера. Логін - dilovod
                //Змініть localhost на і'мя машини де у вас сервер.
                //Якщо у вас SSL-з'єднання, формат строки інший: "iiop-ssl://localhost:11301/AccessRoot;Login=dilovod;Password=123;AuthenticationAlgorithm=FossDoc;ClientAuthentication=Foss.FossDoc.ApplicationServer.Connection.ClientSSLAuthentication, Foss.FossDoc.ApplicationServer.Connection;"
                string connectionString = "URL=corbaloc::1.2@andrewsalko:11301/AccessRoot;Login=Деловод;Password=123;AuthenticationAlgorithm=FossDoc;";

                //Якщо у вас Windows-аутентифікація (ActiveDirectory) то логін та пароль передавати не потрібно:
                //string connectionString = "URL=corbaloc::1.2@andrewsalko:11301/AccessRoot;AuthenticationAlgorithm=Windows;";

                //Ви можете зберігати сессію достатньо довго, але не забувайте про Dispose
                using (ISession session = (ISession)Foss.FossDoc.ApplicationServer.Connection.Connector.Connect(connectionString))
                {
                    //менеджер для роботи з об'єктами (через нього ви отримаєте будь-які властивості, наприклад Тема листа, відправник, наявність файлів та інше)
                    var obj = session.ObjectDataManager;

                    //Сервер сам завантажує та зберігає листи у базі. Наш додаток лише перевіряє, чи є у папці Вхідні нові листи (які поточний користувач не читав)
                    //Нам потрібно знати папку Вхідні (її ідентифікатор) для поточного користувача
                    OID inboxID = session.MessagingManager.GetSpecialMessagingFolder(Foss.FossDoc.ApplicationServer.Messaging.SpecialMessagingFolder.Inbox);

                    //структура DS.OID схожа на Guid, але має додаткові 4 байти. усі об'єкти у FossDoc мають свій унікальний ідентифікатор


                    //Нам потрібен "фільтр" щоб знайти повідомлення за різними ознаками, наприклад "непрочитані", або у діапазоні дати.
                    var nonReadRestrict = SearchRestrictions.GetRestrictForNonReadMessages();

                    //Дивись клас SearchRestrictions - приклади пошуку за діапазонами дат, або більше-менше заданої дати.
                    var today = DateTime.Now;

                    DateTime startDate = today;
                    //кінець поточного дня
                    DateTime endDate = new DateTime(today.Year, today.Month, today.Day, 23, 59, 59);
                    //PR_MESSAGE_DELIVERY_TIME - "Отримано" (дата отримання листа)
                    var dateRangeRestrict = SearchRestrictions.GetDateRangeRestriction(startDate, endDate, Foss.FossDoc.ApplicationServer.Messaging.Schema.InboundMessage.PR_MESSAGE_DELIVERY_TIME);

                    var restrict = nonReadRestrict;                     //Можна застосувати dateRangeRestrict - для пошуку листів у діапазоні дати отримання

                    //Метод GetChildren отримує дочірні обєкти в батьківському об'єкті за вказаним тегом.
                    //Тег - можна вважати іменем властивості, хоча це структура з 4 байтів, наприклад: 0x360F1F00 - це тег "Документи в папці".
                    //Наприклад у папки є гілки "Документи в папці" та "Папки в папці". У листа - "Файли".
                    //наведений приклад GetChildren отримує листи (ідентифікатори) з папки Вхідні за достатньо популярним тегом "Документи в папці", із застосуванням фільтру tblMain.
                    //У папці може бути тисячі листів, а нам потрібні тількі нові (непрочитані).

                    OID[] messagesIDs = obj.GetChildren(new OID[] { inboxID }, new TPropertyTag[] { Foss.FossDoc.ApplicationServer.Messaging.Schema.MessagesFolder.PR_CONTAINER_CONTENTS }, restrict);
                    if (messagesIDs == null || messagesIDs.Length == 0)
                    {
                        _Log("Нових листів не знайдено");
                        return;                        //нема нових email
                    }

                    string appDir = new Uri(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase)).LocalPath;

                    for (int i = 0; i < messagesIDs.Length; i++)
                    {
                        OID msgID = messagesIDs[i];

                        //тут ми просто виводимо ідентифікатор листа, його можна побачити на вкладці Об'єкт.
                        _Log("Лист {0}", msgID.ToStringRepresentation());

                        //Тепер ми можемо отримати властивості листа. Багато з них можна побачити на вкладці Обєкт, але контейнерні властивості треба дивитися у дереві (або окремих вкладках)
                        //Це стосується "Файли" або "Отримувачі".
                        //А поки що ми запитаємо лише дві властовості - Тема та Адреса відправника.

                        //tags - це масив властовостей, які ми хочемо запитати в сервера. Багато з них можна знайти в інтерфейсах сервера, або ввести власноруч якщо скопіювати тег з адміністрування.
                        //На вкладці Об'єкт, угорі активуйте показ тегів та унікальних імен (Show tags, Show unique names)
                        //var testTag = Converters.PropertyTag.FromUInt32(0x0C1F001E);    //це те ж саме що й PR_SENDER_EMAIL_ADDRESS

                        TPropertyTag[] tags = new TPropertyTag[]
                        {
                            Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SUBJECT,
                            Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SENDER_EMAIL_ADDRESS
                        };

                        var props = obj.GetProperties(msgID, tags);

                        if (props == null)
                        {
                            //Важливо завжди перевіряти результат GetProperties на null. Якщо у вас немає доступу на читання обєкта або його не існує у базі, ви отримаєте null.
                            _Log("Об'єкт не існує або немає доступу на читання: {0}", msgID.ToStringRepresentation());
                            continue;
                        }

                        //Ми запитали дві властивості, та у результаті сервер збереже порядок - першим йде PR_SUBJECT (Тема листа), а потім адреса відправника
                        if (props[0].PropertyTag.IsEquals(Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SUBJECT))
                        {
                            //Сервер повертає спец.структуру, та в неї перевірте тег - він повинен співпасти. Якщо ні - властивість не існує, та звертатися до значення не можна.
                            string subject = props[0].Value.GetstrVal();
                            _Log("Тема:{0}", subject);
                        }

                        if (props[1].PropertyTag.IsEquals(Foss.FossDoc.ApplicationServer.Messaging.Schema.Message.PR_SENDER_EMAIL_ADDRESS))
                        {
                            string senderAddr = props[1].Value.GetstrVal();
                            _Log("Адреса відправника:{0}", senderAddr);
                        }

                        //Ми створимо окрему папку для кожного листа, за його ідентифікатором:
                        string destFolderPath = Path.Combine(appDir, msgID.ToStringRepresentation());
                        if (Directory.Exists(destFolderPath))
                        {
                            //якщо папка вже існує, ми її видалимо
                            Directory.Delete(destFolderPath, true);
                        }

                        Directory.CreateDirectory(destFolderPath);

                        //У листа можуть бути файли, але не обов'язково. Метод нижче це проаналізує та завантажить файли на диск
                        _DownloadAttaches(obj, msgID, destFolderPath);

                        //Якщо необхідно "Прочитати" лист як звичайній користувач - відкрийте цей виклик:
                        //session.MessagingManager.SetReadFlag(new OID[] { msgID }, true);
                    }

                    _Log("Виконано");
                }                //using
            }
            catch (Exception ex)
            {
                _Log(ex.ToString());
            }
        }
        /// <summary>
        /// Діапазон дати (від...до). Увага: дата-час містить хвилини та секунди. У разі, якщо вам потрібно шукати "за датою",
        /// рекомендується брати від 00:00:00 до 23:59:59 кінцевої дати, таким чином усі необхідні документи потраплять до виборки.
        /// </summary>
        /// <param name="start">Дата-час початку</param>
        /// <param name="end">Дата-час закінчення</param>
        /// <param name="searchTag">Поле</param>
        /// <returns></returns>
        public static DS.TableRestriction GetDateRangeRestriction(DateTime start, DateTime end, TPropertyTag searchTag)
        {
            var resStart = GetRestrictionStartDate(start, searchTag);
            var resEnd   = GetRestrictionEndDate(end, searchTag);

            //обєднуємо "AND" умовою
            TableRestrictionHelper tblAND = new TableRestrictionHelper(DS.resAND.ConstVal, resStart, resEnd);

            return(tblAND);
        }