/// <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); } }
/// <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(); }
/// <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); }
/// <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()); }
/// <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(); } } }
/// <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); }
/// <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); } }
/// <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); }