CaseInventoryHandlers.cs 3.96 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using DirRX.CaseArchiving.CaseInventory;

namespace DirRX.CaseArchiving
{
  partial class CaseInventoryArchivistPropertyFilteringServerHandler<T>
  {

    public virtual IQueryable<T> ArchivistFiltering(IQueryable<T> query, Sungero.Domain.PropertyFilteringEventArgs e)
    {
      // Ограничить выбор из списка ролью Архивист.
      var employees = Functions.Module.GetEmployeesForArchivistRole();
      
      return query.Where(x => employees.Contains(x));
    }
  }

  partial class CaseInventoryFilteringServerHandler<T>
  {

    public override IQueryable<T> Filtering(IQueryable<T> query, Sungero.Domain.FilteringEventArgs e)
    {
      var filter = _filter;
      
      if (filter == null)
        return query;
      
      // Фильтр по НОР.
      if (filter.BusinessUnit != null)
        query = query.Where(f => f.BusinessUnit == filter.BusinessUnit);

      // Фильтр по подразделению.
      if (filter.Department != null)
        query = query.Where(f => f.Department == filter.Department);
      
      var currentYear = Calendar.UserToday.Year;
      
      // Фильтр по текущему году.
      if (filter.CurrentYear)
        query = query.Where(f => f.EndOfYear.Value.Year == currentYear);
      
      // Фильтр по предыдущему году.
      var previousYear = currentYear - 1;
      if (filter.PreviousYear)
        query = query.Where(f => f.EndOfYear.Value.Year == previousYear);
      
      // Фильтр по диапазону лет.
      if (filter.ManualPeriod)
      {
        if (filter.DateRangeTo != null)
          query = query.Where(f => f.EndOfYear.Value.Year <= filter.DateRangeTo.Value.Year);
        if (filter.DateRangeFrom != null)
          query = query.Where(f => f.EndOfYear.Value.Year >= filter.DateRangeFrom.Value.Year);
      }
      
      return query;
    }
  }

  partial class CaseInventoryServerHandlers
  {

    public override void Saving(Sungero.Domain.SavingEventArgs e)
    {
      base.Saving(e);
      
      // Проверить необходимость передачи документов в архив после подписания описи.
      if (_obj.ArchiveState == ArchiveState.Approved && !_obj.ProcessingDate.HasValue)
      {
        _obj.ProcessingDate = Calendar.Now;
        e.Params.Add(Constants.Module.DocflowParams.NeedFinishArchiving, true);
      }
    }

    public override void AfterSave(Sungero.Domain.AfterSaveEventArgs e)
    {
      base.AfterSave(e);
      
      // Запустить асинхронный обработчик для завершения передачи дел в архив.
      if (e.Params.Contains(Constants.Module.DocflowParams.NeedFinishArchiving))
      {
        e.Params.Remove(Constants.Module.DocflowParams.NeedFinishArchiving);

        var job = AsyncHandlers.TransferDocumentsToArchive.Create();
        job.caseInventoryId = _obj.Id;
        job.ExecuteAsync();
      }
    }

    public override void Created(Sungero.Domain.CreatedEventArgs e)
    {
      base.Created(e);
      
      _obj.State.Properties.Subject.IsRequired = false;
      _obj.VerificationState = DirRX.CaseArchiving.CaseInventory.VerificationState.InProcess;
      _obj.ArchiveState = DirRX.CaseArchiving.CaseInventory.ArchiveState.Checking;
      _obj.InternalApprovalState = DirRX.CaseArchiving.CaseInventory.InternalApprovalState.OnApproval;
    }

    public override void BeforeSave(Sungero.Domain.BeforeSaveEventArgs e)
    {
      base.BeforeSave(e);

      if (!_obj.DocumentNumber.HasValue)
        _obj.DocumentNumber = Functions.CaseInventory.GetNextDocumentNumber(_obj);
      
      _obj.Subject = _obj.Name;
      
      _obj.State.Properties.BusinessUnit.IsRequired = false;
      _obj.State.Properties.Department.IsRequired = PublicFunctions.Module.Remote.IsCreateCaseInventoryByDepartments();
    }
  }
}