示例#1
0
        public ActionResult Execute(UI.Action action)
        {
            var searchFieldIds = action
                                 .Parameters
                                 .Where(p => p.ParameterType == ParameterType.AutoCompleteSearchFieldId)
                                 .Select(p => Convert.ToInt32(p.DefaultValue))
                                 .ToList();

            var displayFieldIds = action
                                  .Parameters
                                  .Where(p => p.ParameterType == ParameterType.AutoCompleteDisplayFieldId)
                                  .Select(p => Convert.ToInt32(p.DefaultValue))
                                  .ToList();

            var searchFields  = DbEditorService.GetFields(searchFieldIds);
            var displayFields = DbEditorService.GetFields(displayFieldIds);

            var templateName = searchFields.First().Template.Name;

            var result = DbDocumentService.GetDocuments(displayFields, searchFields, DAL.Models.OperationType.StartsWith, action.Value);

            return(new ActionResult()
            {
                ActionType = action.ActionType,
                Success = true,
                Data = result
            });
        }
示例#2
0
        public ActionResult Execute(UI.Action action)
        {
            var view = action.ViewData;

            var templateDef = DbEditorService.GetTemplate(Convert.ToInt32(view.Props["TemplateId"]));

            var controls = new List <UI.Control>();

            GetFlatListOfControls(action.ViewData, ref controls);

            var dictionaryControls = controls.Where(c => c.ControlType.In(ControlType.MultiSelect, ControlType.Select));
            var labelControls      = controls.Where(c => c.ControlType.In(ControlType.Label));
            var referenceControls  = controls.Where(c => c.ControlType.In(ControlType.Table));

            var dataControls = controls
                               .Except(dictionaryControls)
                               .Except(referenceControls)
                               .Except(labelControls);

            var dataTableKeyValues             = dataControls.Select(c => new KeyValuePair <string, object>((string)c.Props["Name"], c.Value)).ToList();
            Dictionary <string, object> values = dataTableKeyValues.ToDictionary(kv => kv.Key, kv => kv.Value);

            DbDocumentService.UpdateDocument(templateDef.Name, action.DocId.Value, values);

            ProcessDictionaryControls(dictionaryControls);

            return(new ActionResult()
            {
                ActionType = action.ActionType,
                Success = true
            });
        }
示例#3
0
        public ActionResult Execute(UI.Action action)
        {
            var filters = action.ViewData.Filters;

            var viewId = Convert.ToInt32(filters.First().Props["ViewId"]);

            var dalViewDef = DbEditorService.GetViewDeep(viewId);

            var viewBehaviour = BehaviourSelector.ViewBehaviours[Mapper.Map <UI.ViewType>(dalViewDef.ViewType)](CurrentUser);

            var pageNumParam       = action.Parameters.FirstOrDefault(p => p.ParameterType == ParameterType.PageNumber);
            var pageSizeParam      = action.Parameters.FirstOrDefault(p => p.ParameterType == ParameterType.PageSize);
            var sortFieldParam     = action.Parameters.FirstOrDefault(p => p.ParameterType == ParameterType.SortFieldId);
            var sortDirectionParam = action.Parameters.FirstOrDefault(p => p.ParameterType == ParameterType.SortDirection);

            bool hasPageAndSortInfo = true;

            if (string.IsNullOrEmpty(pageNumParam.DefaultValue) ||
                string.IsNullOrEmpty(pageSizeParam.DefaultValue) ||
                string.IsNullOrEmpty(sortFieldParam.DefaultValue) ||
                string.IsNullOrEmpty(sortDirectionParam.DefaultValue))
            {
                hasPageAndSortInfo = false;
            }

            DAL.Models.DbSearchRequestParams sortAndPageParams = DAL.Models.DbSearchRequestParams.GetDefault(dalViewDef);

            if (hasPageAndSortInfo)
            {
                var pageNum     = Convert.ToInt32(pageNumParam.DefaultValue);
                var pageSize    = Convert.ToInt32(pageSizeParam.DefaultValue);
                var sortFieldId = Convert.ToInt32(sortFieldParam.DefaultValue);
                var sortDir     = sortDirectionParam.DefaultValue;

                var sortField = DbEditorService.GetField(sortFieldId);

                sortAndPageParams = new DAL.Models.DbSearchRequestParams(pageNum, pageSize, sortField, sortDir);
            }


            var ticketSet = DbDocumentService.GetDocuments(dalViewDef, filters.Select(f => (IFilterWithValue)f).ToList(), sortAndPageParams);

            var viewDef = Mapper.Map <UI.ViewDefinition>(dalViewDef);
            var view    = BehaviourSelector.ViewBehaviours[Mapper.Map <UI.ViewType>(viewDef.ViewType)](CurrentUser).Make(viewDef, ticketSet, null, null);

            return(new ActionResult()
            {
                Success = true,
                ActionType = action.ActionType,
                Data = view
            });
        }
