| Quintiq file version 2.0 | 
| #parent: #root | 
| Method CanProcessActivity ( | 
|   output String feedback_o, | 
|   const SWF_ActivityBase activity, | 
|   String action | 
| ) const declarative remote as Boolean | 
| { | 
|   Description: 'Indicate if this user can process the [action] for the given [activity].' | 
|   TextBody: | 
|   [* | 
|     result := true; | 
|      | 
|     // Only admin or creator can edit delete the activity | 
|     if( action = SWF_ActivityBase::ACTION_EditDelete() | 
|         and ( ( not this.IsAdministrator()  | 
|                 and this <> activity.Creator() )  | 
|                or activity.HasDefinition() ) ) | 
|     { | 
|       result := false; | 
|       feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivity_NotCreator(); | 
|     }    | 
|     // Only admin or the assign user can process the activity | 
|     else if( action <> SWF_ActivityBase::ACTION_EditDelete() | 
|              and not this.IsAdministrator() | 
|              and not activity.AssignedUser() = this ) | 
|     { | 
|       result := false; | 
|       feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivity_UnauthorizedAction(); | 
|     }          | 
|     // Activity from definition cannot be replied                  | 
|     else if( SWF_ActivityBase::GetIsReplyAction( action ) | 
|              and ( activity.HasDefinition() | 
|                    or activity.IsExternal() ) ) | 
|     { | 
|       result := false; | 
|       feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivity_NonUserCreatedActivity(); | 
|     } | 
|     // Only open activity can be close, activity is locked | 
|     else if( ( SWF_ActivityBase::GetIsCloseAction( action ) | 
|              or action = SWF_ActivityBase::ACTION_SetToOpen() ) | 
|              and not activity.IsActive() ) | 
|     { | 
|       result := false; | 
|        | 
|       previousIncompleteStep := activity.GetPreviousIncompleteStep() | 
|        | 
|       if( not isnull( previousIncompleteStep ) ) | 
|       { | 
|         feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivity_IsLocked( activity.GetPreviousIncompleteStep() ); | 
|       } | 
|       else if( guard( not activity.ParentStep().IsActive(), false ) ) | 
|       { | 
|         feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivityParentStep_IsInactive( activity.ParentStep() ); | 
|       } | 
|       else if( guard( activity.IsExternal() and not activity.IsActive(), false ) ) | 
|       { | 
|         feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivity_ExternalActivityNotActive( activity.Name() ); | 
|       }  | 
|     } | 
|     // Only closed activity can be open | 
|     else if( ( SWF_ActivityBase::GetIsCloseAction( action ) | 
|              or action = SWF_ActivityBase::ACTION_Reply() | 
|              or action = SWF_ActivityBase::ACTION_Forward() ) | 
|              and activity.IsCompleted() ) | 
|     { | 
|       result := false; | 
|       feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivity_IsClosed(); | 
|     } | 
|     // Only open activity can be close, activity is closed | 
|     else if( action = SWF_ActivityBase::ACTION_SetToOpen() | 
|              and not activity.IsCompleted() ) | 
|     { | 
|       result := false; | 
|       feedback_o := SWF_Translation::TRANSLATE_Auth_ProcessActivity_IsOpen(); | 
|     } | 
|      | 
|     return result; | 
|   *] | 
| } |