private IEnumerable <HistoryItem> Build(HistoryRequest request, Action <ClarifyGeneric, WorkflowObjectInfo> genericAction)
        {
            var clarifyDataSet = _session.CreateDataSet();

            var workflowObjectInfo = WorkflowObjectInfo.GetObjectInfo(request.WorkflowObject.Type);
            var workflowGeneric    = clarifyDataSet.CreateGenericWithFields(workflowObjectInfo.ObjectName);

            if (workflowObjectInfo.HasIDFieldName)
            {
                workflowGeneric.DataFields.Add(workflowObjectInfo.IDFieldName);
            }

            genericAction(workflowGeneric, workflowObjectInfo);

            var inverseActivityRelation = workflowObjectInfo.ActivityRelation;
            var activityRelation        = _schemaCache.GetRelation("act_entry", inverseActivityRelation).InverseRelation;

            var actEntryGeneric = workflowGeneric.Traverse(activityRelation.Name);

            actEntryGeneric.AppendSort("entry_time", false);
            actEntryGeneric.AppendSort("objid", false);

            if (request.Since.HasValue)
            {
                var filter = new FilterExpression().MoreThan("entry_time", request.Since.Value);
                actEntryGeneric.Filter.AddFilter(filter);
            }

            var templateDictionary = _templatePolicyConfiguration.RenderPolicies(request.WorkflowObject);

            //query generic hierarchy and while using act entry templates transform the results into HistoryItems
            return(_historyItemAssembler.Assemble(actEntryGeneric, templateDictionary, request));
        }
        private IEnumerable<HistoryItem> Build(HistoryRequest request, Action<ClarifyGeneric, WorkflowObjectInfo> genericAction)
        {
            var clarifyDataSet = _session.CreateDataSet();

            var workflowObjectInfo = WorkflowObjectInfo.GetObjectInfo(request.WorkflowObject.Type);
            var workflowGeneric = clarifyDataSet.CreateGenericWithFields(workflowObjectInfo.ObjectName);
            if (workflowObjectInfo.HasIDFieldName)
            {
                workflowGeneric.DataFields.Add(workflowObjectInfo.IDFieldName);
            }

            genericAction(workflowGeneric, workflowObjectInfo);

            var inverseActivityRelation = workflowObjectInfo.ActivityRelation;
            var activityRelation = _schemaCache.GetRelation("act_entry", inverseActivityRelation).InverseRelation;

            var actEntryGeneric = workflowGeneric.Traverse(activityRelation.Name);
            actEntryGeneric.AppendSort("entry_time", false);

            if (request.Since.HasValue)
            {
                var filter = new FilterExpression().MoreThan("entry_time", request.Since.Value);
                actEntryGeneric.Filter.AddFilter(filter);
            }

            var templateDictionary = _templatePolicyConfiguration.RenderPolicies(request.WorkflowObject);

            //query generic hierarchy and while using act entry templates transform the results into HistoryItems
            return _historyItemAssembler.Assemble(actEntryGeneric, templateDictionary, request);
        }
 private static HistoryViewModel CreateHistoryModel(HistoryRequest request, IEnumerable <HistoryItem> historyItems)
 {
     return(new HistoryViewModel
     {
         Since = DateTime.UtcNow,
         WorkflowObject = request.WorkflowObject,
         AllActivitiesShown = request.ShowAllActivities,
         HistoryItems = historyItems.ToArray()
     });
 }
 private static HistoryViewModel CreateHistoryModel(HistoryRequest request, IEnumerable<HistoryItem> historyItems)
 {
     return new HistoryViewModel
     {
         Since = DateTime.UtcNow,
         WorkflowObject = request.WorkflowObject,
         AllActivitiesShown = request.ShowAllActivities,
         HistoryItems = historyItems.ToArray()
     };
 }
        public IEnumerable<HistoryItem> Assemble(ClarifyGeneric actEntryGeneric, IDictionary<int, ActEntryTemplate> templatesByCode, HistoryRequest historyRequest)
        {
            actEntryGeneric.DataFields.AddRange("act_code", "entry_time", "addnl_info");

            if (!historyRequest.ShowAllActivities)
            {
                var activeCodes = templatesByCode.Values.Where(t => !t.IsVerbose).Select(d => d.Code).ToArray();
                actEntryGeneric.Filter(f => f.IsIn("act_code", activeCodes));
            }

            //adding related generics expected by any fancy act entry templates
            var templateRelatedGenerics = traverseRelatedGenerics(actEntryGeneric, templatesByCode);

            _employeeAssembler.TraverseEmployee(actEntryGeneric);
            _contactAssembler.TraverseContact(actEntryGeneric);
            if (historyRequest.HistoryItemLimit.HasValue)
            {
                actEntryGeneric.MaximumRows = historyRequest.HistoryItemLimit.Value;
            }
            actEntryGeneric.Query();

            var actEntryDTOS = actEntryGeneric.DataRows().Select(actEntryRecord =>
            {
                var id = historyRequest.WorkflowObject.Id;
                if (historyRequest.WorkflowObject.IsChild)
                {
                    //child objects are loaded in bulk so historyRequest.WorkflowObject.Id is not the correct id
                    //find the act_entry's parent generic id field value
                    var info = WorkflowObjectInfo.GetObjectInfo(actEntryGeneric.ParentRelation.TargetName);
                    var parentId = actEntryRecord.AsInt(actEntryGeneric.ParentRelation.Name);
                    var parentRow = actEntryGeneric.ParentGeneric.DataRows().First(r => r.DatabaseIdentifier() == parentId);
                    id = (info.HasIDFieldName) ? parentRow[info.IDFieldName].ToString() : Convert.ToString(parentRow.DatabaseIdentifier());
                }

                var code = actEntryRecord.AsInt("act_code");

                return new ActEntry
                {
                    Id = id,
                    Type = historyRequest.WorkflowObject.Type,
                    Template = findTemplateByActCode(code, templatesByCode),
                    When = actEntryRecord.AsDateTime("entry_time"),
                    Who = _employeeAssembler.Assemble(actEntryRecord, _contactAssembler),
                    AdditionalInfo = actEntryRecord.AsString("addnl_info"),
                    ActEntryRecord = actEntryRecord
                };

            }).ToList();

            return actEntryDTOS
                .Select(dto => createActivityDTOFromMapper(dto, templateRelatedGenerics))
                .Where(i=>!i.IsCancelled)
                .Where(_ => historyRequest.ShowAllActivities || !_.IsVerbose)
                .ToList();
        }
 public IEnumerable <HistoryItem> Build(HistoryRequest request)
 {
     return(Build(request, (generic, workflowObjectInfo) =>
     {
         if (workflowObjectInfo.IDFieldName.IsEmpty() || workflowObjectInfo.IDFieldName == "objid")
         {
             generic.Filter(f => f.Equals("objid", Convert.ToInt32(request.WorkflowObject.Id)));
         }
         else
         {
             generic.Filter(f => f.Equals(workflowObjectInfo.IDFieldName, request.WorkflowObject.Id));
         }
     }));
 }
 public IEnumerable<HistoryItem> Build(HistoryRequest request)
 {
     return Build(request, (generic, workflowObjectInfo) =>
     {
         if (workflowObjectInfo.IDFieldName.IsEmpty() || workflowObjectInfo.IDFieldName == "objid")
         {
             generic.Filter(f => f.Equals("objid", Convert.ToInt32(request.WorkflowObject.Id)));
         }
         else
         {
             generic.Filter(f => f.Equals(workflowObjectInfo.IDFieldName, request.WorkflowObject.Id));
         }
     });
 }
 public IEnumerable <HistoryItem> Build(HistoryRequest request, string[] ids)
 {
     return(Build(request, (generic, workflowObjectInfo) => generic.Filter(f => f.IsIn(workflowObjectInfo.IDFieldName, ids))));
 }
        public IEnumerable <HistoryItem> Assemble(ClarifyGeneric actEntryGeneric, IDictionary <int, ActEntryTemplate> templatesByCode, HistoryRequest historyRequest)
        {
            actEntryGeneric.DataFields.AddRange("act_code", "entry_time", "addnl_info", "proxy");

            if (!historyRequest.ShowAllActivities)
            {
                var activeCodes = templatesByCode.Values.Where(t => !t.IsVerbose).Select(d => d.Code).ToArray();
                actEntryGeneric.Filter(f => f.IsIn("act_code", activeCodes));
            }

            //adding related generics expected by any fancy act entry templates
            var templateRelatedGenerics = traverseRelatedGenerics(actEntryGeneric, templatesByCode);

            _employeeAssembler.TraverseEmployee(actEntryGeneric);
            _contactAssembler.TraverseContact(actEntryGeneric);
            if (historyRequest.HistoryItemLimit.HasValue)
            {
                actEntryGeneric.MaximumRows = historyRequest.HistoryItemLimit.Value;
            }
            actEntryGeneric.Query();

            var actEntryDTOS = actEntryGeneric.DataRows().Select(actEntryRecord =>
            {
                var id = historyRequest.WorkflowObject.Id;
                if (historyRequest.WorkflowObject.IsChild)
                {
                    //child objects are loaded in bulk so historyRequest.WorkflowObject.Id is not the correct id
                    //find the act_entry's parent generic id field value
                    var info      = WorkflowObjectInfo.GetObjectInfo(actEntryGeneric.ParentRelation.TargetName);
                    var parentId  = actEntryRecord.AsInt(actEntryGeneric.ParentRelation.Name);
                    var parentRow = actEntryGeneric.ParentGeneric.DataRows().First(r => r.DatabaseIdentifier() == parentId);
                    id            = (info.HasIDFieldName) ? parentRow[info.IDFieldName].ToString() : Convert.ToString(parentRow.DatabaseIdentifier());
                }

                var code = actEntryRecord.AsInt("act_code");

                return(new ActEntry
                {
                    Id = id,
                    Type = historyRequest.WorkflowObject.Type,
                    Template = findTemplateByActCode(code, templatesByCode),
                    When = actEntryRecord.AsDateTime("entry_time"),
                    Who = _employeeAssembler.Assemble(actEntryRecord, _contactAssembler),
                    ImpersonatedBy = _employeeAssembler.Assemble(actEntryRecord),
                    AdditionalInfo = actEntryRecord.AsString("addnl_info"),
                    ActEntryRecord = actEntryRecord
                });
            }).Where(_ => !_.Template.IsCancelled).ToList();

            return(actEntryDTOS
                   .Select(dto => createActivityDTOFromMapper(dto, templateRelatedGenerics))
                   .Where(i => !i.IsCancelled)
                   .Where(_ => historyRequest.ShowAllActivities || !_.IsVerbose)
                   .ToList());
        }
        private HistoryViewModel getHistoryWithConstraint(HistoryRequest request)
        {
            var historyItems = getHistoryItems(request);

            return CreateHistoryModel(request, historyItems);
        }
        private IEnumerable<HistoryItem> getHistoryItems(HistoryRequest request)
        {
            var historyBuilderPolicy = _entityHistoryBuilders.First(policy => policy.Handles(request.WorkflowObject));

            return historyBuilderPolicy.BuildHistory(request);
        }
 public HistoryViewModel GetHistory(HistoryRequest request)
 {
     return getHistoryWithConstraint(request);
 }
 public IEnumerable<HistoryItem> Build(HistoryRequest request, string[] ids)
 {
     return Build(request, (generic,workflowObjectInfo) => generic.Filter(f => f.IsIn(workflowObjectInfo.IDFieldName, ids)));
 }
        private IEnumerable <HistoryItem> getHistoryItems(HistoryRequest request)
        {
            var historyBuilderPolicy = _entityHistoryBuilders.First(policy => policy.Handles(request.WorkflowObject));

            return(historyBuilderPolicy.BuildHistory(request));
        }
        private HistoryViewModel getHistoryWithConstraint(HistoryRequest request)
        {
            var historyItems = getHistoryItems(request);

            return(CreateHistoryModel(request, historyItems));
        }
 public HistoryViewModel GetHistory(HistoryRequest request)
 {
     return(getHistoryWithConstraint(request));
 }