ExternalEntityHandlers.cs 2.72 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using DirRX.Storage.ExternalEntity;

namespace DirRX.Storage
{
  partial class ExternalEntityServerHandlers
  {

    public override void Saving(Sungero.Domain.SavingEventArgs e)
    {
      if (_obj.MappingMode.Value != MappingMode.Auto && _obj.AcceptWithoutConfirmation == true)
        _obj.AcceptWithoutConfirmation = false;
    }

    public override void Created(Sungero.Domain.CreatedEventArgs e)
    {
      // Если запись создается из Внешнего справочника, заполнить значения из контекста.
      if (CallContext.CalledFrom(Storage.ExternalSystems.Info))
      {
        _obj.ExternalSystem = Storage.ExternalSystems.GetCached(CallContext.GetCallerEntityId(Storage.ExternalSystems.Info));
      }      
      
      _obj.MappingMode = MappingMode.NoMapping;
    }

    public override void AfterDelete(Sungero.Domain.AfterDeleteEventArgs e)
    {
      // Удалить внешние ссылки, используя ассинхронный обработчик.
      if (Functions.ExternalEntity.GetEntityMapping(_obj).Any())
      {       
        var asyncHandler = AsyncHandlers.DeleteExternalEntityLinks.Create();
        asyncHandler.ExtSystemId = _obj.ExternalSystem.SourceUid;
        asyncHandler.EntityType = _obj.EntityType;
        asyncHandler.ExecuteAsync();
      }
    }
  }

  partial class ExternalEntityUiFilteringServerHandler<T>
  {

    public override IQueryable<T> Filtering(IQueryable<T> query, Sungero.Domain.UiFilteringEventArgs e)
    {
      query = base.Filtering(query, e);
      
      if (CallContext.CalledDirectlyFrom(Storage.ExternalSystems.Info))
      {
        var parentId = CallContext.GetCallerEntityId(Storage.ExternalSystems.Info);
        query = query.Where(x => x.ExternalSystem.Id == parentId);
      }
      
      return query;
    }
  }

  partial class ExternalEntityFilteringServerHandler<T>
  {

    public override IQueryable<T> Filtering(IQueryable<T> query, Sungero.Domain.FilteringEventArgs e)
    {
      var filter = _filter;
      if (filter == null)
        return query;
      
      // Фильтр по состоянию.
      if (filter.Active || filter.Closed)
        query = query.Where(f => (filter.Active && f.Status.Value == Sungero.CoreEntities.DatabookEntry.Status.Active) ||
                            (filter.Closed && f.Status.Value == Sungero.CoreEntities.DatabookEntry.Status.Closed));
      
      // Фильтр по системе-источнику.
      if (filter.SourceSystem != null)
        query = query.Where(f => f.ExternalSystem == filter.SourceSystem);
      
      return query;
    }

  }
}