示例#4
0
        public ActionResult Execute(UI.Action action)
        {
            Parameter templateParam = action.Parameters.FirstOrDefault(p => p.ParameterType == ParameterType.TemplateId);

            if (templateParam == null)
            {
                throw new CustomValidationException($"There is no TemplateId parameter for action DeleteDocument.");
            }

            int templateId = Convert.ToInt32(templateParam.DefaultValue);

            DAL.Models.Template templateDef = DbEditorService.GetTemplate(templateId);

            DbDocumentService.UpdateDocumentToDeleted(templateDef.Name, action.DocId.Value);

            return(new ActionResult()
            {
                ActionType = action.ActionType,
                Success = true
            });
        }
示例#5
0
        public ActionResult Execute(UI.Action action)
        {
            var filterIdParameter = action.Parameters.FirstOrDefault(p => p.ParameterType == ParameterType.FilterId);
            var dbFilterDef       = DbEditorService.GetFilter(Convert.ToInt32(filterIdParameter.DefaultValue));

            if (dbFilterDef == null)
            {
                throw new CustomValidationException("Filter is not defined for this action.");
            }

            var filterDef = Mapper.Map <UI.FilterDefinition>(dbFilterDef);

            var filter = BehaviourSelector.FilterBehaviours[Mapper.Map <UI.FilterType>(filterDef.FilterType)](CurrentUser).Make(filterDef, null);

            var dbViewDef = DbEditorService.GetViewDeep(filterDef.ViewId);

            var filterValues = new Dictionary <DAL.Models.Filter, object>()
            {
                { dbFilterDef, null }
            };

            var searchParams = DAL.Models.DbSearchRequestParams.GetDefault(dbViewDef);
            var tickets      = DbDocumentService.GetDocuments(dbViewDef, new List <IFilterWithValue>()
            {
                filter
            }, searchParams);

            var viewDef = Mapper.Map <UI.ViewDefinition>(dbViewDef);
            var view    = BehaviourSelector.ViewBehaviours[Mapper.Map <UI.ViewType>(viewDef.ViewType)](CurrentUser).Make(viewDef, tickets, null, null);

            var result = new ActionResult()
            {
                Success    = true,
                ActionType = action.ActionType,
                Data       = view
            };

            return(result);
        }
