public static void SyncTickets() { bool ProcessEnabled = true; Boolean.TryParse(System.Configuration.ConfigurationManager.AppSettings["Jobs.EnabledJobs"], out ProcessEnabled); int definitionId = 0; if (!Int32.TryParse(System.Configuration.ConfigurationManager.AppSettings["DefinitionId"], out definitionId)) { throw new Exception("DefinitionId no existe en el web config"); } string pipelineId = System.Configuration.ConfigurationManager.AppSettings["PipelineId"]; string pipelineStageId = System.Configuration.ConfigurationManager.AppSettings["PipelineStageId"]; IHubspotService apiService = new HubspotService(); Trace.TraceInformation(string.Format("[TicketsSyncJob.SyncTickets] Executing at {0}", DateTime.Now)); IDBService dbService = new DBService(); DBProceso procesoInfo = dbService.GetProcessInfo("SINCRONIZACION_TICKETS"); StringBuilder strResultado = new StringBuilder("Iniciando proceso..."); if (Monitor.TryEnter(thisLock)) { try { if (!executing && ProcessEnabled) { executing = true; //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); #region SINCRONIZACION DE COMPANIAS EN MEMORIA Dictionary <string, long> CompanyDictionary = new Dictionary <string, long>(); long offset = 0; bool hasMoreCompanies = true; int totalCompanies = 0; strResultado.Append(" * Paso 1 "); while (hasMoreCompanies) { strResultado.Append(" * Paso 1.1 "); CompaniesHubSpotResult companiesHubSpotResult = apiService.GetAllCompanies(250, offset); Trace.TraceInformation(string.Format("HasMore: {0} Offset: {1}", companiesHubSpotResult.HasMore, companiesHubSpotResult.Offset)); hasMoreCompanies = companiesHubSpotResult.HasMore; offset = companiesHubSpotResult.Offset; strResultado.Append(" * Paso 1.2 "); totalCompanies += companiesHubSpotResult.Companies.Count(); strResultado.Append(" * Paso 1.3 "); foreach (Company company in companiesHubSpotResult.Companies) { //TODO: Cambiar por RFC if (company.Properties.RFC != null && !string.IsNullOrEmpty(company.Properties.RFC.Value)) { string rfcCompany = company.Properties.RFC.Value.Trim().ToUpper(); if (!CompanyDictionary.ContainsKey(rfcCompany)) { CompanyDictionary.Add(rfcCompany, company.CompanyId); } } } } Trace.TraceInformation(string.Format("Total Companies: {0}", totalCompanies)); Trace.TraceInformation(string.Format("Total Companies in Dic: {0}", CompanyDictionary.Count())); #endregion strResultado.Append(" * Paso 2 "); dbService.UpdateTicketsToProcess(); strResultado.Append(" * Paso 3 "); IEnumerable <DBTicketModel> tickets = dbService.GetTickets(); strResultado.Append(" * Paso 4 "); int ticketsSyncronized = 0; foreach (DBTicketModel ticket in tickets) { long companyId = 0; strResultado.Append(" * Paso 4.1 "); string rfc = ticket.RFC.Trim().ToUpper(); if (!CompanyDictionary.TryGetValue(rfc, out companyId)) { strResultado.Append(String.Format("No existe el rfc {0} en el hubspot", rfc)); continue; } strResultado.Append(" * Paso 4.2 "); CompanyTicketHubspotSave ticketHubspotSave = new CompanyTicketHubspotSave { CompanyId = companyId, Content = ticket.Descripcion, Monto = ticket.Monto, NumeroOperacion = ticket.NumeroOperacion, Subject = ticket.TipoActividad, DefinitionId = definitionId, PipelineId = pipelineId, PipelineStageId = pipelineStageId }; strResultado.Append(" * Paso 4.3 "); CompanyTicketCreateHubspotResponse apiResponse = apiService.CreateTicketToCompany(ticketHubspotSave); strResultado.Append(" * Paso 4.4 "); if (apiResponse.IsCreated) { strResultado.Append(" * Paso 4.5 "); ticket.TicketId = apiResponse.TicketId; dbService.UpdateSyncTicket(ticket); ticketsSyncronized++; } } Trace.TraceInformation(string.Format("[TicketsSyncJob.SyncTickets] Finishing at {0}", DateTime.Now)); int total = tickets.Count(); procesoDetalle.FechaFin = DateTime.Now; procesoDetalle.Estatus = false; procesoDetalle.Resultado = string.Format("Se sincronizaron {0} de {1} tickets", ticketsSyncronized, total); strResultado.Append(string.Format("|Se sincronizaron {0} de {1} tickets", ticketsSyncronized, total)); dbService.ActualizarProcesoEjecucion(procesoDetalle); } } } 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); } } Trace.TraceInformation(string.Format("[TicketsSyncJob.SyncTickets] Finishing at {0}", DateTime.Now)); }
public CompanyTicketCreateHubspotResponse CreateTicketToCompany(CompanyTicketHubspotSave ticket) { //https://developers.hubspot.com/docs/methods/crm-associations/crm-associations-overview //Ticket to company 26 CompanyTicketCreateHubspotResponse responseModel = new CompanyTicketCreateHubspotResponse(); List <TicketProperty> ticketProperties = new List <TicketProperty>(); ticketProperties.Add(new TicketProperty() { Name = "subject", Value = ticket.Subject.Trim() }); ticketProperties.Add(new TicketProperty() { Name = "content", Value = ticket.Content.Trim() }); ticketProperties.Add(new TicketProperty() { Name = "numero_de_operaci_n", Value = ticket.NumeroOperacion.ToString() }); ticketProperties.Add(new TicketProperty() { Name = "monto", Value = ticket.Monto.ToString() }); ticketProperties.Add(new TicketProperty() { Name = "hs_pipeline", Value = ticket.PipelineId }); ticketProperties.Add(new TicketProperty() { Name = "hs_pipeline_stage", Value = ticket.PipelineStageId }); string jsonToSend = JsonConvert.SerializeObject(ticketProperties); var request = new RestRequest("/crm-objects/v1/objects/tickets?hapikey=" + apiKeyMetrolab); request.Method = Method.POST; request.AddHeader("Accept", "application/json"); request.Parameters.Clear(); request.AddParameter("application/json", jsonToSend, ParameterType.RequestBody); IRestResponse response = client.Execute(request); TicketResponse ticketResponse = JsonConvert.DeserializeObject <TicketResponse>(response.Content); if (ticketResponse.ObjectId > 0) { Association association = new Association() { FromObjectId = ticketResponse.ObjectId, ToObjectId = ticket.CompanyId, Category = "HUBSPOT_DEFINED", DefinitionId = ticket.DefinitionId }; jsonToSend = JsonConvert.SerializeObject(association); request = new RestRequest("/crm-associations/v1/associations?hapikey=" + apiKeyMetrolab); request.Method = Method.PUT; request.AddParameter("application/json", jsonToSend, ParameterType.RequestBody); request.AddHeader("Content-Type", "application/json"); response = client.Put(request); if (response.StatusCode == System.Net.HttpStatusCode.NoContent) { responseModel.IsCreated = true; responseModel.TicketId = ticketResponse.ObjectId; } } responseModel.Content = response.Content; responseModel.StatusHttp = (int)response.StatusCode; return(responseModel); }