Пример #1
0
        /// <summary>
        /// Efetua o parse entre Microsoft.Xrm.Sdk.Entity para T, onde T é a classe de domínio.
        /// </summary>
        /// <typeparam name="T">Classe de domínio</typeparam>
        /// <param name="organization">Organização CRM 2011</param>
        /// <returns>Retorna uma instância de T preenchida.</returns>
        public static T Parse <T>(this Entity entity, string organization, bool offline, object provider)
        {
            string campoCRM    = "";
            string entidadeCRM = "";

            try
            {
                T obj;

                if (provider == null)
                {
                    obj = (T)Activator.CreateInstance(typeof(T), organization, offline);
                }
                else
                {
                    obj = (T)Activator.CreateInstance(typeof(T), organization, offline, provider);
                }
                entidadeCRM = Utility.GetEntityName <T>();
                var listLogicalAttribute = obj.GetType().GetProperties().GetNameProperties();

                var entidadesRetiradas = new string[] { "annotation", "systemuser", "businessunit", "uom", "productpricelevel", "subject", "customeraddress", "salesorderdetail", "invoicedetail" };
                var camposSituacao     = new string[] { "statuscode", "statecode" };
                var camposDomainBase   = new string[] { "statuscode", "statecode", "createdon", "createdby", "modifiedon", "modifiedby" };
                var entityName         = entidadeCRM.ToLower();

                for (int index = 0; index < listLogicalAttribute.Count; index++)
                {
                    var item             = listLogicalAttribute[index];
                    var logicalAttribute = Utility.GetLogicalAttribute <T>(item);
                    if (logicalAttribute == null)
                    {
                        continue;
                    }
                    campoCRM = logicalAttribute.Name.ToLower();

                    var lowerEntity = entidadeCRM.ToLower();

                    if (entidadesRetiradas.Contains(lowerEntity) && camposSituacao.Contains(campoCRM))
                    {
                        continue;
                    }
                    if (lowerEntity.StartsWith("itbc_itbc_") && camposDomainBase.Contains(campoCRM))
                    {
                        continue;
                    }

                    // Retirado campos padrões da DomainBase que não existem em determinadas entidades
                    //if (entidadeCRM.ToLower() == "annotation" && camposSituacao.Contains(campoCRM)) continue;
                    //if (entidadeCRM.ToLower() == "systemuser" && camposSituacao.Contains(campoCRM)) continue;
                    //if (entidadeCRM.ToLower() == "businessunit" && camposSituacao.Contains(campoCRM)) continue;
                    //if (entidadeCRM.ToLower() == "uom" && camposSituacao.Contains(campoCRM)) continue;
                    //if (entidadeCRM.ToLower() == "productpricelevel" && camposSituacao.Contains(campoCRM)) continue;
                    //if (entidadeCRM.ToLower().StartsWith("itbc_itbc_") && camposDomainBase.Contains(campoCRM)) continue;

                    if (campoCRM == "id")
                    {
                        if (lowerEntity == "task" || lowerEntity == "email")
                        {
                            campoCRM = "activityid";
                        }
                        else
                        {
                            campoCRM = entidadeCRM + "id";
                        }
                    }

                    var value = entity.TryGetValue(campoCRM);
                    if (value == null)
                    {
                        continue;
                    }

                    PropertyInfo propTmp = obj.GetType().GetProperty(item, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
                    //propTmp.SetValue(obj, ConfigureProperty(Utility.GetTypeAttibute(organization, Utility.GetEntityName<T>(), logicalAttribute.Name, offline), value), null);

                    //Obter tipo de objeto para o CRM.
                    var typeXrmSdk = Utility.GetTypeAttribute(organization, offline, Utility.GetEntityName <T>(), propTmp, value);
                    var crmValue   = ConfigureProperty(typeXrmSdk, value);
                    if (Utility.IsEnum(propTmp.PropertyType))
                    {
                        Type enumType = Utility.GetType(propTmp);
                        propTmp.SetValue(obj, System.Enum.Parse(enumType, crmValue.ToString()), null);
                    }
                    else
                    {
                        propTmp.SetValue(obj, crmValue, null);
                    }
                }
                return(obj);
            }catch (Exception ex)
            {
                SDKore.Helper.Error.Create(new Exception(ex.Message + " Campo CRM: " + campoCRM + " Entidade: " + entidadeCRM), System.Diagnostics.EventLogEntryType.Error);
                throw new ArgumentException(ex.Message);
            }
        }