private void Gravar()
        {
            try
            {
                using (Banco banco = new Banco())
                {
                    banco.BeginTransaction();

                    banco.AddParameter("UserName", System.Web.HttpContext.Current.User.Identity.Name);
                    banco.ExecuteNonQuery("DELETE FROM senador_usuario WHERE UserName = @UserName");

                    foreach (GridViewRow row in GridView.Rows)
                    {
                        if (row.RowType == DataControlRowType.DataRow)
                        {
                            CheckBox chkRow = (row.Cells[0].FindControl("CheckBoxSelecionar") as CheckBox);

                            if (chkRow.Checked && chkRow.Enabled == true)
                            {
                                try
                                {
                                    banco.AddParameter("UserName", System.Web.HttpContext.Current.User.Identity.Name);
                                    banco.AddParameter("CodigoParlamentar", row.Cells[3].Text);
                                    banco.ExecuteNonQuery("INSERT INTO senador_usuario (UserName, CodigoParlamentar) VALUES (@UserName, @CodigoParlamentar)");
                                }
                                catch (Exception ex)
                                {
                                }
                            }
                        }
                    }

                    banco.CommitTransaction();
                }
            }
            catch (Exception ex)
            {
            }
        }
        public static string ConsultarReceitaWS()
        {
            var sb = new StringBuilder();
            var strInfoAdicional    = new StringBuilder();
            int RateLimit_Remaining = -1;
            int totalImportados     = 0;

            DataTable dtFornecedores;
            DataTable dtFornecedoresAtividade;
            DataTable dtFornecedoresNatJu;

            using (var banco = new Banco())
            {
                dtFornecedores = banco.GetTable(
                    @"select cnpj_cpf, f.id, fi.id_fornecedor, f.nome
                    from fornecedor f
                    left join fornecedor_info fi on f.id = fi.id_fornecedor
                    where char_length(f.cnpj_cpf) = 14
                    and f.cnpj_cpf <> '00000000000000'
                    -- and obtido_em < '2018-01-01'
                    and fi.id_fornecedor is null
                    -- and ip_colaborador not like '1805%'
                    -- and fi.id_fornecedor is null
                    -- and ip_colaborador is null -- not in ('170509', '170510', '170511', '170512')
                    -- and controle is null
                    -- and controle <> 0
					-- and (f.mensagem is null or f.mensagem <> 'Uma tarefa foi cancelada.')
					-- and controle <> 5
					and (controle is null or controle NOT IN (2, 3, 5))
                    order by f.id desc");

                if (dtFornecedores.Rows.Count == 0)
                {
                    Console.WriteLine("Não há fornecedores para consultar");
                    return("<p>Não há fornecedores para consultar</p>");
                }

                dtFornecedoresAtividade = banco.GetTable("SELECT * FROM fornecedor_atividade;");
                dtFornecedoresNatJu     = banco.GetTable("SELECT * FROM fornecedor_natureza_juridica;");
            }

            Console.WriteLine("Consultando CNPJ's Local: {0} itens.", dtFornecedores.Rows.Count);
            //var watch = System.Diagnostics.Stopwatch.StartNew();

            int i = 0;

            foreach (DataRow item in dtFornecedores.Rows)
            {
                // the code that you want to measure comes here
                //watch.Stop();
                //Console.WriteLine(watch.ElapsedMilliseconds);
                //watch.Restart();

                i++;
                if (!validarCNPJ(item["cnpj_cpf"].ToString()))
                {
                    InserirControle(3, item["cnpj_cpf"].ToString(), "CNPJ Invalido");
                    Console.WriteLine("CNPJ Invalido: " + item["cnpj_cpf"] + " - " + i);

                    strInfoAdicional.Append("<p>Empresa invalida importada:" + item["id"].ToString() + " - " + item["cnpj_cpf"].ToString() + " - " + item["nome"].ToString() + "; Motivo: CNPJ Invalido</p>");
                    continue;
                }

                Console.WriteLine("Consultando CNPJ: " + item["cnpj_cpf"] + " - " + i);
                FornecedorInfo receita = null;

                try
                {
                    using (HttpClient client = new HttpClient())
                    {
                        //--------------------------------
                        string uriString;
                        HttpResponseMessage response = null;


                        uriString          = string.Format("https://www.receitaws.com.br/v1/cnpj/{0}", item["cnpj_cpf"].ToString());
                        client.BaseAddress = new Uri(uriString);

                        if (RateLimit_Remaining > -1 && RateLimit_Remaining <= 1)
                        {
                            Console.WriteLine("Rate limit atingido!");
                            System.Threading.Thread.Sleep(60000);
                        }


                        //Setar o Timeout do client quando é API BASICA
                        client.Timeout = TimeSpan.FromMilliseconds(1000);
                        response       = client.GetAsync(string.Empty).Result;

                        //var rateLimit = response.Headers.FirstOrDefault(x => x.Key == "X-RateLimit-Limit");
                        //var retryAfter = response.Headers.FirstOrDefault(x => x.Key == "RetryAfter"); // A API do ReceitaWS infelizmente não retorna um valor de retryAfter, então temos que usar um sleep num valor padrão.
                        var rateLimit_Remaining = response.Headers.FirstOrDefault(x => x.Key == "X-RateLimit-Remaining");


                        if (rateLimit_Remaining.Value != null)
                        {
                            int temp;
                            int.TryParse(rateLimit_Remaining.Value.First(), out temp);
                            RateLimit_Remaining = temp;
                        }


                        if (response.IsSuccessStatusCode)
                        {
                            var responseContent = response.Content;

                            string responseString = responseContent.ReadAsStringAsync().Result;

                            receita = (FornecedorInfo)JsonConvert.DeserializeObject(responseString, typeof(FornecedorInfo));
                        }
                        else
                        {
                            InserirControle(1, item["cnpj_cpf"].ToString(), response.RequestMessage.ToString());
                            continue;
                        }
                    }
                }
                catch (Exception ex)
                {
                    //if (receita == null)
                    //{
                    //    receita = new ReceitaWSData();
                    //    receita.status = ReceitaWSData.STATUS_ERROR;
                    //    receita.ultima_atualizacao = DateTime.Now.ToString(DateMask_UltimaAtualizacao);

                    //    if (ex is AggregateException)
                    //    {
                    //        receita.message = "API Básica -- Gateway Time-out -- Exception: " + ex.InnerException.Message;
                    //        receita.ControleProcessamento = ReceitaWSData.ControleProcessamentoReceitaWS.Ignorar;
                    //    }
                    //    else
                    //    {
                    //        receita.message = ex.Message;
                    //    }
                    //}
                    InserirControle(1, item["cnpj_cpf"].ToString(), ex.GetBaseException().Message);
                    continue;
                }

                string strSql2;
                using (var banco = new Banco())
                {
                    //if (receita?.status == null)
                    //{
                    //    Thread.Sleep(60000); //1 MINUTO
                    //    continue;
                    //}

                    if (receita.status == "OK")
                    {
                        banco.BeginTransaction();

                        try
                        {
                            if (item["id_fornecedor"] != DBNull.Value)
                            {
                                banco.AddParameter("@id_fornecedor", item["id_fornecedor"]);

                                banco.ExecuteNonQuery(@"
                                delete from fornecedor_info where id_fornecedor=@id_fornecedor;
                                delete from fornecedor_atividade_secundaria where id_fornecedor=@id_fornecedor;
                                delete from fornecedor_socio where id_fornecedor=@id_fornecedor;
                            ");
                            }

                            var strSql =
                                @"insert into fornecedor_info(
							    id_fornecedor,
							    cnpj,
								tipo,
							    nome,
							    data_de_abertura,
							    nome_fantasia,
							    id_fornecedor_atividade_principal,
							    id_fornecedor_natureza_juridica,
							    logradouro,
							    numero,
							    complemento,
							    cep,
							    bairro,
							    municipio,
							    estado,
							    endereco_eletronico,
							    telefone,
							    ente_federativo_responsavel,
							    situacao_cadastral,
							    data_da_situacao_cadastral,
							    motivo_situacao_cadastral,
							    situacao_especial,
							    data_situacao_especial,
							    capital_social,
								obtido_em,
                                ip_colaborador
						    ) values (
							    @id_fornecedor,
							    @cnpj,
								@tipo,
							    @nome,
							    @data_de_abertura,
							    @nome_fantasia,
							    @id_fornecedor_atividade_principal,
							    @id_fornecedor_natureza_juridica,
							    @logradouro,
							    @numero,
							    @complemento,
							    @cep,
							    @bairro,
							    @municipio,
							    @estado,
							    @endereco_eletronico,
							    @telefone,
							    @ente_federativo_responsavel,
							    @situacao_cadastral,
							    @data_da_situacao_cadastral,
							    @motivo_situacao_cadastral,
							    @situacao_especial,
							    @data_situacao_especial,
							    @capital_social,
								@obtido_em,
                                @ip_colaborador
						    )"                        ;

                            banco.AddParameter("@id_fornecedor", item["id"]);
                            banco.AddParameter("@cnpj", item["cnpj_cpf"]);
                            banco.AddParameter("@tipo", receita.tipo);
                            banco.AddParameter("@nome", receita.nome);
                            banco.AddParameter("@data_de_abertura", ParseDate(receita.abertura));
                            banco.AddParameter("@nome_fantasia", receita.fantasia);

                            if (receita.atividade_principal != null && receita.atividade_principal.Count > 0)
                            {
                                var drAt = LocalizaInsereAtividade(dtFornecedoresAtividade, receita.atividade_principal[0]);
                                banco.AddParameter("@id_fornecedor_atividade_principal", drAt["id"]);
                            }
                            else
                            {
                                banco.AddParameter("@id_fornecedor_atividade_principal", DBNull.Value);
                            }

                            if (receita.atividade_principal != null)
                            {
                                var drNj =
                                    dtFornecedoresNatJu.Select("codigo='" + receita.natureza_juridica.Split(' ')[0] + "'");
                                banco.AddParameter("@id_fornecedor_natureza_juridica",
                                                   drNj.Length > 0 ? drNj[0]["id"] : DBNull.Value);
                            }
                            else
                            {
                                banco.AddParameter("@id_fornecedor_natureza_juridica", DBNull.Value);
                            }

                            banco.AddParameter("@logradouro", receita.logradouro);
                            banco.AddParameter("@numero", receita.numero);
                            banco.AddParameter("@complemento", receita.complemento);
                            banco.AddParameter("@cep", receita.cep);
                            banco.AddParameter("@bairro", receita.bairro);
                            banco.AddParameter("@municipio", receita.municipio);
                            banco.AddParameter("@estado", receita.uf);
                            banco.AddParameter("@endereco_eletronico", receita.email);
                            banco.AddParameter("@telefone", receita.telefone);
                            banco.AddParameter("@ente_federativo_responsavel", receita.efr);
                            banco.AddParameter("@situacao_cadastral", receita.situacao);
                            banco.AddParameter("@data_da_situacao_cadastral", ParseDate(receita.data_situacao));
                            banco.AddParameter("@motivo_situacao_cadastral", receita.motivo_situacao);
                            banco.AddParameter("@situacao_especial", receita.situacao_especial);
                            banco.AddParameter("@data_situacao_especial", ParseDate(receita.data_situacao_especial));
                            banco.AddParameter("@capital_social", ObterValor(receita.capital_social));
                            banco.AddParameter("@obtido_em", ParseDate(receita.ultima_atualizacao));
                            banco.AddParameter("@ip_colaborador", DateTime.Now.ToString("yyMMdd"));

                            banco.ExecuteNonQuery(strSql);


                            banco.AddParameter("@id", item["id"]);
                            banco.AddParameter("@nome", receita.nome);
                            banco.ExecuteNonQuery(@"update fornecedor set nome=@nome where id=@id");


                            strSql2 = @"insert into fornecedor_atividade_secundaria values (@id_fornecedor_info, @id_fornecedor_atividade)";
                            foreach (var atividadesSecundaria in receita.atividades_secundarias)
                            {
                                banco.ClearParameters();

                                try
                                {
                                    var drAt = LocalizaInsereAtividade(dtFornecedoresAtividade, atividadesSecundaria);
                                    banco.AddParameter("@id_fornecedor_info", item["id"]);
                                    banco.AddParameter("@id_fornecedor_atividade", drAt["id"]);

                                    banco.ExecuteNonQuery(strSql2);
                                }
                                catch (MySqlException ex)
                                {
                                    if (!ex.Message.Contains("Duplicate entry"))
                                    {
                                        throw;
                                    }
                                }
                            }

                            strSql2 =
                                @"insert into fornecedor_socio 
                                (id_fornecedor, nome, pais_origem, id_fornecedor_socio_qualificacao, nome_representante, id_fornecedor_socio_representante_qualificacao) 
                            values 
                                (@id_fornecedor, @nome, @pais_origem, @id_fornecedor_socio_qualificacao, @nome_representante, @id_fornecedor_socio_representante_qualificacao)";

                            foreach (var qsa in receita.qsa)
                            {
                                banco.ClearParameters();

                                banco.AddParameter("@id_fornecedor", item["id"]);
                                banco.AddParameter("@nome", qsa.nome);
                                banco.AddParameter("@pais_origem", qsa.pais_origem);
                                banco.AddParameter("@id_fornecedor_socio_qualificacao", qsa.qual.Split('-')[0]);

                                banco.AddParameter("@nome_representante", qsa.nome_rep_legal);
                                banco.AddParameter("@id_fornecedor_socio_representante_qualificacao",
                                                   !string.IsNullOrEmpty(qsa.qual_rep_legal) && qsa.qual_rep_legal.Contains("-") ? (object)qsa.qual_rep_legal.Split('-')[0] : DBNull.Value);

                                banco.ExecuteNonQuery(strSql2);
                            }

                            totalImportados++;

                            if (receita.situacao != "ATIVA")
                            {
                                strInfoAdicional.Append("<p>Empresa inativa importada:" + item["id"].ToString() + " - " + receita.cnpj + " - " + receita.nome + "</p>");
                            }

                            banco.CommitTransaction();

                            InserirControle(0, item["cnpj_cpf"].ToString(), "");
                            Console.WriteLine("Atualizando CNPJ: " + item["cnpj_cpf"] + " - " + i);
                        }
                        catch (Exception)
                        {
                            banco.RollBackTransaction();
                        }
                    }
                    else
                    {
                        InserirControle(2, item["cnpj_cpf"].ToString(), receita.message);

                        strInfoAdicional.Append("<p>Empresa invalida importada:" + item["id"].ToString() + " - " + receita.cnpj + " - " + item["nome"].ToString() + "; Motivo: " + receita.message + "</p>");
                    }
                }
            }

            using (var banco = new Banco())
            {
                banco.ExecuteNonQuery(@"
					update fornecedor_info set nome_fantasia=null where nome_fantasia = '' or nome_fantasia = '********';
					update fornecedor_info set logradouro=null where logradouro = '' or logradouro = '********';
					update fornecedor_info set numero=null where numero = '' or numero = '********';
					update fornecedor_info set complemento=null where complemento = '' or complemento = '********';
					update fornecedor_info set cep=null where cep = '' or cep = '********';
					update fornecedor_info set bairro=null where bairro = '' or bairro = '********';
					update fornecedor_info set municipio=null where municipio = '' or municipio = '********';
					update fornecedor_info set estado=null where estado = '' or estado = '**';
					update fornecedor_info set endereco_eletronico=null where endereco_eletronico = '' or endereco_eletronico = '********';
					update fornecedor_info set telefone=null where telefone = '' or telefone = '********';
					update fornecedor_info set ente_federativo_responsavel=null where ente_federativo_responsavel = '' or ente_federativo_responsavel = '********';
					update fornecedor_info set motivo_situacao_cadastral=null where motivo_situacao_cadastral = '' or motivo_situacao_cadastral = '********';
					update fornecedor_info set situacao_especial=null where situacao_especial = '' or situacao_especial = '********';
				"                );
            }

            return(string.Format("<p>{0} de {1} fornecedores novos importados</p>", totalImportados, dtFornecedores.Rows.Count) + strInfoAdicional.ToString());
        }
        public string Salvar(Auditoria auditoria)
        {
            int?userId;

            try
            {
                var identity = (ClaimsIdentity)User.Identity;
                userId = Convert.ToInt32(identity.FindFirst("UserId").Value);
            }
            catch (Exception)
            {
                userId = null;
            }

            using (var banco = new Banco())
            {
                int id_mcf_auditoria;
                banco.BeginTransaction();

                if (!string.IsNullOrEmpty(auditoria.codigo))
                {
                    banco.AddParameter("codigo", auditoria.codigo);
                    var id = banco.ExecuteScalar(@"select id from mcf_auditoria where codigo = @codigo");

                    if (Convert.IsDBNull(id))
                    {
                        auditoria.codigo = null;
                        return(Salvar(auditoria));
                    }
                    id_mcf_auditoria = Convert.ToInt32(id);

                    banco.AddParameter("codigo", auditoria.codigo);
                    banco.AddParameter("id_user", userId);
                    banco.AddParameter("id_estado", auditoria.estado);
                    banco.AddParameter("cidade", auditoria.cidade);
                    banco.AddParameter("link_portal", auditoria.link_portal);
                    banco.AddParameter("id", id_mcf_auditoria);

                    banco.ExecuteNonQuery(
                        @"UPDATE mcf_auditoria SET 
							codigo = @codigo, id_user = @id_user, id_estado = @id_estado, cidade = @cidade, link_portal = @link_portal 
						WHERE id = @id;"                        );

                    banco.AddParameter("id_mcf_auditoria", id_mcf_auditoria);
                    banco.ExecuteNonQuery(@"delete from mcf_auditoria_item where id_mcf_auditoria = @id_mcf_auditoria");
                }
                else
                {
                    auditoria.codigo = Guid.NewGuid().ToString();

                    banco.AddParameter("codigo", auditoria.codigo);
                    banco.AddParameter("id_user", userId);
                    banco.AddParameter("id_estado", auditoria.estado);
                    banco.AddParameter("cidade", auditoria.cidade);
                    banco.AddParameter("link_portal", auditoria.link_portal);

                    var id = banco.ExecuteScalar(
                        @"INSERT INTO mcf_auditoria (
						codigo, id_user, data_criacao, data_geracao_denuncia, id_estado, cidade, link_portal
					) VALUES (
						@codigo, @id_user, NOW(), NULL, @id_estado, @cidade, @link_portal
					);
					SELECT LAST_INSERT_ID();"                    );

                    id_mcf_auditoria = Convert.ToInt32(id);
                }

                foreach (var grupo in auditoria.grupos)
                {
                    foreach (var item in grupo.itens)
                    {
                        banco.AddParameter("id_mcf_auditoria", id_mcf_auditoria);
                        banco.AddParameter("id_mcf_id_transparencia_item", item.id);
                        banco.AddParameter("id_mcf_id_transparencia_item_situacao", item.situacao);
                        banco.AddParameter("indicio_de_prova", item.indicio_de_prova);

                        banco.ExecuteScalar(
                            @"INSERT INTO mcf_auditoria_item (
								id_mcf_auditoria, id_mcf_id_transparencia_item, id_mcf_id_transparencia_item_situacao, indicio_de_prova
							) VALUES (
								@id_mcf_auditoria, @id_mcf_id_transparencia_item, @id_mcf_id_transparencia_item_situacao, @indicio_de_prova
							);"                            );
                    }
                }

                foreach (var signatario in auditoria.signatarios)
                {
                    banco.AddParameter("nome", signatario.nome_completo);
                    banco.AddParameter("cpf", signatario.cpf);
                    banco.AddParameter("rg", signatario.rg);
                    banco.AddParameter("nacionalidade", signatario.nacionalidade);
                    banco.AddParameter("estado_civil", signatario.estado_civil);
                    banco.AddParameter("profissao", signatario.profissao);
                    banco.AddParameter("cep", signatario.cep);
                    banco.AddParameter("endereco", signatario.endereco);
                    banco.AddParameter("bairro", signatario.bairro);
                    banco.AddParameter("cidade", signatario.cidade);
                    banco.AddParameter("id_estado", signatario.estado);
                    banco.AddParameter("email", signatario.email);

                    var id_mcf_signatario = banco.ExecuteScalar(
                        @"INSERT INTO mcf_signatario (
								nome, cpf, rg, nacionalidade, estado_civil, profissao, cep, endereco, bairro, cidade, id_estado, email
							) VALUES (
								@nome, @cpf, @rg, @nacionalidade, @estado_civil, @profissao, @cep, @endereco, @bairro, @cidade, @id_estado, @email
							);
							SELECT LAST_INSERT_ID();"                            );

                    banco.AddParameter("id_mcf_auditoria", id_mcf_auditoria);
                    banco.AddParameter("id_mcf_signatario", Convert.ToInt32(id_mcf_signatario));

                    banco.ExecuteScalar(
                        @"INSERT INTO mcf_auditoria_signatario (
								id_mcf_auditoria, id_mcf_signatario
							) VALUES (
								@id_mcf_auditoria, @id_mcf_signatario
							);"                            );
                }

                banco.CommitTransaction();
            }

            return(auditoria.codigo);
        }