*********************************************************************************************** FUNCTION PLink_ElegPortador() *********************************************************************************************** Local vcCNPJ:="",vcAutentica:="", vcProjeto:=space(6),vcCartao:=space(16), Texto := "" Local vcReceita := "0", vcStatus:="",vcMensagem:="",vcMetodo:="",vcNSU_Host:=space(12) Local vcDescProjeto := "" //Aqui faço uma pesquisa local para saber se o projeto está no banco local, se não tiver busco no webservice USE PROJETO ALIAS PROJETO NEW if PROJETO->( bof() ) .and. PROJETO->( eof() ) if alert("É necessário efetuar a Busca de Projetos no site do Pharmalink!"+LF+LF+; "Deseja efetuá-la agora?",4+32 ) == 6 PLink_BuscProjetos(.t.) else PROJETO->( dbclosearea() ) return(.F.) endif endif do while .t. criajanela("Identificação do cartão") @ 01,02 say "Projeto: " get vcProjeto picture "@!" when ; msg("Informe o código do projeto no PharmaLink") @ 02,02 say " Cartão: " + vcCartao read if lastkey() == K_ESC fechajanela() alert("Cancelado pelo operador!") return(.F.) endif USE PROJETO ALIAS PROJETO NEW if empty(vcProjeto) IF !BROWSE("", "PROJETO",{"COD_PROJETO","DES_PROJETO"},; {"Codigo","Projeto"},{"@!","@!"},2,8,20) alert("Cancelado pelo operador!") fechajanela() PROJETO->( DBCLOSEAREA() ) return(.F.) ELSE vcProjeto := PROJETO->COD_PROJETO vcDescProjeto := PROJETO->DES_PROJETO ENDIF else PROJETO->( DBGOTOP() ) if !PROJETO->( DBSEEK(vcProjeto) ) alert("Projeto não localizado!") fechajanela() PROJETO->( DBCLOSEAREA() ) loop endif vcDescProjeto := PROJETO->DES_PROJETO endif PROJETO->( DBCLOSEAREA() ) @ 01,02 say "Projeto: " + vcProjeto + " - " + vcDescProjeto @ 02,02 say " Cartão:" get vcCartao picture "9999999999999999" when ; msg("Informe o número do cartão do PharmaLink") read fechajanela() if empty(vcCartao) loop endif exit enddo vcProjeto := alltrim(vcProjeto) vcCartao := alltrim(vcCartao) msg("Aguarde... Verificando a validade do cartão PharmaLink") && Abertura das funcoes para WebService do xHarbour xmlhttp := WebService(.t.) // Cria o objeto do HTTP if empty(xmlhttp) // Se falho na criação retorna alert("Falha na criação do objeto HTTP") return(.F.) endif xmlhttp:open("POST", "http://www.conectapdv.com.br/concentrador/concentrador.asmx", .F.) xmlhttp:SetRequestHeader( "Host" , "www.conectapdv.com.br" ) xmlhttp:SetRequestHeader( "Content-Type" , "text/xml; charset=utf-8" ) xmlhttp:SetRequestHeader( "SOAPAction" , "http://tempuri.org/WS_Eleg_Portador" ) xmldoc := WebService(.f.) // Cria o objeto do XML if empty(xmldoc) // Se falhou na criação retorna alert("Falha na criação do objeto XML") return(.F.) endif xmldoc:async := .T. xmldoc:validateOnParse := .T. xmldoc:resolveExternals := .T. xmldoc:preserveWhiteSpace := .T. Texto := '' Texto += '' Texto += '' Texto += '' Texto += '' Texto += '<identifica>' Texto += '<cnpj>'+CNPJ+'</cnpj>' //CNPJ do cliente Texto += '<terminal>'+strzero(val(Maquina),6)+'</terminal>' //Numero qualquer para identificar o terminal Texto += '<autentica>'+PH_Autentica+'</autentica>' //Numero da autenticação fornecida pelo Pharmalink Texto += '</identifica>' Texto += '' Texto += ''+vcProjeto+'' //Numero do Projeto Texto += ''+GeraTimestamp()+'' //Função que gera numeros aleatorios Texto += ''+vcCartao+'' //Numero do Cartão utilizado Texto += '00000000000' //CPF sempre passo fixo Texto += '""' //Canal sempre vazio Texto += '' Texto += '' Texto += '' xmldoc:LoadXML(Texto) //Tratamento de erro IF xmldoc:parseError:errorCode != 0 lcErrorMsg := "Não foi possível carregar o documento pois ele não corresponde ao seu Schema" lcErrorMsg := lcErrorMsg + " Linha: " + STR(xmldoc:parseError:line) lcErrorMsg := lcErrorMsg + " Caractere na linha: " + STR(xmldoc:parseError:linepos) lcErrorMsg := lcErrorMsg + " Causa do erro: " + xmldoc:parseError:reason; +"code: "+STR(xmldoc:parseError:errorCode) alert(lcErrorMsg,) return(.F.) ENDIF xmlhttp:send(xmldoc:xml) do while xmlhttp:readyState <> 4 msg(ALLTRIM(STR(xmlhttp:readyState))) //Mostra no rodapé o tempo millisec(50) enddo //Tratamento de retorno Linha := PegaDadosWeb('retorno' ,alltrim(xmlhttp:responseXML:xml)) vcStatus := strzero(val(PegaDadosWeb('status' ,alltrim(Linha))),2) //status vcNSU_Host := alltrim(PegaDadosWeb('nsu_host' ,alltrim(Linha))) //nsu_host vcReceita := PegaDadosWeb('exige_crm' ,alltrim(Linha)) //exige_crm vcMensagem := PegaDadosWeb('instrucoes' ,alltrim(Linha)) // instrucoes cNome := alltrim(PegaDadosWeb('nome' ,alltrim(Linha))) // Nome do usuario CdAutorizacao := vcNSU_Host vPhModalidade := upper(PegaDadosWeb('modalidade' ,alltrim(Linha))) // modalidade do projeto if vcStatus <> "00" //Verifica se deu erro no retorno alert("Retorno: "+vcStatus+" - "+vcMensagem,) return(.F.) endif // Todas as informações abaixo é pega para efetivar as transações depois if vPhModalidade == "CONVENIO" *---> Tratamento para pegar as Observações do conveniado <---* LinhaDentro := PegaDadosWeb('obs_venda',alltrim(Linha)) cCol := len(LinhaDentro) cCol1 := at("</observacao>",LinhaDentro)+19 vcObservacao := "" do while .t. vcObservacao += PegaDadosWeb('observacao' ,alltrim(LinhaDentro)) + LF // Obserações do conveniado cCol1 := at("</observacao>",LinhaDentro)+19 LinhaDentro := substr(LinhaDentro,cCol1,cCol) cCol := len(LinhaDentro) if cCol < 3 .or. LinhaDentro == '0' exit endif enddo *---> Tratamento para pegar os Dependentes do conveniado <---* vPhTitular := upper(RETIRA_ACENTO(PegaDadosWeb('titular',alltrim(Linha)))) // Titular do Convênio LinhaDentro := PegaDadosWeb('dependentes',alltrim(Linha)) // Dependentes cCol := len(LinhaDentro) cCol1 := at("</dependente>",LinhaDentro)+19 vcDependentes := {} vPhDependente := "" if LinhaDentro != '0' do while .t. aadd(vcDependentes, upper(RETIRA_ACENTO(PegaDadosWeb('dependente' ,alltrim(LinhaDentro)))) ) // Dependentes do conveniado cCol1 := at("</dependente>",LinhaDentro)+19 LinhaDentro := substr(LinhaDentro,cCol1,cCol) cCol := len(LinhaDentro) if cCol < 3 .or. LinhaDentro == '0' exit endif enddo maxi := len(vcDependentes) //Se tem dependentes, seleciona aqui if maxi > 1 msg("[ENTER] Seleciona - [Esc] Retorna.") criajanela("Dependentes do " + vPhTitular) setkey(K_LEFT ,{|| nil }) setkey(K_RIGHT,{|| nil }) op := achoice(09,02,08+maxi,77, vcDependentes,,"F_cont",1) fechajanela() setkey(K_LEFT ,nil) setkey(K_RIGHT,nil) if op == 0 op := 1 endif vPhDependente := vcDependentes[op] else vPhDependente := vPhTitular endif //Informa os dados do dependente criajanela("Conveniado: " + vPhDependente,) do while .t. vPhDDD := space(02) vPhFone := space(09) vPhRG := space(15) @ 01,02 say "Telefone..: " get vPhDDD picture "99" valid !empty(vPhDDD) when ; msg("Informe o código do DDD do telefone do conveniado",,,.t.) @ 01,18 get vPhFone picture "9999-9999" valid !empty(vPhFone) when ; msg("Informe o número do telefone do conveniado",,,.t.) @ 02,02 say "Número RG.: " get vPhRG picture "@!" valid !empty(vPhRG) when ; msg("Informe o número da identidade do conveniado",,,.t.) read if lastkey() == K_ESC loop endif exit enddo fechajanela() else vPhDDD := space(02) vPhFone := space(09) vPhRG := space(15) criajanela("Telefone") do while .t. vPhDDD := space(02) vPhFone := space(09) vPhRG := space(15) @ 01,02 say "Telefone..: " get vPhDDD picture "99" valid !empty(vPhDDD) when ; msg("Informe o código do DDD do telefone do conveniado",,,.t.) @ 01,18 get vPhFone picture "9999-9999" valid !empty(vPhFone) when ; msg("Informe o número do telefone do conveniado",,,.t.) @ 02,02 say "Número RG.: " get vPhRG picture "@!" valid !empty(vPhRG) when ; msg("Informe o número da identidade do conveniado",,,.t.) read if lastkey() == K_ESC loop endif exit enddo fechajanela() endif endif return({vcStatus,vcProjeto,vcCartao,vcNSU_Host}) ************************************************************************** FUNCTION RETIRA_ACENTO(cTexto) ************************************************************************** * Retira os acentos do texto cTexto := alltrim(strtran(strtran(strtran(strtran(strtran(strtran(cTexto,; "ã","a"),"á","a"),"à","a"),"â","a"),"é","e"),"è","e")) cTexto := alltrim(strtran(strtran(strtran(strtran(strtran(strtran(cTexto,; "ê","e"),"í","i"),"õ","o"),"ó","o"),"ô","o"),"ú","u")) cTexto := alltrim(strtran(strtran(strtran(strtran(strtran(strtran(cTexto,; "ü","u"),"ç","c"),"Ç","C"),"Ã","A"),"Õ","O"),"É","E")) return(cTexto) ******************************************************************** FUNCTION WebService(cTipo) ******************************************************************** *** *** Cria a conexão com WebService *** *** cTipo = Tipo de criação, .t.=conexão HTTP e .f.=criação do XML ******************************************************************** local _retorno := "" if cTipo == NIL cTipo := .T. endif if !InternetOK() Alert("Falha na conexão com a internet!") return(_retorno) endif && Abertura das funcoes para WebService do xHarbour if cTipo *---> Criação do cabeçalho do HTTP <---* try _retorno := CREATEOBJECT("MSXML2.XMLHTTP") catch try _retorno := CREATEOBJECT("MSXML2.XMLHTTP") catch Alert("Erro na criação do objeto MSXML2.XMLHTTP: " + Ole2TxtError()) _retorno := "" end end else *---> Criação do cabeçalho do XML <---* try _retorno := CREATEOBJECT("MSXML2.DOMDocument") catch try _retorno := CREATEOBJECT("MSXML2.DOMDocument") catch Alert("Erro na criação do objeto MSXML2.DOMDocument: " + Ole2TxtError()) _retorno := "" end end endif return(_retorno) ****************************************************************************** FUNCTION InternetOK() // Verifica se tem conexão com a internet ****************************************************************************** local aHosts, cName, cAddress := "www.google.com.br" InetInit() aHosts := InetGetHosts( cAddress ) if aHosts == NIL .or. len(aHosts) == 0 InetCleanup() return .F. endif InetCleanup() RETURN .T.