public override bool Execute(RockContext rockContext, WorkflowAction action, object entity, out List <string> errorMessages) { errorMessages = new List <string>(); StringBuilder sbErrorMessages = new StringBuilder(); if (!action.IsNotNull()) { action.AddLogEntry("ReferenceValidation: Input (action) is null."); return(false); } int refCount = action.Activity.Workflow.GetAttributeValue("ReferenceCount").AsInteger(); int maxRef = action.Activity.Workflow.GetAttributeValue("ReferenceLimit").AsInteger(); string firstName = action.Activity.GetAttributeValue("Firstname"); string lastName = action.Activity.GetAttributeValue("Lastname"); string phoneNumber = action.Activity.GetAttributeValue("Phone"); string phoneType = action.Activity.GetAttributeValue("PhoneType"); string email = action.Activity.GetAttributeValue("Email"); Guid? addressGuid = action.Activity.GetAttributeValue("Address").AsGuidOrNull(); if (refCount < maxRef) { validateName(firstName, lastName, sbErrorMessages); validatePhone(phoneNumber, phoneType, sbErrorMessages); validateEmail(email, sbErrorMessages); validateRelationships(action, refCount, maxRef, sbErrorMessages); LocationService locationService = new LocationService(new RockContext()); Location location = locationService.Get(addressGuid.Value); if (addressGuid.HasValue && addressGuid != new Guid()) { validateAddress(location, sbErrorMessages); } else { sbErrorMessages.AppendLine("<li> A valid address is required.</li>"); } if (sbErrorMessages.Length == 0) { ContactInfo userInfo = new ContactInfo(); userInfo.name = formatName(firstName, lastName); userInfo.address = formatAddress(location); userInfo.phoneNumber = formatPhone(phoneNumber); userInfo.email = email.Trim(); //if this is the 1st successful entry, //store in the list for future comparison. if (refCount == 0) { Reference.Clear(); Reference.Add(userInfo); } else if (refCount > 0 && refCount < maxRef) { for (var i = 0; i < Reference.Count; i++) { string fieldCorrectionStr = ""; if (checkForDuplicates(Reference[i], userInfo, out fieldCorrectionStr)) { if (!String.IsNullOrEmpty(fieldCorrectionStr)) { string[] words = fieldCorrectionStr.Trim().Split(' '); foreach (var word in words) { sbErrorMessages.AppendFormat("<li>This reference's {0} matches that of reference {1}, Please correct.</li>", word.Trim(), i + 1); } } else { action.AddLogEntry("ReferenceValidation: CheckForDuplicates returns true, but correction string is empty."); } } } if (sbErrorMessages.Length == 0) { Reference.Add(userInfo); } } } } Guid ErMsg = GetActionAttributeValue(action, "ErrorMessages").AsGuid(); if (sbErrorMessages.Length > 0) { // If we get here, validation has failed SetWorkflowAttributeValue(action, ErMsg, sbErrorMessages.ToString()); action.AddLogEntry("ReferenceValidation: Validation failed"); return(reactivateCurrentActions(rockContext, action)); } // If we get here, validation was successful SetWorkflowAttributeValue(action, ErMsg, string.Empty); action.AddLogEntry("ReferenceValidation: Validation successful"); return(true); }