private void ButtonTransmitir_Click(object sender, EventArgs e)
        {
            try
            {
                ButtonProcurar.Enabled   = false;
                ButtonTransmitir.Enabled = false;
                TextBoxLog.Clear();

                ProgressBarSecundaria.Value = 0;
                ProgressBarPrimaria.Value   = 0;

                dispatcher.DoEvents();

                // Instancia a classe que irá assinar o arquivo
                var assinador = new AssinadorXML(dispatcher, ProgressBarSecundaria);

                var dirZipDescompactado = Guid.NewGuid().ToString();

                // Descompacta o arquivo .intech
                if (!Directory.Exists(dirZipDescompactado))
                {
                    Directory.CreateDirectory(dirZipDescompactado);
                }

                Zip.Descompacta(TextBoxArquivo.Text, dirZipDescompactado);

                var arquivos     = Directory.GetFiles(dirZipDescompactado);
                var contadorLote = 0;
                var totalLotes   = arquivos.Length;

                ProgressBarPrimaria.Maximum = arquivos.Length;

                // Processa cada xml contido no arquivo .intech
                foreach (var arquivo in arquivos)
                {
                    contadorLote++;

                    LabelProgressBarPrimaria.Text = $"Processando lote {contadorLote} de {totalLotes}...";

                    // Assina o xml do lote utilizando o certificado digital selecionado
                    LabelProgressBarSecundaria.Text = "Assinando lote...";
                    ProgressBarSecundaria.Value     = 0;
                    dispatcher.DoEvents();
                    var xml = assinador.AssinarEventosDoArquivo(Global.Certificado, arquivo);

                    if (xml == null)
                    {
                        return;
                    }

                    var tipoEvento = assinador.BuscarElementoAssinar(xml);

                    var ambiente = BuscarAmbiente(xml, tipoEvento);

                    if (ambiente == "1")
                    {
                        webServices = new WebServicesRF(true);
                    }
                    else
                    {
                        webServices = new WebServicesRF(false);
                    }

                    LabelProgressBarSecundaria.Text = "Enviando lote...";
                    ProgressBarSecundaria.Value     = 0;
                    ProgressBarSecundaria.Maximum   = 1;
                    dispatcher.DoEvents();

                    var retorno = webServices.ReceberLoteEvento(XElement.Parse(xml.InnerXml)).ToXmlNode();

                    ProgressBarSecundaria.Value = 1;
                    dispatcher.DoEvents();

                    //if (tipoEvento.Tag == "evtServTom")
                    //{
                    var sucesso = true;
                    var eventos = BuscaEventosRetorno(retorno);

                    LabelProgressBarSecundaria.Text = "Atualizando status dos registros...";
                    ProgressBarSecundaria.Value     = 0;
                    ProgressBarSecundaria.Maximum   = eventos.Count;
                    dispatcher.DoEvents();

                    if (eventos.Count == 0)
                    {
                        var resultado = BuscaResultadoEventoUnico(retorno);

                        if (resultado == "ERRO")
                        {
                            var mensagem = BuscaMensagemEventoUnico(retorno);

                            // Atualiza a ocorrência no banco utilizando a API
                            //ServiceEfdReinf.UpdateRecibo(oidArquivoUpload, numRecibo);
                            AdicionarLog("Erro: " + mensagem);
                            sucesso = false;
                            dispatcher.DoEvents();
                        }
                    }

                    for (int i = 0; i < eventos.Count; i++)
                    {
                        var resultado = BuscaResultadoEvento(eventos[i]);

                        if (resultado == "ERRO")
                        {
                            // Mostra um dialogo para salvar o retorno
                            //SalvarArquivoRetorno(eventos[i]);

                            var mensagem = BuscaMensagemEvento(eventos[i]);

                            try
                            {
                                // Atualiza a ocorrência no banco utilizando a API
                                //ServiceEfdReinf.UpdateRecibo(oidArquivoUpload, numRecibo);
                                AdicionarLog("Erro ao atualizar ocorrência: " + mensagem);
                                sucesso = false;
                                dispatcher.DoEvents();
                            }
                            catch (Exception ex)
                            {
                                AdicionarLog("Erro ao atualizar ocorrência: " + mensagem);
                            }
                        }
                        else
                        {
                            if (tipoEvento.Tipo != DMN_TIPO_REGISTRO.R1000)
                            {
                                try
                                {
                                    var idEvento = BuscaIDEvento(eventos[i]);
                                    var oid      = Convert.ToDecimal(idEvento.Substring(31));

                                    // Atualiza o status e o nº do recibo no banco utilizando a API
                                    var numRecibo = BuscaRecibo(eventos[i]);
                                    ServiceEfdReinf.UpdateRecibo(tipoEvento.Tipo, oid, numRecibo);
                                }
                                catch (Exception ex)
                                {
                                    // Mostra um dialogo para salvar o retorno
                                    //SalvarArquivoRetorno(eventos[i]);

                                    AdicionarLog("Erro ao atualizar movimento: " + ex.Message);
                                }
                            }
                        }

                        ProgressBarSecundaria.Increment(1);
                        dispatcher.DoEvents();
                    }

                    LabelProgressBarPrimaria.Text = string.Empty;

                    if (sucesso)
                    {
                        LabelProgressBarSecundaria.Text = "Arquivo enviado com sucesso!";
                    }
                    else
                    {
                        LabelProgressBarSecundaria.Text = "Arquivo enviado com erros.";
                    }
                    //}
                    //else
                    //{
                    //    var resultado = BuscaResultado(retorno);

                    //    if (resultado == "ERRO")
                    //    {
                    //        // Mostra um dialogo para salvar o retorno
                    //        //SalvarArquivoRetorno(retorno);

                    //        AdicionarLog("Erro: " + BuscaMensagem(retorno));
                    //    }
                    //    else
                    //    {
                    //        LabelProgressBarPrimaria.Text = string.Empty;
                    //        LabelProgressBarSecundaria.Text = "Arquivo enviado com sucesso!";
                    //        var numRecibo = BuscaRecibo(retorno);
                    //        MessageBox.Show("Arquivo enviado com sucesso!\nNúmero do recibo: " + numRecibo);

                    //        // Atualiza o status e o nº do recibo no banco
                    //        //ServiceEfdReinf.UpdateRecibo(oidArquivoUpload, numRecibo);
                    //    }
                    //}

                    ProgressBarPrimaria.Increment(1);
                    dispatcher.DoEvents();
                }

                Directory.Delete(dirZipDescompactado, true);
            }
            catch (Exception ex)
            {
                AdicionarLog("Erro: " + ex.Message);
                VerificarInnerException(ex);
            }
            finally
            {
                ButtonProcurar.Enabled   = true;
                ButtonTransmitir.Enabled = true;

                if (salvar)
                {
                    TextWriter writer = new StreamWriter(nomeArquivoLog);
                    writer.Write(logEventos);
                    writer.Flush();
                    writer.Close();
                }
            }
        }
