Advertisement
Guest User

Untitled

a guest
Dec 12th, 2016
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 29.59 KB | None | 0 0
  1.  
  2. using Microsoft.Crm.Sdk.Messages;
  3. using Microsoft.Xrm.Sdk;
  4. using Microsoft.Xrm.Sdk.Client;
  5. using Microsoft.Xrm.Sdk.Messages;
  6. using Microsoft.Xrm.Sdk.Query;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.ServiceModel.Description;
  12. using System.Web.Script.Serialization;
  13.  
  14. namespace SyncWriter.Common
  15. {
  16.     public static class Utils
  17.     {
  18.         const string EntidadNoProc = "new_registroprocesado";
  19.         public static int CantidadErroresSincronizacion{ get; set; }
  20.  
  21.         private static IOrganizationService _crmService;
  22.         public static void Init(IOrganizationService service)
  23.         {
  24.             _crmService = service;
  25.         }
  26.         public static void ManageTransformErrorsRetry(IEnumerable<object> source, EntityModel Model, Guid syncId, IDictionary<object, object> RegNoProcesados)
  27.         {
  28.             var ListEntities = new List<Entity>();
  29.             // An error has occurred.
  30.             foreach (var record in source)
  31.             {
  32.                 string idRecord = "";
  33.                 //var RecordValue = record.GetType().GetProperty(Model.Fields.First(x => x.IsSourceId.Equals(true)).SourceFieldName).GetValue(record);
  34.                 //idRecord = RegNoProcesados.First(y => y.Key.ToString() == RecordValue.ToString()).Value.ToString();
  35.                 idRecord = Model.GetCRMGuidKey(RegNoProcesados, record);
  36.                 var EntidadError = new Entity(EntidadNoProc);
  37.                 EntidadError.Attributes.Add("new_registroprocesadoid", new Guid(idRecord));
  38.                 EntidadError.Attributes.Add("statuscode", new OptionSetValue(100000003));
  39.                 EntidadError.Attributes.Add("new_corregido", false);
  40.  
  41.                 ListEntities.Add(EntidadError);
  42.             }
  43.             if (ListEntities.Count > 0)
  44.             {
  45.                 ExecuteErrorMultipleRequest(ListEntities, false);
  46.             }
  47.         }
  48.         public static void ManageTransformErrors(string Mensaje, List<Tuple<object, string>> source, EntityModel model, Guid syncId)
  49.         {
  50.             var ListEntities = new List<Entity>();
  51.             // An error has occurred.
  52.             foreach (var record in source)
  53.             {
  54.                 var sourceData = new JavaScriptSerializer().Serialize(record);
  55.                 var EntidadError = new Entity(EntidadNoProc);
  56.                 EntidadError.Attributes.Add("new_fechadeinicio", DateTime.Now);
  57.                 EntidadError.Attributes.Add("new_descripcioncodigo", model.EntityName);
  58.                 EntidadError.Attributes.Add("new_xmlorigen", sourceData);
  59.                 EntidadError.Attributes.Add("new_corregido", false);
  60.                 var recordKeyName = model.Fields.First(x => x.IsSourceId).SourceFieldName;
  61.                 var recordKey = record.Item1.GetType().GetProperty(recordKeyName).GetValue(record.Item1);
  62.                 EntidadError.Attributes.Add("new_registroid", recordKey.ToString());
  63.                 EntidadError.Attributes.Add("new_syncid", new EntityReference("new_sincronizacion", syncId));
  64.                 EntidadError.Attributes.Add("statuscode", new OptionSetValue(100000000));
  65.                 EntidadError.Attributes.Add("new_fechadefin", DateTime.Now);
  66.                 var MensajeCampo = Mensaje.Replace("{{NOMBRECAMPO}}", model.Fields.First(x => x.SourceFieldName == record.Item2).EntityFieldName);
  67.                 var valorDatoString = "";
  68.                 if (record.Item2.Contains("."))
  69.                 {
  70.                     var ValorDato = record.Item1.GetType().GetProperty(record.Item2.Substring(0, record.Item2.IndexOf("."))).GetValue(record.Item1).GetType().GetProperty(record.Item2.Substring(record.Item2.IndexOf(".") + 1)).GetValue(record.Item1.GetType().GetProperty(record.Item2.Substring(0, record.Item2.IndexOf("."))).GetValue(record.Item1));
  71.                     if (ValorDato != null)
  72.                     {
  73.                         valorDatoString = ValorDato.ToString();
  74.                         if (!string.IsNullOrWhiteSpace(valorDatoString))
  75.                         {
  76.                             valorDatoString = "\"" + valorDatoString + "\"";
  77.                         }
  78.                         else
  79.                         {
  80.                             valorDatoString = "\"\"";
  81.                         }
  82.                     }
  83.                     else
  84.                     {
  85.                         valorDatoString = "\"null\"";
  86.                     }
  87.                 }
  88.                 else
  89.                 {
  90.                     var ValorDato = record.Item1.GetType().GetProperty(record.Item2).GetValue(record.Item1);
  91.                     if (ValorDato != null)
  92.                     {
  93.                         valorDatoString = ValorDato.ToString();
  94.                         if (!string.IsNullOrWhiteSpace(valorDatoString))
  95.                         {
  96.                             valorDatoString = "\"" + valorDatoString + "\"";
  97.                         }
  98.                         else
  99.                         {
  100.                             valorDatoString = "\"\"";
  101.                         }
  102.                     }
  103.                     else
  104.                     {
  105.                         valorDatoString = "null";
  106.                     }
  107.                 }
  108.                 var MensajeCompleto = MensajeCampo.Replace("{{VALOR}}", valorDatoString);
  109.                 EntidadError.Attributes.Add("new_errordescripcion", MensajeCompleto);
  110.                 ListEntities.Add(EntidadError);
  111.             }
  112.             if (ListEntities.Count > 0)
  113.             {
  114.                 ExecuteErrorMultipleRequest(ListEntities, true);
  115.             }
  116.         }
  117.  
  118.         public static void ErrorServicio(Guid IdSync, Exception ex)
  119.         {
  120.             var sync = new Entity("new_sincronizacion");
  121.             sync["new_sincronizacionid"] = IdSync;
  122.             sync["new_error"] = "Mensaje: " + ex.Message + (ex.InnerException != null ? " InnerException: " + ex.InnerException.Message : "") + ex.StackTrace;
  123.             sync["statecode"] = new OptionSetValue(1);
  124.             sync["statuscode"] = new OptionSetValue(2);
  125.             _crmService.Update(sync);
  126.         }
  127.  
  128.         public static void ExecuteErrorMultipleRequest(List<Entity> ListEntities, bool Crear)
  129.         {
  130.             ExecuteMultipleRequest requestWithResults = null;
  131.             requestWithResults = new ExecuteMultipleRequest()
  132.             {
  133.                 // Assign settings that define execution behavior: continue on error, return responses.
  134.                 Settings = new ExecuteMultipleSettings()
  135.                 {
  136.                     ContinueOnError = true,
  137.                     ReturnResponses = false
  138.                 },
  139.                 // Create an empty organization request collection.
  140.                 Requests = new OrganizationRequestCollection()
  141.             };
  142.  
  143.             // Create several (local, in memory) entities in a collection.
  144.             EntityCollection input = new EntityCollection(ListEntities) { EntityName = EntidadNoProc };
  145.  
  146.             // Add a CreateRequest for each entity to the request collection.
  147.             foreach (var entity in input.Entities)
  148.             {
  149.                 OrganizationRequest Request;
  150.                 if (Crear)
  151.                 {
  152.                     Request = new CreateRequest { Target = entity };
  153.                     requestWithResults.Requests.Add(Request);
  154.                 }
  155.                 else
  156.                 {
  157.                     Request = new UpdateRequest { Target = entity };
  158.                     requestWithResults.Requests.Add(Request);
  159.                 }
  160.             }
  161.  
  162.             // Execute all the requests in the request collection using a single web method call.
  163.             ExecuteMultipleResponse responseWithResults =
  164.                 (ExecuteMultipleResponse)_crmService.Execute(requestWithResults);
  165.         }
  166.  
  167.         public static int ManageErrors(ExecuteMultipleResponse results, ExecuteMultipleRequest transformedData, Guid syncId, EntityModel Model)
  168.         {
  169.             if (results.Responses.Any(x => x.Fault != null))
  170.             {
  171.                 var ListEntities = new List<Entity>();
  172.                 // Display the results returned in the responses.
  173.                 foreach (var responseItem in results.Responses.Where(x => x.Fault != null))
  174.                 {
  175.                     string sourceData = "";
  176.                     // An error has occurred.
  177.                     if (transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().GetType() == typeof(Entity))
  178.                     {
  179.                         sourceData = new JavaScriptSerializer().Serialize(ToCRMModel(Model, transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().Attributes));
  180.                     }
  181.                     else
  182.                     {
  183.                         //sourceData = new JavaScriptSerializer().Serialize(ToCRMModel(Model, transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().Attributes));
  184.                     }
  185.                     var EntidadError = new Entity(EntidadNoProc);
  186.                     EntidadError.Attributes.Add("new_fechadeinicio", DateTime.Now);
  187.                     EntidadError.Attributes.Add("new_descripcioncodigo", Model.EntityName);
  188.                     //EntidadError = new JavaScriptSerializer().Serialize(ToSourceObject(Model,source));
  189.                     EntidadError.Attributes.Add("new_xmltransformado", sourceData);
  190.                     string MensajeError = responseItem.Fault.Message;
  191.                     if (MensajeError.Contains("00000000-0000-0000-0000-000000000000"))
  192.                     {
  193.                         //MensajeError = MensajeError.Replace("00000000-0000-0000-0000-000000000000",
  194.                         //transformedData.Requests.ElementAt(responseItem.RequestIndex)
  195.                         //.Parameters.Values.Cast<Entity>().First().Attributes
  196.                         //.First(x => x.Key.ToString() == Model.Fields
  197.                         //.First(y => y.IsSourceId.Equals(true)).EntityFieldName.ToString())
  198.                         //.Value.ToString());
  199.                         var entity = transformedData.Requests.ElementAt(responseItem.RequestIndex)
  200.                             .Parameters.Values.Cast<Entity>().FirstOrDefault();
  201.                         MensajeError = MensajeError.Replace("00000000-0000-0000-0000-000000000000", Model.getCompositeKeyValueEntity(entity).ToString());
  202.                     }
  203.                     EntidadError.Attributes.Add("new_errordescripcion", MensajeError);
  204.                     if (responseItem.Fault.ErrorDetails.Any(x => x.Key == "CallStack"))
  205.                     {
  206.                         EntidadError.Attributes.Add("new_errorstack", responseItem.Fault.ErrorDetails.First(x => x.Key == "CallStack").Value);
  207.                     }
  208.                     else
  209.                     {
  210.                         EntidadError.Attributes.Add("new_errorstack", responseItem.Fault.TraceText);
  211.                     }
  212.  
  213.                     EntidadError.Attributes.Add("new_corregido", false);
  214.                     EntidadError.Attributes.Add("new_registroid", transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().Attributes.First(x => x.Key.ToString() == Model.Fields.First(y => y.IsSourceId.Equals(true)).EntityFieldName.ToString()).Value.ToString());
  215.                     EntidadError.Attributes.Add("new_syncid", new EntityReference("new_sincronizacion", syncId));
  216.                     if (transformedData.RequestName == "Create")
  217.                     {
  218.                         EntidadError.Attributes.Add("new_operacion", new OptionSetValue(100000000));
  219.                     }
  220.                     else
  221.                     {
  222.                         EntidadError.Attributes.Add("new_operacion", new OptionSetValue(100000001));
  223.                     }
  224.                     EntidadError.Attributes.Add("statuscode", new OptionSetValue(100000001));
  225.                     EntidadError.Attributes.Add("new_fechadefin", DateTime.Now);
  226.                     ListEntities.Add(EntidadError);
  227.                 }
  228.  
  229.                 ExecuteErrorMultipleRequest(ListEntities, true);
  230.             }
  231.             return results.Responses.Where(x => x.Fault != null).Count();
  232.         }
  233.  
  234.         public static int PostUpdate(IDictionary<Entity, int> records, Guid syncId, EntityModel model)
  235.         {
  236.             ExecuteMultipleRequest requestWithResults = null;
  237.             requestWithResults = new ExecuteMultipleRequest()
  238.             {
  239.                 // Assign settings that define execution behavior: continue on error, return responses.
  240.                 Settings = new ExecuteMultipleSettings()
  241.                 {
  242.                     ContinueOnError = true,
  243.                     ReturnResponses = false
  244.                 },
  245.                 // Create an empty organization request collection.
  246.                 Requests = new OrganizationRequestCollection()
  247.             };
  248.  
  249.  
  250.             var query = model.getEntitiesByKeyQuery(records.Select(x => x.Key).ToArray());
  251.  
  252.             var entities = _crmService.RetrieveMultiple(query);
  253.  
  254.             foreach (var entity in entities.Entities)
  255.             {
  256.                 SetStateRequest stateRequest = new SetStateRequest();
  257.  
  258.  
  259.                 // Set the Request Object's Properties
  260.                 stateRequest.State = new OptionSetValue(1);
  261.                 var KeyEntity = model.getCompositeKeyValueEntity(entity);
  262.                 stateRequest.Status =
  263.                     new OptionSetValue(records
  264.                     .FirstOrDefault(x => model.getCompositeKeyValueEntity(x.Key).ToString()
  265.                     == KeyEntity.ToString()).Value);
  266.  
  267.                 // Point the Request to the case whose state is being changed
  268.                 stateRequest.EntityMoniker = entity.ToEntityReference();
  269.  
  270.  
  271.                 requestWithResults.Requests.Add(stateRequest);
  272.             }
  273.  
  274.             ExecuteMultipleResponse response = (ExecuteMultipleResponse)_crmService.Execute(requestWithResults);
  275.             return ManageErrors(response, requestWithResults, syncId, model);
  276.         }
  277.  
  278.         public static int ManageErrors(ExecuteMultipleResponse results, ExecuteMultipleRequest transformedData, Guid syncId, string AttrToFind, EntityModel Model)
  279.         {
  280.             if (results.Responses.Any(x => x.Fault != null))
  281.             {
  282.                 var ListEntities = new List<Entity>();
  283.                 // Display the results returned in the responses.
  284.                 foreach (var responseItem in results.Responses.Where(x => x.Fault != null))
  285.                 {
  286.                     string sourceData = "";
  287.                     // An error has occurred.
  288.                     if (transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().GetType() == typeof(Entity))
  289.                     {
  290.                         sourceData = new JavaScriptSerializer().Serialize(ToCRMModel(Model, transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().Attributes));
  291.                     }
  292.                     else
  293.                     {
  294.                         //sourceData = new JavaScriptSerializer().Serialize(ToCRMModel(Model, transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<EntityReference>().First().Id));
  295.                     }
  296.                     var EntidadError = new Entity(EntidadNoProc);
  297.                     EntidadError.Attributes.Add("new_fechadeinicio", DateTime.Now);
  298.                     EntidadError.Attributes.Add("new_descripcioncodigo", Model.EntityName);
  299.                     EntidadError.Attributes.Add("new_xmltransformado", sourceData);
  300.                     string MensajeError = responseItem.Fault.Message;
  301.                     if (MensajeError.Contains("00000000-0000-0000-0000-000000000000"))
  302.                     {
  303.                         MensajeError = MensajeError.Replace("00000000-0000-0000-0000-000000000000", transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().Attributes.First(x => x.Key.ToString() == Model.Fields.First(y => y.IsSourceId.Equals(true)).EntityFieldName.ToString()).Value.ToString());
  304.                     }
  305.                     EntidadError.Attributes.Add("new_errordescripcion", MensajeError);
  306.                     if (responseItem.Fault.ErrorDetails.Any(x => x.Key == "CallStack"))
  307.                     {
  308.                         EntidadError.Attributes.Add("new_errorstack", responseItem.Fault.ErrorDetails.First(x => x.Key == "CallStack").Value);
  309.                     }
  310.                     else
  311.                     {
  312.                         EntidadError.Attributes.Add("new_errorstack", responseItem.Fault.TraceText);
  313.                     }
  314.  
  315.                     EntidadError.Attributes.Add("new_corregido", false);
  316.                     var RegistroId = "";
  317.                     if (transformedData.Requests.ElementAt(responseItem.RequestIndex).GetType() == typeof(Entity))
  318.                     {
  319.                         RegistroId = transformedData.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().Attributes.First(x => x.Key.ToString() == Model.Fields.First(y => y.IsSourceId.Equals(true)).EntityFieldName.ToString()).Value.ToString();
  320.                     }
  321.                     EntidadError.Attributes.Add("new_registroid", RegistroId);
  322.                     EntidadError.Attributes.Add("new_syncid", new EntityReference("new_sincronizacion", syncId));
  323.                     if (transformedData.RequestName == "Create")
  324.                     {
  325.                         EntidadError.Attributes.Add("new_operacion", new OptionSetValue(100000000));
  326.                     }
  327.                     else
  328.                     {
  329.                         EntidadError.Attributes.Add("new_operacion", new OptionSetValue(100000001));
  330.                     }
  331.                     EntidadError.Attributes.Add("statuscode", new OptionSetValue(100000001));
  332.                     EntidadError.Attributes.Add("new_fechadefin", DateTime.Now);
  333.                     ListEntities.Add(EntidadError);
  334.                 }
  335.  
  336.                 ExecuteErrorMultipleRequest(ListEntities, true);
  337.             }
  338.             return results.Responses.Where(x => x.Fault != null).Count();
  339.         }
  340.         public static int ManageErrors(ExecuteMultipleResponse results, ExecuteMultipleRequest source, IDictionary<object, object> RegNoProcesados, EntityModel Model)
  341.         {
  342.             var ListEntities = new List<Entity>();
  343.             // Display the results returned in the responses.
  344.             foreach (var responseItem in results.Responses)
  345.             {
  346.                 string idRecord = "";
  347.                 idRecord = RegNoProcesados.First(x => x.Key.ToString() == source.Requests.ElementAt(responseItem.RequestIndex).Parameters.Values.Cast<Entity>().First().Attributes.First(y => y.Key.ToString() == Model.Fields.First(z => z.IsSourceId.Equals(true)).EntityFieldName.ToString()).Value.ToString()).Value.ToString();
  348.                 var EntidadError = new Entity(EntidadNoProc);
  349.                 EntidadError.Attributes.Add("new_registroprocesadoid", new Guid(idRecord));
  350.                 if (responseItem.Fault == null)
  351.                 {
  352.                     EntidadError.Attributes.Add("statuscode", new OptionSetValue(1));
  353.                     EntidadError.Attributes.Add("new_corregido", true);
  354.                 }
  355.                 else
  356.                 {
  357.                     EntidadError.Attributes.Add("statuscode", new OptionSetValue(100000003));
  358.                     EntidadError.Attributes.Add("new_corregido", false);
  359.                 }
  360.  
  361.                 ListEntities.Add(EntidadError);
  362.             }
  363.  
  364.             ExecuteErrorMultipleRequest(ListEntities, false);
  365.             return results.Responses.Where(x => x.Fault != null).Count();
  366.         }
  367.         public static IOrganizationService GetCRMService()
  368.         {
  369.             return _crmService;
  370.         }
  371.         public static IOrganizationService GetCRMServiceInstance()
  372.         {
  373.             Uri oUri = new Uri("https://trpdemotest.crm2.dynamics.com" + "/XRMServices/2011/Organization.svc");
  374.  
  375.             ClientCredentials clientCredentials = new ClientCredentials();
  376.             clientCredentials.UserName.UserName = "jgoldman@trpdemotest.onmicrosoft.com";
  377.             clientCredentials.UserName.Password = "Pass@word1";
  378.             var crmInstance = new OrganizationServiceProxy(oUri, null, clientCredentials, null);
  379.             crmInstance.EnableProxyTypes();
  380.             return crmInstance;
  381.  
  382.  
  383.  
  384.         }
  385.         public static Entity getEntityWithId(Entity entity, string AttrToFind)
  386.         {
  387.             var query = new QueryExpression(entity.LogicalName);
  388.  
  389.             query.Criteria.AddCondition(new ConditionExpression(AttrToFind, ConditionOperator.Equal, entity.Attributes[AttrToFind]));
  390.             var response = _crmService.RetrieveMultiple(query);
  391.             if (response.Entities.Count > 0)
  392.             {
  393.                 return entity;
  394.             }
  395.             else
  396.             {
  397.                 return null;
  398.             }
  399.         }
  400.  
  401.         public static IDictionary<object, object> getIdsToBlock(IEnumerable<Tuple<string, string[]>> data, EntityModel model)
  402.         {
  403.             var query = model.getIdsQuery(data);
  404.             var response = _crmService.RetrieveMultiple(query);
  405.  
  406.             return response.Entities.ToDictionary(x => model.getCompositeKeyValueEntity(x), x => x.Attributes[model.EntityId]);
  407.         }
  408.  
  409.         public static Tuple<string, IDictionary<object, object>> GetReferenceData(string[] data, Dependency dependency)
  410.         {
  411.             var query = new QueryExpression(dependency.EntityToJoin);
  412.             query.ColumnSet.AddColumn(dependency.EntityFieldToJoin);
  413.             query.Criteria.AddCondition(new ConditionExpression(dependency.EntityFieldToJoin, ConditionOperator.In, data));
  414.             var response = _crmService.RetrieveMultiple(query);
  415.             var dic = new Dictionary<object, object>();
  416.             foreach (var d in data.Distinct())
  417.             {
  418.                 var value = response.Entities.FirstOrDefault(x => x.Attributes[dependency.EntityFieldToJoin].Equals(d)) == null ? "-1" : response.Entities.First(x => x.Attributes[dependency.EntityFieldToJoin].Equals(d)).Attributes[dependency.EntityToJoinId];
  419.                 dic.Add(d, value);
  420.             }
  421.             return new Tuple<string, IDictionary<object, object>>(dependency.EntityToJoin,
  422.                 dic);
  423.             //return new Tuple<string, IDictionary<object, object>>(dependency.EntityToJoin,
  424.             //    response.Entities.ToDictionary(x => x.Attributes[dependency.EntityFieldToJoin],
  425.             //    x => x.Attributes[dependency.EntityToJoinId] == null ? -1 :
  426.             //    x.Attributes[dependency.EntityToJoinId]));
  427.         }
  428.  
  429.         public static EntityModel GetModel<T>() where T : class
  430.         {
  431.             var type = typeof(T);
  432.             var name = type.Name.Replace("SyncPlugin", "");
  433.             var path = "SyncWriter.Mapping." + name + "Map.json";
  434.             EntityModel model;
  435.             using (Stream fileStream = type.Assembly.GetManifestResourceStream(path))
  436.             {
  437.                 var sr = new StreamReader(fileStream);
  438.                 model = new JavaScriptSerializer().Deserialize<EntityModel>(sr.ReadToEnd());
  439.             }
  440.             var list = model.Fields
  441.                 .Select(x => new { FieldName = x.SourceFieldName }).ToList<object>();
  442.             model.EntityType = EntityTypeBuilder.CompileResultType(list);
  443.  
  444.             var crmList = model.Fields
  445.                 .Select(x => new { FieldName = x.EntityFieldName }).ToList<object>();
  446.  
  447.             if (model.Dependencies.Any())
  448.                 crmList.AddRange(model.Dependencies.Select(x => new { FieldName = x.EntityToJoinId }));
  449.  
  450.             crmList.Add(new { FieldName = model.EntityId });
  451.             model.CRMModel = EntityTypeBuilder.CompileResultType(crmList);
  452.  
  453.             return model;
  454.         }
  455.  
  456.         public static object ToSourceObject(EntityModel model, IDictionary<string, object> attrs)
  457.         {
  458.             var obj = Activator.CreateInstance(model.EntityType);
  459.             foreach (var field in model.Fields)
  460.             {
  461.                 var value = attrs.First(x => x.Key == field.EntityFieldName).Value;
  462.                 obj.GetType().GetProperty(field.SourceFieldName).SetValue(obj, value);
  463.  
  464.             }
  465.             return obj;
  466.         }
  467.  
  468.         public static object ToCRMModel(EntityModel model, AttributeCollection attrs)
  469.         {
  470.             var obj = Activator.CreateInstance(model.CRMModel);
  471.             foreach (var field in model.Fields)
  472.             {
  473.                 var value = GetCRMValue(attrs.First(x => x.Key == field.EntityFieldName));
  474.                 obj.GetType().GetProperty(field.EntityFieldName).SetValue(obj, value);
  475.             }
  476.             foreach (var dependency in model.Dependencies)
  477.             {
  478.                 var value = GetCRMValue(attrs.First(x => x.Key == dependency.EntityLookupName));
  479.                 obj.GetType().GetProperty(dependency.EntityToJoinId).SetValue(obj, value);
  480.             }
  481.             if (attrs.Any(x => x.Key == model.EntityId))
  482.             {
  483.                 obj.GetType().GetProperty(model.EntityId).SetValue(obj, GetCRMValue(attrs.First(x => x.Key == model.EntityId)));
  484.             }
  485.             return obj;
  486.         }
  487.  
  488.         private static object GetCRMValue(KeyValuePair<string, object> attr)
  489.         {
  490.             object CrmValue = null;
  491.             if (attr.Value != null)
  492.             {
  493.                 if (attr.Value.GetType() == typeof(EntityReference))
  494.                 {
  495.                     CrmValue = ((EntityReference)attr.Value).Id.ToString();
  496.                 }
  497.                 else if (attr.Value.GetType() == typeof(OptionSetValue))
  498.                 {
  499.                     CrmValue = ((OptionSetValue)attr.Value).Value.ToString();
  500.                 }
  501.                 else
  502.                 {
  503.                     CrmValue = attr.Value.ToString();
  504.                 }
  505.             }
  506.             return CrmValue;
  507.         }
  508.         public static object ToSourceObject(EntityModel model, AttributeCollection attrs)
  509.         {
  510.             var obj = Activator.CreateInstance(model.EntityType);
  511.             foreach (var field in model.Fields)
  512.             {
  513.                 var value = attrs.First(x => x.Key == field.EntityFieldName).Value;
  514.                 obj.GetType().GetProperty(field.SourceFieldName).SetValue(obj, value);
  515.  
  516.             }
  517.             return obj;
  518.         }
  519.         public static object ToCRMType(this object ObjectSource, Field ModelField)
  520.         {
  521.             object ObjectReturn = ObjectSource;
  522.             if (ObjectSource != null)
  523.             {
  524.                 if (!string.IsNullOrWhiteSpace(ObjectSource.ToString()))
  525.                 {
  526.                     try
  527.                     {
  528.                         switch (ModelField.CRMType)
  529.                         {
  530.                             case CRMTypes.STRING:
  531.                                 ObjectReturn = Convert.ToString(ObjectSource);
  532.                                 break;
  533.                             case CRMTypes.INT:
  534.                                 ObjectReturn = Convert.ToInt32(ObjectSource);
  535.                                 break;
  536.                             case CRMTypes.DATETIME:
  537.                                 ObjectReturn = Convert.ToDateTime(ObjectSource);
  538.                                 break;
  539.                             case CRMTypes.DOUBLE:
  540.                                 ObjectReturn = Convert.ToDouble(ObjectSource);
  541.                                 break;
  542.                             case CRMTypes.BOOL:
  543.                                 ObjectReturn = Convert.ToBoolean(ObjectSource);
  544.                                 break;
  545.                             case CRMTypes.DECIMAL:
  546.                                 ObjectReturn = Convert.ToDecimal(ObjectSource);
  547.                                 break;
  548.                             case CRMTypes.MONEY:
  549.                                 ObjectReturn = new Money(Convert.ToDecimal(ObjectSource));
  550.                                 break;
  551.                         }
  552.                     }
  553.                     catch (Exception)
  554.                     {
  555.                         return null;
  556.                     }
  557.                 }
  558.                 else
  559.                 {
  560.                     if (ModelField.CRMType == CRMTypes.STRING)
  561.                     {
  562.                         ObjectReturn = Convert.ToString(ObjectSource);
  563.                     }
  564.                     else
  565.                     {
  566.                         return null;
  567.                     }
  568.                 }
  569.             }
  570.             return ObjectReturn;
  571.         }
  572.         public enum CRMTypes
  573.         {
  574.             STRING = 0,
  575.             INT,
  576.             DATETIME,
  577.             BOOL,
  578.             DOUBLE,
  579.             DECIMAL,
  580.             MONEY
  581.         }
  582.     }
  583.     //public class EntityModel
  584.     //{
  585.  
  586.     //}
  587.  
  588.     public class Field
  589.     {
  590.         public string SourceFieldName { get; set; }
  591.         public string EntityFieldName { get; set; }
  592.         public bool IsSourceId { get; set; }
  593.         public bool ErrorOnNullOrEmpty { get; set; }
  594.         public bool isOptionValue { get; set; }
  595.         public Utils.CRMTypes CRMType { get; set; }
  596.         public bool IsDependency { get; set; }
  597.     }
  598.  
  599.     public class Dependency
  600.     {
  601.         public string EntityToJoin { get; set; }
  602.         public string EntityToJoinId { get; set; }
  603.         public string EntityFieldToJoin { get; set; }
  604.         public string SourceFieldToJoin { get; set; }
  605.         public string EntityLookupName { get; set; }
  606.     }
  607.  
  608. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement