javascriptc#dynamics-crmdynamics-crm-2015

Plugin/Javascript - Update custom fields agr1 and agr2 on all Contacts with same email addres


I need to make plugin or javascript what work like that: 1.When agr1(bool) change(true<->false) on contact like "John Smith" with emailaddress1 = "john1@example.com" then plugin/js change agr1 field on all contacts with emailaddress1 = "john1@example.com"(duplicates mails).

  1. I got 2 agreement (bool(yes/no)) on form: agr1 and agr2 for example, I create plugin what change agr2=false when I change agr1 from true to false and change agr1 to true when I channge agr2 from false to true - I want to do this on form when I create new Contact - how can I do this?

My code for example2(its work on exist contact not when I create):

namespace IfZgodaChangeMassmailingChange
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel;
    using Microsoft.Crm.Sdk.Messages;
    using Microsoft.Crm.Sdk;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Xrm.Sdk.Query;
    using System.Linq.Expressions;
    using System.Activities;
    using System.Runtime.Serialization;
    using System.Collections.ObjectModel;
    using System.Collections;
    using System.Reflection;
    using Microsoft.Xrm.Sdk.Workflow;
    using Microsoft.Xrm.Sdk.Messages;


    public class IfZgodaChangeMassmailingChange : IfZgodaChangeSetZgoda2.Plugin
    {
        public IfZgodaChangeMassmailingChange()
            : base(typeof(IfZgodaChangeMassmailingChange))
        {
            base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Update", "contact", new Action<LocalPluginContext>(ExecutePostKontaktUpdate)));
        }


        protected void ExecutePostKontaktUpdate(LocalPluginContext localContext)
        {

            if (localContext == null)
            {
                throw new ArgumentNullException("localContext");
            }

            IPluginExecutionContext context = localContext.PluginExecutionContext;
            IOrganizationService service = localContext.OrganizationService;
            ITracingService tracingService = localContext.TracingService;
            OrganizationServiceContext _crmOrgContext = new OrganizationServiceContext(service);
            tracingService.Trace("ExecutePostFakturaUpdate Plugin: Verifying the client is not offline.");

            if (context.IsExecutingOffline || context.IsOfflinePlayback)
                return;

            if (context.Depth > 1)
                return;

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                Entity entity = (Entity)context.InputParameters["Target"];
                Entity _postEntity = (context.PostEntityImages.Contains("PostImage") && context.PostEntityImages["PostImage"] is Entity) ? context.PostEntityImages["PostImage"] : null;
                Entity _preEntity = (context.PreEntityImages.Contains("PreImage") && context.PreEntityImages["PreImage"] is Entity) ? context.PreEntityImages["PreImage"] : null;

                if (entity.LogicalName != "contact")
                    return;

                try
                {

                    if (context.MessageName == "Update")
                    {

                        bool agr1pre= _preEntity.GetAttributeValue<bool>("agr1");
                        bool agr1post= _postEntity.GetAttributeValue<bool>("agr1");

                        bool agr2pre= _preEntity.GetAttributeValue<bool>("agr2");
                        bool agr2post= _postEntity.GetAttributeValue<bool>("agr2");




                        if (agr1pre == true && agr1post == false)
                        {
                            entity.Attributes["agr2"] = false;
                            service.Update(entity);
                          
                           
                        
                       
                        }
                        else if (agr2pre== false && agr2post== true)
                        {
                            entity.Attributes["agr1"] = true;
                            service.Update(entity);
                        }
                        

                    }

                }
                    
                catch (FaultException<OrganizationServiceFault> e)
                {
                    tracingService.Trace("Exception: {0}", e.ToString());
                    throw;
                }
                catch (Exception e)
                {
                    tracingService.Trace("Exception: {0}", e.ToString());
                    throw;
                }

            }

        }

        [RequiredArgument]
        [Input("contact")]
        [ReferenceTarget("contact")]
        public InArgument<EntityReference> contact { get; set; }

    }
}

Thanks


