segunda-feira, 31 de agosto de 2015

segunda-feira, 24 de agosto de 2015

[Desenvolvimento de Software] - Aplicação Farmácia Popular Autorizador

Aplicação Farmácia Popular




Modulo autoriza com troca de arquivo entre PDV e Aplicação.

     Programa da farmácia popular do Brasil.
Por Alexssandro Dutra de lima.       
Trabalho na Vciga Informática.       
Graduação da UNOPA.                   

AUTORIZA.EXE


  • Com o Mercado de Trabalho competitivo.
Atualmente o mercado de software esta muito competitiva que nossos projetos têm que ser bem elaborados.

  • Temos que Capacitar o profissional na área de TI.
Capacitar nossos profissionais e fica na frente dos concorrentes com um bom nível de qualidade.
  • Relevância dos requisitos do cliente para a qualidade do produto oferecido.
Que possamos ter uma qualidade no produto a ser oferecido que satisfaça o cliente com um produto que seja realmente o esperado por ele.
  • Testes de qualidade de software.
Com qualidade no projeto com teste de caixa branca sem esquecer o principal, teste de caixa preta.

Objetivos do AUTORIZA.EXE


  • Objetivo do Projeto.

     Objetivo do projeto com foco e prazo de entrega e na definição das necessidades a um resultado que pretendemos satisfazer além da justificar o porquê do projeto.

  • Objetivo do Projetista

     Os projetistas têm que organizar o Máximo possível a interface com o cliente e tendo em vista tudo aquilo que está oculto no objetivo, isto é, a razão de ser do projeto, o benefício gerado por ele.

  • Objetivo do Cliente.

     Identificar o grau de satisfação do cliente, concluir uma boa avaliação da satisfação, saber realmente se o cliente esta satisfeito com o produto entregue maximizando sua satisfação, Descobrir o objetivo do cliente é a chave para vender com qualidade e fazer bons negócios.

  • Objetivo de Software.

     E o objetivo do software e a satisfação do cliente, Aumentar a sua capacidade de concorrência e a lucratividade da sua empresa, com isso produzir um software com alta qualidade e baixo custo em um curto prazo de tempo com garantia da qualidade, tendo como objetivo atender às necessidades de processamento de informação dos usuários de um sistema para o seu gerente.


Desenvolvimento do AUTORIZA.EXE

  • Ciclo de vida
  • Prototipação
  • Apresentação das Técnicas das Telas
  • Funcionamento da aplicação

     O que vou mostra aqui, o nascimento e acompanhamento da vida do software, com suas funcionalidades, e apresentando um pouco de como será sua aplicação e seu desenvolvimento como também todas as suas funcionalidade em tempo real.

Ciclo de vida do projeto





     O que é o ciclo de vida? 


     Para a engenharia e a informática, é o ciclo de desenvolvimento, é o período que começa com a implementação de um padrão tecnológico e finaliza com o desenvolvimento de novas ferramentas mais eficientes. Sendo assim o nascimento, e o desenvolvimento de como é a vida de um projeto ate a sua finalização.



Frases comuns do Ciclo de Vida de um Projeto.
Figura-01

Modelo de levantamentos e desenvolvimento. 
figura-02

Prototipação

     Criando um protótipo para demonstração de como ficará o projeto aplicando as telas antes do seu termino e verificando suas ações em cada modulo da aplicação, sendo um produto de trabalho na fase de testes do primeiro modelo, criando um molde de como o projeto ficará.

Figura-03

O que vamos ter aqui:
  1.        Visualização de recebimento do Log em tempo real.
  2.        Tela de Seleção para Cancelamento com opções.
  3.        Tela de Cadastro com Dados de sua empresa.
  4.        Acesso a Web  via aplicação WebService.
  5.        Localização de erros via pesquisa direto na aplicação.
  6.        Histórico de todos os CPF por vendas.

