Exemple #1
0
        private static void AssertEntityReferencesExists(LocalCrmDatabaseOrganizationService service, Entity entity)
        {
            foreach (var foreign in entity.Attributes.Select(attribute => attribute.Value).OfType <EntityReference>())
            {
#if !PRE_KEYATTRIBUTE
                if (foreign.Id == Guid.Empty && foreign.KeyAttributes.Count > 0)
                {
                    var kvps = new List <object>();
                    foreach (var kvp in foreign.KeyAttributes)
                    {
                        kvps.Add(kvp.Key);
                        kvps.Add(kvp.Value);
                    }

                    // Throw an error if not found.
                    foreign.Id = service.GetFirst(foreign.LogicalName, kvps.ToArray()).Id;
                }
                else
                {
#endif
                service.Retrieve(foreign.LogicalName, foreign.Id, new ColumnSet(false));
#if !PRE_KEYATTRIBUTE
            }
        }

        foreach (var att in entity.Attributes.Select(a => new { a.Key, Value = a.Value as EntityReference })
                 .Where(a => a.Value?.KeyAttributes.Count > 0).ToList())
        {
            entity[att.Key] = new EntityReference(att.Value.LogicalName, att.Value.Id)
            {
                Name = att.Value.Name
            };
#endif
            }
        }
        private static void UpdateOwningFieldsBasedOnOwner(LocalCrmDatabaseOrganizationService service, Entity entity, EntityProperties properties)
        {
            var ownerRef = entity.GetAttributeValue <EntityReference>(Email.Fields.OwnerId).Clone();
            var owner    = service.Retrieve(ownerRef.LogicalName, ownerRef.Id, new ColumnSet(true));
            var bu       = owner.GetAttributeValue <EntityReference>(SystemUser.Fields.BusinessUnitId)
                           ?? owner.GetAttributeValue <EntityReference>(Email.Fields.OwningBusinessUnit);

            ownerRef.Name = null; // Clear Name value since owning field names aren't populated.
            var owningUser = owner.LogicalName == SystemUser.EntityLogicalName
                ? ownerRef
                : null;
            var owningTeam = owner.LogicalName == Team.EntityLogicalName
                ? ownerRef
                : null;

            ConditionallyAddValue(entity, properties, Email.Fields.OwningUser, owningUser);
            ConditionallyAddValue(entity, properties, Email.Fields.OwningTeam, owningTeam);

            if (bu == null)
            {
                return;
            }

            bu      = bu.Clone();
            bu.Name = null;
            ConditionallyAddValue(entity, properties, Email.Fields.OwningBusinessUnit, bu);
            ConditionallyAddValue(entity, properties, SystemUser.Fields.BusinessUnitId, bu);
        }
Exemple #3
0
 private static void AssertEntityReferencesExists(LocalCrmDatabaseOrganizationService service, Entity entity)
 {
     foreach (var foreign in entity.Attributes.Select(attribute => attribute.Value).OfType <EntityReference>())
     {
         service.Retrieve(foreign.LogicalName, foreign.Id, new ColumnSet(true));
     }
 }
Exemple #4
0
        private static void AssertConnectionRolesAreAssociated(LocalCrmDatabaseOrganizationService service, Entity entity, bool isUpdate, DelayedException exception)
        {
            var role1 = entity.GetAttributeValue <EntityReference>(Connection.Fields.Record1RoleId);
            var role2 = entity.GetAttributeValue <EntityReference>(Connection.Fields.Record2RoleId);

            if (isUpdate)
            {
                if (role1 == null && role2 == null)
                {
                    // Role never got set, exit
                    return;
                }

                if (role1 == null || role2 == null)
                {
                    // One is null, attempt to populate it
                    var dbVersion = service.Retrieve(entity.LogicalName, entity.Id, new ColumnSet(true));
                    var dbRole1   = dbVersion.GetAttributeValue <EntityReference>(Connection.Fields.Record1RoleId);
                    var dbRole2   = dbVersion.GetAttributeValue <EntityReference>(Connection.Fields.Record2RoleId);

                    if (role1 == null)
                    {
                        role1 = role2.NullSafeEquals(dbRole1)
                            ? dbRole2
                            : dbRole1;
                    }
                    else
                    {
                        role2 = role1.NullSafeEquals(dbRole2)
                            ? dbRole1
                            : dbRole2;
                    }
                }
            }

            if (role1 == null ||
                role2 == null)
            {
                return;
            }

            var qe = new QueryExpression
            {
                ColumnSet  = new ColumnSet(true),
                EntityName = ConnectionRoleAssociation.EntityLogicalName
            };

            qe.First().WhereEqual(
                ConnectionRoleAssociation.Fields.ConnectionRoleId, role1.Id,
                ConnectionRoleAssociation.Fields.AssociatedConnectionRoleId, role2.Id,
                LogicalOperator.Or,
                ConnectionRoleAssociation.Fields.ConnectionRoleId, role2.Id,
                ConnectionRoleAssociation.Fields.AssociatedConnectionRoleId, role1.Id);

            if (!service.RetrieveMultiple(qe).Entities.Any())
            {
                exception.Exception = CrmExceptions.GetFaultException(ErrorCodes.UnrelatedConnectionRoles);
            }
        }
        /// <summary>
        /// Contact and Account Ids are populated by the customer id property.  Handle hydrating values.
        /// </summary>
        private static void AutoPopulateOpportunityFields <T>(LocalCrmDatabaseOrganizationService service, T entity, bool isCreate) where T : Entity
        {
            if (entity.LogicalName != Opportunity.EntityLogicalName)
            {
                return;
            }

            var customer = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.CustomerId);
            var opp      = isCreate
                ? new Entity()
                : service.Retrieve(Opportunity.EntityLogicalName, entity.Id, new ColumnSet(Opportunity.Fields.ParentAccountId, Opportunity.Fields.ParentContactId));

            var parentName = "parent" + customer?.LogicalName + "id";

            // Customer was set, set correct parent field to customer
            if (customer != null &&
                !entity.Contains(parentName))
            {
                entity[parentName] = customer;
            }

            var hadAccount = opp.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentAccountId) != null;
            var hadContact = opp.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId) != null;

            // Customer was cleared, set correct parent field to null;
            if (entity.ContainsNullValue("customerid"))
            {
                if (hadAccount)
                {
                    entity[Opportunity.Fields.ParentAccountId] = null;
                }
                else if (hadContact)
                {
                    entity[Opportunity.Fields.ParentContactId] = null;
                }
            }

            var hasAccount      = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentAccountId) != null;
            var hasContact      = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId) != null;
            var willHaveAccount = hasAccount ||
                                  hadAccount &&
                                  !entity.ContainsNullValue(Opportunity.Fields.ParentAccountId);
            var willHaveContact = hasContact ||
                                  hadContact &&
                                  !entity.ContainsNullValue(Opportunity.Fields.ParentContactId);

            if (hasAccount)
            {
                entity[Opportunity.Fields.CustomerId] = entity[Opportunity.Fields.ParentAccountId];
            }
            else if (hasContact &&
                     !willHaveAccount)
            {
                entity[Opportunity.Fields.CustomerId] = entity[Opportunity.Fields.ParentContactId];
            }

            if (!willHaveAccount && willHaveContact)
            {
                entity[Opportunity.Fields.CustomerId] = entity.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId)
                                                        ?? opp.GetAttributeValue <EntityReference>(Opportunity.Fields.ParentContactId);
            }
            else if (!willHaveAccount)
            {
                entity[Opportunity.Fields.CustomerId] = null;
            }
        }