Solution

  • I resolve my problem by code below.

    What this code do? -> update custom fields on all contacts with same mail address

    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Workflow;
    using System;
    using System.Activities;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace IfZgodaChangeSetZgoda2
    {
        public class SpojnoscZgod : Plugin
        {
            public SpojnoscZgod()
                : base(typeof(SpojnoscZgod))
            {
                base.RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(40, "Update", "contact", new Action<LocalPluginContext>(ExecutePostKontaktUpdate)));
            }
            protected void ExecutePostKontaktUpdate(LocalPluginContext localContext)
            {
    
                if (localContext == null)
                {
                    throw new ArgumentNullException("localContext");
                }
    
                IPluginExecutionContext context = localContext.PluginExecutionContext;
                IOrganizationService service = localContext.OrganizationService;
                ITracingService tracingService = localContext.TracingService;
                OrganizationServiceContext _crmOrgContext = new OrganizationServiceContext(service);
                tracingService.Trace("ExecutePostFakturaUpdate Plugin: Verifying the client is not offline.");
    
                if (context.IsExecutingOffline || context.IsOfflinePlayback)
                    return;
    
                if (context.Depth > 1)
                    return;
    
                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    Entity contact = (Entity)context.InputParameters["Target"];
                    Entity _postEntity = (context.PostEntityImages.Contains("PostImage") && context.PostEntityImages["PostImage"] is Entity) ? context.PostEntityImages["PostImage"] : null;
                    Entity _preEntity = (context.PreEntityImages.Contains("PreImage") && context.PreEntityImages["PreImage"] is Entity) ? context.PreEntityImages["PreImage"] : null;
    
                    string email = _postEntity.GetAttributeValue<string>("emailaddress1"); // get email address from contact
    
                    bool zgodaNaMarketing = _postEntity.GetAttributeValue<bool>("alt_zgodanamarketing"); //get marketing agreement before edition
                    bool zgodaNaMarketingPre = _preEntity.GetAttributeValue<bool>("alt_zgodanamarketing"); //get marketing agreement after edition
                    bool alt_ZgodanamarketingnewPre = _preEntity.GetAttributeValue<bool>("alt_zgodanamassmailing"); //get marketing agreement for massmailing before edition
                    bool alt_Zgodanamarketingnew_post = _postEntity.GetAttributeValue<bool>("alt_zgodanamassmailing"); //get marketing agreement for massmailing after edition
    
                    string alt_uzasadnieniePre = _preEntity.GetAttributeValue<string>("alt_uzasadnienie"); //get justification of consent before edition
                    string alt_uzasadnienie = _postEntity.GetAttributeValue<string>("alt_uzasadnienie"); //get justification of consent after edition
                    
    
                    if (contact.LogicalName != "contact") 
                        return;
    
                    if (_postEntity.GetAttributeValue<string>("emailaddress1") == null) { return; }  //if you delete mailaddress from contact add this line for doing nothing
     
                        try
                    {
    
    
    
                        QueryExpression contactQuery = new QueryExpression("contact");    // new query expression
                        contactQuery.ColumnSet = new ColumnSet(true);                   // new column set                             
                        contactQuery.Criteria = new FilterExpression();             // new filter for request
                        contactQuery.Criteria.AddCondition("emailaddress1".ToString(), ConditionOperator.Equal, email.ToString());  // get all contacts with same emailaddress1
                        EntityCollection retrievedContacts = service.RetrieveMultiple(contactQuery);  // retrieve with above criteria
    
    
                        foreach (Entity contacts in retrievedContacts.Entities)  // loop for change in all contacts 1 by 1 
                        {
    
                            
                            if (zgodaNaMarketingPre == true && zgodaNaMarketing == false) 
                            {
                                contacts.Attributes["alt_zgodanamarketing"] = false;
                                contacts.Attributes["alt_zgodanamassmailing"] = false;
                                contacts.Attributes["alt_uzasadnienie"] = alt_uzasadnienie;
                                service.Update(contacts);  
    
                            }
                            else if (alt_ZgodanamarketingnewPre == false && alt_Zgodanamarketingnew_post == true)
                            {
                                contacts.Attributes["alt_zgodanamarketing"] = true;
                                contacts.Attributes["alt_zgodanamassmailing"] = true;
                                contacts.Attributes["alt_uzasadnienie"] = alt_uzasadnienie;
                                service.Update(contacts);
                                
                            }
                            else
                            {
                                contacts.Attributes["alt_zgodanamarketing"] = zgodaNaMarketing;
                                contacts.Attributes["alt_zgodanamassmailing"] = alt_Zgodanamarketingnew_post;
                                contacts.Attributes["alt_uzasadnienie"] = alt_uzasadnienie;                            
                                service.Update(contacts);
                                
                            }
                        }
    
                    }
    
    
    
                    catch (FaultException<OrganizationServiceFault> e)
                    {
                        tracingService.Trace("Exception: {0}", e.ToString());
                        throw;
                    }
                    catch (Exception e)
                    {
                        tracingService.Trace("Exception: {0}", e.ToString());
                        throw;
                    }
    
                    }
                
    
            }
    
            [RequiredArgument]
            [Input("contact")]
            [ReferenceTarget("contact")]
            public InArgument<EntityReference> contact { get; set; }
    
        }
    }