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