Skip to content

Instantly share code, notes, and snippets.

@MethodenMann
Last active May 7, 2025 07:22
Show Gist options
  • Save MethodenMann/ef94fca7a3134a0603bcf94629859df8 to your computer and use it in GitHub Desktop.
Save MethodenMann/ef94fca7a3134a0603bcf94629859df8 to your computer and use it in GitHub Desktop.
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Mail;
using System.Runtime.Remoting.Contexts;
using System.Text;
using Zurich.CEP.Common.DomainModel.DataModel.Crm;
using Zurich.Zkp.Common;
using Zurich.Zkp.Common.CrmDataAccess.DataProvider;
using Zurich.Zkp.DomainModel.Constants;
using Zurich.Zkp.DomainModel.DataModel.Crm;
using Zurich.Zkp.Extensions;
using Zurich.Zkp.PluginBase;
using Configuration = Zurich.Zkp.DomainModel.Constants.Configuration;
namespace LeadPlugin
{
public class LeadHandler : Plugin
{
public LeadHandler()
: base(typeof(LeadHandler))
{
RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(
(int)PipelinePhase.PreOperation,
Message.Create.ToString(),
lead.EntityLogicalName,
OnPreCreate));
RegisteredEvents.Add(new Tuple<int, string, string, Action<LocalPluginContext>>(
(int)PipelinePhase.PreOperation,
Message.Update.ToString(),
lead.EntityLogicalName,
OnPreUpdate));
}
private void OnPreCreate(LocalPluginContext context)
{
try
{
var target = Common.GetTargetEntity(context);
SetSlaStartDate(target);
CopyCustomerAttributes(context);
}
catch (Exception e)
{
throw new InvalidOperationException($"Error in pre creating lead: {e.Message}");
}
}
private void OnPreUpdate(LocalPluginContext context)
{
try
{
var target = Common.GetTargetEntity(context);
var preImage = Common.GetPreEntityImage(context, target.LogicalName);
var slaStartDate = preImage.GetAttributeValue<DateTime>(lead.zch_SlaStartDate);
if (slaStartDate != null)
{
// Do not overwrite SLA start date
return;
}
SetSlaStartDate(target);
CopyCustomerAttributes(context);
}
catch (Exception e)
{
throw new InvalidOperationException("Error in pre updating lead: " + e.Message);
}
}
private void SetSlaStartDate(Entity leadEntity)
{
var leadType = leadEntity.GetAttributeValue<OptionSetValue>(lead.zch_LeadTypeCode)?.ToEnum<lead.zch_leadtypecodeEnum>();
if (leadType == lead.zch_leadtypecodeEnum.XTwoPercent_Consulting_Order_63242)
{
leadEntity.SetAttributeValue(lead.zch_SlaStartDate, DateTime.Now.ToSwissTime());
}
}
private void CopyCustomerAttributes(LocalPluginContext context)
{
Entity targetEntity = Common.GetTargetEntity(context);
EntityReference partnerRef = targetEntity.GetAttributeValue<EntityReference>(lead.CustomerId);
if (partnerRef == null)
{
context.Trace("Lead doesn't have CustomerId / Partner on Lead is empty");
return;
};
Entity partnerEntity = context.OrganizationService.Retrieve(partnerRef.LogicalName, partnerRef.Id, new ColumnSet(true));
CopyFirstAndLastNameFromPartner(targetEntity, partnerEntity);
CopyAddressFromPartner(targetEntity, partnerEntity);
CopyEmailFromPartner(targetEntity, partnerEntity);
}
private void CopyAddressFromPartner(Entity targetEntity, Entity partnerEntity)
{
if (targetEntity.GetAttributeValue<string>(lead.zch_Street) == null && targetEntity.GetAttributeValue<string>(lead.zch_StreetNumber) == null
&& targetEntity.GetAttributeValue<string>(lead.Address1_PostalCode) == null && targetEntity.GetAttributeValue<string>(lead.Address1_City) == null)
{
var partnerStreet = partnerEntity.GetAttributeValue<string>("zch_street");
var partnerStreetNumber = partnerEntity.GetAttributeValue<string>("zch_streetnumber");
var partnerAddress1PostalCode = partnerEntity.GetAttributeValue<string>("address1_postalcode");
var partnerAddress1City = partnerEntity.GetAttributeValue<string>("address1_city");
if (partnerStreet != null && partnerStreetNumber != null && partnerAddress1PostalCode != null && partnerAddress1City != null)
{
targetEntity.SetAttributeValue<string>(lead.zch_Street, partnerStreet);
targetEntity.SetAttributeValue<string>(lead.zch_StreetNumber, partnerStreetNumber);
targetEntity.SetAttributeValue<string>(lead.Address1_PostalCode, partnerAddress1PostalCode);
targetEntity.SetAttributeValue<string>(lead.Address1_City, partnerAddress1City);
}
}
}
private void CopyEmailFromPartner(Entity targetEntity, Entity partnerEntity)
{
//On Purpose: EmailAddress1 on Lead is EmailAddress2 on Partner and vice-versa for private / business email
if (targetEntity.GetAttributeValue<string>(lead.EMailAddress1) == null)
{
var emailaddress1 = partnerEntity.GetAttributeValue<string>("emailaddress2");
if (emailaddress1 != null)
{
targetEntity.SetAttributeValue<string>(lead.EMailAddress1, emailaddress1);
}
}
if (targetEntity.GetAttributeValue<string>(lead.EMailAddress2) == null)
{
var emailaddress2 = partnerEntity.GetAttributeValue<string>("emailaddress1");
if (emailaddress2 != null)
{
targetEntity.SetAttributeValue<string>(lead.EMailAddress2, emailaddress2);
}
}
}
private void CopyFirstAndLastNameFromPartner(Entity targetEntity, Entity partnerEntity)
{
if (targetEntity.GetAttributeValue<string>(lead.FirstName) == null && targetEntity.GetAttributeValue<string>(lead.LastName) == null)
{
if (partnerEntity.LogicalName == "contact")
{
var partnerFirstName = partnerEntity.GetAttributeValue<string>("firstname");
var partnerLastName = partnerEntity.GetAttributeValue<string>("lastname");
if (partnerFirstName != null)
{
targetEntity.SetAttributeValue<string>(lead.FirstName, partnerFirstName);
}
if (partnerLastName != null)
{
targetEntity.SetAttributeValue<string>(lead.LastName, partnerLastName);
}
}
if (partnerEntity.LogicalName == "account")
{
var partnerAccountName = partnerEntity.GetAttributeValue<string>("name");
if (partnerAccountName != null)
{
targetEntity.SetAttributeValue<string>(lead.LastName, partnerAccountName);
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment