示例#1
0
        /// <summary>
        /// Получить дату последней синхронизации ящиком в СО.
        /// </summary>
        /// <param name="box">Ящик.</param>
        /// <returns>Дата последней синхронизации.</returns>
        public static DateTime GetLastSyncDate(IBusinessUnitBox box)
        {
            var key     = string.Format(Constants.Module.LastBoxSyncDate, box.Id);
            var command = string.Format(Queries.Module.GetLastSyncDate, key);

            try
            {
                var executionResult = Docflow.PublicFunctions.Module.ExecuteScalarSQLCommand(command);
                var date            = string.Empty;
                if (!(executionResult is DBNull) && executionResult != null)
                {
                    date = executionResult.ToString();
                }
                Logger.DebugFormat("Last box sync date in DB is {0} (UTC)", date);

                DateTime result = DateTime.Parse(date, null, System.Globalization.DateTimeStyles.AdjustToUniversal);

                return(result);
            }
            catch (Exception ex)
            {
                Logger.DebugFormat("Error while getting box sync date", ex);
                return(Calendar.SqlMinValue);
            }
        }
示例#2
0
        /// <summary>
        /// Создать уведомление об изменении оргструктуры абонентского ящика нашей организации.
        /// </summary>
        /// <param name="box">Абонентский ящик нашей организации.</param>
        /// <param name="newDepartmentBoxes">Новые ящики подразделений.</param>
        /// <param name="changedDepartmentBoxes">Измененные ящики подразделений.</param>
        /// <param name="deletedDepartmentBoxes">Удаленные ящики подразделений.</param>
        private static void CreateDepartmentBoxNotice(IBusinessUnitBox box, List <IDepartmentBox> newDepartmentBoxes, List <IDepartmentBox> changedDepartmentBoxes, List <IDepartmentBox> deletedDepartmentBoxes)
        {
            var task        = Workflow.SimpleTasks.Create();
            var dateWithUTC = Sungero.Docflow.PublicFunctions.Module.GetDateWithUTCLabel(Calendar.Now);
            var subject     = DepartmentBoxes.Resources.DepartmentBoxNoticeSubjectFormat(box.Name, dateWithUTC);

            task.Subject = Exchange.PublicFunctions.Module.CutText(subject, task.Info.Properties.Subject.Length);
            var step = task.RouteSteps.AddNew();

            step.AssignmentType = Workflow.SimpleTask.AssignmentType.Notice;
            step.Performer      = box.Responsible;

            if (newDepartmentBoxes.Any())
            {
                task.Subject        = DepartmentBoxes.Resources.DepartmentBoxAssignmentSubjectFormat(box.Name, dateWithUTC);
                step.AssignmentType = Workflow.SimpleTask.AssignmentType.Assignment;
                task.Deadline       = Calendar.Now.AddWorkingDays(step.Performer, 1);
                task.NeedsReview    = false;
                DepartmentBoxSection(task, newDepartmentBoxes, DepartmentBoxes.Resources.NewDepartmentBoxesNotice);
            }

            if (changedDepartmentBoxes.Any())
            {
                DepartmentBoxSection(task, changedDepartmentBoxes, DepartmentBoxes.Resources.ChangedDepartmentBoxesNotice);
            }

            if (deletedDepartmentBoxes.Any())
            {
                DepartmentBoxSection(task, deletedDepartmentBoxes, DepartmentBoxes.Resources.DeletedDepartmentBoxesNotice);

                // Уведомление ответственным о закрытии ящика подразделения.
                foreach (var responsible in deletedDepartmentBoxes.Where(b => b.Responsible != null && !Equals(b.Responsible, box.Responsible)).Select(b => b.Responsible))
                {
                    var deleteBoxTask = Workflow.SimpleTasks.Create();
                    deleteBoxTask.Subject = DepartmentBoxes.Resources.DeletedDepartmentBoxesReponsibleNotice;
                    var deleteBoxStep = deleteBoxTask.RouteSteps.AddNew();
                    deleteBoxStep.AssignmentType = Workflow.SimpleTask.AssignmentType.Notice;
                    deleteBoxStep.Performer      = responsible;
                    var responsibleBoxes = deletedDepartmentBoxes.Where(b => Equals(b.Responsible, responsible));

                    deleteBoxTask.ActiveText += DepartmentBoxes.Resources.DeletedDepartmentBoxesNotice + Environment.NewLine;
                    foreach (var departmentBox in responsibleBoxes)
                    {
                        deleteBoxTask.Attachments.Add(departmentBox);
                        deleteBoxTask.ActiveText += Constants.BusinessUnitBox.Delimiter;
                        deleteBoxTask.ActiveText += Hyperlinks.Get(departmentBox);
                        deleteBoxTask.ActiveText += Environment.NewLine;
                    }
                    deleteBoxTask.ActiveText += Environment.NewLine;
                    deleteBoxTask.Save();
                    deleteBoxTask.Start();
                }
            }

            task.Save();
            task.Start();
        }
示例#3
0
        /// <summary>
        /// Обновить дату последней синхронизаци ящика.
        /// </summary>
        /// <param name="notificationDate">Дата синхронизации ящика.</param>
        /// <param name="box">Ящик.</param>
        public static void UpdateLastSyncDate(DateTime notificationDate, IBusinessUnitBox box)
        {
            var key = string.Format(Constants.Module.LastBoxSyncDate, box.Id);

            var newDate = notificationDate.ToString("yyyy-MM-ddTHH:mm:ss.ffff+0");

            Docflow.PublicFunctions.Module.ExecuteSQLCommandFormat(Queries.Module.UpdateLastSyncDate, new[] { key, newDate });
            Logger.DebugFormat("Last box sync date is set to {0} (UTC)", newDate);
        }
示例#4
0
        /// <summary>
        /// Проверка, есть ли у текущего пользователя сертификат сервиса обмена.
        /// </summary>
        /// <param name="businessUnitBox">Абонентский ящик нашей организации.</param>
        /// <returns>True, если есть, иначе False.</returns>
        public virtual bool HasCurrentUserExchangeServiceCertificate(IBusinessUnitBox businessUnitBox)
        {
            // Получить доступные сертификаты.
            var availableCertificates = Certificates.GetAllCached().Where(x => Equals(x.Owner, Users.Current) && x.Enabled == true);

            // Проверить наличие сертификатов ответственного, если сервис предоставляет такую возможность.
            if (businessUnitBox.HasExchangeServiceCertificates == true)
            {
                availableCertificates = availableCertificates.Where(x => businessUnitBox.ExchangeServiceCertificates.Any(z => z.Certificate.Equals(x)));
            }

            return(availableCertificates.Any());
        }
示例#5
0
        /// <summary>
        /// Проставить статус соединения в абонентских ящиках подразделений.
        /// </summary>
        /// <param name="box">Абонентский ящик нашей организации.</param>
        public void SetDepartmentBoxConnectionStatus(IBusinessUnitBox box)
        {
            var departmentBoxes       = Functions.BoxBase.Remote.GetActiveChildBoxes(box);
            var closedDepartmentBoxes = Functions.BoxBase.Remote.GetClosedChildBoxes(box);

            departmentBoxes.AddRange(closedDepartmentBoxes);
            departmentBoxes = departmentBoxes.Where(x => !Equals(x.ConnectionStatus, box.ConnectionStatus)).ToList();
            foreach (var departmentBox in departmentBoxes)
            {
                if (!Equals(departmentBox.ConnectionStatus, box.ConnectionStatus))
                {
                    departmentBox.ConnectionStatus = box.ConnectionStatus;
                    departmentBox.Save();
                }
            }
        }
