static int PostJira(User user, InfoWorklog infoWorklog)
        {
            try
            {
                Log.Info(LogInfoJira);
                //LogArqErros.Info(LogInfoJira);

                using (var client = new HttpClient())
                {
                    //Jira
                    var URI   = String.Format("{0}/rest/api/2/issue/{1}/worklog", UrlBaseJira, infoWorklog.key);
                    var param = new { comment = infoWorklog.comment, started = infoWorklog.started, timeSpent = infoWorklog.timeSpent };
                    var token = user.xTokenJira;
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
                    HttpResponseMessage response = client.PostAsJsonAsync(URI, param).Result;
                    if (response.IsSuccessStatusCode)
                    {
                        Log.Info($"Jira - Registro de trabalho foi inserido com sucesso");

                        var returnValue = response.Content.ReadAsAsync <WorklogPost>().Result;

                        Log.Debug($"Verificando se hora de inicio da atividade está correta");
                        var iTimeStarted = PutTimeStarted(user: user, worklogPost: returnValue, infoWorklog: infoWorklog);
                        if (iTimeStarted == 0)
                        {
                            Log.Debug($"Tentando deletar o horário inserido anteriormente");
                            var iDeleteWorklog = DeleteWorklog(user: user, worklogPost: returnValue, infoWorklog: infoWorklog);
                        }
                        else
                        {
                            Log.Debug($"Tentando retirar as tags pendentes do toggl referente");
                            var iToggl = PutTogglTags(user: user, infoWorklog: infoWorklog);
                            Thread.Sleep(1000);
                        }
                    }
                    else
                    {
                        var    message = response.Content.ReadAsStringAsync().Result;
                        int    pFrom   = message.IndexOf("<h1>") + "<h1>".Length;
                        int    pTo     = message.LastIndexOf("</h1>");
                        String result  = message.Substring(pFrom, pTo - pFrom);

                        Log.Error($"Jira - Ocorreu algum erro ao inserir o Registro de trabalho.");
                        lError.Add($"Jira - Ocorreu algum erro ao inserir o Registro de trabalho. StatusCode: {(int)response.StatusCode}. Message: {result}");
                        //LogArqErros.Error($"Jira - Ocorreu algum erro ao inserir o Registro de trabalho. StatusCode: {(int)response.StatusCode}. Message: {result}");
                    }
                }
                return(1);
            }
            catch (Exception ex)
            {
                Log.Error($"Jira - Ocorreu algum erro ao inserir o Registro de trabalho.");
                lError.Add(String.Format("Jira - Ocorreu algum erro ao inserir o Registro de trabalho: {0}", ex.GetAllMessages()));
                //LogArqErros.Error(String.Format("Jira - Ocorreu algum erro ao inserir o Registro de trabalho: {0}", ex.GetAllMessages()));
                return(0);
            }
        }
        static int PutTimeStarted(User user, WorklogPost worklogPost, InfoWorklog infoWorklog)
        {
            try
            {
                using (var client = new HttpClient())
                {
                    if (worklogPost.started != infoWorklog.dtStarted)
                    {
                        Log.Debug($"Jira - Horario de início do Registro de trabalho está incorreto. Horário inserido: {infoWorklog.dtStarted} - Horário retornado: {worklogPost.started}");
                        Log.Debug("Atualizando o horário de início do Registro de trabalho.");
                        var URI        = String.Format("{0}/rest/api/2/issue/{1}/worklog/{2}", UrlBaseJira, infoWorklog.key, worklogPost.id);
                        var startedAux = (Newtonsoft.Json.JsonConvert.SerializeObject(infoWorklog.dtStarted)).Replace("\"", "");
                        startedAux = startedAux.Replace(startedAux.Substring(19), ".000-0200");
                        var paramPut = new { started = startedAux };
                        var token    = user.xTokenJira;
                        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
                        var response = client.PutAsJsonAsync(URI, paramPut).Result;
                        if (response.IsSuccessStatusCode)
                        {
                            Log.Debug($"Horario atualizado com sucesso");
                            return(1);
                        }
                        else
                        {
                            var    message = response.Content.ReadAsStringAsync().Result;
                            int    pFrom   = message.IndexOf("<h1>") + "<h1>".Length;
                            int    pTo     = message.LastIndexOf("</h1>");
                            String result  = message.Substring(pFrom, pTo - pFrom);
                            Log.Error($"Jira - Ocorreu algum erro ao atualizar o horário de início do Registro de trabalho.");
                            lError.Add($"Jira - Ocorreu algum erro ao atualizar o horário de início do Registro de trabalho. StatusCode: {(int)response.StatusCode}. Message: {result}");
                            //LogArqErros.Error($"Jira - Ocorreu algum erro ao atualizar o horário de início do Registro de trabalho. StatusCode: {(int)response.StatusCode}. Message: {result}");
                            return(0);
                        }
                    }

                    Log.Debug($"Horario não está incorreto");
                    return(1);
                }
            }
            catch (Exception ex)
            {
                Log.Error($"Jira - Ocorreu algum erro ao atualizar o horário de início do Registro de trabalho.");
                lError.Add(String.Format("Jira - Ocorreu algum erro ao atualizar o horário de início do Registro de trabalho: {0}", ex.GetAllMessages()));
                //LogArqErros.Error(String.Format("Jira - Ocorreu algum erro ao atualizar o horário de início do Registro de trabalho: {0}", ex.GetAllMessages()));
                return(0);
            }
        }
        static int PutTogglTags(User user, InfoWorklog infoWorklog)
        {
            try
            {
                using (var client = new HttpClient())
                {
                    Log.Debug($"Buscando as tags que serão consideradas como pendente no arquivo TagsPendente.xml");
                    var tagsPendentes = GetTagsPendente();

                    //Toggl
                    var URIToggl        = String.Format("{0}/api/v8/time_entries/{1}", UrlBaseToggl, infoWorklog.time_entry_id);
                    var t               = infoWorklog.tags.Where(i => !tagsPendentes.Tag.Contains(i.ToString().ToUpper())).ToArray();
                    var xTags           = String.Join(",", t);
                    var paramToggl      = new { time_entry = new { tags = t } };
                    var tokenAuxToggl   = String.Format("{0}:api_token", user.XTokenToggl);
                    var tokenBytesToggl = System.Text.Encoding.UTF8.GetBytes(tokenAuxToggl);
                    var tokenToggl      = Convert.ToBase64String(tokenBytesToggl);
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", tokenToggl);
                    HttpResponseMessage responseToggl = client.PutAsJsonAsync(URIToggl, paramToggl).Result;

                    if (responseToggl.IsSuccessStatusCode)
                    {
                        Log.Debug($"Tags excluidas com sucesso");
                        return(1);
                    }
                    else
                    {
                        var    message = responseToggl.Content.ReadAsStringAsync().Result;
                        int    pFrom   = message.IndexOf("<h1>") + "<h1>".Length;
                        int    pTo     = message.LastIndexOf("</h1>");
                        String result  = message.Substring(pFrom, pTo - pFrom);
                        Log.Error($"Toggl - Ocorreu algum erro ao atualizar o Registro de trabalho retirando as tags Pendentes.");
                        Log.Error($"Toggl - Ocorreu algum erro ao atualizar o Registro de trabalho retirando as tags Pendentes. StatusCode: {(int)responseToggl.StatusCode}. Message: {result}");
                        return(0);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error($"Toggl - Ocorreu algum erro ao atualizar o Registro de trabalho retirando as tags Pendentes.");
                lError.Add(String.Format("Toggl - Ocorreu algum erro ao atualizar o Registro de trabalho retirando as tags Pendentes: {0}", ex.GetAllMessages()));
                //LogArqErros.Error(String.Format("Toggl - Ocorreu algum erro ao atualizar o Registro de trabalho retirando as tags Pendentes: {0}", ex.GetAllMessages()));
                return(0);
            }
        }
 static int DeleteWorklog(User user, WorklogPost worklogPost, InfoWorklog infoWorklog)
 {
     try
     {
         using (var client = new HttpClient())
         {
             var URI   = String.Format("{0}/rest/api/2/issue/{1}/worklog/{2}", UrlBaseJira, infoWorklog.key, worklogPost.id);
             var token = user.xTokenJira;
             client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
             var response = client.DeleteAsync(URI).Result;
             if (response.IsSuccessStatusCode)
             {
                 Log.Debug($"O horário foi deletado com sucesso");
                 return(1);
             }
             else
             {
                 var    message = response.Content.ReadAsStringAsync().Result;
                 int    pFrom   = message.IndexOf("<h1>") + "<h1>".Length;
                 int    pTo     = message.LastIndexOf("</h1>");
                 String result  = message.Substring(pFrom, pTo - pFrom);
                 Log.Error($"Jira - Ocorreu algum erro ao deletar o Registro de trabalho.");
                 lError.Add($"Jira - Ocorreu algum erro ao deletar o Registro de trabalho: {(int)response.StatusCode}. Message: {result}");
                 //LogArqErros.Error($"Jira - Ocorreu algum erro ao deletar o Registro de trabalho: {(int)response.StatusCode}. Message: {result}");
                 return(0);
             }
         }
     }
     catch (Exception ex)
     {
         Log.Error(String.Format("Jira - Ocorreu algum erro ao deletar o Registro de trabalho."));
         lError.Add(String.Format("Jira - Ocorreu algum erro ao deletar o Registro de trabalho: {0}", ex.GetAllMessages()));
         //LogArqErros.Error(String.Format("Jira - Ocorreu algum erro ao deletar o Registro de trabalho: {0}", ex.GetAllMessages()));
         return(0);
     }
 }
        static List <InfoWorklog> GetToggl(User user)
        {
            try
            {
                List <InfoWorklog> lToggl = new List <InfoWorklog>();
                using (var client = new HttpClient())
                {
                    //Toggl
                    var URI        = String.Format("{0}/api/v8/me", UrlBaseToggl);
                    var tokenAux   = String.Format("{0}:api_token", user.XTokenToggl);
                    var tokenBytes = System.Text.Encoding.UTF8.GetBytes(tokenAux);
                    var token      = Convert.ToBase64String(tokenBytes);
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
                    var result       = client.GetAsync(URI).Result;
                    var retUserToggl = result.Content.ReadAsAsync <UserToggl>().Result;
                    var email        = retUserToggl.data.email;
                    var default_wid  = retUserToggl.data.default_wid;
                    Thread.Sleep(1000);

                    var tagsPendentes = GetTagsPendente();

                    URI    = String.Format("{0}/api/v8/workspaces/{1}/tags", UrlBaseToggl, default_wid);
                    result = client.GetAsync(URI).Result;
                    List <WorkspaceTags> retWorkspaceTags = result.Content.ReadAsAsync <List <WorkspaceTags> >().Result;
                    string xidTagsPendente = string.Empty;
                    if (retWorkspaceTags.Count > 0)
                    {
                        var idTagsPendente = retWorkspaceTags.Where(i => tagsPendentes.Tag.Contains(i.name.ToUpper()))
                                             .Select(i => i.id).ToArray();
                        xidTagsPendente = String.Join(",", idTagsPendente);
                    }
                    Thread.Sleep(1000);

                    var since = DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd");
                    var until = DateTime.Now.ToString("yyyy-MM-dd");
                    if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["since"]) && !string.IsNullOrEmpty(ConfigurationManager.AppSettings["until"]))
                    {
                        since = ConfigurationManager.AppSettings["since"];
                        until = ConfigurationManager.AppSettings["until"];
                    }

                    var          contPage = 1;
                    List <Datum> ldata    = new List <Datum>();
                    URI = String.Format("{0}/reports/api/v2/details?user_agent={1}&workspace_id={2}&tag_ids={3}&since={4}&until={5}&page={6}",
                                        UrlBaseToggl, email, default_wid, xidTagsPendente, since, until, contPage);
                    result = client.GetAsync(URI).Result;
                    var retDetailedReport = result.Content.ReadAsAsync <DetailedReport>().Result;
                    ldata.AddRange(retDetailedReport.data.OrderBy(i => i.start).ToList());
                    while (ldata.Count < retDetailedReport.total_count)
                    {
                        contPage++;
                        URI = String.Format("{0}/reports/api/v2/details?user_agent={1}&workspace_id={2}&tag_ids={3}&since={4}&until={5}&page={6}",
                                            UrlBaseToggl, email, default_wid, xidTagsPendente, since, until, contPage);
                        result            = client.GetAsync(URI).Result;
                        retDetailedReport = result.Content.ReadAsAsync <DetailedReport>().Result;
                        ldata.AddRange(retDetailedReport.data.OrderBy(i => i.start).ToList());
                        Thread.Sleep(1000);
                    }
                    Thread.Sleep(1000);
                    foreach (var data in ldata)
                    {
                        InfoWorklog infoWorklog = new InfoWorklog();
                        Match       numJira     = Regex.Match(data.description, @"(\w+)\-\d{1,4}");
                        if (numJira.Success)
                        {
                            infoWorklog.key     = numJira.Value;
                            infoWorklog.comment = data.description.Replace(numJira.Value, "");
                            if (infoWorklog.comment.Substring(0, 2).Contains("- "))
                            {
                                infoWorklog.comment = infoWorklog.comment.Substring(2);
                            }
                            else if (infoWorklog.comment.Substring(0, 1).Contains("-"))
                            {
                                infoWorklog.comment = infoWorklog.comment.Substring(1);
                            }
                            else if (infoWorklog.comment.Substring(0, 3).Contains(" - "))
                            {
                                infoWorklog.comment = infoWorklog.comment.Substring(3);
                            }
                        }
                        infoWorklog.dtStarted = data.start;
                        var startedAux = (Newtonsoft.Json.JsonConvert.SerializeObject(data.start)).Replace("\"", "");
                        infoWorklog.started       = startedAux.Replace(startedAux.Substring(19), ".000-0300");
                        infoWorklog.timeSpent     = MilisecondsToJiraFormat(mili: data.dur);
                        infoWorklog.time_entry_id = data.id;
                        infoWorklog.tags          = data.tags;

                        lToggl.Add(infoWorklog);
                    }

                    Thread.Sleep(1000);
                }
                return(lToggl);
            }
            catch (Exception ex)
            {
                Log.Error($"Toggl - Algum erro aconteceu ao buscar os Registros de trabalho pendentes.");
                lError.Add(String.Format("Toggl - Algum erro aconteceu ao buscar os Registros de trabalho pendentes: {0}", ex.GetAllMessages()));
                //LogArqErros.Error(String.Format("Toggl - Algum erro aconteceu ao buscar os Registros de trabalho pendentes: {0}", ex.GetAllMessages()));
                return(new List <InfoWorklog>());
            }
        }