My task List has the Following Fields
1) Start Date
2) Due Date
3) Survey Submitted By
Through Visual Studio Workflows I want to achieve the below scenario. Can any one give me an idea which actions should I use.
Note: Here Task is Already assigned in the Task list. On Workflow Activated I need to fetch the Task item and send an email and do the below step again.
Send an email to the Survey Submitted By (user) when the task is created.
Send an email to the Survey Submitted By (user) when the task is a week from the Due Date (if the task is not completed)
Send an email to the Survey Submitted By (user) when the task is two days from the Due Date (if the task is not completed)
Send an email to the Survey Submitted By (user) on the Due Date (if the task is not completed)
Mark the Task as "Not Completed" and remove the Survey Submitted By’s (user) permissions when the task is past the Due Date and Not Completed
Below is the scenario which I tried.
Workflow Designer: OnWorkflowActivatedCode:
private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
{
try
{
CurrentDate = String.Format("{0:MM/dd/yyyy}", CTDate);
SPListItem CurrentWorkflowitem = onWorkflowActivated1.WorkflowProperties.Item;
_ItemListDuedate = DateTime.Parse(Convert.ToString(CurrentWorkflowitem["Due Date"]));
_ItemSurveySubmittedBy = Convert.ToString(CurrentWorkflowitem["Survey Submitted By"]);
_ItemStatus = Convert.ToString(workflowProperties.Item["Status"]);
SPFieldUserValue SubmitteduserValue = new SPFieldUserValue(CurrentWorkflowitem.Web, _ItemSurveySubmittedBy);
SubmittedUserLastName = SubmitteduserValue.User.Name.Split(',').LastOrDefault();
SubmittedUserEmail = SubmitteduserValue.User.Email;
}
catch (Exception ex)
{
SendEmailToAdmin(ex.Message);
}
}
WORKFLOW STATUS LOOP:
private void WorkflowStatus_Loop(object sender, ConditionalEventArgs e)
{
bool workflowstatus= CompareCurrentDate_DueDate(_ItemStatus, _ItemListDuedate);
if (workflowstatus)
{
e.Result = true;
}
private bool CompareCurrentDate_DueDate(String CurrentStatus, DateTime ListDuedate)
{
try
{
if (CurrentStatus != "Completed")
{
CTDate = DateTime.Parse(Convert.ToString(DateTime.Now));
int Cmin = CTDate.Minute;
int Listmin = ListDuedate.Minute;
diff = Cmin - Listmin;
//TimeSpan age = ListDueDate.Subtract(CTDate);
// diff = Convert.ToInt32(age.Days);
if (diff > 48)
{
datechk = false;
}
}
else
{
datechk = false;
}
}
catch (Exception ex)
{
datechk = false;
SendEmailToAdmin(ex.Message);
}
return datechk;
}}
Code to check Status
private void codeToCheckStatus_Initial(object sender, EventArgs e)
{
try
{
String Duedate = String.Format("{0:MM/dd/yyyy}", _ItemListDuedate);
Remainder1 = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["Remainder1"];
Remainder2 = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["Remainder2"];
Remainder3 = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["Remainder3"];
InitialMail = (Boolean)onWorkflowActivated1.WorkflowProperties.Item["InitialMail"];
if (InitialMail == true)
{
Email_Body = "Please complete the below survey before the Due date has completed. ";
Email_Subject = "Survey Task with Title " + onWorkflowActivated1.WorkflowProperties.Item.Title + "has been assigned";
HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
updatelist("InitialMail", false);
}
if (diff == 41 && Remainder1 == true)
{
Email_Subject = "Week Remainder Email for the Task " + workflowProperties.Item.Title;
Email_Body = "The Task is due kindly act on it";
HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
updatelist("Remainder1", false);
}
if (diff == 44 && Remainder2 == true)
{
Email_Subject = "Two Day Remainder Email for the Task " + workflowProperties.Item.Title;
Email_Body = "The Task is due kindly act on it";
HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
updatelist("Remainder2", false);
}
if (diff == 45 && Remainder3 == true)
{
Email_Subject = "Same Day Remainder Email for the Task " + workflowProperties.Item.Title;
Email_Body = "The Task has been update as completed and you dont have permissions for the same";
HTMLBODY = PopulateBody(SubmittedUserLastName, Duedate, Email_Body, "TaskList");
SendEmail(Email_Subject, SubmittedUserEmail, " ", HTMLBODY);
//SPListItem wfitem = workflowProperties.Item;
//wfitem["Remainder3"] = false;
//wfitem["Status"] = "Completed";
//SPRoleAssignmentCollection SPRoleAssColn = wfitem.RoleAssignments;
//for (int i = SPRoleAssColn.Count - 1; i >= 0; i--)
//{
// SPRoleAssignment roleAssign = SPRoleAssColn[i];
// SPRoleAssColn.Remove(i);
//}
//wfitem.Update();
updatelist("Remainder3", false);
SPListItem wfitem = workflowProperties.Item;
wfitem["Status"] = "Completed";
wfitem.SystemUpdate();
}
}
catch (Exception ex)
{
// datechk = false;
SendEmailToAdmin(ex.Message);
}
}
private void updatelist(string field, Boolean value)
{
SPListItem wfitem = workflowProperties.Item;
wfitem[field] = value;
wfitem.SystemUpdate();
}
I tried with Designer Reusable workflow . Attached is my Designer Workflow. As stated below we can not get the Updated Status Column when we go for Reusable workflows. When I used Title the workflow is working fine