public override bool Execute(OrderTaskContext context) { bool allowed = false; if (context.MTApp.CurrentRequestContext != null) { allowed = context.MTApp.CurrentRequestContext.CurrentStore.Settings.AllowZeroDollarOrders; } if (!allowed) { if (context.Order.TotalOrderBeforeDiscounts - context.Order.TotalOrderDiscounts <= 0) { WorkflowMessage errorMessage = new WorkflowMessage("Error", "Zero dollar orders are not allowed on this store.", true); context.Errors.Add(errorMessage); return(false); } } if (context.Order.Items.Count < 1) { WorkflowMessage error2 = new WorkflowMessage("Error", "The system was unable to process your order and may be busy. Please try again.", true); context.Errors.Add(error2); return(false); } return(true); }
internal void RejectApproveWorkItem(int workItemId, string approveComment, long nextActivityId) { SysWorkItem item; this._pi = this._piCacheFactory.GetProcessInstanceCacheByWorkItem(workItemId, out item); if (!item.Status.HasValue) { item.Status = 0; } if (item.Status.Value == 1) { throw new ApplicationException("该工作项已完成"); } if (item.Status.Value == 3) { throw new ApplicationException("该工作项已被系统取消"); } if (item.Status.Value != 0) { throw new ApplicationException("该工作项已完成或被取消"); } this.AddInstanceData(item, ApproveResultEnum.Reject, approveComment); Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); WorkflowMessage message = this.NewRejectWorkItemWithNextActivityApproveMessage(item, nextActivityId); queue.Enqueue(message); while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._piCacheFactory.ClearCache(this._pi.ProcessInstanceId); }
private Mock <IWorkflowMessageRepository> BuildIRepositoryMock(WorkflowMessage message) { var mock = new Mock <IWorkflowMessageRepository>(); mock.Setup(r => r.GetByKey(It.IsAny <Guid>())).Returns(message); return(mock); }
public override void ProcessMessage(SysWorkflowMessage msg) { SysWorkItem wI = this._engine.WI; SysProcessInstance pI = this._engine.PI; if (!wI.Status.HasValue) { wI.Status = 0; } if (wI.Status.Value != 0x63) { throw new ApplicationException("该工作项的状态已变更"); } Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); if (msg.NextApproveUserList.Count > 0) { WorkflowMessage item = this._engine.NewCompleteWorkItemWithNextUsersMessage(wI, msg.NextApproveUserList); queue.Enqueue(item); } else { WorkflowMessage message2 = this._engine.NewCompleteWorkItemMessage(wI); queue.Enqueue(message2); } while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._engine.ProcessInstanceCache.ClearCache(pI.ProcessInstanceId); }
internal virtual int StartFormProcess(int startUserId, int formInstanceId) { IOrgProxy proxy = OrgProxyFactory.GetProxy(this._context); int nextIdentity = this._manager.GetNextIdentity(); IUser userById = proxy.GetUserById(startUserId); if (userById == null) { throw new ApplicationException("用户不存在"); } if (!userById.Department_ID.HasValue) { throw new ApplicationException("未指定用户部门"); } IDepartment departmentById = proxy.GetDepartmentById(userById.Department_ID.Value); if (departmentById == null) { throw new ApplicationException("用户部门无效"); } SysFormInstance fi = this._context.FindById <SysFormInstance>(new object[] { formInstanceId }); if (fi == null) { throw new ApplicationException("表单实例不存在"); } if (!fi.ObjectId.HasValue) { throw new ApplicationException("表单实例未关联对象ID"); } fi.State = 1; this.ProcessInstanceCache.UpdateFormInstance(fi); SysProcessInstance instance2 = new SysProcessInstance { StartTime = new DateTime?(DateTime.Now), EndTime = null, InstanceStatus = 0, ObjectId = fi.ObjectId.Value, FormInstanceId = new int?(fi.FormInstanceId), FormInstance = fi, ProcessId = new long?(this._process.ProcessId), ProcessInstanceId = nextIdentity, StartUserId = new int?(startUserId), StartDeptId = new int?(departmentById.Department_ID), WwfInstanceId = null }; this._pi = instance2; this._pi.FormInstance = fi; this._piCacheFactory.AddProcessInstance(this._pi); Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); WorkflowMessage item = this.NewStartProcessMessage(); queue.Enqueue(item); while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._piCacheFactory.ClearCache(nextIdentity); return(nextIdentity); }
public override bool Execute(OrderTaskContext context) { for (int i = 0; i <= 5; i++) { WorkflowMessage errorMessage = new WorkflowMessage("Error", "This error is error number " + i.ToString(), true); context.Errors.Add(errorMessage); } return false; }
public override bool Execute(OrderTaskContext context) { for (var i = 0; i <= 5; i++) { var errorMessage = new WorkflowMessage("Error", "This error is error number " + i, true); context.Errors.Add(errorMessage); } return(false); }
public void GetKnownTypes() { var types = WorkflowMessage.GetKnownTypes(); types.Should().NotBeEmpty(); types.Count().Should().Be(4); types.Should().Contain(typeof(ReportCompleteMessage)); types.Should().Contain(typeof(ReportInProgressMessage)); types.Should().Contain(typeof(ReportPendingCompleteMessage)); types.Should().Contain(typeof(ReportSubmittedMessage)); }
protected void RegisterWarning(string code, IDictionary <string, string> parameters) { var message = new WorkflowMessage { Code = code, Parameters = new Dictionary <string, string>() }; foreach (var param in parameters) { message.Parameters.Add(param.Key, param.Value); } CurrentResult.Warnings.Add(message); }
internal virtual void CancelProcess(int processInstanceId) { this._pi = this._piCacheFactory.GetProcessInstanceCache(processInstanceId); Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); WorkflowMessage item = this.NewCancelProcessMessage(this._pi); queue.Enqueue(item); while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._piCacheFactory.ClearCache(processInstanceId); }
public override void ProcessMessage(SysWorkflowMessage msg) { if (this._engine.ProcessCache.GetProcessCache(msg.ProcessId) == null) { throw new ApplicationException("process == null"); } SysProcessInstance processInstance = this._engine.PI; if (processInstance == null) { throw new ApplicationException("processInstance == null"); } IOrgProxy proxy = OrgProxyFactory.GetProxy(this.dbContext); if (!processInstance.StartUserId.HasValue) { throw new ApplicationException("processInstance.StartUserId == null"); } IUser userById = proxy.GetUserById(processInstance.StartUserId.Value); if (userById == null) { throw new ApplicationException("用户不存在"); } if (!userById.Department_ID.HasValue) { throw new ApplicationException("未指定用户部门"); } IDepartment departmentById = proxy.GetDepartmentById(userById.Department_ID.Value); if (departmentById == null) { throw new ApplicationException("用户部门无效"); } int?startDeptId = processInstance.StartDeptId; if ((startDeptId.HasValue ? startDeptId.GetValueOrDefault() : -1) < 0) { processInstance.StartDeptId = new int?(departmentById.Department_ID); this.dbContext.UpdatePartial <SysProcessInstance>(processInstance, p => new { StartDeptId = processInstance.StartDeptId }); } Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); WorkflowMessage item = this._engine.NewStartProcessWithNextUsersMessage(msg.NextApproveUserList); queue.Enqueue(item); while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._engine.ProcessInstanceCache.ClearCache(msg.ProcessInstanceId); }
public override void ProcessMessage(SysWorkflowMessage msg) { if (msg.AddUser && (!msg.AddUserId.HasValue || (msg.AddUserId <= 0))) { throw new ApplicationException("指定了加签,但未指定加签用户"); } SysWorkItem wI = this._engine.WI; SysProcessInstance pI = this._engine.PI; if (!wI.Status.HasValue) { wI.Status = 0; } if (wI.Status.Value == 1) { throw new ApplicationException("该工作项已完成"); } if (wI.Status.Value == 3) { throw new ApplicationException("该工作项已被系统取消"); } if (wI.Status.Value != 0x63) { throw new ApplicationException("该工作项已完成或被取消"); } this._engine.AddInstanceData(wI, msg.ApproveResult, msg.ApproveComment); if (msg.AddUser && (msg.ApproveResult == ApproveResultEnum.Pass)) { this._engine.CreateAddingWorkItem(wI, msg.AddUserId.Value); } Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); if (msg.NextApproveUserList.Count > 0) { WorkflowMessage item = this._engine.NewCompleteWorkItemWithNextUsersApproveMessage(wI, msg.NextApproveUserList); queue.Enqueue(item); } else { WorkflowMessage message2 = this._engine.NewCompleteWorkItemApproveMessage(wI); queue.Enqueue(message2); } while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._engine.ProcessInstanceCache.ClearCache(pI.ProcessInstanceId); }
public void CallConstructor_WorkflowMessageCreatedEventRaised() { using (var serviceLocatorFixture = new ServiceLocatorFixture()) { // Setup SetupServiceLocatorFixture(serviceLocatorFixture); var events = new List <IDomainEvent> (); CommitEvent.RegisterAll(events.Add); var workflow = new WorkflowMessage(Guid.NewGuid(), Guid.NewGuid(), string.Empty, Guid.NewGuid(), string.Empty, new Score()); Assert.AreEqual(1, events.Count(), "Incorrect number of events."); Assert.AreEqual(typeof(WorkflowMessageCreatedEvent), events.First().GetType()); } }
internal virtual int StartProcess(int startUserId, int relativeObjectId, List <IApproveUser> nextApproveUserList) { IOrgProxy proxy = OrgProxyFactory.GetProxy(this._context); int nextIdentity = this._manager.GetNextIdentity(); IUser userById = proxy.GetUserById(startUserId); if (userById == null) { throw new ApplicationException("用户不存在"); } if (!userById.Department_ID.HasValue) { throw new ApplicationException("未指定用户部门"); } IDepartment departmentById = proxy.GetDepartmentById(userById.Department_ID.Value); if (departmentById == null) { throw new ApplicationException("用户部门无效"); } SysProcessInstance instance = new SysProcessInstance { StartTime = new DateTime?(DateTime.Now), EndTime = null, InstanceStatus = 0, ObjectId = relativeObjectId, ProcessId = new long?(this._process.ProcessId), ProcessInstanceId = nextIdentity, StartUserId = new int?(startUserId), StartDeptId = new int?(departmentById.Department_ID), WwfInstanceId = null }; this._pi = instance; this._piCacheFactory.AddProcessInstance(this._pi); Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); WorkflowMessage item = this.NewStartProcessWithNextUsersMessage(nextApproveUserList); queue.Enqueue(item); while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._piCacheFactory.ClearCache(nextIdentity); return(nextIdentity); }
public void CallAdministerAssessment_WorkflowMessageStatusChangedEventRaised() { using (var serviceLocatorFixture = new ServiceLocatorFixture()) { // Setup SetupServiceLocatorFixture(serviceLocatorFixture); var workflowMessage = new WorkflowMessage(Guid.NewGuid(), Guid.NewGuid(), string.Empty, Guid.NewGuid(), string.Empty, new Score()); var events = new List <IDomainEvent> (); CommitEvent.RegisterAll(events.Add); workflowMessage.AdministerAssessment(); Assert.AreEqual(1, events.Count(), "Incorrect number of events."); Assert.AreEqual(typeof(WorkflowMessageStatusChangedEvent), events.First().GetType()); Assert.AreEqual(WorkflowMessageStatus.InProgress, (events.First() as WorkflowMessageStatusChangedEvent).Status); } }
public void CallAdvance_CorrectEventsRaised() { using (var serviceLocatorFixture = new ServiceLocatorFixture()) { // Setup SetupServiceLocatorFixture(serviceLocatorFixture); var workflowMessage = new WorkflowMessage(Guid.NewGuid(), Guid.NewGuid(), string.Empty, Guid.NewGuid(), string.Empty, new Score()); workflowMessage.AdministerAssessment(); var events = new List <IDomainEvent> (); CommitEvent.RegisterAll(events.Add); var assessmentKey = Guid.NewGuid(); var assessmentCode = Guid.NewGuid().ToString(); var recommendedAssessmentKey = Guid.NewGuid(); var recommendedAssessmentCode = Guid.NewGuid().ToString(); var score = new Score(); workflowMessage.Advance(assessmentKey, assessmentCode, recommendedAssessmentKey, recommendedAssessmentCode, score); Assert.AreEqual(2, events.Count(), "Incorrect number of events."); Assert.IsTrue(events.Any(a => a.GetType() == typeof(WorkflowMessageStatusChangedEvent)), "Status Changed event not raised."); Assert.IsTrue(events.Any(a => a.GetType() == typeof(WorkflowMessageAdvancedEvent)), "Advanced Event not raised."); Assert.IsTrue( (events.First(a => a.GetType() == typeof(WorkflowMessageStatusChangedEvent)) as WorkflowMessageStatusChangedEvent).Status == WorkflowMessageStatus.WaitingForResponse, "Status event has wrong status."); var advanceEvent = events.First(a => a.GetType() == typeof(WorkflowMessageAdvancedEvent)) as WorkflowMessageAdvancedEvent; Assert.AreEqual(assessmentKey, advanceEvent.InitiatingAssessmentKey, "Advance event has wrong InitiatingAssessmentKey."); Assert.AreEqual(assessmentCode, advanceEvent.InitiatingAssessmentCode, "Advance event has wrong InitiatingAssessmentCode."); Assert.AreEqual(recommendedAssessmentKey, advanceEvent.RecommendedAssessmentDefinitionKey, "Advance event has wrong RecommendedAssessmentDefinitionKey."); Assert.AreEqual(recommendedAssessmentCode, advanceEvent.RecommendedAssessmentDefinitionCode, "Advance event has wrong RecommendedAssessmentDefinitionCode."); Assert.AreSame(score, advanceEvent.InitiatingAssessmentScore, "Advance event has wrong InitiatingAssessmentScore."); Assert.AreEqual(assessmentKey, workflowMessage.InitiatingAssessmentKey, "Worflow message has wrong InitiatingAssessmentKey."); Assert.AreEqual(assessmentCode, workflowMessage.InitiatingAssessmentCode, "Worflow message has wrong InitiatingAssessmentCode."); Assert.AreEqual(recommendedAssessmentKey, workflowMessage.RecommendedAssessmentDefinitionKey, "Worflow message has wrong RecommendedAssessmentDefinitionKey."); Assert.AreEqual(recommendedAssessmentCode, workflowMessage.RecommendedAssessmentDefinitionCode, "Worflow message has wrong RecommendedAssessmentDefinitionCode."); Assert.AreSame(score, workflowMessage.InitiatingAssessmentScore, "Worflow message has wrong InitiatingAssessmentScore."); } }
public void ExecuteShouldRecommendNidaAssessFurtherRuleThenClause_WorkflowMessageCreated() { using (var serviceLocatorFixture = new ServiceLocatorFixture()) { // Setup SetupServiceLocatorFixture(serviceLocatorFixture); var assessmentDefKey = Guid.NewGuid(); var assessmentDefinition = Substitute.For <AssessmentDefinition>(); assessmentDefinition.Key.Returns(assessmentDefKey); var assessmentInstance = new AssessmentInstanceFactory().Create(assessmentDefinition, Guid.NewGuid(), "TestName"); var workflowMessage = new WorkflowMessage(Guid.NewGuid(), Guid.NewGuid(), string.Empty, assessmentInstance.AssessmentDefinitionKey, DrugAbuseScreeningTest.AssessmentCodedConcept.Code, null); workflowMessage.AdministerAssessment(); assessmentInstance.AddToWorkflow(workflowMessage.Key); var ruleCollection = new NidaWorkflowRuleCollection( BuildIAssessmentDefinitionRepositoryMock(assessmentDefKey).Object, BuildIRepositoryMock(workflowMessage).Object, new Mock <IAssessmentInstanceRepository>().Object); assessmentInstance.ScoreComplete(new CodedConcept(new CodeSystem("", "", ""), "", ""), "test"); var messageCollector = new MessageCollector(); var ruleEngineContext = new RuleEngineContext <AssessmentInstance>(assessmentInstance); ruleEngineContext.WorkingMemory.AddContextObject <IMessageCollector>(messageCollector, "MessageCollector"); foreach (var action in ruleCollection.ShouldRecommendNidaAssessFurtherRule.ThenClauses) { action(ruleEngineContext); } Assert.AreEqual(1, messageCollector.Messages.Count(), "Incorrect Number of messages."); Assert.AreEqual(typeof(WorkflowMessage), messageCollector.Messages.First().GetType()); Assert.AreSame(workflowMessage, messageCollector.Messages.First()); Assert.AreEqual(NidaAssessFurther.AssessmentCodedConcept.Code, (messageCollector.Messages.First() as WorkflowMessage).RecommendedAssessmentDefinitionCode); } }
internal virtual void CompleteApproveWorkItem(int workItemId, ApproveResultEnum approveResult, string approveComment, bool addUser = false, int?addUserId = new int?()) { SysWorkItem item; if (addUser && (!addUserId.HasValue || (addUserId <= 0))) { throw new ApplicationException("指定了加签,但未指定加签用户"); } this._pi = this._piCacheFactory.GetProcessInstanceCacheByWorkItem(workItemId, out item); if (!item.Status.HasValue) { item.Status = 0; } if (item.Status.Value == 1) { throw new ApplicationException("该工作项已完成"); } if (item.Status.Value == 3) { throw new ApplicationException("该工作项已被系统取消"); } if (item.Status.Value != 0) { throw new ApplicationException("该工作项已完成或被取消"); } this.AddInstanceData(item, approveResult, approveComment); if (addUser && (approveResult == ApproveResultEnum.Pass)) { this.CreateAddingWorkItem(item, addUserId.Value); } Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); WorkflowMessage message = this.NewCompleteWorkItemApproveMessage(item); queue.Enqueue(message); while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._piCacheFactory.ClearCache(this._pi.ProcessInstanceId); }
public override bool Execute(OrderTaskContext context) { bool allowed = false; if (context.MTApp.CurrentRequestContext != null) { allowed = context.MTApp.CurrentRequestContext.CurrentStore.Settings.AllowZeroDollarOrders; } if (!allowed) { if (context.Order.TotalOrderBeforeDiscounts - context.Order.TotalOrderDiscounts <= 0) { WorkflowMessage errorMessage = new WorkflowMessage("Error", "Zero dollar orders are not allowed on this store.", true); context.Errors.Add(errorMessage); return false; } } if (context.Order.Items.Count < 1) { WorkflowMessage error2 = new WorkflowMessage("Error", "The system was unable to process your order and may be busy. Please try again.", true); context.Errors.Add(error2); return false; } return true; }
internal void CompleteWorkItemSelf(int workItemId) { SysWorkItem item; this._pi = this._piCacheFactory.GetProcessInstanceCacheByWorkItem(workItemId, out item); if (!item.Status.HasValue) { item.Status = 0; } if (item.Status.Value != 0) { throw new ApplicationException("该工作项已完成或被取消"); } Queue <WorkflowMessage> queue = new Queue <WorkflowMessage>(10); WorkflowMessage message = this.NewCompleteWorkItemSelfMessage(item); queue.Enqueue(message); while (queue.Count > 0) { queue.Dequeue().Execute(queue); } this._piCacheFactory.ClearCache(this._pi.ProcessInstanceId); }
public override bool Execute(OrderTaskContext context) { var allowed = context.HccApp.CurrentStore.Settings.AllowZeroDollarOrders; if (!allowed) { if (context.Order.TotalGrand <= 0) { var errorMessage = new WorkflowMessage("Error", "Zero dollar orders are not allowed on this store.", true); context.Errors.Add(errorMessage); return(false); } } if (context.Order.Items.Count < 1) { var error2 = new WorkflowMessage("Error", "The system was unable to process your order and may be busy. Please try again.", true); context.Errors.Add(error2); return(false); } return(true); }
/// <summary> /// Initializes a new instance of the <see cref="NidaWorkflowRuleCollection"/> class. /// </summary> /// <param name="assessmentDefinitionRepository">The assessment definition repository.</param> /// <param name="repository">The repository.</param> /// <param name="assessmentInstanceRepository">The assessment instance repository.</param> /// <param name="resourcesManager">The resources manager.</param> public NidaWorkflowRuleCollection( IAssessmentDefinitionRepository assessmentDefinitionRepository, IWorkflowMessageRepository repository, IAssessmentInstanceRepository assessmentInstanceRepository, IResourcesManager resourcesManager = null) { _resourcesManager = resourcesManager; NewRule(() => ShouldRecommendDastRule).When(assessment => (int)assessment.Score.Value > 0) .Then( (assessment, ctx) => { var messageReporter = ctx.WorkingMemory.GetContextObject <IMessageCollector> ("MessageCollector"); var assessmentDefinitionKey = assessmentDefinitionRepository.GetKeyByCode(DrugAbuseScreeningTest.AssessmentCodedConcept.Code); WorkflowMessage message = null; if (assessment.WorkflowKey.HasValue) { message = repository.GetByKey(assessment.WorkflowKey.Value); } message = message ?? new WorkflowMessage( assessment.PatientKey, assessment.Key, NidaSingleQuestionScreener.AssessmentCodedConcept.Code, assessmentDefinitionKey, DrugAbuseScreeningTest.AssessmentCodedConcept.Code, assessment.Score); if (assessment.CanSelfAdminister) { message.AllowSelfAdministration(); } assessment.AddToWorkflow(message.Key); messageReporter.AddMessage(message); }) .ElseThen( (assessment, ctx) => { WorkflowMessage message = null; if (assessment.WorkflowKey.HasValue) { message = repository.GetByKey(assessment.WorkflowKey.Value); } message = message ?? new WorkflowMessage( assessment.PatientKey, assessment.Key, NidaSingleQuestionScreener.AssessmentCodedConcept.Code, Guid.Empty, null, assessment.Score); if (assessment.CanSelfAdminister) { message.AllowSelfAdministration(); } message.Complete(NidaPatientSummaryReportModelBuilder.GetGreenReportModel()); }); NewRuleSet(() => NidaSingleQuestionScreenerRuleSet, ShouldRecommendDastRule); NewRule(() => ShouldRecommendNidaAssessFurtherRule).When(assessment => assessment.WorkflowKey.HasValue) .Then( (assessment, ctx) => { var messageReporter = ctx.WorkingMemory .GetContextObject <IMessageCollector> ("MessageCollector"); var assessmentDefinitionKey = assessmentDefinitionRepository.GetKeyByCode(NidaAssessFurther.AssessmentCodedConcept.Code); var message = repository.GetByKey(assessment.WorkflowKey.Value); message.Advance( assessment.Key, DrugAbuseScreeningTest.AssessmentCodedConcept.Code, assessmentDefinitionKey, NidaAssessFurther.AssessmentCodedConcept.Code, assessment.Score); messageReporter.AddMessage(message); }); NewRuleSet(() => DrugAbuseScreeningTestRuleSet, ShouldRecommendNidaAssessFurtherRule); NewRule(() => ShouldCompleteWorkflowStatusRule).When(assessment => assessment.WorkflowKey.HasValue) .Then( (assessment, ctx) => { var message = repository.GetByKey(assessment.WorkflowKey.Value); var dastKey = message.GetAssessmentKeyforCodeInWorkflow(DrugAbuseScreeningTest.AssessmentCodedConcept.Code); var dastInstance = assessmentInstanceRepository.GetByKey(dastKey.Value); ReportModel reportModel; if (((long)dastInstance.Score.Value) <= 2 && !(((NidaAssessFurtherScoring)assessment.Score.Value).TotalScore)) { reportModel = NidaPatientSummaryReportModelBuilder.GetAmberReportModel( _resourcesManager, dastInstance, assessment); } else { reportModel = NidaPatientSummaryReportModelBuilder.GetRedReportModel( _resourcesManager, dastInstance, assessment); } message.Complete(reportModel); }); NewRuleSet(() => NidaAssessFurtherRuleSet, ShouldCompleteWorkflowStatusRule); }
/// <summary> /// Adds the new gift card. /// </summary> /// <param name="context">The context.</param> /// <param name="lineItem">The line item.</param> private static void AddNewGiftCard(OrderTaskContext context, LineItem lineItem) { var paymentManager = new OrderPaymentManager(context.Order, context.HccApp); var store = context.HccApp.CurrentStore; var giftCard = new GiftCardData { LineItemId = lineItem.Id, CardNumber = context.HccApp.CatalogServices.GenerateGiftCardNumber(), Amount = Money.RoundCurrency(lineItem.AdjustedPricePerItem), RecipientEmail = lineItem.CustomPropGiftCardEmail, RecipientName = lineItem.CustomPropGiftCardName, ExpirationDate = DateTime.UtcNow.AddMonths(store.Settings.GiftCard.ExpirationPeriodMonths) }; var gcNumber = paymentManager.GiftCardCreate(giftCard); if (string.IsNullOrEmpty(gcNumber)) { var message = new WorkflowMessage( "Gift Certificate Insert Failed", "Gift Certificate for line item " + lineItem.Id + " in order " + context.Order.OrderNumber + " failed.", false); context.Errors.Add(message); } else { if (string.IsNullOrEmpty(lineItem.CustomPropGiftCardNumber)) { lineItem.CustomPropGiftCardNumber = gcNumber; } else { lineItem.CustomPropGiftCardNumber = lineItem.CustomPropGiftCardNumber + "<br/>" + gcNumber; } context.HccApp.OrderServices.Orders.Update(context.Order); var gc = new GiftCard(giftCard, lineItem.CustomPropGiftCardMessage); if (string.IsNullOrEmpty(gc.RecipientEmail)) { gc.RecipientEmail = context.Order.UserEmail; if (string.IsNullOrEmpty(gc.RecipientName)) { gc.RecipientName = context.Order.ShippingAddress.FirstName; } } try { context.HccApp.ContentServices.SendGiftCardNotification(gc, context.Order, lineItem); } catch (Exception ex) { context.Errors.Add(new WorkflowMessage("Exception Sending Gift Card", ex.Message + ex.StackTrace, false)); var note = new OrderNote(); note.IsPublic = false; note.Note = "EXCEPTION: " + ex.Message + " | " + ex.StackTrace; context.Order.Notes.Add(note); EventLog.LogEvent(ex); } } }
/// <summary> /// Gets a populated workflow model. /// </summary> /// <returns>A workflow model.</returns> public static WorkflowDefinition GetWorkflowModel() { var workflowModel = new WorkflowDefinition() { Name = "BizTalkServerProject.SimpleOrch", Key = "BizTalkServerProject.SimpleOrch", Type = "Workflow" }; var workflowChannel = new WorkflowChannel() { Name = "ReceiveSendPort", Key = "BizTalkServerProject.SimpleOrch.ReceiveSendPort", Type = "BizTalkServerProject.ReceiveSendPT", Activator = true, Direction = MessageExchangePattern.ReceiveResponse }; workflowChannel.Properties.Add("OrderedDelivery", "False"); workflowChannel.Properties.Add("Binding", "Logical"); workflowModel.Channels.Add(workflowChannel); var workflowMessageIn = new WorkflowMessage() { Name = "Message_1", Key = "BizTalkServerProject.SimpleOrch.Message_1", Type = "System.String" }; workflowModel.Messages.Add(workflowMessageIn); workflowChannel.MessagesIn.Add(workflowMessageIn); var workflowMessageOut = new WorkflowMessage() { Name = "Message_2", Key = "BizTalkServerProject.SimpleOrch.Message_2", Type = "System.String" }; workflowModel.Messages.Add(workflowMessageOut); workflowChannel.MessagesOut.Add(workflowMessageOut); var receiveActivity = new WorkflowActivity() { Name = "Receive_1", Key = "BizTalkServerProject.SimpleOrch.Receive_1", Type = "Receive" }; receiveActivity.Properties.Add("Activate", "True"); receiveActivity.Properties.Add("PortName", "ReceiveSendPort"); receiveActivity.Properties.Add("MessageName", "Message_1"); receiveActivity.Properties.Add("OperationName", "Operation_1"); receiveActivity.Properties.Add("OperationMessageName", "Request"); receiveActivity.Properties.Add("WorkflowChannel", "BizTalkServerProject.SimpleOrch.ReceiveSendPort"); workflowModel.Activities.Add(receiveActivity); var constructActivity = new WorkflowActivity() { Name = "ConstructMessage_1", Key = "BizTalkServerProject.SimpleOrch.ConstructMessage_11", Type = "MessageConstruction" }; constructActivity.Properties.Add("Expression0", "Message_2 = null; //\"hello \" + Message_1;"); constructActivity.Properties.Add("ConstructedMessage", "Message_2"); workflowModel.Activities.Add(constructActivity); var sendActivity = new WorkflowActivity() { Name = "Send_1", Key = "BizTalkServerProject.SimpleOrch.Send_12", Type = "Send" }; sendActivity.Properties.Add("PortName", "ReceiveSendPort"); sendActivity.Properties.Add("MessageName", "Message_2"); sendActivity.Properties.Add("OperationName", "Operation_1"); sendActivity.Properties.Add("OperationMessageName", "Response"); sendActivity.Properties.Add("WorkflowChannel", "BizTalkServerProject.SimpleOrch.ReceiveSendPort"); workflowModel.Activities.Add(sendActivity); return(workflowModel); }
public void WorkflowStatesFlowCorrectly() { using (var serviceLocatorFixture = new ServiceLocatorFixture()) { // Setup SetupServiceLocatorFixture(serviceLocatorFixture); var events = new List <IDomainEvent> (); CommitEvent.RegisterAll(events.Add); var workflow = new WorkflowMessage(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid().ToString(), Guid.NewGuid(), Guid.NewGuid().ToString(), new Score()); Assert.AreEqual(WorkflowMessageStatus.WaitingForResponse, workflow.Status); events.Clear(); workflow.Advance(Guid.NewGuid(), Guid.NewGuid().ToString(), Guid.NewGuid(), Guid.NewGuid().ToString(), new Score()); Assert.AreEqual(0, events.Count()); Assert.AreEqual(WorkflowMessageStatus.WaitingForResponse, workflow.Status); workflow.AdministerAssessment(); Assert.AreEqual(WorkflowMessageStatus.InProgress, workflow.Status); events.Clear(); workflow.Reject(); Assert.AreEqual(0, events.Count()); Assert.AreEqual(WorkflowMessageStatus.InProgress, workflow.Status); events.Clear(); workflow.AdministerAssessment(); Assert.AreEqual(0, events.Count()); Assert.AreEqual(WorkflowMessageStatus.InProgress, workflow.Status); workflow.Advance(Guid.NewGuid(), Guid.NewGuid().ToString(), Guid.NewGuid(), Guid.NewGuid().ToString(), new Score()); Assert.AreEqual(WorkflowMessageStatus.WaitingForResponse, workflow.Status); workflow.Reject(); Assert.AreEqual(WorkflowMessageStatus.Rejected, workflow.Status); events.Clear(); workflow.Reject(); Assert.AreEqual(0, events.Count()); Assert.AreEqual(WorkflowMessageStatus.Rejected, workflow.Status); events.Clear(); workflow.AdministerAssessment(); Assert.AreEqual(0, events.Count()); Assert.AreEqual(WorkflowMessageStatus.Rejected, workflow.Status); events.Clear(); workflow.Advance(Guid.NewGuid(), Guid.NewGuid().ToString(), Guid.NewGuid(), Guid.NewGuid().ToString(), new Score()); Assert.AreEqual(0, events.Count()); Assert.AreEqual(WorkflowMessageStatus.Rejected, workflow.Status); } }
/// <summary> /// Executes the behavior /// </summary> /// <param name="sagaStep"></param> /// <param name="workflowMessage"></param> /// <returns></returns> public abstract IWorkflowMessage Execute(ISagaStep sagaStep, WorkflowMessage workflowMessage);