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