private void btnOnCall_Click(object sender, EventArgs e) { OnCallForm onCallFrom = new OnCallForm(); if (onCallFrom.ShowDialog() == DialogResult.OK) { Show(); } }
int ContinuarRequisicao() { byte[] valorBuffer = new byte[20000]; int result; int continua = 0; int taxas = 1; string captionMenu = ""; string captionCarteiraDigital = ""; bool interromper = false; do { result = ContinuaFuncaoSiTefInterativo(out int proximoComando, out long tipoCampo, out short tamanhoMinimo, out short tamanhoMaximo, valorBuffer, valorBuffer.Length, continua); continua = 0; string mensagem = Encoding.UTF8.GetString(valorBuffer).Replace("\0", "").Trim(); string respostaSitef = ""; bool voltar = false; bool digitado = true; if (result == 10000) { switch (proximoComando) { case 0: //Está devolvendo um valor para, se desejado, ser armazenado pela automação #region Trata Tipo de Campo if (tipoCampo == 0) { TefRetorno obj1 = new TefRetorno(1, 0, mensagem); TefRetornoAdicionar(obj1, mTefTransacao); } else if (tipoCampo == 100) { TefRetorno obj11 = new TefRetorno(11, 0, mensagem); TefRetornoAdicionar(obj11, mTefTransacao); string msgAut = mensagem.PadRight(4, '0'); TefRetorno obj731 = new TefRetorno(731, 0, msgAut.Substring(0, 2)); TefRetornoAdicionar(obj731, mTefTransacao); ModalidadePagamentoGrupoConst grupo = ModalidadePagamentoGrupo.RetornarModalidadePagamentoGrupo(msgAut.Substring(0, 2)); if (grupo != null) { TefRetorno obj731_1 = new TefRetorno(731, 1, grupo.Nome); TefRetornoAdicionar(obj731_1, mTefTransacao); } TefRetorno obj732 = new TefRetorno(732, 0, msgAut.Substring(2, 2)); TefRetornoAdicionar(obj732, mTefTransacao); ModalidadePagamentoSubGrupoConst subgrupo = ModalidadePagamentoSubGrupo.RetornarModalidadePagamentoSubGrupo(msgAut.Substring(2, 2)); if (subgrupo != null) { TefRetorno obj732_1 = new TefRetorno(732, 1, subgrupo.Nome); TefRetornoAdicionar(obj732_1, mTefTransacao); } } else if (tipoCampo == 105) { string msgData = mensagem.Substring(6, 2) + mensagem.Substring(4, 2) + mensagem.Substring(0, 4); TefRetorno obj22 = new TefRetorno(22, 0, msgData); TefRetornoAdicionar(obj22, mTefTransacao); string msgHora = mensagem.Substring(8); TefRetorno obj23 = new TefRetorno(23, 0, msgHora); TefRetornoAdicionar(obj23, mTefTransacao); } else if (tipoCampo == 106) { if (!string.IsNullOrWhiteSpace(mensagem)) { TefRetorno obj748_1 = new TefRetorno(748, 1, mensagem); TefRetornoAdicionar(obj748_1, mTefTransacao); BandeiraPadraoConst obj = BandeiraPadrao.RetornarBandeiraPadrao(Convert.ToInt32(mensagem)); if (obj != null) { TefRetorno obj748_2 = new TefRetorno(748, 2, obj.NomeTipoCodigo); TefRetornoAdicionar(obj748_2, mTefTransacao); } } } else if (tipoCampo == 107) { if (!string.IsNullOrWhiteSpace(mensagem)) { captionCarteiraDigital = mensagem; TefRetorno obj748 = new TefRetorno(748, 0, mensagem); TefRetornoAdicionar(obj748, mTefTransacao); } } else if (tipoCampo == 111) { OnMessageClient?.Invoke(mensagem, 100); } else if (tipoCampo == 121) { string[] viaCliente = mensagem.Split('\n', '\r'); TefRetorno obj712 = new TefRetorno(712, 0, viaCliente.Length.ToString()); TefRetornoAdicionar(obj712, mTefTransacao); for (int i = 0; i < viaCliente.Length; i++) { TefRetorno obj713 = new TefRetorno(713, i, "\"" + viaCliente[i] + "\""); TefRetornoAdicionar(obj713, mTefTransacao); } } else if (tipoCampo == 122) { string[] viaEstab = mensagem.Split('\n', '\r'); TefRetorno obj714 = new TefRetorno(714, 0, viaEstab.Length.ToString()); TefRetornoAdicionar(obj714, mTefTransacao); for (int i = 0; i < viaEstab.Length; i++) { TefRetorno obj715 = new TefRetorno(715, i, "\"" + viaEstab[i] + "\""); TefRetornoAdicionar(obj715, mTefTransacao); } } else if (tipoCampo == 123) { if (!string.IsNullOrWhiteSpace(mensagem)) { ComprovanteTipoConst obj = ComprovanteTipo.RetornarComprovanteTipo(mensagem); if (obj != null) { TefRetorno obj712_1 = new TefRetorno(712, 1, obj.CodigoNome); TefRetornoAdicionar(obj712_1, mTefTransacao); TefRetorno obj714_1 = new TefRetorno(714, 1, obj.CodigoNome); TefRetornoAdicionar(obj714_1, mTefTransacao); } } } else if (tipoCampo == 131) { TefRetorno obj10 = new TefRetorno(10, 0, mensagem); TefRetornoAdicionar(obj10, mTefTransacao); var obj = RedeAutorizadora.RetornarAutorizadora(obj10.Valor); if (obj != null) { TefRetorno obj10_1 = new TefRetorno(10, 1, obj.Nome); TefRetornoAdicionar(obj10_1, mTefTransacao); } } else if (tipoCampo == 132) { TefRetorno obj748_1 = new TefRetorno(748, 1, mensagem); TefRetornoAdicionar(obj748_1, mTefTransacao); BandeiraPadraoConst obj = BandeiraPadrao.RetornarBandeiraPadrao(Convert.ToInt32(mensagem)); if (obj != null) { TefRetorno obj748_2 = new TefRetorno(748, 2, obj.NomeTipoCodigo); TefRetornoAdicionar(obj748_2, mTefTransacao); } } else if (tipoCampo == 133) { TefRetorno obj13 = new TefRetorno(13, 0, mensagem); TefRetornoAdicionar(obj13, mTefTransacao); } else if (tipoCampo == 134) { TefRetorno obj12 = new TefRetorno(12, 0, mensagem); TefRetornoAdicionar(obj12, mTefTransacao); } else if (tipoCampo == 156) { TefRetorno obj748 = new TefRetorno(748, 0, mensagem); TefRetornoAdicionar(obj748, mTefTransacao); } else if (tipoCampo == 158) { TefRetorno obj739 = new TefRetorno(739, 0, mensagem); TefRetornoAdicionar(obj739, mTefTransacao); } else if (tipoCampo == 590) { TefRetorno obj742 = new TefRetorno(742, 0, mensagem); TefRetornoAdicionar(obj742, mTefTransacao); } else if (tipoCampo == 591) { if (!string.IsNullOrWhiteSpace(mensagem)) { decimal valorRecarga = Convert.ToDecimal(mensagem) / 100M; TefRetorno obj742_1 = new TefRetorno(742, 1, valorRecarga.ToString("N2")); TefRetornoAdicionar(obj742_1, mTefTransacao); } } else if (tipoCampo == 800) { TefRetorno obj27 = new TefRetorno(27, 0, mensagem); TefRetornoAdicionar(obj27, mTefTransacao); } else if (tipoCampo == 2021) { TefRetorno obj740 = new TefRetorno(740, 0, mensagem); TefRetornoAdicionar(obj740, mTefTransacao); } else if (tipoCampo == 2022) { string msgAut = mensagem.PadRight(4, '0'); TefRetorno obj747 = new TefRetorno(747, 0, msgAut.Substring(2, 2) + msgAut.Substring(0, 2)); TefRetornoAdicionar(obj747, mTefTransacao); } else if (tipoCampo == 2023) { TefRetorno obj741 = new TefRetorno(741, 0, mensagem); TefRetornoAdicionar(obj741, mTefTransacao); } #endregion break; case 1: //Mensagem para o visor do operador OnMessageClient?.Invoke(mensagem, 100); break; case 2: //Mensagem para o visor do cliente OnMessageClient?.Invoke(mensagem, 100); break; case 3: //Mensagem para os dois visores OnMessageClient?.Invoke(mensagem, 100); break; case 4: //Texto que deverá ser utilizado como cabeçalho na apresentação do menu (Comando 21) captionMenu = mensagem; break; case 11: //Deve remover a mensagem apresentada no visor do operador mensagem = ""; OnMessageClient?.Invoke(mensagem, 0); break; case 12: //Deve remover a mensagem apresentada no visor do cliente mensagem = ""; OnMessageClient?.Invoke(mensagem, 0); break; case 13: //Deve remover mensagem apresentada no visor do operador e do cliente mensagem = ""; OnMessageClient?.Invoke(mensagem, 0); break; case 14: //Deve limpar o texto utilizado como cabeçalho na apresentação do menu captionMenu = ""; break; case 15: //Cabeçalho a ser apresentado pela aplicação break; case 16: //Deve remover o cabeçalho captionMenu = ""; break; case 20: //Deve obter uma resposta do tipo SIM/NÃO. if (string.IsNullOrWhiteSpace(mensagem)) { mensagem = "Confirma?"; } TefFuncaoInterativa objForm20 = new TefFuncaoInterativa { DataType = DataTypeEnum.Confirmation, TipoCampo = tipoCampo, RespostaSitef = "1", Mensagem = mensagem }; OnCallForm?.Invoke(objForm20); respostaSitef = objForm20.RespostaSitef; interromper = objForm20.Interromper; break; case 21: //Deve apresentar um menu de opções e permitir que o usuário selecione uma delas. Na chamada o parâmetro Buffer contém as opções no formato 1:texto;2:texto;...i:Texto;... A rotina da aplicação deve apresentar as opções da forma que ela desejar (não sendo necessário incluir os índices 1,2, ...) e após a seleção feita pelo usuário, retornar em Buffer o índice i escolhido pelo operador (em ASCII) TefFuncaoInterativa objForm21 = new TefFuncaoInterativa { DataType = DataTypeEnum.Menu, Titulo = captionMenu, ItensMenu = mensagem.Split(';') }; OnCallForm?.Invoke(objForm21); respostaSitef = objForm21.RespostaSitef; interromper = objForm21.Interromper; break; case 22: //Deve aguardar uma tecla do operador. É utilizada quando se deseja que o operador seja avisado de alguma mensagem apresentada na tela if (string.IsNullOrWhiteSpace(mensagem)) { mensagem = "Aguarde ....."; } TefFuncaoInterativa objForm22 = new TefFuncaoInterativa { DataType = DataTypeEnum.Await, Mensagem = mensagem }; OnCallForm?.Invoke(objForm22); respostaSitef = ""; break; case 23: //Este comando indica que a rotina está perguntando para a aplicação se ele deseja interromper o processo de coleta de dados ou não. Esse código ocorre quando a CliSiTef está acessando algum periférico e permite que a automação interrompa esse acesso (por exemplo: aguardando a passagem de um cartão pela leitora ou a digitação de senha pelo cliente) break; case 29: //Deve ser fornecido um campo, sem captura, cujo tamanho está entre TamMinimo e TamMaximo. O campo deve ser devolvido em Buffer break; case 30: //Deve ser lido um campo cujo tamanho está entre TamMinimo e TamMaximo. O campo lido deve ser devolvido em Buffer TefFuncaoInterativa objForm30 = new TefFuncaoInterativa { DataType = DataTypeEnum.Numeric, TipoCampo = tipoCampo, TamanhoMinimo = tamanhoMinimo, TamanhoMaximo = tamanhoMaximo, Titulo = mensagem }; OnCallForm?.Invoke(objForm30); respostaSitef = objForm30.RespostaSitef; interromper = objForm30.Interromper; if (!interromper) { if (tipoCampo == 505) { TefRetorno obj505 = new TefRetorno(505, 0, respostaSitef); TefRetornoAdicionar(obj505, mTefTransacao); } } break; case 31: //Deve ser lido o número de um cheque. A coleta pode ser feita via leitura de CMC-7 ou pela digitação da primeira linha do cheque. No retorno deve ser devolvido em Buffer “0:” ou “1:” seguido do número coletado manualmente ou pela leitura do CMC-7, respectivamente. Quando o número for coletado manualmente o formato é o seguinte: Compensação (3), Banco (3), Agencia (4), C1 (1), ContaCorrente (10), C2 (1), Numero do Cheque (6) e C3 (1), nesta ordem. Notar que estes campos são os que estão na parte superior de um cheque e na ordem apresentada. Sugerimos que na coleta seja apresentada uma interface que permita ao operador identificar e digitar adequadamente estas informações de forma que a consulta não seja feita com dados errados, retornando como bom um cheque com problemas break; case 34: //Deve ser lido um campo monetário ou seja, aceita o delimitador de centavos e devolvido no parâmetro Buffer TefFuncaoInterativa objForm34 = new TefFuncaoInterativa { DataType = DataTypeEnum.Currency, TipoCampo = tipoCampo, TamanhoMinimo = tamanhoMinimo, TamanhoMaximo = tamanhoMaximo, Titulo = mensagem }; OnCallForm?.Invoke(objForm34); respostaSitef = objForm34.RespostaSitef; interromper = objForm34.Interromper; if (tipoCampo == 504 || tipoCampo == 130) { if (!string.IsNullOrWhiteSpace(respostaSitef) && Convert.ToDecimal(respostaSitef) > 0) { string valor = Convert.ToDecimal(respostaSitef).ToString("N2"); TefRetorno obj3 = new TefRetorno(3, taxas, valor + "|" + RemoverQuebraDeLinhas(mensagem)); TefRetornoAdicionar(obj3, mTefTransacao); taxas++; } } break; case 35: //Deve ser lido um código em barras ou o mesmo deve ser coletado manualmente. No retorno Buffer deve conter “0:” ou “1:” seguido do código em barras coletado manualmente ou pela leitora, respectivamente. Cabe ao aplicativo decidir se a coleta será manual ou através de uma leitora. Caso seja coleta manual, recomenda-se seguir o procedimento descrito na rotina ValidaCampoCodigoEmBarras de forma a tratar um código em barras da forma mais genérica possível, deixando o aplicativo de automação independente de futuras alterações que possam surgir nos formatos em barras. No retorno do Buffer também pode ser passado “2:”, indicando que a coleta foi cancelada, porém o fluxo não será interrompido, logo no caso de pagamentos múltiplos, todos os documentados coletados anteriormente serão mantidos e o fluxo retomado, permitindo a efetivação de tais pagamentos. break; case 41: //Análogo ao Comando 30 (TextInputNeeded), porém o campo deve ser coletado de forma mascarada (senha). break; case 42: //Deve apresentar um menu de opções e permitir que o usuário selecione uma delas. break; case 50: TefFuncaoInterativa objForm50 = new TefFuncaoInterativa { DataType = DataTypeEnum.QrCode, TipoCampo = tipoCampo, Titulo = captionCarteiraDigital, Mensagem = mensagem }; OnCallForm?.Invoke(objForm50); respostaSitef = objForm50.RespostaSitef; interromper = objForm50.Interromper; captionCarteiraDigital = ""; break; case 51: OnMessageClient?.Invoke(mensagem, 100); break; case 52: OnMessageClient?.Invoke(mensagem, 100); break; case 99: break; default: break; } } if (voltar) { continua = 1; } else if (!digitado || interromper) { continua = -1; } valorBuffer = Encoding.ASCII.GetBytes(respostaSitef + new string('\0', 20000 - respostaSitef.Length)); } while (result == 10000); return(result); }