A Brazier
A Brazier

Reputation: 11

Automatically map a Contact to an Account

I want to add a field to Accounts which shows the email domain for that account e.g. @BT.com. I then have a spreadsheet which lists all the Accounts and their email domains. What I want to do is when a new Contact is added to Dynamics that it checks the spreadsheet for the same email domain (obviously without the contacts name in the email) and then assigned the Contact to the Account linked to that domain. Any idea how I would do this. Thanks

Upvotes: 1

Views: 125

Answers (2)

Zach Mast
Zach Mast

Reputation: 1718

I took Ondrej's code and cleaned it up a bit, re-factored for pre-operation. I also updated the logic to only match active account records and moved the query inside the try/catch. I am unfamiliar with the MailAddress object, I personally would just use string mapping logic.

var target = (Entity)context.InputParameters["Target"];

try
{
    string host = new MailAddress(target.emailaddress1).Host;

    var query = new QueryExpression("account");
    query.TopCount = 1;
    // or whatever the name of email domain field on account is
    query.Criteria.AddCondition("emailaddress1", ConditionOperator.Contains, "@" + host);
    query.Criteria.AddCondition("statecode", ConditionOperator.Equals, 0); //Active records only
    var entities = organizationService.RetrieveMultiple(query).Entities;
    if (entities.Count != 0)
    {
        target["parentaccountid"] = entities[0].ToEntityReference();
    }
}
catch
{
  //Log error
}

Upvotes: 0

Ondrej Svejdar
Ondrej Svejdar

Reputation: 22084

Probably best chance would be to develop CRM plugin. Register your plugin to be invoked when on after contact is created or updated (so called post-event phase). And in your plugin update the parentaccountid property of the contact entity to point to account of your choice.

Code-wise it goes something like (disclaimer: not tested):

// IPluginExecutionContext context = null;
// IOrganizationService organizationService = null;

var contact = (Entity)context.InputParameters["Target"];
var email = organizationService.Retrieve("contact", contact.Id, new ColumnSet("emailaddress1")).GetAttributeValue<string>("emailaddress1");
string host;
try
{
  var address = new MailAddress(email);
  host = address.Host;
}
catch
{
  return;
}

var query = new QueryExpression("account");
query.TopCount = 1;
// or whatever the name of email domain field on account is
query.Criteria.AddCondition("emailaddress1", ConditionOperator.Contains, "@" + host);
var entities = organizationService.RetrieveMultiple(query).Entities;
if (entities.Count != 0)
{
  contact["parentaccountid"] = entities[0].ToEntityReference();
}

organizationService.Update(contact);

Upvotes: 0

Related Questions