Skip to main content

AssertValueAspect

Checks whether the value of a given property satisfies a given condition.

Examples

The following example makes sure that, when creating a new employee, the contract end date is after the contract start date. The pointcuts define when the value assertion must happen.

<AssertValueAspect Identifier="Directory_User_NewInternal_CheckDates" Binding="Workflow_Directory_User:Directory_User.Records.ContractEndDate" ExpressionBinding="Workflow_Directory_User:Directory_User.Records" Expression="C#:record: return ( ((Nullable&amp;lt;DateTime&amp;gt;) record.ContractStartDate).HasValue &amp;&amp; ((Nullable&amp;lt;DateTime&amp;gt;) record.ContractEndDate).HasValue) ?  record.ContractStartDate &amp;lt; record.ContractEndDate : true;" Message_L1="Contract's end date must be after contract's start date.">
<PointCut Activity="Directory_User_NewInternal:Request" ActivityState="ActionWithRefine-Executed" Mode="Before" />
<PointCut Activity="Directory_User_NewInternal:Review" ActivityState="ReviewWithFeedback-Approved" Mode="Before" />
</AssertValueAspect>

Assert a multi-valued object

info

When asserting a multi-valued object, said object must not be called through a binding that goes back and forth between entities.

For example, to manage records, using the ExpressionBinding set to Workflow_Directory_User:Directory_User.Records and the Expression using C#:record:return record.Directory_User.Records... will not work.

Instead, the ExpressionBinding should be set to Workflow_Directory_User:Directory_User and the Expression should use C#:user:return user.Records...

The following example makes sure that a user's positions do not overlap.

<AssertValueAspect Identifier="RecordsOverlapCheck" Binding="Workflow_Directory_User:Directory_User.Records.Organization" ExpressionBinding="Workflow_Directory_User:Directory_User" Expression="C#:user:for (int i = 0; i &amp;lt; user.Records.Count; i++)
{
for (int j = 0; j &amp;lt; user.Records.Count &amp;amp;&amp;amp; i != j ; j++)
{
if (user.Records[i].StartDate != default
&amp;amp;&amp;amp; user.Records[j].StartDate != default)
{
if ((user.Records[i].EndDate == null) &amp;amp;&amp;amp; (user.Records[j].EndDate == null))
|| ((user.Records[i].EndDate == null) &amp;amp;&amp;amp; (user.Records[j].EndDate != null) &amp;amp;&amp;amp; (user.Records[j].EndDate &amp;gt; user.Records[i].StartDate))
|| ((user.Records[j].EndDate == null) &amp;amp;&amp;amp; (user.Records[i].EndDate != null) &amp;amp;&amp;amp; (user.Records[i].EndDate &amp;gt;= user.Records[j].StartDate))
|| ((user.Records[i].EndDate != null) &amp;amp;&amp;amp; (user.Records[j].EndDate != null) &amp;amp;&amp;amp; (user.Records[i].StartDate &amp;lt;= user.Records[j].EndDate) &amp;amp;&amp;amp; (user.Records[i].EndDate &amp;gt;= user.Records[j].StartDate))
{
return false;
}
}
}
}
return true;" Message_L1="A user cannot have more than one position simultaneously.">
<PointCut Activity=... >
</AssertValueAspect>

Properties

PropertyDetails
Binding requiredType: String Description: Binding whose difference with ExpressionBinding defines the property to be validated by the aspect.
Identifier requiredType: String Description: Unique identifier of the aspect.
Expression optionalType: String Description: C# expression returning a boolean, true to invalidate the property value.
ExpressionBinding optionalType: String Description: Binding:- that defines the variable type used in the potential expressions specified in the aspect;- whose difference with Binding defines the property involved in the aspect.Note: required when handling the property of multi-valued objects, for example records, to make sure to modify the property in all records and not only in one.
IfExpression optionalType: String Description: Expression that conditions the aspect execution. See more details on C# expressions.
Message_L1 optionalType: String Description: Message in language 1 (up to 16) to be displayed when the property is invalidated by the condition specified in Expression.
Priority default value: 0Type: Int32 Description: Execution priority among all aspects. At a given activity state, the aspect with the highest priority will be triggered first.Note: the priority can be a negative value.

Child Element: PointCut

A pointcut is a mechanism telling Identity Manager when to execute the linked aspect.

The position of the pointcut is specified by an activity state and a mode (before or after).

pointcut Schema

PropertyDetails
Activity
required

Type
Int64

Description
Identifier of the activity whose specified state triggers the aspect.

ActivityState
required

Type
Enumeration

Description
Identifier of the activity state that triggers the aspect.

Mode
default value: 0

Type
PointCutMode

Description
Mode defining when exactly the aspect is triggered around the specified workflow's activity state.
0 - Before: the aspect will be executed on entry to the specified activity state, regardless of the transition used.
1 - After: the aspect will be executed on exit from the specified activity state, regardless of the transition used.