예제 #1
0
        private int confirmUndoTransaction(List <PW_Parameter> transactionResult, int RetTransaction)
        {
            int ret = 0;

            foreach (PW_Parameter item in transactionResult)
            {
                if (item.parameterCode == (uint)E_PWINFO.PWINFO_CNFREQ & item.parameterValue == "1")
                {
                    if (RetTransaction == (int)E_PWRET.PWRET_FROMHOSTPENDTRN)
                    {
                        E_PWCNF transactionStatus = E_PWCNF.PWCNF_REV_AUTO_ABORT;
                        ret = eft.confirmPendTransaction(transactionStatus, transactionResult);
                    }
                    else
                    {
                        ConfirmationWindow cw = new ConfirmationWindow();
                        E_PWCNF            transactionStatus = E_PWCNF.PWCNF_REV_AUTO_ABORT;
                        cw.ShowDialog(ref transactionStatus);
                        ret = eft.confirmUndoTransaction(transactionStatus, transactionResult);
                    }
                }
            }

            return(ret);
        }
        // Executa uma transação
        private int ExecuteTransaction()
        {
            E_PWOPER            operation = (E_PWOPER)Enum.Parse(typeof(E_PWOPER), cmbOper.SelectedValue.ToString());
            List <PW_Parameter> paramList;
            int          ret;
            string       resultMessage;
            PW_Parameter param;
            E_PWCNF      transactionStatus;

            // Executa a transação
            ret = eft.StartTransaction(operation, lstParameters.Items.Cast <PW_Parameter>().ToList());

            // Obtem todos os resultados da transação
            paramList = GetTransactionResult();

            // Caso a operação tenha sido cancelada, obtém a mensagem a ser exibida nesse caso
            if (ret == (int)E_PWRET.PWRET_CANCEL)
            {
                param = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_CNCDSPMSG);
            }
            else
            {
                param = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_RESULTMSG);
            }

            // Caso não seja possível obter uma mensagem de resultado da biblioteca, atribui uma padrão
            if (param != null)
            {
                resultMessage = param.parameterValue;
            }
            else
            {
                resultMessage = "TRANSACAO FINALIZADA";
            }

            // Exibe a mensagem de resultado, substituindo a quebra de linha utilizada
            // pela biblioteca pela quebra de linha utilizada na janela
            MessageBox.Show(this, resultMessage.Replace("\r", "\n"));

            // Transação com erro
            if (ret != 0)
            {
                // A última transação não foi confirmada corretamente
                if (ret == (int)E_PWRET.PWRET_FROMHOSTPENDTRN)
                {
                    // Captura do usuário o que ele deseja fazer com a transação que ficou com problema de integridade
                    // Esse é um ponto que vai ser atingido somente se ocorrer algum erro de tratamento da automação
                    // ou um erro grave de sistema e uma nova transação não poderá ser realizada até que
                    // a última seja resolvida
                    // A captura do que deve ser feita do usuário é somente um exemplo, é possível a automação
                    // obter essa informação em seu banco de dados e saber se a transação deve ser confirmada ou desfeita

                    // Obtem os identificadores da transação pendente
                    PW_Parameter authSyst, virtMerch, reqNum, autLocRef, autExtRef;
                    authSyst  = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDAUTHSYST);
                    virtMerch = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDVIRTMERCH);
                    reqNum    = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDREQNUM);
                    autLocRef = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDAUTLOCREF);
                    autExtRef = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_PNDAUTEXTREF);

                    // Exibe uma mensagem identificando a transação que está pendente
                    MessageBox.Show(this, string.Format("Existe uma transação pendente:\n" +
                                                        "PNDAUTHSYST={0}\n" +
                                                        "NDVIRTMERCH={1}\n" +
                                                        "PNDREQNUM={2}\n" +
                                                        "PNDAUTLOCREF={3}\n" +
                                                        "PNDAUTEXTREF={4}\n" +
                                                        "Será necessário resolvê-la !!!",
                                                        authSyst == null ? "" : authSyst.parameterValue,
                                                        virtMerch == null ? "" : virtMerch.parameterValue,
                                                        reqNum == null ? "" : reqNum.parameterValue,
                                                        autLocRef == null ? "" : autLocRef.parameterValue,
                                                        autExtRef == null ? "" : autExtRef.parameterValue));

                    // Pergunta ao usuário qual status de confirmação atribuir para a transação
                    ConfirmationWindow cw = new ConfirmationWindow();
                    transactionStatus = E_PWCNF.PWCNF_REV_ABORT;
                    cw.ShowDialog(ref transactionStatus);

                    // Executa a resolução de pendencia
                    ConfirmUndoTransaction(paramList, transactionStatus, true);
                }
            }
            // Transação com sucesso
            else
            {
                // Verifica se é necessário confirmar a transação
                PW_Parameter confirmacaoNecessaria;
                confirmacaoNecessaria = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_CNFREQ);
                if (confirmacaoNecessaria != null && int.Parse(confirmacaoNecessaria.parameterValue) == 1)
                {
                    // Pergunta ao usuário qual status de confirmação atribuir para a transação
                    ConfirmationWindow cw = new ConfirmationWindow();
                    transactionStatus = E_PWCNF.PWCNF_REV_ABORT;
                    cw.ShowDialog(ref transactionStatus);

                    // Executa a resolução de pendencia
                    ConfirmUndoTransaction(paramList, transactionStatus);
                }
            }

            // *** IMPORTANTE:
            // Sempre após a finalização de uma transação, é necessário verificar o conteúdo
            // da informação PWINFO_IDLEPROCTIME e agendar uma chamada automática da função
            // PW_iIdleProc no horário apontado por ela
            // Essa implementação é necessária para que a biblioteca seja acionada de tempos
            // em tempos, de acordo com a sua necessidade, para resolver pendências com
            // o sistema, mesmo que nenhuma nova transação seja feita
            // PW_Parameter idleProc = paramList.Find(item => item.parameterCode == (ushort)E_PWINFO.PWINFO_IDLEPROCTIME);

            return(ret);
        }