示例#6
0
        public View Make(ViewDefinition definition, DAL.Models.DbSearchResponse ticketSet, View parentNode, Action <UI.View> viewAction)
        {
            var view = new View()
            {
                ViewType   = Mapper.Map <UI.ViewType>(definition.ViewType),
                ParentNode = parentNode
            };

            var ticket = ticketSet.Tickets.FirstOrDefault();

            // TODO
            //view.DocId = (ticket != null) ? (int?)Convert.ToInt32(ticket["Id"]) : null;

            view.Props = new Dictionary <string, object>()
            {
                { "Name", definition.Name },
                { "TemplateId", definition.TemplateId },
                { "OrderIndex", definition.OrderIndex },
                { "DisplayName", definition.DisplayName },
                { "GridWidth", definition.GridWidth },
                { "LinkedFieldId", definition.LinkedFieldId },
                { "Active", false }
            };

            view.Controls = definition
                            .Controls
                            .Select(c => BehaviourSelector.ControlBehaviours[Mapper.Map <UI.ControlType>(c.ControlType)](CurrentUser).Make(c, ticketSet, view, null))
                            .ToList();

            view.Filters = definition
                           .Filters
                           .Select(f => BehaviourSelector.FilterBehaviours[Mapper.Map <UI.FilterType>(f.FilterType)](CurrentUser).Make(f, view))
                           .ToList();

            foreach (var childViewDef in definition.ChildViews)
            {
                View childView;

                if (childViewDef.ViewType == DAL.Models.ViewType.Table)
                {
                    var parentFilters = ticketSet.Request.Filters;

                    var searchParams = DAL.Models.DbSearchRequestParams.GetDefault((DAL.Models.View)childViewDef.Entity);
                    searchParams.SearchWithInnerJoin = true;
                    var linkedTickets = DbDocumentService.GetDocuments((DAL.Models.View)childViewDef.Entity, parentFilters, searchParams);

                    childView = BehaviourSelector.ViewBehaviours[Mapper.Map <UI.ViewType>(childViewDef.ViewType)](CurrentUser)
                                .Make(childViewDef, linkedTickets, null, null);
                }
                else
                {
                    childView = BehaviourSelector.ViewBehaviours[Mapper.Map <UI.ViewType>(childViewDef.ViewType)](CurrentUser)
                                .Make(childViewDef, ticketSet, null, null);
                }

                view.ChildViews.Add(childView);
            }

            if (definition.ChildViews.Any(cv => cv.ViewType == DAL.Models.ViewType.Tab))
            {
                var parentView = new View()
                {
                    ViewType   = ViewType.TabContainer,
                    ParentNode = parentNode
                };



                var tabViews = view.ChildViews.Where(v => v.ViewType == ViewType.Tab);

                view.ChildViews = view.ChildViews.Except(tabViews).ToList();

                view.ViewType        = ViewType.Tab;
                view.ParentNode      = parentView;
                view.Props["Active"] = true;

                parentView.DocId = view.DocId;
                parentView.Props = view.Props;

                parentView.ChildViews.AddRange((new List <View>()
                {
                    view
                }).Union(tabViews));

                return(parentView);
            }
            else
            {
                return(view);
            }
        }
