public void CancelarTransacaoPagamento(int chargerId)
        {
            try
            {
                if (chargerId > 0)
                {
                    var gerenciaNet = new GerencianetAPI();

                    gerenciaNet.CancelTransaction(chargerId);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao cancelar transação", ex);
            }
        }
        public HttpResponseMessage GerarBoletoFornecedor(HttpRequestMessage request, FaturaViewModel faturaVm)
        {
            return(CreateHttpResponse(request, () =>
            {
                HttpResponseMessage response = null;

                if (!ModelState.IsValid)
                {
                    response = request.CreateResponse(HttpStatusCode.BadRequest,
                                                      ModelState.Keys.SelectMany(k => ModelState[k].Errors)
                                                      .Select(m => m.ErrorMessage).ToArray());
                }
                else
                {
                    var usuario = _usuarioRep.GetSingle(int.Parse(HttpContext.Current.User.Identity.GetUserId()));

                    var fatura = _faturaRep.GetSingle(faturaVm.Id);
                    var param = new List <string> {
                        "MULTA_MORA", "MULTA_ATRASO"
                    };

                    //Pega parâmetros de multa
                    var parametrosAtrasoPagtoFatura = _parametroSistemaRep.GetAll().Where(x => param.Contains(x.Codigo)).ToList();
                    var multaDiaria = (decimal)parametrosAtrasoPagtoFatura.FirstOrDefault(c => c.Codigo == "MULTA_MORA")?.Valor.TryParseInt() / 30;
                    var multaAtraso = parametrosAtrasoPagtoFatura.FirstOrDefault(c => c.Codigo == "MULTA_ATRASO")?.Valor.TryParseInt();

                    var pessoa = fatura.Fornecedor.Pessoa;
                    var telefone = pessoa.Telefones.FirstOrDefault(x => x.Ativo);
                    var endereco = pessoa.Enderecos.FirstOrDefault();
                    //endereco.Bairro = new Bairro();
                    //endereco.Estado = new Estado();

                    var diasAtraso = DateTime.Now.Subtract(fatura.DtVencimento).Days;
                    var valorAtrasoDias = fatura.Comissoes.Sum(x => x.Valor) * (diasAtraso * multaDiaria);
                    var valorMultaAtraso = fatura.Comissoes.Sum(x => x.Valor) * multaAtraso / 100;
                    var valorMulta = valorMultaAtraso + valorAtrasoDias;

                    var gerenciaNet = new GerencianetAPI();

                    #region Criando Transação


                    List <Item> itens = new List <Item>();

                    fatura.Comissoes.ForEach(c => itens.Add(new Item
                    {
                        Name = $"Pedido: {c.PedidoId}",
                        Value = (int)Convert.ToDecimal(string.Format("{0:N}", c.Valor).Replace(",", "").Replace(".", ""))
                    }));

                    itens.Add(new Item
                    {
                        Name = "Multa e Juros",
                        Value = (int)Convert.ToDecimal(string.Format("{0:N}", valorMulta).Replace(",", "").Replace(".", ""))
                    });


                    var metadata = new Metadata
                    {
                        CustomId = fatura.Id.ToString(),
                        NotificationURL = $"{ConfigurationManager.AppSettings[$"{Environment.GetEnvironmentVariable("Amb_EconomizaJa")}_UrlRetorno"]}api/pagamentos/retornoFatura"
                    };

                    var transacao = new TransactionRequest
                    {
                        Items = itens.ToArray(),
                        Metadata = metadata
                    };

                    var retornoTransacao = gerenciaNet.CreateTransaction(transacao);

                    #endregion

                    #region Associando Forma de Pagamento Boleto para Transação

                    Payment payment = new Payment();

                    payment.BankingBillet = new BankingBillet
                    {
                        ExpireAt = DateTime.Now.AddDays(1).ToShortDateString(), //Vencimento para o dia seguinte
                        Customer = new Customer
                        {
                            Name = pessoa.Usuarios.FirstOrDefault()?.UsuarioNome,
                            Birth = (pessoa.PessoaJuridica.DtFundacao ?? DateTime.Now).ToString("yyyy-MM-dd"),
                            Email = pessoa.PessoaJuridica.Email,
                            PhoneNumber = $"{telefone?.DddTelComl}{telefone?.TelefoneComl}",
                            Address = new Address
                            {
                                ZipCode = endereco.Cep,
                                City = endereco.Cidade.DescCidade,
                                Number = endereco.Numero.ToString(),
                                Neighborhood = endereco.Bairro.DescBairro,
                                Complement = endereco.Complemento,
                                State = endereco.Estado.Uf,
                                Street = endereco.DescEndereco
                            },
                            JuridicalPerson = new JuridicalPerson
                            {
                                CNPJ = pessoa.PessoaJuridica.Cnpj,
                                CorporateName = pessoa.PessoaJuridica.RazaoSocial
                            }
                        },

                        //Adicionando juros por dia caso venha pagar depois do vencimento
                        Configurations = new ConfigGerenciaNet
                        {
                            Interest = 33
                        },

                        Message = "Após vencimento será cobrado multa de 2% sobre o valor boleto e 0,033% ao dia."
                    };

                    var retornoBoleto = gerenciaNet.CreateBankingBillet(retornoTransacao.ChargerId, payment);

                    #endregion

                    #region Cancelando Boleto Vencido

                    var retornoCancelBoleto = new object();
                    if (fatura.ChargerId > 0)
                    {
                        retornoCancelBoleto = gerenciaNet.CancelTransaction(fatura.ChargerId);
                    }

                    #endregion

                    #region Atualizando Dados Fatura Banco

                    if (retornoCancelBoleto.TryParseInt() == 200)
                    {
                        fatura.DtAlteracao = DateTime.Now;
                        fatura.ChargerId = retornoBoleto.ChargeId;
                        fatura.UrlBoleto = retornoBoleto.Link;
                        fatura.Status = StatusFatura.AguardandoPagamento;
                        _faturaRep.Edit(fatura);
                        _unitOfWork.Commit();

                        #region Envia Email

                        Emails emails = new Emails
                        {
                            UsuarioCriacaoId = 1,
                            DtCriacao = DateTime.Now,
                            AssuntoEmail = "Boleto Gerado - 2º via do boleto gerada.",
                            EmailDestinatario = pessoa.PessoaJuridica.Email,

                            CorpoEmail = _templateRep.GetSingle(28).Template.Trim()
                                         .Replace("#NomeFantasia#", pessoa.PessoaJuridica.NomeFantasia)
                                         .Replace("#UrlBoleto#", fatura.UrlBoleto),

                            Status = Status.NaoEnviado,
                            Origem = Origem.BoletoGerado,
                            Ativo = true
                        };

                        _emailsRep.Add(emails);
                        _unitOfWork.Commit();

                        #endregion
                    }

                    #endregion

                    response = request.CreateResponse(HttpStatusCode.OK, new { });

                    return response;
                }

                return response;
            }));
        }