示例#6
0
        /// <summary>
        /// Создать задачу на обработку конфликтов синхронизации контрагентов.
        /// </summary>
        /// <param name="box">Абонентский ящик.</param>
        /// <param name="party">Организация из сервиса обмена.</param>
        /// <param name="parties">Список конфликтных контрагентов.</param>
        /// <returns>Задача на обработку конфликтов синхронизации контрагентов.</returns>
        public static ICounterpartyConflictProcessingTask Create(IBusinessUnitBox box,
                                                                 NpoComputer.DCX.Common.Organization party, List <Parties.ICounterparty> parties)
        {
            var task        = CounterpartyConflictProcessingTasks.Create();
            var dateWithUTC = Sungero.Docflow.PublicFunctions.Module.GetDateWithUTCLabel(Calendar.Now);
            var subject     =
                CounterpartyConflictProcessingTasks.Resources.ConflictTaskSubjectFormat(box.BusinessUnit.Name, box.ExchangeService.Name, dateWithUTC);

            task.Subject       = Exchange.PublicFunctions.Module.CutText(subject, task.Info.Properties.Subject.Length);
            task.ThreadSubject = CounterpartyConflictProcessingTasks.Resources.ConflictTaskThreadSubject;
            task.Assignee      = box.Responsible;
            task.MaxDeadline   = Calendar.Today.AddWorkingDays(task.Assignee, 2);

            if (parties.All(p => Parties.CompanyBases.Is(p) && Equals(Parties.CompanyBases.As(p).TRRC, party.Kpp)) ||
                parties.All(p => !Parties.CompanyBases.Is(p) && string.IsNullOrWhiteSpace(party.Kpp)))
            {
                task.ActiveText = CounterpartyConflictProcessingTasks.Resources.ConflictTaskMany;
                foreach (var attach in parties)
                {
                    task.ActiveText += string.Format("{0}{1}{2}", Environment.NewLine, Constants.BusinessUnitBox.Delimiter, Hyperlinks.Get(attach));
                }
            }
            else
            {
                task.ActiveText =
                    CounterpartyConflictProcessingTasks.Resources.ConflictTaskSingleFormat(party.Name, party.Inn, party.Kpp);
                if (!string.IsNullOrWhiteSpace(party.Ogrn))
                {
                    task.ActiveText += CounterpartyConflictProcessingTasks.Resources.ConflictTaskSingleOgrnFormat(Environment.NewLine, party.Ogrn);
                }
            }

            foreach (var attach in parties)
            {
                task.Attachments.Add(attach);
            }

            task.Save();
            return(task);
        }
示例#7
0
        /// <summary>
        /// Создать ящик подразделения.
        /// </summary>
        /// <param name="box">Абонентский ящик нашей организации.</param>
        public static void CreateDepartmentBoxes(IBusinessUnitBox box)
        {
            var createdDepartments     = DepartmentBoxes.GetAll(d => Equals(d.RootBox, box)).ToList();
            var newDepartmentBoxes     = new List <IDepartmentBox>();
            var changedDepartmentBoxes = new List <IDepartmentBox>();
            var deletedDepartmentBoxes = new List <IDepartmentBox>();
            var client = Functions.BusinessUnitBox.GetClient(box);

            // Обходим кэширование клиента DCX для получения актуальной оргструктуры.
            var allDepartments = client.GetOrganizationStructure(client.OurSubscriber.CounteragentId);
            var serviceHead    = allDepartments.SingleOrDefault(d => d.IsHead);
            var departments    = allDepartments.Where(d => !d.IsHead);

            // Создание / обновление абонентских ящиков подразделений.
            foreach (var department in departments)
            {
                var departmentBox = createdDepartments.SingleOrDefault(d => Equals(d.ServiceId, department.Id)) ?? DepartmentBoxes.Create();
                if (!Equals(departmentBox.ServiceId, department.Id))
                {
                    departmentBox.ServiceId = department.Id;
                }
                if (!Equals(departmentBox.RootBox, box))
                {
                    departmentBox.RootBox = box;
                }
                if (!Equals(departmentBox.ServiceName, department.Name))
                {
                    if (!string.IsNullOrEmpty(departmentBox.Name))
                    {
                        changedDepartmentBoxes.Add(departmentBox);
                    }
                    departmentBox.ServiceName = department.Name;
                }

                if (!departmentBox.AccessRights.IsGranted(DefaultAccessRightsTypes.Change, box.Responsible))
                {
                    departmentBox.AccessRights.Grant(box.Responsible, DefaultAccessRightsTypes.Change);
                }
                var exchangeRole = Sungero.ExchangeCore.PublicFunctions.Module.GetExchangeServiceUsersRole();
                if (!exchangeRole.AccessRights.IsGranted(DefaultAccessRightsTypes.Change, box.Responsible))
                {
                    exchangeRole.AccessRights.Grant(box.Responsible, DefaultAccessRightsTypes.Change);
                    exchangeRole.Save();
                }

                if (!createdDepartments.Contains(departmentBox))
                {
                    createdDepartments.Add(departmentBox);
                    newDepartmentBoxes.Add(departmentBox);
                }
            }

            // Проверка иерархии.
            foreach (var department in departments)
            {
                var departmentBox = createdDepartments.Single(d => Equals(d.ServiceId, department.Id));
                var parentbox     = createdDepartments.SingleOrDefault(d => Equals(d.ServiceId, department.ParentDepartmentId));
                if (department.ParentDepartmentId == null ||
                    department.ParentDepartmentId == Guid.Empty.ToString() ||
                    (serviceHead != null && department.ParentDepartmentId == serviceHead.Id))
                {
                    if (!Equals(departmentBox.ParentBox, box))
                    {
                        departmentBox.ParentBox = box;
                    }
                }
                else if (!Equals(departmentBox.ParentBox, parentbox))
                {
                    departmentBox.ParentBox = parentbox;
                }
            }

            // Закрытие удаленных ящиков.
            foreach (var department in createdDepartments)
            {
                var exists = departments.Any(d => Equals(d.Id, department.ServiceId));
                if (!exists && (department.IsDeleted == false || department.Status != Status.Closed))
                {
                    department.IsDeleted = true;
                    department.Status    = Status.Closed;
                    deletedDepartmentBoxes.Add(department);
                }
            }

            // Сохранение одной сущности может потянуть за собой остальные, так что парамсы обновляем до первого сохранения.
            foreach (var department in createdDepartments)
            {
                ((Domain.Shared.IExtendedEntity)department).Params[Constants.BoxBase.DisableSaveValidation] = true;
            }

            foreach (var department in createdDepartments.Where(x => x.State.IsChanged))
            {
                department.Save();
            }

            if (newDepartmentBoxes.Any() || changedDepartmentBoxes.Any() || deletedDepartmentBoxes.Any())
            {
                CreateDepartmentBoxNotice(box, newDepartmentBoxes, changedDepartmentBoxes, deletedDepartmentBoxes);
            }
        }
