ModuleClientFunctions.cs 9 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;

namespace DirRX.CaseArchiving.Client
{
  public class ModuleFunctions
  {
    /// <summary>
    /// Отобразить диалог для создания описей электронных дел.
    /// </summary>
    [Public]
    public virtual void ShowCaseInventoryCreationDialog()
    {
      // Проверить наличие завершенных дел для включения в описи.
      var caseFiles = CaseArchiving.PublicFunctions.Module.Remote.GetCaseFiles(DirRX.LongTermArchive.CaseFile.LTAStageDirRX.CompletedDirRX);
      var isCreateByDepartments = CaseArchiving.PublicFunctions.Module.Remote.IsCreateCaseInventoryByDepartments();
      if (isCreateByDepartments)
        caseFiles = caseFiles.Where(x => x.Department != null);
      
      if (!caseFiles.Any())
      {
        Dialogs.ShowMessage(CaseArchiving.Resources.CreateInventoriesDialogCaseFileNotFoundWarning, MessageType.Warning);
        return;
      }
      
      // Запросить критерии формирования описей.
      var dialog = Dialogs.CreateInputDialog(CaseArchiving.Resources.CreateInventoriesDialogTitle);
      var yearSelector = dialog.AddString(CaseArchiving.Resources.CreateInventoriesDialogYearLabel, true, Calendar.Now.Year.ToString());
      var caseInventoryKindList = caseFiles.Where(x => x.LTAInventoryKindDirRX != null).Select(x => x.LTAInventoryKindDirRX).Distinct();
      var documentKinds = dialog.AddSelectMany(CaseArchiving.Resources.CreateInventoriesDialogKindsLabel, false, caseInventoryKindList.First()).From(caseInventoryKindList);
      
      var registrationGroups = dialog.AddSelectMany(Sungero.Docflow.RegistrationGroups.Info.LocalizedPluralName, false, Sungero.Docflow.RegistrationGroups.Null)
        .From(caseFiles.Where(x => x.RegistrationGroup != null).Select(x => x.RegistrationGroup).Distinct().ToArray());
      
      var departments = dialog.AddSelectMany(Sungero.Company.Departments.Info.LocalizedPluralName, false, Sungero.Company.Departments.Null);
      
      if (isCreateByDepartments)
        departments.From(caseFiles.Select(x => x.Department).Distinct());
      else
        departments.IsVisible = false;

      var caseInventoryResponsibleList = caseFiles.Where(x => x.LTAResponsibleDirRX != null).Select(x => x.LTAResponsibleDirRX).Distinct();
      var responsibles = dialog.AddSelectMany(CaseArchiving.Resources.CreateInventoriesDialogResponsibleLabel, false, Sungero.Company.Employees.Null).From(caseInventoryResponsibleList);

      var curentUserEmployee = Storage.PublicFunctions.Module.Remote.GetEmployeeForCurentUser();
      if (curentUserEmployee != null)
        responsibles.Value = caseInventoryResponsibleList.AsEnumerable().Where(x => x.Equals(curentUserEmployee));

      var archivists = CaseArchiving.PublicFunctions.Module.Remote.GetEmployeesForArchivistRole();
      var archivist = dialog.AddSelect(CaseArchiving.Resources.CreateInventoriesDialogArchivistLabel, true, archivists.FirstOrDefault()).From(archivists);
      
      dialog.SetOnButtonClick((e) =>
                              {
                                if (e.Button == DialogButtons.Ok)
                                {
                                  int tmp;
                                  if (!(int.TryParse(yearSelector.Value, out tmp) && tmp > 1990))
                                    e.AddError("Неверно указан год.");
                                }
                              });
      
      if (dialog.Show() == DialogButtons.Ok)
      {
        var year = int.Parse(yearSelector.Value);
        
        // Наложить полученные в диалоге фильтры на список завершенных дел.
        caseFiles = caseFiles.Where(x => (x.StartDate.HasValue ? x.StartDate.Value.Year : 0) <= year && (x.EndDate.HasValue ? x.EndDate.Value.Year : 5000) >= year);
        
        if (documentKinds.Value.Any())
          caseFiles = caseFiles.Where(x => x.LTAInventoryKindDirRX != null && documentKinds.Value.Contains(x.LTAInventoryKindDirRX));
        
        if (departments.Value.Any())
          caseFiles = caseFiles.Where(x => x.Department != null && departments.Value.Contains(x.Department));

        if (registrationGroups.Value.Any())
          caseFiles = caseFiles.Where(x => x.RegistrationGroup != null && registrationGroups.Value.Contains(x.RegistrationGroup));
        
        if (responsibles.Value.Any())
        {
          var responsibleIds = responsibles.Value.Select(x => x.Id).ToList();
          caseFiles = caseFiles.Where(x => x.LTAResponsibleDirRX != null && responsibleIds.Contains(x.LTAResponsibleDirRX.Id));
        }
        
        if (!caseFiles.Any())
        {
          Dialogs.ShowMessage(CaseArchiving.Resources.CreateInventoriesDialogCaseFileNotFoundWarning, MessageType.Warning);
          return;
        }
        
        // Создать и отобразить описи дел.
        var emptyCaseInventories = CaseArchiving.PublicFunctions.Module.Remote.CreateCaseInventories(year, caseFiles.ToList(), archivist.Value).ToList();
        var filledCaseInventories = FillCaseInventories(emptyCaseInventories);        
        filledCaseInventories.Show();
      }
    }

