Esempio n. 1
0
        public IStepBuilder <TData, ActionStepBody> Then(Action <IStepExecutionContext> body)
        {
            var newStep = new WorkflowStep <ActionStepBody>();

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new StepBuilder <TData, ActionStepBody>(WorkflowBuilder, newStep);

            stepBuilder.Input(x => x.Body, x => body);
            Step.Outcomes.Add(new ValueOutcome {
                NextStep = newStep.Id
            });
            return(stepBuilder);
        }
Esempio n. 2
0
        public ActionResult CriarWorkflowStep([FromBody] WorkflowStep inputs)
        {
            try
            {
                _serv.CriarWorkflowStep(inputs);

                return(Ok());
            }
            catch (Exception ex)
            {
                return(BadRequest($"Ocorreu um erro ao criar um novo WorkflowStep: {ex.Message}"));
            }
        }
Esempio n. 3
0
        public ActionResult EditarWorkflowStep([FromBody] WorkflowStep inputs)
        {
            try
            {
                _serv.EditarWorkflowStep(inputs);

                return(Ok());
            }
            catch (Exception ex)
            {
                return(BadRequest($"Ocorreu um erro ao editar o WorkflowStep {inputs.IdWorkflowStep}: {ex.Message}"));
            }
        }
Esempio n. 4
0
 private void Given1StepWorkflow(WorkflowStep step1, string id, int version)
 {
     A.CallTo(() => Registry.GetDefinition(id, version)).Returns(new WorkflowDefinition()
     {
         Id       = id,
         Version  = version,
         DataType = typeof(object),
         Steps    = new List <WorkflowStep>()
         {
             step1
         }
     });
 }
