RequestProcessingAssignmentActions.cs 7.08 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using DirRX.Storage.RequestProcessingAssignment;

namespace DirRX.Storage.Client
{
  partial class RequestProcessingAssignmentActions
  {
    public virtual void Reject(Sungero.Workflow.Client.ExecuteResultActionArgs e)
    {
      
    }

    public virtual bool CanReject(Sungero.Workflow.Client.CanExecuteResultActionArgs e)
    {
      return true;
    }

    public virtual void CreateDocument(Sungero.Domain.Client.ExecuteActionArgs e)
    {
      if (_obj.RequestKind == RequestKind.Extract)
      {
        // Создать карточку Архивной выписки.
        var document = Storage.PublicFunctions.Module.Remote.CreateArchiveExtract();
        document.Subject = _obj.Task.DisplayValue;
        document.Save();
        _obj.AttachmentGroup.All.Add(document);
      }
      else if (_obj.RequestKind == RequestKind.Reference)
      {
        // Создать карточку Архивной справки.
        var document = Storage.PublicFunctions.Module.Remote.CreateArchivalReference();
        document.Subject = _obj.Task.DisplayValue;
        document.Save();
        _obj.AttachmentGroup.All.Add(document);
      }
      else
      {
        // Создать простой документ.
        var document = Sungero.Docflow.SimpleDocuments.Create();
        document.ShowModal();
        if (!document.State.IsInserted)
          _obj.AttachmentGroup.All.Add(document);
      }
    }

    public virtual bool CanCreateDocument(Sungero.Domain.Client.CanExecuteActionArgs e)
    {
      return _obj.RequestKind == RequestKind.Extract || _obj.RequestKind == RequestKind.Reference;
    }

    public virtual void ExportDocuments(Sungero.Domain.Client.ExecuteActionArgs e)
    {
      var folder = _obj.AttachmentGroup.All.FirstOrDefault(x => Folders.Is(x));
      if (folder != null)
      {
        var errorIds = new List<int>();
        foreach (var item in Folders.As(folder).Items)
        {
          try
          {
            var eventLog = PublicFunctions.Module.Remote.GetArchiveEventLogEntry(item.Id);
            if (eventLog != null)
            {
              var fileName = string.Format("{0} {1}", _obj.Id, item.DisplayValue);
              var zip = PublicFunctions.ArchiveEventLog.Remote.ExportContainer(eventLog, fileName);
              if (zip != null)
                zip.Export();
              else
                errorIds.Add(item.Id);
            }
          }
          catch (Exception ex)
          {
            errorIds.Add(item.Id);
            var exception = ex.InnerException != null ? ex.InnerException : ex;
            Logger.Debug(exception.ToString());
          }
        }
        
        if (errorIds.Any())
          e.AddWarning(string.Format("Не удалось выгрузить документы ИД {0}.", string.Join(", ", errorIds)));
        else
          Dialogs.NotifyMessage("Документы выгружены");
      }
    }

    public virtual bool CanExportDocuments(Sungero.Domain.Client.CanExecuteActionArgs e)
    {
      // Отображать кнопку если есть документы в папке.
      var folder = _obj.AttachmentGroup.All.FirstOrDefault(x => Folders.Is(x));
      return folder != null && Folders.As(folder).Items.Any();
    }

    public virtual void SearchDocuments(Sungero.Domain.Client.ExecuteActionArgs e)
    {
      // Создать диалог для поиска архивных документов.
      var searchDialog = Dialogs.CreateSearchDialog<Sungero.Content.IElectronicDocument>();
      if (searchDialog.Show())
      {
        // Ограничить выбор документами, ссылки на которые есть в Журнале поступления и выбытия.
        var query = searchDialog.GetQuery();
        
        var nonArchiveIds = PublicFunctions.Module.Remote.FilterNonArchiveDocuments(query.Select(x => x.Id).ToList());
        if (nonArchiveIds.Any())
          query = query.Where(x => !nonArchiveIds.Contains(x.Id));
        
        // Отобразить найденные документы для выбора.
        var selected = query.ShowSelectMany();
        
        if (selected.Any())
        {
          // Добавить выбранные документы в область вложений.
          var folder = _obj.AttachmentGroup.All.FirstOrDefault(x => Folders.Is(x));
          if (folder != null)
          {
            var folderItems = Folders.As(folder).Items;
            foreach (var selectedItem in selected)
              folderItems.Add(selectedItem);
          }
          Dialogs.NotifyMessage("Ссылки на выбранные документы добавлены во вложенную папку.");
        }
      }
    }

    public virtual bool CanSearchDocuments(Sungero.Domain.Client.CanExecuteActionArgs e)
    {
      return _obj.AttachmentGroup.All.FirstOrDefault(x => Folders.Is(x)) != null;
    }

    public virtual void SendByEmail(Sungero.Domain.Client.ExecuteActionArgs e)
    {
      var mail = MailClient.CreateMail();
      mail.Subject = _obj.Task.Subject + ". Результаты";
      mail.To.Add(_obj.InitiatorEmail);

      var noticeText = string.Empty;
      if (_obj.RequestKind == RequestKind.Access && _obj.AccessUser != null)
      {
        noticeText += "Предоставлен доступ в архив";

        if (_obj.AccessTermFrom.HasValue)
          noticeText += " с " + _obj.AccessTermFrom.Value.ToString();
        
        if (_obj.AccessTermTo.HasValue)
          noticeText += " по " + _obj.AccessTermTo.Value.ToString();
        
        noticeText += ". Логин: " + _obj.AccessUser.Login.LoginName;
        noticeText += Environment.NewLine;
        noticeText += Environment.NewLine;
        
        var folder = _obj.AttachmentGroup.All.FirstOrDefault();
        if (folder != null)
        {
          noticeText += "Подготовлены документы в папке: ";
          noticeText += Hyperlinks.Get(folder);
        }
      }
      else
      {
        // Вложить документы.
        if (_obj.AttachmentGroup.All.Any(x => Sungero.Content.ElectronicDocuments.Is(x)))
        {
          noticeText += "Документы подготовлены";
          mail.AddAttachment(_obj.AttachmentGroup.All.Where(x => Sungero.Content.ElectronicDocuments.Is(x)).Select(x => Sungero.Content.ElectronicDocuments.As(x).LastVersion));
        }
      }
      
      if (!string.IsNullOrEmpty(_obj.ActiveText))
      {
        noticeText += Environment.NewLine;
        noticeText += _obj.ActiveText;
      }
      
      mail.Body = noticeText;
      
      mail.Show();
    }

    public virtual bool CanSendByEmail(Sungero.Domain.Client.CanExecuteActionArgs e)
    {
      return !string.IsNullOrEmpty(_obj.InitiatorEmail);
    }

    public virtual void Complete(Sungero.Workflow.Client.ExecuteResultActionArgs e)
    {
      
    }

    public virtual bool CanComplete(Sungero.Workflow.Client.CanExecuteResultActionArgs e)
    {
      return true;
    }

  }

}