RequestProcessingTaskRouteHandlers.cs 9 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using Sungero.Workflow;
using DirRX.Storage.RequestProcessingTask;
using Newtonsoft.Json.Linq;

namespace DirRX.Storage.Server
{
  partial class RequestProcessingTaskRouteHandlers
  {

    public virtual void StartBlock7(Sungero.Workflow.Server.NoticeArguments e)
    {
      // Уведомление инициатору о результатах выполнения запроса в архив.
      if (_obj.Initiator == null)
        return;
      
      var assignment = DirRX.Storage.RequestProcessingAssignments.GetAll(x => x.MainTask.Id == _obj.MainTask.Id).FirstOrDefault();
      var accessUser = DirRX.Storage.PublicFunctions.Module.Remote.GetEmployeeForUser(assignment.AccessUser);
      e.Block.Performers.Add(accessUser);
      e.Block.Performers.Add(_obj.Initiator);
      e.Block.Subject = RequestProcessingTasks.Resources.InfoResultNoticeSubjectFormat(_obj.Subject);

    }

    public virtual void CompleteAssignment4(DirRX.Storage.IRequestProcessingAssignment assignment, DirRX.Storage.Server.RequestProcessingAssignmentArguments e)
    {
      // Сохранить json-результаты в свойстве задачи.
      _obj.RequestResults = Functions.RequestProcessingAssignment.GetRequestResults(assignment);
      
      var folder = _obj.AttachmentGroup.All.FirstOrDefault(x => Folders.Is(x));
      var accessEmployee = DirRX.Storage.PublicFunctions.Module.Remote.GetEmployeeForUser(assignment.AccessUser);
      // Предоставить временный доступ к документам.
      if (assignment.RequestKind == Storage.RequestProcessingAssignment.RequestKind.Access)
      {
        if (folder != null)
        {
          // Предоставить права на чтение папки.
          folder.AccessRights.Grant(assignment.AccessUser, DefaultAccessRightsTypes.Read);
          folder.AccessRights.Save();
          
          // Предоставить права на каждый документ в папке.
          foreach (var documentId in Folders.As(folder).Items.Where(x => Sungero.Content.ElectronicDocuments.Is(x)).Select(x => x.Id))
          {
            var asyncHandler = AsyncHandlers.GrantTemporaryAccessRightsToRead.Create();
            asyncHandler.documentId = documentId;
            asyncHandler.request = _obj.Subject;
            asyncHandler.termFrom = assignment.AccessTermFrom.Value;
            asyncHandler.termTo = assignment.AccessTermTo.Value;
            asyncHandler.userId = assignment.AccessUser.Id;
            asyncHandler.ExecuteAsync();
          }
          
          // Записать результат в текст задания.
          var noticeText = DirRX.Storage.RequestProcessingTasks.Resources.FolderUrlFormat(Hyperlinks.Get(folder)).ToString();
          if (assignment.AccessUser != null)
          {
            noticeText += Environment.NewLine;
            noticeText += DirRX.Storage.RequestProcessingTasks.Resources.InfoAccessGranted;
            if (assignment.AccessTermFrom.HasValue)
              noticeText += DirRX.Storage.RequestProcessingTasks.Resources.InfoAccessFromFormat(assignment.AccessTermFrom.Value.ToString());
            if (assignment.AccessTermTo.HasValue)
              noticeText += DirRX.Storage.RequestProcessingTasks.Resources.InfoAccessToFormat(assignment.AccessTermTo.Value.ToString());
            
            noticeText += DirRX.Storage.RequestProcessingTasks.Resources.InfoAccessLoginFormat(assignment.AccessUser.Login.LoginName);
            noticeText += Environment.NewLine;
          }
          assignment.ActiveText = noticeText + assignment.ActiveText;
        }
      }
      
      // Записать в историю документа инфо о запросе
      if (assignment.RequestKind != Storage.RequestProcessingAssignment.RequestKind.Access)
      {
        if (folder != null)
        {
          foreach (var documentId in Folders.As(folder).Items.Where(x => Sungero.Docflow.OfficialDocuments.Is(x)).Select(x => x.Id))
          {
            var document = Sungero.Docflow.OfficialDocuments.Get(documentId);
            if (document != null)
            {
              document.History.Write(new Sungero.Core.Enumeration("Request"), null, _obj.Subject);
            }
          }
        }
      }
      
      if (!string.IsNullOrEmpty(assignment.InitiatorEmail))
      {
        try
        {
          var message = Mail.CreateMailMessage();
          message.Subject = RequestProcessingTasks.Resources.InfoResultNoticeSubjectFormat(_obj.Subject);
          message.Body = assignment.ActiveText;
          message.Priority = MailPriority.Normal;
          message.From = _obj.Archivist.DisplayValue;
          message.To.Add(assignment.InitiatorEmail);
          if (accessEmployee != null)
            if (!string.IsNullOrEmpty(accessEmployee.Email))
              message.To.Add(accessEmployee.Email);
          Mail.Send(message);
        }
        catch (Exception ex)
        {
          Logger.Debug("Не удалось отправить уведомление о результатах по электронной почте");
          Logger.Debug(ex.ToString());
        }
      }
    }

