Empêcher la suppression d’une tâche créée par un flux de travail en cours

Lors de création des flux de travail, l’interaction entre les utilisateurs et le flux de travail, est basée sur les tâches: En effet, on crée des tâches, sur les quelles on reste sur écoute, jusqu’à sa terminaison. Ensuite  le flux de travail va prendre une certaine décision selon la tâche.. Le problème c’est  la suppression de cette dernière: le flux de travail va rester à l’état « En cours » jusqu’à l’infini.

Il y a deux solution pour ce genre de problème:
la première est de gérer la suppression au niveau de flux de travail: ajouter une activité « OnTaskDeleted » dans notre flux de travail.
La deuxième est la plus générique, est d’empêcher la suppression de toute tâche non terminée de type « WorkFlowTask » et dont son flux de travail est en cours d’exécution. de coût, l’utilisateur reçoit un message d’erreur lors de suppression, indiquant le flux de travail encours, et l’élément sur lequel le flux de travail tourne.
Pour la deuxième solution on crée une EventReceiver, dont on remplacer la methode ItemDeleting:

public override void ItemDeleting(SPItemEventProperties properties)
{

SPListItem taskItem = properties.ListItem;//la tâche à supprimée
if (taskItem.ContentTypeId.Parent.Parent.ToString() == « 0x010801 » &&
taskItem[SPBuiltInFieldId.TaskStatus].ToString()!=SPResource.GetString(CultureInfo.GetCultureInfo((int)properties.Web.Language), « WorkflowTaskStatusComplete« ))
//0x010801 l’id de workflowTask
//WorkflowTaskStatusComplete : la valeur de « Completed » / « Terminé »
{
string workflowName = taskItem[SPBuiltInFieldId.WorkflowName].ToString();
SPList list=properties.Web.Lists[new Guid(taskItem[SPBuiltInFieldId.WorkflowListId].ToString())];
SPListItem item = list.GetItemById(int.Parse(taskItem[SPBuiltInFieldId.WorkflowItemId].ToString()));
foreach (SPWorkflow myWorkflow in item.Workflows)
{

if (list.WorkflowAssociations[myWorkflow.AssociationId].Name == workflowName &&
myWorkflow.InternalState == SPWorkflowState.Running)
{

properties.Status = SPEventReceiverStatus.CancelWithError;

properties.ErrorMessage = string.Format(« Suppression interdite: Flux de travail <a href='{0}’> {1}</a> associé à l’élément <a href='{2}’>{3}</a> de la liste <a href='{4}’>{5}</a>, est en cours d’execution<br/>« ,
properties.WebUrl+ »/ »+ myWorkflow.StatusUrl, workflowName, properties.WebUrl+ »/ »+item.ParentList.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url+ »?id= »+item.ID.ToString(), item.Name, list.DefaultViewUrl, list.Title);

properties.Cancel = true;
return;
}
}

}
base.ItemDeleting(properties);
}

myWorkflow.StatusUrl: la page de conclusion de flux de travail.
item.ParentList.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url: Url  de formulaire d’affichage par défaut d’un élément.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s