12-02-2022 01:26 PM
Hi All,
We're running into a few problems with an existing BR that is used to change the state of the current workflow. The current BR is used in the admin workflow & we haven't encountered any problems, however when end users attempt to run this rule on a child workflow, they receive the error message below.
Business Rule
If args.FunctionName.XFEqualsIgnoreCase("WorkflowStatusUpdate") Then
Dim strChangeType As String = args.NameValuePairs.XFGetValue("ChangeType")
Dim selectionChangedTaskResult As XFSelectionChangedTaskResult = Me.WorkflowStatusUpdate(si, strChangeType)
Return selectionChangedTaskResult
End If
When an admin progresses the workflow the end users are able to execute the subsequent steps to complete their workflow. Is there something I'm missing in the current rule that needs to be changed or is this an issue with our security setup?
Thanks,
12-04-2022 08:07 AM
Your "me.WorkflowStatusUpdate" call means you have custom code in a function "WorkflowStatusUpdate", further down (or up) in the same business rule file. In that function you might have code that is tripping up the security setup, you might want to post it here for review. Either that, or the specific user really has no access to that workflow at all.
12-06-2022 11:56 AM
The complete business rule can be found below.
Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardExtenderArgs) As Object
Try
Select Case args.FunctionType
Case Is = DashboardExtenderFunctionType.LoadDashboard
Case Is = DashboardExtenderFunctionType.ComponentSelectionChanged
If args.FunctionName.XFEqualsIgnoreCase("SetAssignedEntity") Then
Brapi.State.SetUserState(si,False,ClientModuletype.Windows,String.Empty, String.Empty, "ParamComboEntity",String.Empty,args.NameValuePairs("AssignedEntity"),Nothing)
'brapi.ErrorLog.LogMessage(si,"PAram Value - " & args.NameValuePairs("AssignedEntity"))
End If
'-------------------------------------------------
'Complete or Revert Workflow
'-------------------------------------------------
If args.FunctionName.XFEqualsIgnoreCase("WorkflowStatusUpdate") Then
Dim strChangeType As String = args.NameValuePairs.XFGetValue("ChangeType")
Dim selectionChangedTaskResult As XFSelectionChangedTaskResult = Me.WorkflowStatusUpdate(si, strChangeType)
Return selectionChangedTaskResult
End If
End Select
On further investigation users with access to the immediate parent workflow are able to execute this business rule for the child workflow. However, if a user only has access to the workflow in question, they're unable to execute the rule.
12-06-2022 12:48 PM
Sam, sorry, that's still not the actual full rule. The rule class by default does not have a WorkflowStatusUpdate method:
There must be a block somewhere else, with "Function WorkflowStatusUpdate" or "Sub WorkflowStatusUpdate", where that call is defined, or the rule is doing some other funky import magic to pull that method into its namespace.
Without seeing what that function does, we can't know what's going on.
04-04-2023 06:35 PM - last edited on 04-05-2023 06:09 AM by JackLacava
The issue is most likely the business rule trying to access the parent workflow to check the workflow status. If you have a security setting on the parent workflow that the end user does not have access the rule will not work in this scenario.
Here is a generic workspace helper:
Namespace OneStream.BusinessRule.DashboardExtender._WATSCO_Workspace_Helper
Public Class MainClass
Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardExtenderArgs) As XFSelectionChangedTaskResult
Try
Dim selectionChangedTaskResult As New XFSelectionChangedTaskResult()
'Define Workflow Profile
Dim wfProfile As String = BRApi.Workflow.Metadata.GetProfile(si, si.WorkflowClusterPk.ProfileKey).Name
Dim scenario As String = ScenarioDimHelper.GetNameFromID(si, si.WorkflowClusterPk.ScenarioKey)
Dim time As String = BRApi.Finance.Time.GetNameFromId(si, si.WorkflowClusterPk.TimeKey)
If args.FunctionName.XFEqualsIgnoreCase("WorkflowComplete") Then
'Used to complete a workspace
Dim wfClusterPK As WorkflowUnitClusterPk = BRApi.Workflow.General.GetWorkflowUnitClusterPk(si, _
wfProfile, scenario, time)
BRApi.Workflow.Status.SetWorkflowStatus(si, _
wfClusterPK, StepClassificationTypes.Workspace, WorkflowStatusTypes.Completed, _
"Workspace Completed", "", "User clicked complete workflow", Guid.Empty)
'Used to update the wfstatus automatically
selectionChangedTaskResult.WorkflowWasChangedByBusinessRule = True
selectionChangedTaskResult.IsOK = True
selectionChangedTaskResult.ShowMessageBox = True
Return selectionChangedTaskResult
Else If args.FunctionName.XFEqualsIgnoreCase("WorkflowRevert") Then
'Used to revert a workspace
BRApi.Workflow.Status.SetWorkflowStatus(si, _
si.WorkflowClusterPk, StepClassificationTypes.Workspace, WorkflowStatusTypes.InProcess, _
"Workspace Reverted", "", "User clicked Revert workflow", Guid.Empty)
selectionChangedTaskResult.WorkflowWasChangedByBusinessRule = True
selectionChangedTaskResult.IsOK = True
selectionChangedTaskResult.ShowMessageBox = True
Return selectionChangedTaskResult
End If
Return Nothing
Catch ex As Exception
Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
End Try
End Function
End Class
End Namespace