ExternalEntityLinkHandlers.cs 3.75 KB
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using DirRX.LongTermArchive.ExternalEntityLink;

namespace DirRX.LongTermArchive
{
  partial class ExternalEntityLinkCreatingFromServerHandler
  {

    public override void CreatingFrom(Sungero.Domain.CreatingFromEventArgs e)
    {
      if (CallContext.CalledFrom(Storage.ExternalEntities.Info) &&
          Storage.PublicFunctions.Module.Remote.GetMappingMode(CallContext.GetCallerEntityId(Storage.ExternalEntities.Info)) == Storage.ExternalEntity.MappingMode.Auto)
      {
        throw AppliedCodeException.Create("Нельзя копировать записи в режиме авто-сопоставления");
      }
      else
        base.CreatingFrom(e);
    }
  }

  partial class ExternalEntityLinkUiFilteringServerHandler<T>
  {

    public override IQueryable<T> Filtering(IQueryable<T> query, Sungero.Domain.UiFilteringEventArgs e)
    {
      query = base.Filtering(query, e);
      
      if (CallContext.CalledDirectlyFrom(Storage.ExternalEntities.Info))
      {
        var parent = Storage.ExternalEntities.Get(CallContext.GetCallerEntityId(Storage.ExternalEntities.Info));
        query = query.Where(x => x.ExtSystemId == parent.ExternalSystem.SourceUid &&
                            x.ExtEntityType == parent.Uid &&
                            x.EntityType == parent.EntityType);
      }
      
      return query;
    }
  }

  partial class ExternalEntityLinkServerHandlers
  {

    public override void BeforeSave(Sungero.Domain.BeforeSaveEventArgs e)
    {
      if (e.Params.Contains("ViewMode"))
        throw AppliedCodeException.Create("Нельзя сохранить запись в режиме просмотра.");
      else
        base.BeforeSave(e);
    }

    public override void BeforeDelete(Sungero.Domain.BeforeDeleteEventArgs e)
    {
      if (e.Params.Contains("ViewMode"))
        throw AppliedCodeException.Create("Нельзя удалить запись в режиме просмотра.");
      else if (CallContext.CalledFrom(Storage.ExternalEntities.Info) &&
               Storage.PublicFunctions.Module.Remote.GetMappingMode(CallContext.GetCallerEntityId(Storage.ExternalEntities.Info)) == Storage.ExternalEntity.MappingMode.Auto)
        throw AppliedCodeException.Create("Нельзя удалять записи в режиме авто-сопоставления.");
      else
        base.BeforeDelete(e);
    }

    public override void Saving(Sungero.Domain.SavingEventArgs e)
    {
      base.Saving(e);
      _obj.SyncDate = Calendar.Now;
    }

    public override void Created(Sungero.Domain.CreatedEventArgs e)
    {
      // Если запись создается из Справочника системы-источника, заполнить значения из контекста.
      if (CallContext.CalledFrom(Storage.ExternalEntities.Info))
      {
        // В режиме автосопоставления создавать записи запрещено.
        if (Storage.PublicFunctions.Module.Remote.GetMappingMode(CallContext.GetCallerEntityId(Storage.ExternalEntities.Info)) == Storage.ExternalEntity.MappingMode.Auto)
        {
          throw AppliedCodeException.Create("Нельзя создавать записи в режиме авто-сопоставления");
        }
        else
        {
          base.Created(e);
          
          var parent = Storage.ExternalEntities.Get(CallContext.GetCallerEntityId(Storage.ExternalEntities.Info));
          _obj.ExtSystemId = parent.ExternalSystem.SourceUid;
          _obj.ExtEntityType = parent.Uid;
          _obj.EntityType = parent.EntityType;
          _obj.SyncDate = Calendar.Now;
        }
      }
      else
        base.Created(e);
    }
  }
}