    public virtual void StartBlock4(DirRX.Storage.Server.RequestProcessingAssignmentArguments e)
    {
      if (string.IsNullOrEmpty(_obj.RequestData))
        throw AppliedCodeException.Create("Данные запроса не найдены");
      
      // Распарсить данные запроса.
      var json = JObject.Parse(_obj.RequestData);

      if (json == null)
        throw AppliedCodeException.Create(Resources.ErrorInvalidRequestDataFormat(_obj.RequestData));
      
      var sourceUid = json.Value<string>("Source");
      var requestNumber = json.Value<string>("RequestNumber");
      var requestKindString = json.Value<string>("RequestKind");
      var requestKind = new Sungero.Core.Enumeration(requestKindString);
      var requestInitiator = json.Value<string>("Initiator");
      var requestEmail = json.Value<string>("Email");
      var requestText = json.Value<string>("RequestText");
      var archiveLogin = json.Value<string>("ArchiveLogin");
      var contactInfo = json.Value<string>("ContactInfo");

      // Проверить наличие обязательных свойств.
      if (string.IsNullOrEmpty(requestKindString) || string.IsNullOrEmpty(requestInitiator))
        throw AppliedCodeException.Create(Resources.ErrorInvalidRequestDataFormat(_obj.RequestData));
      
      // Если вид запроса не заполнен, значит задача создана автоматически при получении данных из другой системы и следует заполнить свойства задачи.
      if (!_obj.RequestKind.HasValue)
      {
        _obj.RequestKind = requestKind;
        _obj.ActiveText = requestText;
      }
      
      // Заполнить тему и текст задачи.
      var requestDate = Calendar.Now.ToShortDateString();
      var requestKindLocalized = Storage.RequestProcessingTasks.Info.Properties.RequestKind.GetLocalizedValue(_obj.RequestKind);
      _obj.Subject = RequestProcessingTasks.Resources.TaskSubjectFormat(requestKindLocalized, requestInitiator, requestDate, _obj.Id);
      
      // Создать и вложить папку для предоставления документов по запросу.
      var folder = Folders.Create();
      folder.Name = RequestProcessingTasks.Resources.AttachmentFolderNameFormat(requestInitiator, requestDate, _obj.Id);
      folder.Save();
      
      _obj.AttachmentGroup.All.Add(folder);
      _obj.Save();
      
      // Заполнить свойства задания.
      e.Block.Performers.Add(_obj.Archivist);
      e.Block.RequestKind = requestKind;
      e.Block.InitiatorFullName = requestInitiator;
      e.Block.InitiatorEmail = requestEmail;
      e.Block.Subject = string.Format("Исполните: \"{0}\"", _obj.Subject);

      if (!string.IsNullOrWhiteSpace(contactInfo))
        e.Block.ContactInfo = contactInfo;
      
      // Найти архивного пользователя по имени логина.
      if (_obj.RequestKind == RequestKind.Access)
      {
        // Фильтровать пользователей из роли "Пользователи архива".
        var archiveUsersIds = Storage.PublicFunctions.Module.Remote.GetArchiveUsers();
        
        if (_obj.Initiator != null && archiveUsersIds.Contains(_obj.Initiator))
          e.Block.AccessUser = _obj.Initiator;
        else if (!string.IsNullOrWhiteSpace(archiveLogin))
          e.Block.AccessUser = Users.GetAll(x => archiveUsersIds.Contains(x) && x.Login.LoginName.ToLower() == archiveLogin.ToLower()).FirstOrDefault();
        
        e.Block.AccessTermFrom = Calendar.Now;
        e.Block.AccessTermTo = Calendar.AddWorkingDays(e.Block.AccessTermFrom.Value, DirRX.Storage.Constants.RequestProcessingTask.DefaultAccessTerm);
      }
    }

  }
}