public static void SyncDeals() { bool ProcessEnabled = true; Boolean.TryParse(System.Configuration.ConfigurationManager.AppSettings["Jobs.EnabledJobs"], out ProcessEnabled); string FiltroDeal = System.Configuration.ConfigurationManager.AppSettings["Jobs.SincronizarDeals.Filtro"].ToString(); string FiltroDealPipeline = System.Configuration.ConfigurationManager.AppSettings["Jobs.SincronizarDeals.FiltroPipeline"].ToString(); IDBService dbService = new DBService(); DBProceso procesoInfo = dbService.GetProcessInfo("SINCRONIZACION_DEALS"); StringBuilder strResultado = new StringBuilder("Iniciando proceso..."); if (Monitor.TryEnter(thisLock)) { try { if (!executing && ProcessEnabled) { executing = true; int syncedDeals = 0; IHubspotService apiService = new HubspotService(); Trace.TraceInformation(string.Format("[DealsSyncJob.SyncDeals] Get owners {0}", DateTime.Now)); IDictionary <int, string> ownersEmails = apiService.GetDisctionaryEmailsOwner(); Trace.TraceInformation(string.Format("[DealsSyncJob.SyncDeals] Executing at {0}", DateTime.Now)); //SI ESTA HABILITADO Y NO SE ESTA EJECUTANDO if (!procesoInfo.EstatusEjecucion && procesoInfo.EstatusProceso) { procesoInfo.EstatusEjecucion = true; procesoInfo.UltimaEjecucion = DateTime.Now; procesoInfo.Resultado = strResultado.ToString(); dbService.ActualizarEstatusProceso(procesoInfo); DBProcesoEjecucion procesoDetalle = new DBProcesoEjecucion() { ProcesoId = procesoInfo.ProcesoId, Estatus = true, Resultado = "Procesando..." }; int ProcesoDetalleId = dbService.CreateProcesoEjecucion(procesoDetalle); //LIMPIA LA TABLA dbService.ClearDeals(); //INICIA SINCRONIZACION long offset = 0; bool hasMoreDeals = true; IDictionary <string, IDictionary <string, PipelineState> > pipelineStages = apiService.GetDealsPipelinesStages(); while (hasMoreDeals) { var dealsObj = apiService.ReadDeals(250, offset); Trace.TraceInformation(string.Format("HasMore: {0} Offset: {1}", dealsObj.HasMore, dealsObj.Offset)); hasMoreDeals = dealsObj.HasMore; offset = dealsObj.Offset; foreach (Deal deal in dealsObj.Deals) { strResultado.Append(" | " + JsonUtil.ConvertToString(deal)); var associations = deal.Associations; long? contactId = null; string CompanyRFC = string.Empty; string CompanyName = string.Empty; long? companyId = null; decimal amount = 0; string ContactName = string.Empty; string DealStage = deal.Properties.DealStage.Value; string linea = string.Empty; string factor = string.Empty; string Owner = string.Empty; string statusMessage = "SUCCESS"; bool hasError = false; StringBuilder errorMessage = new StringBuilder(); if (!FiltroDeal.Contains(DealStage)) { strResultado.Append(" * Paso 1 "); if (associations.AssociatedVids != null && associations.AssociatedVids.Any()) { strResultado.Append(" * Paso 1.1 "); contactId = associations.AssociatedVids.First(); strResultado.Append(" * Paso 1.2 "); if (contactId.HasValue) { try { ContactHubSpotResult contactObj = apiService.GetContactById(contactId.Value); strResultado.Append(" * Paso 1.3 "); if (contactObj != null && contactObj.Properties.Email != null && !string.IsNullOrEmpty(contactObj.Properties.Email.Value)) { ContactName = contactObj.Properties.Email.Value; } }catch (Exception e) { errorMessage.Append("Error al realizar la consulta de la api de contactos"); errorMessage.Append(Environment.NewLine); ExceptionUtil.AppendMessage(e, errorMessage); hasError = true; } } } strResultado.Append(" * Paso 2 "); if (associations.associatedCompanyIds != null && associations.associatedCompanyIds.Any()) { companyId = associations.associatedCompanyIds.First(); try { CompanyHubSpotResult companyObj = apiService.GetCompanyById(companyId.Value); CompanyName = companyObj.Properties.Name != null?string.Format("{0}", companyObj.Properties.Name.Value) : string.Empty; strResultado.Append(" * Paso 2.1 "); if (/*companyObj!=null && companyObj.Properties!=null &&*/ companyObj.Properties.RFC != null && !string.IsNullOrEmpty(companyObj.Properties.RFC.Value)) { CompanyRFC = companyObj.Properties.RFC.Value; } }catch (Exception e) { errorMessage.Append("Error al realizar la consulta de la api de compania"); errorMessage.Append(Environment.NewLine); ExceptionUtil.AppendMessage(e, errorMessage); hasError = true; } } if (hasError) { statusMessage = errorMessage.ToString(); } strResultado.Append(" * Paso 3 "); if (deal.Properties.Amount != null && !string.IsNullOrEmpty(deal.Properties.Amount.Value)) { amount = Convert.ToDecimal(deal.Properties.Amount.Value); } strResultado.Append(" * Paso 4 "); if (deal.Properties.LineaDeNegocio != null && !string.IsNullOrEmpty(deal.Properties.LineaDeNegocio.Value)) { linea = deal.Properties.LineaDeNegocio.Value; } if (deal.Properties.Factor != null && !string.IsNullOrEmpty(deal.Properties.Factor.Value)) { factor = deal.Properties.Factor.Value; } strResultado.Append(" * Paso 5 "); if (deal.Properties.HubspotOwnerId != null && !string.IsNullOrEmpty(deal.Properties.HubspotOwnerId.SourceId)) { int ownerId = 0; if (Int32.TryParse(deal.Properties.HubspotOwnerId.Value, out ownerId) && ownersEmails != null) { ownersEmails.TryGetValue(ownerId, out Owner); } } strResultado.Append(" * Paso 6 "); //INSERCION A BD DBDealModel dealBD = new DBDealModel() { ProcesoDetalleId = ProcesoDetalleId, DealId = deal.DealId, DealName = deal.Properties.Dealname.Value, CompanyRFC = CompanyRFC, Stage = DealStage, Amount = amount, CompanyName = CompanyName, ContactName = ContactName, ProductLine = linea, OwnerName = Owner, Factor = factor, StatusMessage = statusMessage }; long closeDateUnixTimeStamp = 0; if (deal.Properties.CloseDate != null && Int64.TryParse(deal.Properties.CloseDate.Value, out closeDateUnixTimeStamp)) { dealBD.CloseDate = DateUtil.ConvertMilisecondsToDateTime(closeDateUnixTimeStamp); } if (deal.Properties.NumFacturaEpicor != null) { dealBD.NumFacturaEpicor = deal.Properties.NumFacturaEpicor.Value; } strResultado.Append(" * Paso 7 "); IDictionary <string, PipelineState> stages = new Dictionary <string, PipelineState>(); if (deal.Properties.Pipeline != null && pipelineStages.TryGetValue(deal.Properties.Pipeline.Value, out stages)) { PipelineState pipelineState = null; if (deal.Properties.DealStage != null && stages.TryGetValue(deal.Properties.DealStage.Value, out pipelineState)) { dealBD.StageProbability = pipelineState.Metadata.Probability; dealBD.StageName = pipelineState.Label; } } strResultado.Append(" * Paso 8 "); //FILTRO DE PIPELINE if (deal.Properties.Pipeline != null && deal.Properties.Pipeline.Value == FiltroDealPipeline) { dbService.CreateDeal(dealBD); syncedDeals++; } } //END IF Thread.Sleep(150); } //END FOR } //END WHILE Trace.TraceInformation(string.Format("[DealsSyncJob.SyncDeals] Finishing at {0}", DateTime.Now)); procesoDetalle.FechaFin = DateTime.Now; procesoDetalle.Estatus = false; procesoDetalle.Resultado = string.Format("Se sincronizaron {0} deals", syncedDeals); strResultado.Append(string.Format("|Se sincronizaron {0} deals", syncedDeals)); dbService.ActualizarProcesoEjecucion(procesoDetalle); } //FIN DE PROCESO INFO } } catch (Exception exception) { Debug.WriteLine(exception.Message); Trace.TraceInformation(exception.Message); strResultado.Append("|" + exception.Message); if (exception.Source != null) { strResultado.Append("|" + exception.Source); } if (exception.StackTrace != null) { strResultado.Append("|" + exception.StackTrace); } try { System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(exception, true); strResultado.Append("|" + String.Format("<p>Error Detail Message :{0} => Error In :{1} => Line Number :{2} => Error Method:{3}</p>", HttpUtility.HtmlEncode(exception.Message), trace.GetFrame(0).GetFileName(), trace.GetFrame(0).GetFileLineNumber(), trace.GetFrame(0).GetMethod().Name)); } catch (Exception ex) { } } finally { procesoInfo.EstatusEjecucion = false; procesoInfo.UltimaEjecucion = DateTime.Now; procesoInfo.Resultado = strResultado.ToString(); dbService.ActualizarEstatusProceso(procesoInfo); executing = false; Monitor.Exit(thisLock); } } }