Below is the scenario which I tried.
Workflow Designer:![Workflow sample][1]
[1]: https://i.sstatic.net/tBJnn.png
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();
}