public IList <AuthorizedEvent> RetrieveAuthorizedEvents(long workFlowID, short languageID) { DTO.WorkFlow workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID); WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID); string serviceName = workFlowTypeDocumentType.ServiceName; string stateName = workFlow.CurrentState.Name; object finder = ContextRegistry.GetContext().GetObject(serviceName); int workFlowStateID = workFlow.CurrentState.WorkFlowStateID; IList <WorkFlowStateEventWithLang> workFlowStateEvents = WorkFlowQueryProvider.WorkFlowStateEventQuery.FindByWorkFlowStateEventByStateID(workFlowStateID, languageID); IList <AuthorizedEvent> authorizedEvents = new List <AuthorizedEvent>(); MethodInfo methodInfo; bool canDoStateEvent; foreach (WorkFlowStateEventWithLang workFlowStateEventWithLang in workFlowStateEvents) { //Call method Can{EventName}{StateName} ex. CanSubmitDraft , CanApproveWaitAR .. methodInfo = finder.GetType().GetMethod(string.Format("Can{0}{1}", workFlowStateEventWithLang.Name, stateName)); if (methodInfo != null) { canDoStateEvent = (bool)methodInfo.Invoke(finder, new object[] { workFlowID }); if (canDoStateEvent) { authorizedEvents.Add(new AuthorizedEvent(workFlowStateEventWithLang.EventID, workFlowStateEventWithLang.Name, workFlowStateEventWithLang.DisplayName, workFlowStateEventWithLang.UserControlPath)); } } } return(authorizedEvents); }
public void ReCalculateWorkFlowPermission(long workFlowID) { WorkFlowStateEventPermissionService.ClearOldPermission(workFlowID); DTO.WorkFlow workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID); if (workFlow == null) { return; } if (workFlow.CurrentState == null) { return; } if (workFlow.WorkFlowType == null) { return; } if (workFlow.Document == null) { return; } if (workFlow.Document.DocumentType == null) { return; } WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID); if (workFlowTypeDocumentType == null) { return; } string serviceName = workFlowTypeDocumentType.ServiceName; string stateName = workFlow.CurrentState.Name; object finder = ContextRegistry.GetContext().GetObject(serviceName); if (finder == null) { return; } IList <WorkFlowStateEvent> stateEvents = WorkFlowQueryProvider.WorkFlowStateEventQuery.FindByWorkFlowStateEventByStateID(workFlow.CurrentState.WorkFlowStateID); foreach (WorkFlowStateEvent stateEvent in stateEvents) { MethodInfo methodInfo = finder.GetType().GetMethod(string.Format("ReCalculatePermissionFor{0}{1}", stateEvent.Name, stateName)); if (methodInfo != null) { methodInfo.Invoke(finder, new object[] { workFlowID, stateEvent.WorkFlowStateEventID }); } } }
public void OnDeleteDocument(long workFlowID) { DTO.WorkFlow workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID); WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID); string serviceName = workFlowTypeDocumentType.ServiceName; string stateName = workFlow.CurrentState.Name; object finder = ContextRegistry.GetContext().GetObject(serviceName); MethodInfo methodInfo = finder.GetType().GetMethod("OnDeleteDocument"); if (methodInfo != null) { methodInfo.Invoke(finder, new object[] { workFlowID }); } }
public bool CanDeleteDocument(long workFlowID) { DTO.WorkFlow workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID); WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID); string serviceName = workFlowTypeDocumentType.ServiceName; string stateName = workFlow.CurrentState.Name; object finder = ContextRegistry.GetContext().GetObject(serviceName); MethodInfo methodInfo = finder.GetType().GetMethod(string.Format("CanDelete{0}", stateName)); bool canDelete = false; if (methodInfo != null) { canDelete = (bool)methodInfo.Invoke(finder, new object[] { workFlowID }); } return(canDelete); }
public IList <object> GetVisibleFields(long workFlowID) { DTO.WorkFlow workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID); WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID); string serviceName = workFlowTypeDocumentType.ServiceName; string stateName = workFlow.CurrentState.Name; int stateID = workFlow.CurrentState.WorkFlowStateID; object finder = ContextRegistry.GetContext().GetObject(serviceName); IList <object> visibleFileds = new List <object>(); MethodInfo methodInfo; methodInfo = finder.GetType().GetMethod(string.Format("GetVisibleFieldsFor{0}", stateName)); if (methodInfo != null) { visibleFileds = (IList <object>)methodInfo.Invoke(finder, new object[] { workFlowID }); } return(visibleFileds); }
public void NotifyEventFromInternal(long workFlowID, string eventName, object eventData) { string stateName = string.Empty; try { DTO.WorkFlow workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID); WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID); string serviceName = workFlowTypeDocumentType.ServiceName; stateName = workFlow.CurrentState.Name; object finder = ContextRegistry.GetContext().GetObject(serviceName); //Call method On{EventName}{StateName} ex. OnSubmitDraft , OnApproveWaitAR .. MethodInfo methodInfo = finder.GetType().GetMethod(string.Format("On{0}{1}", eventName, stateName)); if (methodInfo != null) { string signal = (string)methodInfo.Invoke(finder, new object[] { workFlowID, eventData }); //Call method OnExit{StateName} methodInfo = finder.GetType().GetMethod(string.Format("On{0}{1}", "Exit", stateName)); if (methodInfo != null) { methodInfo.Invoke(finder, new object[] { workFlowID }); } //Get NextState in Transition WorkFlowState nextState = WorkFlowQueryProvider.WorkFlowStateTransitionQuery.GetNextState(workFlow.CurrentState.WorkFlowStateID, signal); if (nextState != null) { if (workFlow.CurrentState.Ordinal > nextState.Ordinal) { this.ResetActiveResponse(workFlowID, nextState.Ordinal); } this.UpdateState(workFlowID, nextState); this.ReCalculateWorkFlowPermission(workFlowID); //Call method OnEnter{NextStateName} methodInfo = finder.GetType().GetMethod(string.Format("On{0}{1}", "Enter", nextState.Name)); if (methodInfo != null) { methodInfo.Invoke(finder, new object[] { workFlowID }); } } } else { Spring.Validation.ValidationErrors errors = new Spring.Validation.ValidationErrors(); errors.AddError("WorkFlow.Error", new Spring.Validation.ErrorMessage("WorkFlow_Error_Invalid_Document_State")); //สถานะของเอกสารไม่ถูกต้อง เอกสารนี้อาจกำลังถูกปรับปรุงโดยผู้ใช้งานท่านอื่น throw new ServiceValidationException(errors); } } catch (ServiceValidationException ex) { throw ex; } catch (Exception ex) { if (ex.InnerException != null && ex.InnerException.GetType().Equals(typeof(ServiceValidationException))) { throw ex; } else { if (logger != null) { logger.Error(string.Format("WorkflowID: {0}, EventName: {1}, StateName: {2}", workFlowID, eventName, stateName)); logger.Error(string.Format("WorkFlowService.NotifyEventFromInternal(workflowID) : {0}", workFlowID, ex.StackTrace)); } Spring.Validation.ValidationErrors errors = new Spring.Validation.ValidationErrors(); errors.AddError("WorkFlow.Error", new Spring.Validation.ErrorMessage("WorkFlow_Error_Problem_Occurred")); //ระบบมีปัญหาในการประมวลผล กรุณาลองอีกครั้งหนึ่ง throw new ServiceValidationException(errors); } } }