    /// <summary>
    /// Заполнить описи отчётом и отправить на проверку.
    /// </summary>
    /// <param name="emptyCaseInventories">Пустые описи.</param>
    /// <returns>Заполненные описи.</returns>
    public virtual List<CaseArchiving.ICaseInventory> FillCaseInventories(List<CaseArchiving.ICaseInventory> emptyCaseInventories)
    {
      var filledCaseInventories = new List<CaseArchiving.ICaseInventory>();
      foreach (var caseInventory in emptyCaseInventories)
      {
        // Сформировать тело документа из отчета.
        CaseArchiving.PublicFunctions.CaseInventory.GenerateLastVersionFromReport(caseInventory);
        filledCaseInventories.Add(caseInventory);
        
        // Отправить опись на верификацию.
        CaseArchiving.PublicFunctions.Module.SendCaseInventoryForVerification(caseInventory);
      }
      return filledCaseInventories;
    }
    
    /// <summary>
    /// Отобразить настройки модуля "Описи электронных дел".
    /// </summary>
    [Public]
    public virtual void ShowCaseInventorySettingsDialog()
    {
      var createInventoryByDepartments = CaseArchiving.PublicFunctions.Module.Remote.IsCreateCaseInventoryByDepartments();
      var useInventoryInSource = CaseArchiving.PublicFunctions.Module.Remote.IsCaseInventoryUsedInSourceSystem();
      var useInventoryInArchive = CaseArchiving.PublicFunctions.Module.Remote.IsCaseInventoryUsedInArchiveSystem();

      var dialog = Dialogs.CreateInputDialog(Resources.CaseInventorySettingsDialogTitle);
      var useInSourceSelector = dialog.AddBoolean(Resources.CaseInventorySettingsUseInSourceLabel, useInventoryInSource);
      var useInArchiveSelector = dialog.AddBoolean(Resources.CaseInventorySettingsUseInArchiveLabel, useInventoryInArchive);
      var createByDepartmentSelector = dialog.AddBoolean(Resources.CaseInventorySettingsCreateByDepartmentsLabel, createInventoryByDepartments);
      
      // Сделать настройки места использования описей взаимоисключающими.
      useInArchiveSelector.SetOnValueChanged((m) =>
                                             {
                                               if (m.NewValue == true)
                                                 useInSourceSelector.Value = false;
                                             });
      useInSourceSelector.SetOnValueChanged((m) =>
                                            {
                                              if (m.NewValue == true)
                                                useInArchiveSelector.Value = false;
                                            });
      
      if (dialog.Show() == DialogButtons.Ok)
      {
        if (createByDepartmentSelector.Value.Value != createInventoryByDepartments)
          CaseArchiving.PublicFunctions.Module.Remote.SetDocflowParam(CaseArchiving.PublicConstants.Module.DocflowParams.CreateCaseInventoryByDepartmentsKey, createByDepartmentSelector.Value.Value.ToString().ToLower());

        if (useInSourceSelector != null)
        {
          if (useInSourceSelector.Value.Value != useInventoryInSource)
            CaseArchiving.PublicFunctions.Module.Remote.SetDocflowParam(CaseArchiving.PublicConstants.Module.DocflowParams.UseCaseInventoryInSourceSystemKey, useInSourceSelector.Value.Value.ToString().ToLower());
          if (useInArchiveSelector.Value.Value != useInventoryInArchive)
            CaseArchiving.PublicFunctions.Module.Remote.SetDocflowParam(CaseArchiving.PublicConstants.Module.DocflowParams.UseCaseInventoryInArchiveSystemKey, useInArchiveSelector.Value.Value.ToString().ToLower());
        }
      }
    }
    
  }
}