Esempio n. 5
0
        public static WorkflowStepDto?FromWorkflowStep(WorkflowStep step)
        {
            if (step == null)
            {
                return(null);
            }

            return(SimpleMapper.Map(step, new WorkflowStepDto
            {
                Transitions = step.Transitions.ToDictionary(
                    y => y.Key,
                    y => WorkflowTransitionDto.FromWorkflowTransition(y.Value) !)
            }));
Esempio n. 6
0
        public IStepBuilder <TData, TStepBody> CompensateWithSequence(Action <IWorkflowBuilder <TData> > builder)
        {
            var newStep = new WorkflowStep <Sequence>();

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new StepBuilder <TData, Sequence>(WorkflowBuilder, newStep);

            Step.CompensationStepId = newStep.Id;
            builder.Invoke(WorkflowBuilder);
            stepBuilder.Step.Children.Add(stepBuilder.Step.Id + 1); //TODO: make more elegant

            return(this);
        }
Esempio n. 7
0
        public bool IsExistWorkflowOrderNo(WorkflowStep workFlow)
        {
            if (workFlow.IsActive)
            {
                var result = this.context.workFlowSteps
                             .Where(w => w.OrderNo.Equals(workFlow.OrderNo) &&
                                    w.IsActive && !w.Id.Equals(workFlow.Id))
                             .FirstOrDefault();

                return(result != null);
            }

            return(false);
        }
 public WorkflowStep_WorkflowStepDTO(WorkflowStep WorkflowStep)
 {
     this.Id = WorkflowStep.Id;
     this.WorkflowDefinitionId = WorkflowStep.WorkflowDefinitionId;
     this.Code   = WorkflowStep.Code;
     this.Name   = WorkflowStep.Name;
     this.RoleId = WorkflowStep.RoleId;
     this.SubjectMailForReject = WorkflowStep.SubjectMailForReject;
     this.BodyMailForReject    = WorkflowStep.BodyMailForReject;
     this.Role = WorkflowStep.Role == null ? null : new WorkflowStep_RoleDTO(WorkflowStep.Role);
     this.WorkflowDefinition = WorkflowStep.WorkflowDefinition == null ? null : new WorkflowStep_WorkflowDefinitionDTO(WorkflowStep.WorkflowDefinition);
     this.WorkflowParameters = WorkflowStep.WorkflowParameters?.Select(p => new WorkflowStep_WorkflowParameterDTO(p)).ToList();
     this.Errors             = WorkflowStep.Errors;
 }
Esempio n. 9
0
        private void GetCurrentStep()
        {
            BasePage p = ((BasePage)this.Page);

            if (workflow == null)
            {
                workflow = GetWorkflow();
            }


            EntityIDValue = p.GetEntityIDValue(p.Screen, Me.EntityID, Me.EntityInputType);

            step = workflowService.GetProvider(workflow).GetCurrentWorkflowStep(workflow, EntityIDValue);
        }
Esempio n. 10
0
        public void should_map_outputs()
        {
            //arrange
            Expression <Func <IStepWithProperties, int> > p1 = x => x.Property1;
            Expression <Func <DataClass, IStepExecutionContext, int> > v1 = (x, context) => x.Value1;

            var step1Body = A.Fake <IStepWithProperties>();

            A.CallTo(() => step1Body.Property1).Returns(7);
            A.CallTo(() => step1Body.RunAsync(A <IStepExecutionContext> .Ignored)).Returns(ExecutionResult.Next());
            WorkflowStep step1 = BuildFakeStep(step1Body, new List <DataMapping>(), new List <DataMapping>()
            {
                new DataMapping()
                {
                    Source = p1,
                    Target = v1
                }
            }
                                               );

            Given1StepWorkflow(step1, "Workflow", 1);

            var data = new DataClass()
            {
                Value1 = 5
            };

            var instance = new WorkflowInstance
            {
                WorkflowDefinitionId = "Workflow",
                Version           = 1,
                Status            = WorkflowStatus.Runnable,
                NextExecution     = 0,
                Id                = "001",
                Data              = data,
                ExecutionPointers = new List <ExecutionPointer>()
                {
                    new ExecutionPointer()
                    {
                        Active = true, StepId = 0
                    }
                }
            };

            //act
            Subject.Execute(instance);

            //assert
            data.Value1.Should().Be(7);
        }
Esempio n. 11
0
        public IParallelStepBuilder <TData, Sequence> Parallel()
        {
            var newStep    = new WorkflowStep <Sequence>();
            var newBuilder = new StepBuilder <TData, Sequence>(WorkflowBuilder, newStep);

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new ParallelStepBuilder <TData, Sequence>(WorkflowBuilder, newBuilder, newBuilder);

            Step.Outcomes.Add(new ValueOutcome {
                NextStep = newStep.Id
            });

            return(stepBuilder);
        }
Esempio n. 12
0
        public GettingLoanFlow(WorkflowStep <GettingLoanSteps> initialState, List <IFlowParameter> flowParameters) : base(
                initialState, flowParameters)
        {
            this.Configure(StartStep)
            .OnEntry(() => { })
            .Permit(WorkFlowActions.Next, WorkflowSteps.Single(a => a.Step == GettingLoanSteps.PrimitiveCheck));

            this.Configure(WorkflowSteps.Single(a => a.Step == GettingLoanSteps.PrimitiveCheck))
            .OnEntry(() => { })
            .Permit(WorkFlowActions.Next, WorkflowSteps.Single(a => a.Step == GettingLoanSteps.PreparingDocuments));

            this.Configure(WorkflowSteps.Single(a => a.Step == GettingLoanSteps.PreparingDocuments))
            .OnEntry(() => { })
            .Permit(WorkFlowActions.Next, WorkflowSteps.Single(a => a.Step == GettingLoanSteps.Payment));
        }
Esempio n. 13
0
        private void AttachInputs(StepSourceV1 source, Type dataType, Type stepType, WorkflowStep step)
        {
            foreach (var input in source.Inputs)
            {
                var dataParameter    = Expression.Parameter(dataType, "data");
                var contextParameter = Expression.Parameter(typeof(IStepExecutionContext), "context");
                var sourceExpr       = DynamicExpressionParser.ParseLambda(new [] { dataParameter, contextParameter }, typeof(object), input.Value);

                var stepParameter  = Expression.Parameter(stepType, "step");
                var targetProperty = Expression.Property(stepParameter, input.Key);
                var targetExpr     = Expression.Lambda(targetProperty, stepParameter);

                step.Inputs.Add(new MemberMapParameter(sourceExpr, targetExpr));
            }
        }
Esempio n. 14
0
        public async Task <ActionResult <WorkflowStep_WorkflowStepDTO> > Get([FromBody] WorkflowStep_WorkflowStepDTO WorkflowStep_WorkflowStepDTO)
        {
            if (!ModelState.IsValid)
            {
                throw new BindException(ModelState);
            }

            if (!await HasPermission(WorkflowStep_WorkflowStepDTO.Id))
            {
                return(Forbid());
            }

            WorkflowStep WorkflowStep = await WorkflowStepService.Get(WorkflowStep_WorkflowStepDTO.Id);

            return(new WorkflowStep_WorkflowStepDTO(WorkflowStep));
        }
        internal static void Enrich(WorkflowStep workflowStep)
        {
            var activity = Activity.Current;

            if (activity != null)
            {
                var stepName = string.IsNullOrEmpty(workflowStep.Name)
                    ? "inline"
                    : workflowStep.Name;

                activity.DisplayName += $" step {stepName}";
                activity.SetTag("workflow.step.id", workflowStep.Id);
                activity.SetTag("workflow.step.name", workflowStep.Name);
                activity.SetTag("workflow.step.type", workflowStep.BodyType.Name);
            }
        }
Esempio n. 16
0
        public IContainerStepBuilder <TData, Schedule, TStepBody> Schedule(Expression <Func <TData, TimeSpan> > time)
        {
            var newStep = new WorkflowStep <Schedule>();
            Expression <Func <Schedule, TimeSpan> > inputExpr = (x => x.Interval);

            newStep.Inputs.Add(new MemberMapParameter(time, inputExpr));

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new ReturnStepBuilder <TData, Schedule, TStepBody>(WorkflowBuilder, newStep, this);

            Step.Outcomes.Add(new ValueOutcome {
                NextStep = newStep.Id
            });

            return(stepBuilder);
        }
Esempio n. 17
0
        public IStepBuilder <TData, Delay> Delay(Expression <Func <TData, TimeSpan> > period)
        {
            var newStep = new WorkflowStep <Delay>();

            Expression <Func <Delay, TimeSpan> > inputExpr = (x => x.Period);

            newStep.Inputs.Add(new MemberMapParameter(period, inputExpr));

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new StepBuilder <TData, Delay>(WorkflowBuilder, newStep);

            Step.Outcomes.Add(new ValueOutcome {
                NextStep = newStep.Id
            });

            return(stepBuilder);
        }
Esempio n. 18
0
        private void AttachOutputs(Step source, Type dataType, Type stepType, WorkflowStep step)
        {
            foreach (var output in source.Outputs)
            {
                Action <IStepBody, object> acn = (pStep, pData) =>
                {
                    object resolvedValue = _scriptHost.EvaluateExpression(output.Value, new Dictionary <string, object>()
                    {
                        ["step"] = pStep,
                        ["data"] = pData
                    });
                    (pData as IDictionary <string, object>)[output.Key] = resolvedValue;
                };

                step.Outputs.Add(new ActionParameter <IStepBody, object>(acn));
            }
        }
Esempio n. 19
0
        private async Task <bool> ValidateRole(WorkflowStep WorkflowStep)
        {
            RoleFilter RoleFilter = new RoleFilter
            {
                Id = new IdFilter {
                    Equal = WorkflowStep.RoleId
                }
            };

            var count = await UOW.RoleRepository.Count(RoleFilter);

            if (count == 0)
            {
                WorkflowStep.AddError(nameof(WorkflowStepValidator), nameof(WorkflowStep.Role), ErrorCode.RoleNotExisted);
            }
            return(WorkflowStep.IsValidated);
        }
        public IUserTaskReturnBuilder <TData> WithOption(string value, string label)
        {
            var newStep = new WorkflowStep <When>();
            Expression <Func <When, object> >  inputExpr = (x => x.ExpectedOutcome);
            Expression <Func <TData, string> > valueExpr = (x => value);
            var mapping = new MemberMapParameter(valueExpr, inputExpr);

            newStep.Inputs.Add(mapping);

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new UserTaskReturnBuilder <TData>(WorkflowBuilder, newStep, this);

            Step.Children.Add(newStep.Id);
            _wrapper.Options[label] = value;

            return(stepBuilder);
        }
Esempio n. 21
0
        public IStepBuilder <TData, Decide> Decide(Expression <Func <TData, object> > expression)
        {
            var newStep = new WorkflowStep <Decide>();

            Expression <Func <Decide, object> > inputExpr = (x => x.Expression);

            newStep.Inputs.Add(new MemberMapParameter(expression, inputExpr));

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new StepBuilder <TData, Decide>(WorkflowBuilder, newStep);

            Step.Outcomes.Add(new ValueOutcome {
                NextStep = newStep.Id
            });

            return(stepBuilder);
        }
Esempio n. 22
0
        public IContainerStepBuilder <TData, If, If> If(Expression <Func <TData, bool> > condition)
        {
            var newStep = new WorkflowStep <If>();

            Expression <Func <If, bool> > inputExpr = (x => x.Condition);

            newStep.Inputs.Add(new MemberMapParameter(condition, inputExpr));

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new StepBuilder <TData, If>(WorkflowBuilder, newStep);

            Step.Outcomes.Add(new ValueOutcome {
                NextStep = newStep.Id
            });

            return(stepBuilder);
        }
Esempio n. 23
0
        public IContainerStepBuilder <TData, Foreach, Foreach> ForEach(Expression <Func <TData, IEnumerable> > collection)
        {
            var newStep = new WorkflowStep <Foreach>();

            Expression <Func <Foreach, IEnumerable> > inputExpr = (x => x.Collection);

            newStep.Inputs.Add(new MemberMapParameter(collection, inputExpr));

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new StepBuilder <TData, Foreach>(WorkflowBuilder, newStep);

            Step.Outcomes.Add(new ValueOutcome {
                NextStep = newStep.Id
            });

            return(stepBuilder);
        }
Esempio n. 24
0
        private async Task <bool> ValidateWorkflowStepInUsed(WorkflowStep WorkflowStep)
        {
            RequestWorkflowStepMappingFilter RequestWorkflowStepMappingFilter = new RequestWorkflowStepMappingFilter
            {
                WorkflowStepId = new IdFilter {
                    Equal = WorkflowStep.Id
                }
            };

            var count = await UOW.RequestWorkflowStepMappingRepository.Count(RequestWorkflowStepMappingFilter);

            if (count != 0)
            {
                WorkflowStep.AddError(nameof(WorkflowStepValidator), nameof(WorkflowStep.Id), ErrorCode.WorkflowStepInUsed);
            }
            return(WorkflowStep.IsValidated);
        }
Esempio n. 25
0
        private void ProcessOutputs(WorkflowInstance workflow, WorkflowStep step, IStepBody body)
        {
            foreach (var output in step.Outputs)
            {
                var member = (output.Target.Body as MemberExpression);
                if (member != null) // to resolve a field or property
                {
                    var list = new List <String>()
                    {
                        "system.int64", "system.int32", "system.string", "system.boolean"
                    };
                    var resolvedValue = output.Source.Compile().DynamicInvoke(body);

                    Type resolvedValueType = resolvedValue.GetType();

                    var type = resolvedValueType.FullName.ToLower();

                    if (!list.Contains(type))
                    {
                        var data  = workflow.Data;
                        var value = resolvedValue.GetType().GetProperty(member.Member.Name).GetValue(resolvedValue, null);
                        data.GetType().GetProperty(member.Member.Name).SetValue(data, value);
                    }

                    else if (list.Contains(type))
                    {
                        var data = workflow.Data;
                        data.GetType().GetProperty(member.Member.Name).SetValue(data, resolvedValue);
                    }
                }

                if (member == null) // to resolve an object
                {
                    var resolvedValue = output.Source.Compile().DynamicInvoke(body);
                    var data          = workflow.Data;

                    Type dataType = data.GetType();

                    foreach (PropertyInfo propertyInfo in dataType.GetProperties())
                    {
                        var value = resolvedValue.GetType().GetProperty(propertyInfo.Name).GetValue(resolvedValue, null);
                        data.GetType().GetProperty(propertyInfo.Name).SetValue(data, value);
                    }
                }
            }
        }
Esempio n. 26
0
        public IStepBuilder <TData, TStepBody> CompensateWith <TStep>(Action <IStepBuilder <TData, TStep> > stepSetup = null) where TStep : IStepBody
        {
            WorkflowStep <TStep> newStep = new WorkflowStep <TStep>();

            WorkflowBuilder.AddStep(newStep);
            var stepBuilder = new StepBuilder <TData, TStep>(WorkflowBuilder, newStep);

            if (stepSetup != null)
            {
                stepSetup.Invoke(stepBuilder);
            }

            newStep.Name            = newStep.Name ?? typeof(TStep).Name;
            Step.CompensationStepId = newStep.Id;

            return(this);
        }
        public void Test_Graph_Run_Ok()
        {
            DBController  db  = DBController.Create(connectionString);
            Workflow      wf  = db.WorkflowMetadataGet("Test100");
            WorkflowGraph wfg = WorkflowGraph.Create(wf, db);

            wfg.Start();

            BlockingCollection <string> step_set = new BlockingCollection <string>();

            Task t1 = Task.Factory.StartNew(() =>
            {
                WorkflowStep step = null;
                while (wfg.TryTake(out step, TimeSpan.FromMinutes(5)))
                {
                    wfg.SetNodeExecutionResult(step.Key, WfResult.Started);
                    Thread.Sleep(1000);
                    step_set.Add(step.Key);
                }

                step_set.CompleteAdding();
                Console.WriteLine(String.Format("Finishing Step Submitting thread"));
            });

            Task t2 = Task.Factory.StartNew(() =>
            {
                string Key = String.Empty;
                while (step_set.TryTake(out Key, -1))
                {
                    Console.WriteLine(String.Format("Processing step {0}", Key));
                    wfg.SetNodeExecutionResult(Key, WfResult.Succeeded);
                    //wfg.SetNodeExecutionResult(Key, WfResult.Failed);
                }

                Console.WriteLine(String.Format("Finishing Step Processing thread"));
            });

            Task.WaitAll(t1, t2);

            WfResult wr = wfg.WorkflowRunStatus;
            WfResult wc = wfg.WorkflowCompleteStatus;

            Console.WriteLine(String.Format("Run status {0}", wr.StatusCode.ToString()));
            Console.WriteLine(String.Format("Complete status {0}", wc.StatusCode.ToString()));
            Assert.IsTrue(wr.StatusCode == WfStatus.Succeeded);
        }
Esempio n. 28
0
        public void should_map_outputs()
        {
            //arrange
            var param = A.Fake <IStepParameter>();

            var step1Body = A.Fake <IStepWithProperties>();

            A.CallTo(() => step1Body.Property1).Returns(7);
            A.CallTo(() => step1Body.RunAsync(A <IStepExecutionContext> .Ignored)).Returns(ExecutionResult.Next());
            WorkflowStep step1 = BuildFakeStep(step1Body, new List <IStepParameter>(), new List <IStepParameter>()
            {
                param
            }
                                               );

            Given1StepWorkflow(step1, "Workflow", 1);

            var data = new DataClass()
            {
                Value1 = 5
            };

            var instance = new WorkflowInstance
            {
                WorkflowDefinitionId = "Workflow",
                Version           = 1,
                Status            = WorkflowStatus.Runnable,
                NextExecution     = 0,
                Id                = "001",
                Data              = data,
                ExecutionPointers = new ExecutionPointerCollection(new List <ExecutionPointer>()
                {
                    new ExecutionPointer()
                    {
                        Id = "1", Active = true, StepId = 0
                    }
                })
            };

            //act
            Subject.Execute(instance);

            //assert
            A.CallTo(() => param.AssignOutput(data, step1Body, A <IStepExecutionContext> .Ignored))
            .MustHaveHappened();
        }
Esempio n. 29
0
        private void ProcessInputs(WorkflowInstance workflow, WorkflowStep step, IStepBody body, IStepExecutionContext context)
        {
            //TODO: Move to own class
            foreach (var input in step.Inputs)
            {
                var member = (input.Target.Body as MemberExpression);

                if (member == null)
                {
                    UnaryExpression ubody = (UnaryExpression)input.Target.Body;
                    member = ubody.Operand as MemberExpression;
                }

                object resolvedValue = null;

                switch (input.Source.Parameters.Count)
                {
                case 1:
                    resolvedValue = input.Source.Compile().DynamicInvoke(workflow.Data);
                    break;

                case 2:
                    resolvedValue = input.Source.Compile().DynamicInvoke(workflow.Data, context);
                    break;

                default:
                    throw new ArgumentException();
                }

                var property = step.BodyType.GetProperty(member.Member.Name);

                var propertyType = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;

                if (CanChangeType(resolvedValue, propertyType))
                {
                    var safeValue = (resolvedValue == null) ? null : Convert.ChangeType(resolvedValue, propertyType);

                    property.SetValue(body, safeValue);
                }
                else
                {
                    property.SetValue(body, resolvedValue);
                }
            }
        }
Esempio n. 30
0
        public static WorkflowStepDto FromWorkflowStep(WorkflowStep step)
        {
            var response = SimpleMapper.Map(step, new WorkflowStepDto
            {
                Transitions = step.Transitions.ToDictionary(
                    y => y.Key,
                    y => WorkflowTransitionDto.FromWorkflowTransition(y.Value))
            });

            if (step.NoUpdate != null)
            {
                response.NoUpdate           = true;
                response.NoUpdateExpression = step.NoUpdate.Expression;
                response.NoUpdateRoles      = step.NoUpdate.Roles?.ToArray();
            }

            return(response);
        }
Esempio n. 31
0
        public override void UpdatedState(WorkflowStep step)
        {
            if (step.State != step.NextWorkflowStep.State)

                switch (step.WithWorkflowAction)
                {
                    case WorkflowActions.Approve:
                        Invoice.InvoiceState.ApproveInvoice(Invoice);

                        break;
                    case WorkflowActions.Reject:
                        Invoice.InvoiceState.RejectInvoice(Invoice);
                        break;

                    case WorkflowActions.Cancel:
                        Invoice.InvoiceState.CancelInvoice(Invoice);
                        break;
                }
        }
Esempio n. 32
0
 public StateStepConfigurationMetadata(IEnumerable<DocumentType> documentTypes, WorkflowStep workflowStep)
 {
     DocumentTypes = documentTypes;
     WorkflowStep = workflowStep;
 }
Esempio n. 33
0
 public StateStepConfigurationMetadataAttribute(DocumentType[] documentTypes, WorkflowStep workflowStep)
 {
     DocumentTypes = documentTypes;
     WorkflowStep = workflowStep;
 }
        private CatalogUploadViewModel GetCatalogViewModel(WorkflowStep<CatalogUploadState> nextStep, CatalogUploadState state)
        {
            var vm = new CatalogUploadViewModel();
            vm.PageTitle = nextStep.StepName;
            vm.NavigationLocation = new string[] { "Admin" };
            vm.CatalogUploadState = state;
            vm.StepView = nextStep.StepView;
            vm.StepActionName = nextStep.StepButton;// "Next Step";
            vm.MyCatalogs = Account.User(false).MyAdminCatalogs().OrderBy(c => c.CatalogName).ToList();
            vm.MyPricingPlan = Account.User().PricingPlan;
            vm.MyUserBalances = Account.User().MyBalances();
            //			vm.DefaultSongBalance = vm.PricingPlans.Where(p => p.IsEnabled == true).Min(p => p.NumberOfSongs);
            vm.MinUploadFiles = 1;

            return vm;
        }