示例#7
0
        public async Task CreateCompany_Should_CreateCompany()
        {
            // arrange
            var cancellationToken = new CancellationToken();
            var unitOfWorkFactory = new TransactionScopeUnitOfWorkFactory();
            var dbContextFactory  = new DefaultDbContextFactory();
            var dateTimeProvider  = new DefaultDateTimeProvider();

            var mediatorMock = new Mock <IPublisher>();

            var fieldProviderRegistry = new DefaultFieldProviderRegistry();

            fieldProviderRegistry.AddFieldType(typeof(TextField));

            // var dbFieldMetadataRepository = new DbFieldMetadataRepository(dbContextFactory, fieldProviderRegistry, new NewtonsoftJsonSerializer());
            var dbFieldDataRepository       = new DbFieldDataRepository(dbContextFactory, fieldProviderRegistry);
            var classifierRepositoryFactory = CreateClassifierRepositoryFactory(dbContextFactory);
            var dbNumberGenerator           = new DbNumberGenerator(dbContextFactory, classifierRepositoryFactory, dateTimeProvider, Array.Empty <INumberTagResolver>());
            var dbDocumentService           = new DbDocumentService(dbContextFactory, dbNumberGenerator, mediatorMock.Object);
            var jsonSerializer        = new DefaultJsonSerializer();
            var auditLogService       = new DbAuditLogService(dbContextFactory, jsonSerializer);
            var classifierRegistrator = new DefaultClassifierRegistrator(NullLogger <DefaultClassifierRegistrator> .Instance, classifierRepositoryFactory);

            var metadataRepositoryMock = new Mock <IRepository <FieldMetadata> >();

            metadataRepositoryMock
            .Setup(x => x.Search(It.IsAny <MetadataSearchRequest>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(() => new SearchResult <FieldMetadata>
            {
                Rows = new FieldMetadata[]
                {
                    new TextField {
                        Key = "test1", Active = true, System = false
                    },
                    new TextField {
                        Key = "test2", Active = true, System = false
                    },
                    new TextField {
                        Key = "test3", Active = true, System = false
                    }
                }
            });

            var backgroundJobManagerMock = new Mock <IBackgroundJobManager>();

            var generator = new MasterDataDbGenerator(unitOfWorkFactory, dbContextFactory);

            var handler = new CreateCompanyHandler(unitOfWorkFactory,
                                                   dbContextFactory, dateTimeProvider, metadataRepositoryMock.Object,
                                                   dbFieldDataRepository, classifierRepositoryFactory, dbDocumentService, auditLogService, backgroundJobManagerMock.Object);

            using (var _ = unitOfWorkFactory.Create())
            {
                await generator.EnsureClassifierTypeRegistered(Numerator.GetDefaultMetadata(), cancellationToken);

                await generator.EnsureClassifierTypeRegistered(DocumentType.GetDefaultMetadata(), cancellationToken);

                foreach (var classifier in RegisterClassifiersStartupTask.GetClassifiers())
                {
                    await classifierRegistrator.Register(classifier, cancellationToken);
                }

                // act
                var company = new Company
                {
                    ConfigCode = "company",
                    Name       = "Montr Inc.",
                    Fields     = new FieldData
                    {
                        { "test1", "value1" },
                        { "test2", "value2" },
                        { "test3", "value3" }
                    }
                };

                var command = new CreateCompany
                {
                    UserUid = Guid.NewGuid(),
                    Item    = company
                };

                var result = await handler.Handle(command, cancellationToken);

                // assert
                Assert.IsNotNull(result);
                Assert.IsTrue(result.Success);
                Assert.IsNotNull(result.Uid);
                Assert.AreNotEqual(Guid.Empty, result.Uid);

                // assert registration request inserted
                DbDocument dbDocument;
                using (var db = dbContextFactory.Create())
                {
                    dbDocument = await db.GetTable <DbDocument>()
                                 .Where(x => x.CompanyUid == result.Uid)
                                 .SingleAsync(cancellationToken);
                }

                Assert.IsNotNull(dbDocument);

                // assert registration request field data inserted
                IList <DbFieldData> fieldData;
                using (var db = dbContextFactory.Create())
                {
                    fieldData = await db.GetTable <DbFieldData>()
                                .Where(x => x.EntityTypeCode == Document.TypeCode && x.EntityUid == dbDocument.Uid)
                                .ToListAsync(cancellationToken);
                }

                Assert.AreEqual(company.Fields.Count, fieldData.Count);
                Assert.AreEqual(company.Fields["test1"], fieldData.Single(x => x.Key == "test1").Value);
                Assert.AreEqual(company.Fields["test2"], fieldData.Single(x => x.Key == "test2").Value);
                Assert.AreEqual(company.Fields["test3"], fieldData.Single(x => x.Key == "test3").Value);
            }
        }
示例#8
0
        public ActionResult Execute(UI.Action action)
        {
            if (action.DocId == null)
            {
                throw new CustomValidationException("DocId not defined for action's parent control. Please assign Id field to control.");
            }

            var viewIdParameter = action.Parameters.FirstOrDefault(p => p.ParameterType == UI.ParameterType.ViewId);
            var anchorParameter = action.Parameters.FirstOrDefault(p => p.ParameterType == UI.ParameterType.ViewAnchor);


            var dbViewDef = DbEditorService.GetViewDeep(Convert.ToInt32(viewIdParameter.DefaultValue));
            var viewDef   = Mapper.Map <ViewDefinition>(dbViewDef);

            var fieldId = Convert.ToInt32(action.Props["FieldId"]);

            var field = DbEditorService.GetField(fieldId);

            var filter = new VirtualFilter()
            {
                Operation = DAL.Models.OperationType.EqualTo,
                ViewId    = dbViewDef.Id
            };

            filter.FilterFields = new List <IFilterField>()
            {
                new VirtualFilterField()
                {
                    ChainId = 0, Depth = 0, Filter = filter, Field = field
                }
            };

            var filterWithValue = new VirtualFilterWithValue()
            {
                Filter = filter, Value = action.DocId
            };

            var searchParams = DAL.Models.DbSearchRequestParams.GetDefault(dbViewDef);

            var ticketSet = DbDocumentService.GetDocuments(dbViewDef, new List <IFilterWithValue>()
            {
                filterWithValue
            }, searchParams);

            UI.View view;

            if (ticketSet.Tickets.Count == 1)
            {
                view = BehaviourSelector.ViewBehaviours[Mapper.Map <UI.ViewType>(dbViewDef.ViewType)](CurrentUser)
                       .Make(viewDef, ticketSet, null, null);

                var views = GetFlatListOfViews(view);

                if (anchorParameter != null && views.Count > 0)
                {
                    foreach (var v in views)
                    {
                        if (v.Props.ContainsKey("Active"))
                        {
                            v.Props["Active"] = (v.Definition?.Id == Convert.ToInt32(anchorParameter.DefaultValue));
                        }
                    }
                }
            }
            else
            {
                throw new CustomValidationException("Applying filters in goto action does not result in a single document.");
            }

            var result = new ActionResult()
            {
                Success    = true,
                ActionType = action.ActionType,
                Data       = view
            };

            return(result);
        }
示例#9
0
        public ActionResult Execute(UI.Action action)
        {
            // Создаваемый шаблон
            var tempIdParam = action.Parameters.FirstOrDefault(p => p.ParameterType == UI.ParameterType.TemplateId);

            if (tempIdParam == null)
            {
                throw new CustomValidationException($"TemplateId parameter missing for action {action.Props["Id"]}.");
            }

            // Получаем модель шаблона по которой будем создавать документ
            var templateDef = DbEditorService.GetTemplate(Convert.ToInt32(tempIdParam.DefaultValue));

            // Создаем значения по умолчанию, которыми будет заполнен новый документ
            var values = templateDef.Fields
                         .Select(f => new KeyValuePair <DAL.Models.Field, object>(f, null))
                         .ToDictionary(kv => kv.Key, kv => kv.Value);

            // Проверяем есть ли параметры копирования значений в новый шаблон
            FillValues(action, templateDef, values);

            // Создаем документ шаблона и получаем его ID
            var docId = DbDocumentService.CreateDocument(values);

            // Страницу на которую мы перейдем и в которой будет созданный документ по шаблону
            var viewIdParam = action.Parameters.FirstOrDefault(p => p.ParameterType == UI.ParameterType.ViewId);

            // Проверка параметров
            if (viewIdParam != null)
            {
                // Проверяем есть ли на странице фильтр с помощью которого мы попадем на нее
                var viewDefDal   = DbEditorService.GetViewDeep(Convert.ToInt32(viewIdParam.DefaultValue));
                var filterDefDal = viewDefDal.Filters.FirstOrDefault();
                if (filterDefDal == null)
                {
                    throw new CustomValidationException($"View {viewDefDal.Id} must have a filter defined.");
                }
                // Создаем фильтр поля ID с помощью которого мы откроем страницу которая привязана к созданному документу
                // Заполняем его значением созданного документа
                var filterDef = Mapper.Map <UI.FilterDefinition>(filterDefDal);
                var filter    = BehaviourSelector.FilterBehaviours[Mapper.Map <UI.FilterType>(filterDef.FilterType)](CurrentUser).Make(filterDef, null);
                filter.Value = docId;

                // Ищем только что созданный документ по фильтру и открываем страницу с привязкой к этому документу
                var searchParams = DAL.Models.DbSearchRequestParams.GetDefault(viewDefDal);
                var ticketSet    = DbDocumentService.GetDocuments(viewDefDal, new List <DAL.Interfaces.IFilterWithValue>()
                {
                    filter
                }, searchParams);
                var viewDef = Mapper.Map <UI.ViewDefinition>(viewDefDal);
                var view    = BehaviourSelector.ViewBehaviours[Mapper.Map <UI.ViewType>(viewDef.ViewType)](CurrentUser).Make(viewDef, ticketSet, null, null);

                // Возвращаем страницу в качестве результата
                return(new ActionResult()
                {
                    ActionType = action.ActionType,
                    Data = view,
                    Success = true
                });
            }
            else
            {
                return(new ActionResult()
                {
                    ActionType = action.ActionType,
                    Success = true
                });
            }
        }
示例#10
0
        private static void FillValues(UI.Action action, DAL.Models.Template templateDef, Dictionary <DAL.Models.Field, object> values)
        {
            List <Parameter> copyParameters = action.Parameters
                                              .FindAll(p => p.ParameterType == UI.ParameterType.CopyValueFrom || p.ParameterType == UI.ParameterType.CopyValueTo);

            if (copyParameters.Count > 0)
            {
                if (!copyParameters.All(p => p.Props.ContainsKey("Name") && !string.IsNullOrEmpty((string)p.Props["Name"])))
                {
                    throw new CustomValidationException($"All CopyParameters have to contain a Name property. ActionId={action.Definition.Id}");
                }

                if (!copyParameters.Where(p => p.ParameterType == ParameterType.CopyValueTo).All(p => p.Props.ContainsKey("FieldId")))
                {
                    throw new CustomValidationException($"All CopyParameters.Destination have to contain a FieldId property. ActionId={action.Definition.Id}");
                }

                // Создаем набор параметров из списка двух типов параметров
                List <Incoming.CopyFieldParameter> prms = copyParameters.GroupBy(p => (string)p.Props["Name"]).Select(g =>
                {
                    if (g.Count() != 2)
                    {
                        throw new CustomValidationException($"There is no pair for parameter: {g.Key}");
                    }
                    Parameter paramFrom = g.FirstOrDefault(p => p.ParameterType == ParameterType.CopyValueFrom);
                    Parameter paramTo   = g.FirstOrDefault(p => p.ParameterType == ParameterType.CopyValueTo);

                    paramFrom.Props.Where(p => p.Value == null).ToList().ForEach(p => paramFrom.Props.Remove(p.Key));
                    paramTo.Props.Where(p => p.Value == null).ToList().ForEach(p => paramTo.Props.Remove(p.Key));

                    int fieldFromId = paramFrom.Props.ContainsKey("FieldId") ? Convert.ToInt32(paramFrom.Props["FieldId"]) : 0;
                    int fieldToId   = paramTo.Props.ContainsKey("FieldId") ? Convert.ToInt32(paramTo.Props["FieldId"]) : 0;

                    Incoming.CopyFieldParameter paramCopy = new Incoming.CopyFieldParameter()
                    {
                        DefaultValue = paramFrom.DefaultValue,
                        FieldFromId  = fieldFromId,
                        FieldToId    = fieldToId
                    };
                    return(paramCopy);
                }).ToList();

                // Заполняем значениями по умолчанию
                foreach (var param in prms.Where(p => p.FieldToId > 0 && p.DefaultValue != null))
                {
                    DAL.Models.Field templateDefField = templateDef.Fields.FirstOrDefault(f => f.Id == param.FieldToId);
                    if (templateDefField == null)
                    {
                        throw new CustomValidationException($"Destination template missing field id={param.FieldToId}.");
                    }
                    values.Add(templateDefField, param.DefaultValue);
                }

                // Заполняем значениями документа из которого был создан новый документ
                // Определяем шаблон источника
                int fieldId = prms.FirstOrDefault(p => p.FieldFromId > 0)?.FieldFromId ?? 0;
                if (fieldId > 0)
                {
                    DbEditorService     editor          = new DbEditorService();
                    DAL.Models.Field    field           = editor.GetField(fieldId);
                    DAL.Models.Template templateDefFrom = DbEditorService.GetTemplate(field.TemplateId);
                    int parentDocId = Convert.ToInt32(action.DocId);
                    Dictionary <string, object> documentFrom = DbDocumentService.GetDocument(templateDefFrom.Name, parentDocId);
                    foreach (var param in prms.Where(p => p.FieldFromId > 0))
                    {
                        DAL.Models.Field fieldFrom = templateDefFrom.Fields.FirstOrDefault(f => f.Id == param.FieldFromId);
                        DAL.Models.Field fieldTo   = templateDef.Fields.FirstOrDefault(f => f.Id == param.FieldToId);
                        values.Add(fieldTo, documentFrom[fieldFrom.Name]);
                    }
                }
            }
        }
示例#11
0
 static Service()
 {
     DbDocService      = new DbDocumentService();
     DbEditorService   = new DbEditorService();
     DbDictionaryCache = new DbDictionaryCache();
 }