Beispiel #2
0
        private void ButtonTransmitir_Click(object sender, EventArgs e)
        {
            try
            {
                ButtonProcurar.Enabled   = false;
                ButtonTransmitir.Enabled = false;
                TextBoxLog.Clear();

                ProgressBarSecundaria.Value = 0;
                ProgressBarPrimaria.Value   = 0;

                dispatcher.DoEvents();

                // Instancia a classe que irá assinar o arquivo
                var assinador = new AssinadorXML(dispatcher, ProgressBarSecundaria);

                var dirZipDescompactado = Guid.NewGuid().ToString();

                // Descompacta o arquivo .intech
                if (!Directory.Exists(dirZipDescompactado))
                {
                    Directory.CreateDirectory(dirZipDescompactado);
                }

                Zip.Descompacta(TextBoxArquivo.Text, dirZipDescompactado);

                var arquivos     = Directory.GetFiles(dirZipDescompactado);
                var contadorLote = 0;
                var totalLotes   = arquivos.Length;

                ProgressBarPrimaria.Maximum = arquivos.Length;

                // Processa cada xml contido no arquivo .intech
                foreach (var arquivo in arquivos)
                {
                    contadorLote++;

                    LabelProgressBarPrimaria.Text = $"Processando lote {contadorLote} de {totalLotes}...";

                    // Assina o xml do lote utilizando o certificado digital selecionado
                    LabelProgressBarSecundaria.Text = "Assinando lote...";
                    ProgressBarSecundaria.Value     = 0;
                    dispatcher.DoEvents();
                    var xml = assinador.AssinarEventosDoArquivo(Global.Certificado, arquivo);

                    LabelProgressBarSecundaria.Text = "Enviando lote...";
                    ProgressBarSecundaria.Value     = 0;
                    ProgressBarSecundaria.Maximum   = 1;
                    dispatcher.DoEvents();

                    var retorno = webServices.ReceberLoteEvento(XElement.Parse(xml.InnerXml)).ToXmlNode();

                    ProgressBarSecundaria.Value = 1;
                    dispatcher.DoEvents();

                    string tipoEvento = assinador.BuscarElementoAssinar(xml);

                    if (tipoEvento == "evtServTom")
                    {
                        var sucesso = true;
                        var eventos = BuscaEventosRetorno(retorno);

                        LabelProgressBarSecundaria.Text = "Atualizando status dos registros...";
                        ProgressBarSecundaria.Value     = 0;
                        ProgressBarSecundaria.Maximum   = eventos.Count;
                        dispatcher.DoEvents();

                        if (eventos.Count == 0)
                        {
                            throw new Exception("Nenhum evento encontrado.");
                        }

                        for (int i = 0; i < eventos.Count; i++)
                        {
                            // Busca o OID_OPER_FINANCEIRA na tag, onde os 3 primeiros caracteres são ignorados,
                            // E o resto da string é o OID.
                            //var idEvento = BuscaIDEvento(eventos[i]);
                            //var oidMovimento = Convert.ToDecimal(idEvento.Replace("ID9", ""));

                            var resultado = BuscaResultadoEvento(eventos[i]);

                            if (resultado == "ERRO")
                            {
                                // Mostra um dialogo para salvar o retorno
                                //SalvarArquivoRetorno(eventos[i]);

                                try
                                {
                                    var mensagem = BuscaMensagemEvento(eventos[i]);

                                    // Atualiza a ocorrência no banco utilizando o webservice da EFIWeb/WS/WSReinf.asmx
                                    //wsReinf.AtualizarOcorrenciaMovimento(oidMovimento, mensagem);
                                    sucesso = false;
                                    dispatcher.DoEvents();
                                }
                                catch (Exception ex)
                                {
                                    AdicionarLog("Erro ao atualizar ocorrência: " + BuscaMensagemEvento(eventos[i]));
                                }
                            }
                            else
                            {
                                try
                                {
                                    // Atualiza o status e o nº do recibo no banco utilizando
                                    // o webservice da EFIWeb/WS/WSReinf.asmx
                                    var numRecibo = BuscaRecibo(eventos[i]);
                                    //wsReinf.AtualizarStatusMovimento(oidMovimento, numRecibo);
                                }
                                catch (Exception ex)
                                {
                                    // Mostra um dialogo para salvar o retorno
                                    //SalvarArquivoRetorno(eventos[i]);

                                    AdicionarLog("Erro ao atualizar movimento: " + ex.Message);
                                }
                            }

                            ProgressBarSecundaria.Increment(1);
                            dispatcher.DoEvents();
                        }

                        LabelProgressBarPrimaria.Text = string.Empty;

                        if (sucesso)
                        {
                            LabelProgressBarSecundaria.Text = "Arquivo enviado com sucesso!";
                        }
                        else
                        {
                            LabelProgressBarSecundaria.Text = "Arquivo enviado com erros.";
                        }
                    }
                    else
                    {
                        var resultado = BuscaResultado(retorno);

                        if (resultado == "ERRO")
                        {
                            // Mostra um dialogo para salvar o retorno
                            //SalvarArquivoRetorno(retorno);

                            AdicionarLog("Erro: " + BuscaMensagem(retorno));
                        }
                        else
                        {
                            LabelProgressBarPrimaria.Text   = string.Empty;
                            LabelProgressBarSecundaria.Text = "Arquivo enviado com sucesso!";
                            var numRecibo = BuscaRecibo(retorno);
                            MessageBox.Show("Arquivo enviado com sucesso!\nNúmero do recibo: " + numRecibo);

                            // Atualiza o status e o nº do recibo no banco utilizando
                            // o webservice da EFIWeb/WS/WSReinf.asmx
                            //wsReinf.AtualizarStatusArquivo(TextBoxArquivo.Text, numRecibo);
                        }
                    }

                    ProgressBarPrimaria.Increment(1);
                    dispatcher.DoEvents();
                }

                Directory.Delete(dirZipDescompactado, true);
            }
            catch (Exception ex)
            {
                AdicionarLog("Erro: " + ex.Message);
                VerificarInnerException(ex);
            }
            finally
            {
                ButtonProcurar.Enabled   = true;
                ButtonTransmitir.Enabled = true;

                if (salvar)
                {
                    TextWriter writer = new StreamWriter(nomeArquivoLog);
                    writer.Write(logEventos);
                    writer.Flush();
                    writer.Close();
                }
            }
        }