示例#8
0
        /// <summary>
        /// Создать задачу на обработку приглашения к эл. обмену от контрагента.
        /// </summary>
        /// <param name="counterparty">Контрагент.</param>
        /// <param name="box">Абонентский ящик.</param>
        /// <param name="organizationId">Ид контрагента в сервисе обмена.</param>
        /// <param name="comment">Комментарий приглашения.</param>
        /// <returns>Задача на обработку приглашения к эл. обмену от контрагента.</returns>
        public static IIncomingInvitationTask Create(Parties.ICounterparty counterparty, IBusinessUnitBox box, string organizationId, string comment)
        {
            var counterpartyBox = counterparty.ExchangeBoxes.Where(x => Equals(x.OrganizationId, organizationId)).Select(o => o.CounterpartyBox).FirstOrDefault();
            var invitationTask  = IncomingInvitationTasks.Create();
            var subject         = IncomingInvitationTasks.Resources.TaskSubjectFormat(counterparty.Name, box.BusinessUnit.Name, box.ExchangeService.Name);

            invitationTask.Subject    = Exchange.PublicFunctions.Module.CutText(subject, invitationTask.Info.Properties.Subject.Length);
            invitationTask.ActiveText = IncomingInvitationTasks.Resources.TaskActiveTextFormat(counterparty.Name, box.BusinessUnit.Name, box.ExchangeService.Name);

            if (!string.IsNullOrWhiteSpace(counterpartyBox))
            {
                invitationTask.ActiveText += Environment.NewLine;
                invitationTask.ActiveText += Environment.NewLine;
                invitationTask.ActiveText += IncomingInvitationTasks.Resources.CounterpartyBox;
                invitationTask.ActiveText += Environment.NewLine + counterpartyBox;
            }

            if (!string.IsNullOrWhiteSpace(comment))
            {
                invitationTask.ActiveText += Environment.NewLine;
                invitationTask.ActiveText += Environment.NewLine;
                invitationTask.ActiveText += IncomingInvitationTasks.Resources.AssignmentComment;
                invitationTask.ActiveText += Environment.NewLine + comment;
            }
            invitationTask.Box          = box;
            invitationTask.Counterparty = counterparty;
            invitationTask.Assignee     = box.Responsible;
            invitationTask.MaxDeadline  = Calendar.Now.AddWorkingDays(invitationTask.Assignee, 2);
            invitationTask.Attachments.Add(counterparty);
            invitationTask.OrganizationId = organizationId;
            invitationTask.Save();
            invitationTask.Start();
            return(invitationTask);
        }