Esempio n. 1
0
        public int startTransaction(E_PWOPER operation, List <PW_Parameter> paramList)
        {
            int ret = (int)E_PWRET.PWRET_NODATA;

            ret = Interop.PW_iNewTransac((byte)operation);


            if (ret != (int)E_PWRET.PWRET_OK)
            {
                return(ret);
            }

            foreach (PW_Parameter item in paramList)
            {
                ret = Interop.PW_iAddParam(item.parameterCode, item.parameterValue);
                Debug.Print(string.Format("CALLED iAddParam COM ÍNDICE {0}, VALOR {1} E RETORNO {2}", item.parameterName, item.parameterValue, ret.ToString()));
                if (ret != 0)
                {
                    return(ret);
                }
            }

            ret = executeTransaction();


            return(ret);
        }
Esempio n. 2
0
        private int executeTransaction()
        {
            E_PWOPER operation = (E_PWOPER)Enum.Parse(typeof(E_PWOPER), cmbOper.SelectedValue.ToString());

            PGWLib.PGWLib eft = new PGWLib.PGWLib();
            int           ret = eft.startTransaction(operation, lstParameters.Items.Cast <PW_Parameter>().ToList());

            if (ret != 0)
            {
                string sError = ((E_PWRET)ret).ToString();
                int    iError = ret;

                // verifica se deu erro de transacao anterior pendente
                if (ret == (int)E_PWRET.PWRET_FROMHOSTPENDTRN)
                {
                    // confirma a transacao que estava pendente

                    E_PWCNF transactionStatus = E_PWCNF.PWCNF_REV_AUTO_ABORT;
                    ret = eft.confirmPendTransaction(transactionStatus, getTransactionResult());
                    MessageBox.Show(string.Format("Erro ao executar a transação: {0}{1}{2}{3}{4}", iError, Environment.NewLine, sError, Environment.NewLine,
                                                  ">> TRANSACAO PENDENTE RESOLVIDA <<"));
                }
                else
                {
                    MessageBox.Show(string.Format("Erro ao executar a transação: {0}{1}{2}", iError, Environment.NewLine, sError));
                }
            }
            return(ret);
        }
        // Executa a uma operação utilizando uma lista de parâmetros pre definidos pela automação
        public int StartTransaction(E_PWOPER operation, List <PW_Parameter> paramList)
        {
            int ret;

            // Antes de iniciar uma nova transação, resolve possíveis pendência existentes
            ret = PendencyResolve();

            // Caso ocorra algum problema na resolução de pendência retorna o erro
            if (ret != (int)E_PWRET.PWRET_OK)
            {
                return(ret);
            }

            // Inicializa a transação solicitada
            ret = Interop.PW_iNewTransac((byte)operation);

            // Caso ocorra algum problema na inicialização retorna o erro
            if (ret != (int)E_PWRET.PWRET_OK)
            {
                return(ret);
            }

            // Loop adicionando todos os parâmetros já capturados pela automação
            // Parâmetros já capturados devem ser adicionados, caso a biblioteca precise de qualquer
            // parâmetro que não foi recebido para finalizar a transação, ela irá solicitá-lo no fluxo
            // implementado em "executeTransaction"
            foreach (PW_Parameter item in paramList)
            {
                // Adiciona o parâmetro
                ret = Interop.PW_iAddParam(item.parameterCode, item.parameterValue);

                // Registra na janela de debug o resultado da adição do parâmetro
                Debug.Print(string.Format("PW_iAddParam ({0},{1})={2}", item.parameterName,
                                          item.parameterValue, ret.ToString()));
            }

            // Inicia o processo de execução da transação
            ret = ExecuteTransaction();

            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);
        }