/// <summary> /// Executes the plug-in. /// </summary> /// <param name="localContext">The <see cref="LocalPluginContext"/> which contains the /// <see cref="IPluginExecutionContext"/>, /// <see cref="IOrganizationService"/> /// and <see cref="ITracingService"/> /// </param> /// <remarks> /// For improved performance, Microsoft Dynamics CRM caches plug-in instances. /// The plug-in's Execute method should be written to be stateless as the constructor /// is not called for every invocation of the plug-in. Also, multiple system threads /// could execute the plug-in at the same time. All per invocation state information /// is stored in the context. This means that you should not use global variables in plug-ins. /// </remarks> protected void ExecutePreValidateContactCreate(LocalPluginContext localContext) { if (localContext == null) { throw new ArgumentNullException("localContext"); } IPluginExecutionContext context = localContext.PluginExecutionContext; IOrganizationService service = localContext.OrganizationService; ITracingService trace = localContext.TracingService; Entity contactEntity = (Entity)context.InputParameters["Target"]; if (!(context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)) { return; } if (contactEntity.LogicalName != "contact") { return; } string message = context.MessageName; if (context.Mode == 0) //synchronous plugin { try { var recordtype = contactEntity.Contains("gsc_recordtype") ? contactEntity.GetAttributeValue <OptionSetValue>("gsc_recordtype").Value : 0; ContactHandler contactHandler = new ContactHandler(service, trace); contactHandler.CheckForExistingRecords(contactEntity); contactHandler.SetAccessLevel(contactEntity); } catch (Exception ex) { if (ex.Message.Contains("This record has been identified as a fraud account. Please ask the customer to provide further information.")) { throw new InvalidPluginExecutionException("This record has been identified as a fraud account. Please ask the customer to provide further information."); } else if (ex.Message.Contains("This record already exists.")) { throw new InvalidPluginExecutionException("This record already exists."); } else { throw new InvalidPluginExecutionException(String.Concat("(Exception)\n", ex.Message, Environment.NewLine, ex.StackTrace)); } } } }