protected void InviteButton_Click(object sender, EventArgs e)
        {
            if (!Page.IsValid)
            {
                return;
            }

            //create invitation Code

            var contact = XrmContext.CreateQuery("contact").FirstOrDefault(c => c.GetAttributeValue <Guid>("contactid") == ContactToEdit.GetAttributeValue <Guid>("contactid"));

            if (contact == null)
            {
                throw new ArgumentNullException(string.Format("Unable to find contact with id equal to {0}", ContactToEdit.GetAttributeValue <Guid>("contactid")));
            }

            var invitation = new Entity("adx_invitation");

            invitation.SetAttributeValue("adx_name", "Auto-generated email confirmation");
            invitation.SetAttributeValue("adx_type", new OptionSetValue(756150000));             // Single
            invitation.SetAttributeValue("adx_invitecontact", contact.ToEntityReference());
            invitation.SetAttributeValue("adx_invitationcode", XrmContext.CreateInvitationCode());

            XrmContext.AddObject(invitation);

            CreatePermissions();

            XrmContext.SaveChanges();

            // Execute workflow to send invitation code in confirmation email

            XrmContext.ExecuteWorkflowByName(ServiceContext.GetSiteSettingValueByName(Website, "Account/EmailConfirmation/WorkflowName") ?? "ADX Sign Up Email", invitation.Id);

            InvitationConfirmationMessage.Visible = true;
        }
        protected void InviteContact(Entity contact)
        {
            var invitation = new Entity("adx_invitation");

            invitation.SetAttributeValue("adx_name", "Auto-generated email confirmation");
            invitation.SetAttributeValue("adx_type", new OptionSetValue(756150000));             // Single
            invitation.SetAttributeValue("adx_invitecontact", contact.ToEntityReference());
            invitation.SetAttributeValue("adx_invitationcode", XrmContext.CreateInvitationCode());

            var oppPermissions = new Entity("adx_opportunitypermissions");

            oppPermissions.SetAttributeStringTruncatedToMaxLength(XrmContext, "adx_name", "opportunitity permissions for " + contact.GetAttributeValue <string>("fullname"));
            oppPermissions.SetAttributeValue("adx_contactid", contact.ToEntityReference());
            oppPermissions.SetAttributeValue("adx_accountid", contact.GetAttributeValue <EntityReference>("parentcustomerid"));
            oppPermissions.SetAttributeValue("adx_scope", new OptionSetValue((int)Enums.OpportunityAccessScope.Self));
            oppPermissions.SetAttributeValue("adx_read", true);

            var channelPermissions = new Entity("adx_channelpermissions");

            channelPermissions.SetAttributeStringTruncatedToMaxLength(XrmContext, "adx_name", "channel permissions for " + contact.GetAttributeValue <string>("fullname"));
            channelPermissions.SetAttributeValue("adx_contactid", contact.ToEntityReference());
            channelPermissions.SetAttributeValue("adx_accountid", contact.GetAttributeValue <EntityReference>("parentcustomerid"));

            XrmContext.AddObject(invitation);
            XrmContext.AddObject(channelPermissions);
            XrmContext.AddObject(oppPermissions);
            XrmContext.UpdateObject(contact);
            XrmContext.SaveChanges();

            // Execute workflow to send invitation code in confirmation email
            XrmContext.ExecuteWorkflowByName(ServiceContext.GetSiteSettingValueByName(Website, "Account/EmailConfirmation/WorkflowName") ?? "ADX Sign Up Email", invitation.Id);
        }