CaseInventoryServerFunctions.cs 5.45 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using DirRX.CaseArchiving.CaseInventory;

namespace DirRX.CaseArchiving.Server
{
  partial class CaseInventoryFunctions
  {
    
    /// <summary>
    /// Получить список дел описи.
    /// </summary>
    /// <returns>Список дел.</returns>
    [Remote(IsPure=true),Public]
    public virtual IQueryable<DirRX.LongTermArchive.ICaseFile> GetCaseFiles()
    {
      return DirRX.LongTermArchive.CaseFiles.GetAll(x => x.LTACaseInventoryDirRX != null && x.LTACaseInventoryDirRX.Equals(_obj));
    }
    
    /// <summary>
    /// Сформировать версию документа из отчета.
    /// </summary>
    /// <returns>Версия документа.</returns>
    [Public]
    public virtual Sungero.Content.IElectronicDocumentVersions GenerateLastVersionFromReport()
    {
      Sungero.Reporting.Shared.IInternalReport internalReport = null;
      var electronicCaseInventory = Sungero.Docflow.PublicFunctions.DocumentKind.GetNativeDocumentKind(Constants.Module.Initialize.CaseInventoryDocumentKind);
      if (_obj.DocumentKind.Equals(electronicCaseInventory))
      {
        var report = CaseArchiving.Reports.GetCaseInventoryMainReport();
        report.Entity = _obj;
        internalReport = (Sungero.Reporting.Shared.IInternalReport)report;
      }
      else
      {
        var report = CaseArchiving.Reports.GetPaperCaseInventoryMainReport();
        report.Entity = _obj;
        internalReport = (Sungero.Reporting.Shared.IInternalReport)report;
      }
      if (!_obj.HasVersions)
        _obj.Versions.AddNew();
      
      var version = _obj.LastVersion;
      
      using (var reportMS = new System.IO.MemoryStream())
      {
        internalReport.InternalExecute(reportMS);
        version.Body.Write(reportMS);
      }

      version.Author = Users.Current;
      version.AssociatedApplication = Sungero.Content.AssociatedApplications.GetByExtension("docx");
      _obj.Save();

      return version;
    }

    /// <summary>
    /// Исключить все дела из описи.
    /// </summary>
    /// <returns>Сообщение об ошибке, либо пустая строка.</returns>
    [Public, Remote]
    public string RemoveAllCaseFiles()
    {
      try
      {
        foreach (var caseFile in CaseArchiving.PublicFunctions.CaseInventory.Remote.GetCaseFiles(_obj))
        {
          if (!DirRX.LongTermArchive.PublicFunctions.CaseFile.UpdateInventory(caseFile, null))
            return CaseInventories.Resources.WarningCanNotUpdateCaseFileFormat(caseFile.DisplayValue);
        }
        _obj.Save();
        return string.Empty;
      }
      catch (Exception e)
      {
        Logger.Debug(e.ToString());
        return e.Message;
      }
    }
    
    /// <summary>
    /// Изменить ответственного в описи и делах.
    /// </summary>
    /// <param name="responsible">Ответственный.</param>
    /// <returns>Сообщение об ошибке, либо пустая строка.</returns>
    [Public, Remote]
    public string ChangeCaseFilesResponsible(Sungero.Company.IEmployee responsible)
    {
      try
      {
        foreach (var caseFile in CaseArchiving.PublicFunctions.CaseInventory.Remote.GetCaseFiles(_obj))
        {
          caseFile.LTAResponsibleDirRX = responsible;
          caseFile.Save();
        }
        _obj.Responsible = responsible;
        _obj.Save();
        return string.Empty;
      }
      catch (Exception e)
      {
        Logger.Debug(e.ToString());
        return e.Message;
      }
    }    

    /// <summary>
    /// Запустить передачу дел на архивное хранение.
    /// </summary>
    [Public, Remote]
    public virtual void StartArchieving()
    {
      // Сбросить статус описи.
      AccessRights.AllowRead(
        () =>
        {
          _obj.ArchiveState = null;
          _obj.ProcessingDate = Calendar.Now;
          _obj.Save();
        });
      
      // Запустить передачу в архив.
      var job = CaseArchiving.AsyncHandlers.TransferDocumentsToArchive.Create();
      job.caseInventoryId = _obj.Id;
      job.ExecuteAsync();
    }

    /// <summary>
    /// Получить следующий по порядку номер описи.
    /// </summary>
    /// <returns>Номер описи.</returns>
    public virtual int GetNextDocumentNumber()
    {     
      var result = 1;
      var useByDepartments = CaseArchiving.PublicFunctions.Module.Remote.IsCreateCaseInventoryByDepartments();
      
      AccessRights.AllowRead(
        () =>
        {
          // Нумеровать в разрезе видов описей.
          var query = CaseArchiving.CaseInventories.GetAll(x => x.Id != _obj.Id && x.DocumentNumber.HasValue && x.EndOfYear == _obj.EndOfYear.Value && x.DocumentKind.Equals(_obj.DocumentKind));
          
          // И в разрезе подразделений, если включена соответствующая настройка.
          if (useByDepartments)
            query = query.Where(x => x.Department != null && x.Department.Equals(_obj.Department));
          
          var lastDocument = query.OrderByDescending(x => x.Id).FirstOrDefault();
          
          if (lastDocument != null)
            result += lastDocument.DocumentNumber.Value;
        });
      
      return result;
    }
    
  }
}