Figura-04

     Na confecção do protótipo temos que atentar ao UI - Interface do Usuário, o máximo possível dentre seus Conceitos com tão pouco os Tópicos envolvidos, verificando como explorar toda a sua evolução e seus comportamentos.


Apresentação de telas



     Vendas - Veremos aqui, o status do que esta sendo feito entre a aplicação e o sistema PDV em tempo real, que geralmente ficará em "TRAY ICON", podendo ser acessado a qualquer momento pelo usuário ou o técnico para verificar se ouve alguma modificação que não foi bem aplicada no sistema.

Verificando assim toda a movimentação do diretório ou pesquisas que foram feitas, e todo o histórico da aplicação, o usuário, e ou, o técnico validando e mostrando erros ocorridos ao longo do uso com a data e hora de sua inicialização.
Veja a seguir:

Figura-05

Veja o código de verificação de leitura de arquivo da pasta de pedido:

       private void metodoExecutarLeituraArquivo()
        {
            string Jogarnolistbox = Controler.SetPedidoGetRetorno.lendoPastaLocalPedido();
            if (Jogarnolistbox != string.Empty)
            {
                listBoxVender.Items.Add("-> Retorno Diretório de Troca: " + DateTime.Now + " <- font="">
                listBoxVender.Items.Add("-> " + Jogarnolistbox + " <- font="">
            }
            verificandopastanestemomento = true;
        }


     Com este método tudo o que estiver acontecendo na aplicação será enviado para o ListBox para posterior verificação, apesar de que a aplicação seja um servidor, e não há necessidade de ficar verificando o que esta acontecendo em tempo real, caso aparece alguma anomalia que não foi tratado nas exceções.


     Estorno - Veremos aqui, uma breve demonstração de como será o estorno de autorização, pesquisando pelo código retornado pelo WebService, sim, tendo em vista caso a sua aplicação PDV, não tenha suporte para cancelamento do ultimo cupom, enviando um pedido de cancelamento e esperando o retorno de cancelado pelo WebService.
Veja a seguir:



Figura-06

Mostrando aqui algumas das funções da tela de Estorno de autorização:

Botão de pesquisa.
Figura-07

Ao pressionar o botão, executara o seguinte método que mostrarei a seguir.

        private void buttonEstornarPesquisar_Click(object sender, EventArgs e)
        {
            labelEstornarErroAutorizacao.Text = string.Empty;
            MetodoEstornarPesquisarAutorizacao();
        }

       private void MetodoEstornarPesquisarAutorizacao()
        {
            string autorizacaoapesquisar = textBoxNumeroAutorizacao.Text;
            if (autorizacaoapesquisar != string.Empty)
            {
                try
                {
                    string ArquivoHistoricoXml = varSourcePath + "Vendas.xml";
                    bool sVerificacaovendas = File.Exists(ArquivoHistoricoXml);
                    if (sVerificacaovendas)
                    {
                        listBoxVender.Items.Add(" ->Pesquisando: " + autorizacaoapesquisar + " <- font="">

                        DataSet ds = new DataSet();
                        ds.ReadXml(ArquivoHistoricoXml);
                        DataView dv = new DataView(ds.Tables["ROW"]);
                        dv.RowFilter = "Autorizacao = \'" + autorizacaoapesquisar + "\'";
                        Cls.ClsVendas vendas = new Cls.ClsVendas();
                        foreach (DataRowView drv in dv)
                        {                            
                            iddosprodutosacancelar = (vendas.Id = Convert.ToInt32(drv["ID"]));
                            vendas.Cpf = drv["Cpf"].ToString();
                            vendas.NomeConsumidor = drv["NomeConsumidor"].ToString();
                            vendas.EmissaoReceita = drv["EmissaoReceita"].ToString();
                            vendas.Autorizacao = drv["Autorizacao"].ToString();
                            vendas.Crm = drv["Crm"].ToString();
                            vendas.Uf = drv["Uf"].ToString();
                        }
                        preencheDados(vendas);

                    }
                    else
                    {
                        listBoxVender.Items.Add(" ->Entre em contato com o suporte! Nao encontrado o Arquivo em: " + ArquivoHistoricoXml + " <- font="">
                    }

                    string ArquivoEstornarPesquisaItensXml = varSourcePath + "Itens.xml";
                    bool sVerificacao = File.Exists(ArquivoEstornarPesquisaItensXml);

                    if (sVerificacao)
                    {
                        DataSet ds = new DataSet();
                        ds.ReadXml(ArquivoEstornarPesquisaItensXml);
                        DataView dv = new DataView(ds.Tables["ROW"]);
                        dv.RowFilter = "ID = \'" + iddosprodutosacancelar + "\'";                       
                        dataGridViewEstornarDadosVenda.DataSource = dv;    
                    }
                    else
                    {
                        listBoxVender.Items.Add(" ->;Entre em contato com o suporte! Não encontrado o Arquivo em: " + ArquivoEstornarPesquisaItensXml + " <- font="">
                    }
                }
                catch (Exception error)
                {
                    listBoxVender.Items.Add(" ->Entre em contato com o suporte! " + error.Message + " <- font="">
                }
            }

        }


Veja na imagem abaixo, caso o usuário digite um valor que não corresponda ao que realmente foi descrito no Box de texto da aplicação,então, ao invés de digitar número ele receba letras no lugar de números.




Figura-08

        private void MetodoKeyPressNumeroslabelEstornarErroAutorizacao(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {               
                labelEstornarErroAutorizacao.ForeColor = System.Drawing.Color.Red;
                labelEstornarErroAutorizacao.Text = "N°. Autorização";
                e.Handled = true;
            }
            else
            {
                labelEstornarErroAutorizacao.Text = "";
            }
        }

Caso encontre a autorização selecionada na pesquisa o sistema retornará uma tela com as informações da pesquisa, como a imagem abaixo     



Figura-09


Botão de Selecionar Produtos.
Figura-10

     Ao pressionar o botão de selecionar os produtos, executara o seguinte método que mostrarei a seguir.

private void buttonEstornarSelecionarProduto_Click(object sender, EventArgs e) {     preencheDadosstornarDadosVenda();}

private void preencheDadosstornarDadosVenda(){     textBoxCancelarItensCodBarra.Text = EstornarCoCodigoBarra;     textBoxCancelarItensQuantidadeAutorizada.Text = Convert.ToString(EstornarQtAutorizada);     textBoxCancelarItensQuantidadeCancelar.Text = Convert.ToString(EstornarQtSolicitada);     buttonEstornarItens.Enabled = true;}

    Veja na imagem abaixo, caso o usuário digite um valor que não corresponda ao que realmente foi descrito no Box de texto da aplicação, então, aos invés de digitar número ele receba letras no lugar de números.



figura-11

Botão de Adicionar Produtos.
figura-12

Ao pressionar o botão de Adicionar produtos, executara o seguinte método que mostrarei a seguir.

        private void buttonEstonarAdicionarParaProdutosCancelar_Click(object sender, EventArgs e)
        {
            textBoxCancelarItensQuantidadeCancelar.Text = string.Empty;
            labelEstornarErroBarra.Text = string.Empty;
            if (textBoxCancelarItensQuantidadeCancelar.Text != string.Empty)
            {
                EstornarQtCancelar = Convert.ToInt32(textBoxCancelarItensQuantidadeCancelar.Text);
                if (EstornarQtCancelar != 0)
                {
                    if (EstornarQtCancelar <= EstornarQtAutorizada)
                    {
                        dataGridViewEstornaCancelarItens.Rows.Add(textBoxCancelarItensCodBarra.Text, textBoxCancelarItensQuantidadeCancelar.Text);
                        listBoxVender.Items.Add(" -> Cancelando itens, " + EstornarQtCancelar + " <- font="">
                    }
                    else
                    {
                        listBoxVender.Items.Add(" ->Valor não pode ser maior que a quantidade Autorizada! <- font="">
                        MessageBox.Show("Valor, não pode ser maior que a quantidade Autorizada! ", "Valor Inesperado");
                    }
                }
            }
        }

Botão de Limpar Tela.


figura-13

Ao pressionar o botão de Limpar Tela, executara o seguinte método que mostrarei a seguir.

        private void buttonLimparTela_Click(object sender, EventArgs e)
        {
            limparTextBoxes(this.Controls);
        }

       private void limparTextBoxes(Control.ControlCollection controles)

        {
            foreach (Control ctrl in controles)
            {
                if (ctrl is TextBox)
                {
                    ((TextBox)(ctrl)).Text = String.Empty;
                }
            }
        }

     Histórico - Agora como que feito as vendas, então veremos aqui, uma breve demonstração de como será o histórico das vendas autorizadas, pesquisando pelo "CPF", e ou todas as vendas autorizadas e concluídas pelo WebService, mas, seria possível cancelar a venda que realmente foi feito, podendo refazer novamente caso tenha algo errado com os produtos liberado.
Veja a seguir:


figura-14

Botão de Pesquisa que mostra na Tela todas as vendas concluídas.



figura-15


Ao pressionar o botão de Pesquisa, executara o seguinte método que mostrarei a seguir.

Mostra Histórico:

        private void buttonMostraHistorico_Click(object sender, EventArgs e)
        {
            MetodoMostraHistoricoGridView();
        }

Estornar Selecionado:

       private void buttonEstornarPesquisar_Click(object sender, EventArgs e)
        {
            labelEstornarErroAutorizacao.Text = string.Empty;
            MetodoEstornarPesquisarAutorizacao();
        }

Pesquisar pelo CPF:

       private void buttonPesquisarHistoricoCpfCliente_Click(object sender, EventArgs e)
        {
            string valorcpfpesquisa = textBoxPesquisarHistoricoCpfCliente.Text;
            MetodoMostraHistoricoGridView(valorcpfpesquisa);
        }

     Configuração - Tendo em vista nos tempos de hoje, como deve feito as configurações na aplicação, sendo assim o que veremos afora será uma breve explicação de uma demonstração de como é feito a Configuração, e todas as informações necessária para um bom funcionamento das autorizações.
Veja a seguir:


Nome do terminal: Computador local.

CNPJ: corresponde a empresa cadastrada no site do Farmácia Popular do Brasil.
Usuário Estabelecimento: Usuário logado na maquina.
Usuário: Numero que Corresponde ao Login no site do Farmácia Popular do Brasil.
Senha: senha liberada para acesso ao site do Farmácia Popular do Brasil.
CPF Vendedor: Corresponde ao usuário cadastrado como vendedor da farmácia, e que não poderá esta com o mesmo cadastrado em duas redes de farmácia ao mesmo tempo.
Senha: Previamente cadastrado no site do Farmácia Popular do Brasil.
Diretório: Local onde serão lidos os Retornos gerados pela automação, e os Pedidos gerados pelo concentrador.


figura-16

Botão de Gravar Dados.
figura-17

Ao pressionar o botão de Gravar Dados, executara o seguinte método que mostrarei a seguir.

        private void buttonCfgGravarDados_Click(object sender, EventArgs e)
        {
            MetodoGravarDadosConfiguração();
        }

Mensagem na Tela.

Caso seja digitado no TexBox que ele não reconheça será exibido mensagem de validação.

figura-18

Para ajudar na configuração de pastas de pedido e de retorno, existem no sistema dois botões criado para facilitar o auxilio da configuração da mesma, como segue na figura abaixo


figura-19


Ao pressionar o botão, executara o seguinte método que mostrarei a seguir.

       private void buttonCfgProcurarPed_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog BrowOpenFolder = new FolderBrowserDialog();
            BrowOpenFolder.SelectedPath = varSourcePath ;                
            BrowOpenFolder.ShowDialog();
            if (BrowOpenFolder.SelectedPath != null)
            {           
                textBoxCfgDiretorioPedido.Text = BrowOpenFolder.SelectedPath + "\\";
            }
        }

Para facilitar um pouco mais na configuração de pastas de pedido e de retorno, foi criado um Box de seleção, com o auxilio de configurar automaticamente as pasta de troca de arquivo, como segue na figura abaixo


figura-20

Ao pressionar o botão, executara o seguinte método que mostrarei a seguir.

        private void checkBoxCfgCriarPastaPadrao_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxCfgCriarPastaPadrao.Checked)
            {
                FolderBrowserDialog openFolder = new FolderBrowserDialog();
                openFolder.SelectedPath = varSourcePath;
                try
                {
                    if (openFolder.SelectedPath != null)
                    {
                        string diretorioPed = varSourcePath + "ped\\";
                        bool sVerificacaoPastaPedido = Directory.Exists(diretorioPed);
                        if (!sVerificacaoPastaPedido)
                        {
                            listBoxVender.Items.Add(" -> Criando Pasta ( " + diretorioPed + " ) <- font="">
                            Directory.CreateDirectory(diretorioPed);
                            textBoxCfgDiretorioPedido.Text = openFolder.SelectedPath + "ped\\";
                        }
                        if (sVerificacaoPastaPedido)
                        {
                            listBoxVender.Items.Add(" * Selecionado a Pasta ( " + diretorioPed + " ) <- font="">
                            textBoxCfgDiretorioPedido.Text = openFolder.SelectedPath + "ped\\";
                        }
                        string diretorioRet = varSourcePath + "ret\\";
                        bool sVerificacaoPastaRetorno = Directory.Exists(diretorioRet);
                        if (!sVerificacaoPastaRetorno)
                        {
                            listBoxVender.Items.Add(" -> Criando Pasta ( " + diretorioRet + " ) <- font="">
                            Directory.CreateDirectory(diretorioRet);
                            textBoxCfgDiretorioRetorno.Text = openFolder.SelectedPath + "ret\\";
                        }
                        if (sVerificacaoPastaRetorno)
                        {
                            listBoxVender.Items.Add(" * Selecionado Pasta ( " + diretorioRet + " ) <- font="">
                                textBoxCfgDiretorioRetorno.Text = openFolder.SelectedPath + "ret\\";
                        }
                    }
                }
                catch (Exception error)
                {
                    MessageBox.Show("Problema encontrado! \n" + error.Message," Verificando Arquivo",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
                     MessageBoxButtons.OK, MessageBoxIcon.Error);
            }



            if (!checkBoxCfgCriarPastaPadrao.Checked)
            {
                textBoxCfgDiretorioPedido.Text = " ";
                textBoxCfgDiretorioRetorno.Text = " ";
            }
        }

Botão de Validar Dados.

     O intuído deste botão, foi criado para fazer uma pré validação para saber se realmente esta funcionando a comunicação com o WebService, e que fazendo um envio de uma receita de produtos com os dados necessário para sua real validação, como segue a figura abaixo.


figura-21

     Ao pressionar o botão de Validar Dados, executara o seguinte método que mostrarei a seguir.

        private void buttonCfgValidarDados_Click(object sender, EventArgs e)
        {
            MetodoValidarDadosConfiguração();
        }


     Verifique como na figura 22, uma validação do que foi enviado ao WebService e recebido como retorno validação da solicitação de uma autorização, ao mesmo tempo em que o sistema retorna a descrição da mensagem informa tudo o que aconteceu durante o pedido de autorização.



figura-22

     Então, verificando como na figura 23, a descrição da mensagem de solicitação muda dia cordo com o que acontece entre a solicitação e o recebimento do WebService sempre retornando sua autorização com números seguido de letras veja que o código "02S" vem com sua descrição "Solicitação não autorizada. Nenhum medicamento autorizado" da mesma forma que é escrito no manual de retorno de erros.

figura-23


     Consultar Autorizações na Web - Uma das facilidades que foi criado nesta aplicação há não necessite abrir o Internet Explore do Windows, e assim podendo navegar por todo o seu acesso do sistema Web do Farmácia Popular do Brasil. Tendo em vista a facilidade de verificar e ou modificar todas as configurações via Web em uma breve explicação e demonstração de como é feito o acesso ao sistema de configuração, para cadastra a maquina do cliente e seus vendedores balconista com todas as suas informações necessária a vendas com suas autorizações.

Veja a seguir:


figura-24

Seleção de tipo de ambiente de navegação.

     O intuído desta seleção, foi criado para fazer um acesso rápido ao site Web do Farmácia Popular, de um modo mais eficaz, e que não há necessidade de entrar em sites de pesquisa a sua procura, como segue a figura abaixo.


figura-25


     Ao pressionar o botão Selecionar Ambiente, a aplicação executara o seguinte método que mostrarei a seguir, verifique que temos o cheque Box de produção e homologação que mostra a pagina especifica do site do governo.

        private void checkBoxWebHomologacao_CheckedChanged(object sender, EventArgs e)
        {
            string homologacao = "189.28.128.37/portalfarmacia/login.jsf";
            if (checkBoxWebHomologacao.Checked)
            {
                checkBoxWebProducao.Checked = false;
                webBrowserWebService.Navigate(homologacao);
            }
            else
            {
                webBrowserWebService.Navigate("");
            }
        }

Botão de Identificação do Terminal.

     O intuído deste botão, foi criado para executar o programa que é disponibilizado no site do Farmácia Popular, ao pressioná-lo executa o "Indentificação_terminal.exe", como segue a figura abaixo.

figura-26

     Ao pressionar o botão de Identificação do Terminal, executara o seguinte método que mostrarei a seguir.

   private void buttonIndentificacaoTerminal_Click(object sender, EventArgs e)
        {
            listBoxVender.Items.Add(" -> Executando Incentificador de Terminal no Windows <- font="" nbsp="">
            Controler.ClsIndentivicarTerminal.MetodoIncentificarTerminalWindows();
        }

Mostrando a tela abaixo com a criptografia do terminal:


figura-27

     Ao selecionar o Box do ambiente o usuário entrar com o seu código e sua senha de homologação e ou produção, veja que no site que esta aparecendo na figura abaixo, foi selecionado no menu cadastro do computador que o nome da estação será informado junto com o código criptografado gerado pela identificação do terminal.


figura-28

     Aqui vou apresentar a tela de cadastro de vendedores, que por obrigação tem que ter os dados preenchidos em uma única farmácia, e que não tem como fazer venda quando se este cadastrado em outra farmácia, o sistema cadastra, mas não deixa fazer as vendas pelo WebService com um sistema infalível de validação de CPF cadastrado.


figura-29

     Com todos os funcionários, e o computador devidamente cadastrado, assim, no canto superior da tela clique no botão sair que o cliente esta pronto e já para se comunicar com o WebService que vai esta pronto para fazer todas as vendas de produção caso for ou de teste em homologação.

figura-30

     Lista de Erros - Outra facilidade que foi criado na minha aplicação, é a necessidade de uma lista de erros retornada pelo WebService, ao pesquisar o sistema mostrara todos os códigos de erros e nomes de retorno possíveis na aplicação.
Tendo em vista a facilidade de verificar o que foi retornado pelo WebService na hora da transmissão de arquivo XML ao sistema de comunicação do Farmácia Popular do Brasil, ao retorna o erro o cliente farmacista e seus vendedores balconista terá uma ampla informação do que esta acontecendo com suas autorizações.



Veja a seguir:


figura-31

Botão de pesquisa da lista de erros.

     Este botão foi criado para executar uma pesquisa no programa e disponibilizar na tela, o que realmente esta acontecendo com sua autorização de liberação do pedido ao WebService, como segue a figura abaixo.



figura-32

     Ao pressionar o botão, a aplicação executara um método que escolhe pelo código de erro a que foi pedido, como mostrarei a baixo.

        private void buttonListaErroPesquisar_Click(object sender, EventArgs e)
        {
            string valorApesquisar = textBoxListaErroPesquisar.Text;
            if (valorApesquisar == string.Empty)
            {
                listBoxVender.Items.Add("-> Mostrar Lista de Erros! <- font="">
                MetodoListaPreencherGrid();
            }
            else
            {
                MetodoListadeErrosPreencherGrid(valorApesquisar);
                listBoxVender.Items.Add("-> Pesquizando Lista de Erros, \"" + valorApesquisar + "\" <- font="">
            }
        }



     Relatório de Vendas - Este relatório, foi criado na minha aplicação com a necessidade de retornar uma lista de vendas de certo período feito ao WebService, ao pesquisar o sistema mostraria todas as vendas efetuadas pelas datas e CPF a quem foi liberado as vendas.
Só que esta facilidade não esta mais funcionando, o que foi retornado pelo WebService que funcionalidade foi desabilitada no sistema de comunicação do Farmácia Popular e não terá acesso a informação do que esta acontecendo com suas autorizações.



Veja a seguir:


figura-33

Botão de requisitos de relatório de vendas.

     Pressionando o botão foi criado o método abaixo que pesquisa no programa e disponibilizar na tela todos os pedidos que foram liberados pelo WebService veja a figura abaixo.

        private void buttonRelatorioVendasRequisitar_Click(object sender, EventArgs e)
        {
            if (textBoxRelatorioDataInicial.Text != string.Empty && textBoxRelatorioDataFinal.Text != string.Empty)
            {
                MessageBox.Show("Requisição iniciada \n " +
                    " Com data inicial " + textBoxRelatorioDataInicial.Text +
                    "\n e com data Final " + textBoxRelatorioDataFinal.Text, "SOAP Web Service ", MessageBoxButtons.OK, MessageBoxIcon.Information
                    );
                dataGridViewRelatorioVendasRequisicao = Controler.ClsWebComunicacao.AutorizacaoWebComunicacaoRelatorio(textBoxRelatorioDataInicial.Text, textBoxRelatorioDataFinal.Text);
            }
            else
            {
                MessageBox.Show("Favor Digite a data inicial e a data final!", "SOAP Web Service ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

Retorno de pesquisa feita ao WebService com as informações de data de inicio e data final o retorno recebido foi o numero "18P" que a funcionalidade foi desabilitada.


figura-34

     Feedback - O objetivo deste menu é torna a aplicação um pouco mais maleável ao cliente e que o mesmo nos envie algo que não teve um bom sucesso entre o usuário e a aplicação com a necessidade de retornar ao desenvolvedor um Feedback de alguma melhoria ou algo que o mesmo tenha visto e que passou despercebido.


Veja a seguir:


figura-35


   Ao pressionar o botão, a aplicação executara um método que escolhe pelo código de erro a que foi pedido, como mostrarei a baixo.

private void buttonFeedbackEnviarEmail_Click(object sender, EventArgs e)
{
     recebido = (Controler.GetEmail.MetodoEnviarErroEmail(textBoxFeedBackAssunto.Text, textBoxFeedBackObservacoes.Text));
    if(recebido != string.Empty)
    {
        MessageBox.Show("Ola! " + recebido, "Retorno E-Mail");
    }
    if (recebido == string.Empty)
    {
        MessageBox.Show("Deve ter acontecido algum erro ao enviar email.","Sem Retorno");
    }
}

Qualquer duvida entrar em contato para verificação de alguns procedimentos e métodos que não foram incluídos aqui no blogger.

Alexssandro Dutra de Lima - Analista e Desenvolvedor.