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);
        }
        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);
        }
        // Resolve a pendência de uma transação
        private int ConfirmUndoTransaction(List <PW_Parameter> transactionResult, E_PWCNF transactionStatus, bool isPending = false)
        {
            int ret;

            if (isPending)
            {
                ret = eft.ConfirmUndoPendingTransaction(transactionStatus, transactionResult);
            }
            else
            {
                ret = eft.ConfirmUndoNormalTransaction(transactionStatus, transactionResult);
            }

            return(ret);
        }
        // Resolve a pendência de uma transação que, por algum motibo fora do fluxo previsto, ficou
        // pendente no sistema e impediu o ponto de captura de efetuar novas transações
        public int ConfirmUndoPendingTransaction(E_PWCNF transactionStatus, List <PW_Parameter> transactionResponse)
        {
            int ret;

            string pszReqNum    = string.Empty;
            string pszLocRef    = string.Empty;
            string pszExtRef    = string.Empty;
            string pszVirtMerch = string.Empty;
            string pszAuthSyst  = string.Empty;

            // Obtém os dados necéssários para a resolução de pendência
            foreach (PW_Parameter item in transactionResponse)
            {
                switch (item.parameterCode)
                {
                case (ushort)E_PWINFO.PWINFO_PNDREQNUM:
                    pszReqNum = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_PNDAUTLOCREF:
                    pszLocRef = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_PNDAUTEXTREF:
                    pszExtRef = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_PNDVIRTMERCH:
                    pszVirtMerch = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_PNDAUTHSYST:
                    pszAuthSyst = item.parameterValue;
                    break;

                default:
                    break;
                }
            }

            // Executa a confirmação
            ret = Interop.PW_iConfirmation((uint)transactionStatus, pszReqNum, pszLocRef, pszLocRef, pszVirtMerch, pszAuthSyst);

            // Registra na janela de debug a confirmação executada
            Debug.Print(string.Format("PW_iConfirmationPending(ReqNum={0},LocRef={1},ExtRef={2},VirtMerch={3},AuthSyst={4})={5}",
                                      pszReqNum, pszLocRef, pszExtRef, pszVirtMerch, pszAuthSyst, ret.ToString()));
            return(ret);
        }
        // Grava uma pendência para posterior resolução
        private int PendencyWrite(E_PWCNF transactionStatus)
        {
            // Sempre é necessário, antes de marcar este desfazimento, verificar se a transação necessita
            // de resolução de pendência através da obtenção do dado PWINFO_CNFREQ, caso esse valor
            // seja "0", o tratamento abaixo nã é necessário para a transação corrente.

            // Nessa função é necessário implementar na automação, de acordo com o tipo de persistência
            // de dados, a obtenção da biblioteca dos identificadores da transação através de
            // PW_iGetResult e armazená-los em disco:
            // PWINFO_REQNUM
            // PWINFO_AUTLOCREF
            // PWINFO_AUTEXTREF
            // PWINFO_VIRTMERCH
            // PWINFO_AUTHSYST
            // Bem como o status a ser utilizado para a resolução de sua pendencia "transactionStatus"

            return((int)E_PWRET.PWRET_OK);
        }
Exemple #6
0
        public int confirmUndoTransaction(E_PWCNF transactionStatus, List <PW_Parameter> transactionResponse)
        {
            int ret = 99;

            string pszReqNum    = string.Empty;
            string pszLocRef    = string.Empty;
            string pszExtRef    = string.Empty;
            string pszVirtMerch = string.Empty;
            string pszAuthSyst  = string.Empty;

            foreach (PW_Parameter item in transactionResponse)
            {
                switch (item.parameterCode)
                {
                case (ushort)E_PWINFO.PWINFO_REQNUM:
                    pszReqNum = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_AUTLOCREF:
                    pszLocRef = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_AUTEXTREF:
                    pszExtRef = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_VIRTMERCH:
                    pszVirtMerch = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_AUTHSYST:
                    pszAuthSyst = item.parameterValue;
                    break;

                default:
                    break;
                }
            }

            ret = Interop.PW_iConfirmation((uint)transactionStatus, pszReqNum, pszLocRef, pszLocRef, pszVirtMerch, pszAuthSyst);
            Debug.Print(string.Format("Confirma Transacao : ret={0},ReqNum = {1}, LocRef = {2}, ExtRef = {3}, VirtMerch = {4}, AuthSyst = {5}",
                                      ret.ToString(), pszReqNum, pszLocRef, pszExtRef, pszVirtMerch, pszAuthSyst));
            return(ret);
        }
Exemple #7
0
        public void ShowDialog(ref E_PWCNF transactionStatus)
        {
            this.ShowDialog();

            transactionStatus = (E_PWCNF)Enum.Parse(typeof(E_PWCNF), cmbtransactionStatuses.SelectedItem.ToString());
        }
        // Resolve a pendência de uma transação finalizada com sucesso
        public int ConfirmUndoNormalTransaction(E_PWCNF transactionStatus, List <PW_Parameter> transactionResponse)
        {
            int ret;

            string pszReqNum    = string.Empty;
            string pszLocRef    = string.Empty;
            string pszExtRef    = string.Empty;
            string pszVirtMerch = string.Empty;
            string pszAuthSyst  = string.Empty;

            // Obtém os dados necéssários para a resolução de pendência
            foreach (PW_Parameter item in transactionResponse)
            {
                switch (item.parameterCode)
                {
                case (ushort)E_PWINFO.PWINFO_REQNUM:
                    pszReqNum = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_AUTLOCREF:
                    pszLocRef = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_AUTEXTREF:
                    pszExtRef = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_VIRTMERCH:
                    pszVirtMerch = item.parameterValue;
                    break;

                case (ushort)E_PWINFO.PWINFO_AUTHSYST:
                    pszAuthSyst = item.parameterValue;
                    break;

                default:
                    break;
                }
            }

            // Executa a confirmação
            ret = Interop.PW_iConfirmation((uint)transactionStatus, pszReqNum, pszLocRef, pszLocRef, pszVirtMerch, pszAuthSyst);

            // Registra na janela de debug a confirmação executada
            Debug.Print(string.Format("PW_iConfirmationNormal(ReqNum={0},LocRef={1},ExtRef={2},VirtMerch={3},AuthSyst={4})={5}",
                                      pszReqNum, pszLocRef, pszExtRef, pszVirtMerch, pszAuthSyst, ret.ToString()));

            // Conforme a arquitetura utilizada pela automação, esse ponto poderá estar rodando em
            // uma thread. Portanto o tratamento abaixo é feito para que a thread não seja
            // interrompida até que a confirmação seja enviada ao servidor.
            // Para versões de biblioteca iguais ou superiores a 4.0.96.0, poderá ser utilizada a
            // função: PW_iWaitConfirmation
            int           loopRet;
            StringBuilder displayMessage = new StringBuilder(1000);

            for (; ;)
            {
                loopRet = Interop.PW_iPPEventLoop(displayMessage, (uint)1000);
                if (loopRet != (int)E_PWRET.PWRET_NOTHING)
                {
                    break;
                }
                Thread.Sleep(500);
            }

            // Caso a confirmação tenha sido executada com sucesso, remove o desfazimento pendente
            if (ret != (int)E_PWRET.PWRET_OK)
            {
                PendencyDelete();
            }
            // Caso ocorra alguma falha na confirmação
            else
            {
                // Apaga o desfazimento
                PendencyDelete();

                // Armazena o status recebido para repetição do processo antes da próxima transação
                PendencyWrite(transactionStatus);
            }

            return(ret);
        }