/*
Autor.: Wanderlei Cardoso de Oliveira
Data..: 05/06/2013
Função: Autorizar as vendas pelo Farmácia Popular
Skype.: cwanderlei
E-mail: cwanderlei@yahoo.com.br
*/
#include "Fivewin.ch"
#include "fileio.ch"
#include "Hbclass.ch"
STATIC Doc, Http
CLASS TFPOPULAR
DATA SenhaFar INIT '' //Senha da Farmácia
DATA SenhaVen INIT '' //Senha do Vendedor
DATA UsuarioFar INIT '' //Usúario da Farmácia
DATA UsuarioVen INIT '' //Usúario do Vendedor
DATA Data_Receita INIT CTOD(" / / ") //Data da Receita
DATA Cnpj INIT '' //CNPJ da Farmácia
DATA nSolicitacao INIT '' //Número da Solicitação gerado pela Aplicação
DATA nAutorizacao INIT '' //Número da Autorização gerado pelo Farmácia Popular
DATA Cpf INIT '' //CPF do Paciente
DATA Nome INIT '' //Nome do Paciente retornado pelo Farmácia Popular
DATA Crm INIT '' //CRM do Prescritor da Receita
DATA UF INIT '' //Estado do CRM do Prescritor
DATA lAmbiente INIT .F. //Tipo de Ambiente .T.=Produção e .F.=Homologação
DATA lConectado INIT .T. //Flag que indica se está conectado
DATA CupomFiscal INIT '' //Número do Cupom Fiscal gerado pela Aplicação
DATA Vinculado INIT '' //Cupom Vinculado retornado pelo Farmácia Popular
DATA Status INIT '' //Status da Transação retornado pelo Farmácia Popular
DATA CodRetorno INIT '' //Código de Retorno da Transação retornado pelo Farmácia Popular
DATA Mensagem INIT '' //Mensagem retornada pelo Farmácia Popular
DATA aProdutos INIT {} //Array dos Produtos gerado pela Aplicação
DATA Dna INIT '' //DNA da Estação
METHOD New(cCnpj,Tipo_Ambiente) CONSTRUCTOR
METHOD TFPSolicitacao() //Solicitação de Pré-Autorização
METHOD TFPConfirmacao() //Confirmação da Pré-Autorização
METHOD TFPRecebimento() //Confirmação do Recebimento da Pré-Autorização
METHOD TFPEstorno() //Estorno dos Produtos Pré-Autorizados
METHOD TFPGeraDna() //Geração do DNA da Estação
METHOD TFPConecta() //Cria o WebService e o Documento do Xml
METHOD ZeraVariaveis() //Limpa as Variaveis
METHOD End() //Fecha o Objeto
ENDCLASS
METHOD New(cCnpj,Tipo_Ambiente) CLASS TFPOPULAR
::ZeraVariaveis()
::Cnpj := cCnpj
::lAmbiente := Tipo_Ambiente
if !VerificaNet()
MsgStop("Sem comunicação com a internet !","Atenção")
::lConectado := .F.
endif
RETURN( SELF )
METHOD TFPConecta() CLASS TFPOPULAR
::lConectado := .T.
*---> Abertura das funcoes para WebService do xHarbour <---*
try
doc := GetActiveObject( "MSXML2.DOMDocument" )
catch
try
doc := CreateObject( "MSXML2.DOMDocument" )
catch
MsgStop("Erro na criação do objeto MSXML2.DOMDocument : " + Ole2TxtError(),'Atenção')
::lConectado := .F.
end
end
try
http := GetActiveObject( "MSXML2.SERVERXMLHTTP.6.0" )
catch
try
http := CreateObject( "MSXML2.SERVERXMLHTTP.6.0" )
catch
MsgStop("Erro na criação do objeto MSXML2.SERVERXMLHTTP.6.0 : " + Ole2TxtError(),'Atenção')
::lConectado := .F.
end
end
if ::lConectado
if ::lAmbiente
*---> ENDERECO DE PRODUCAO <---*
http:Open( "POST", "https://200.214.130.55:9443/farmaciapopular/services/ServicoSolicitacaoWS?wsdl HTTP/1.1", .F. )
http:SetRequestHeader( "Content-Type" , 'text/xml; charset="utf-8"' )
http:SetRequestHeader( "Host" , "200.214.130.55:9443" )
http:SetRequestHeader( "User-Agent" , "Borland SOAP 1.2" )
http:SetRequestHeader( "Connection" , "Keep-Alive" )
http:SetRequestHeader( "Cache-Control" , "no-cache" )
doc:async := .T.
doc:validateOnParse := .T.
doc:resolveExternals := .T.
doc:preserveWhiteSpace := .T.
else
*---> ENDERECO DE HOMOLOGACAO <---*
http:Open( "POST", "https://200.214.130.41:9443/farmaciahomologa/services/ServicoSolicitacaoWS?wsdl HTTP/1.1", .F. )
http:SetRequestHeader( "Content-Type" , 'text/xml; charset="utf-8"' )
http:SetRequestHeader( "Host" , "200.214.130.41:9443" )
http:SetRequestHeader( "User-Agent" , "Borland SOAP 1.2" )
http:SetRequestHeader( "Connection" , "Keep-Alive" )
http:SetRequestHeader( "Cache-Control" , "no-cache" )
doc:async := .T.
doc:validateOnParse := .T.
doc:resolveExternals := .T.
doc:preserveWhiteSpace := .T.
endif
endif
RETURN( .T. )
METHOD End() CLASS TFPOPULAR
::Close()
Return( .T. )
METHOD ZeraVariaveis() CLASS TFPOPULAR
::SenhaFar := ""
::SenhaVen := ""
::UsuarioFar := ""
::UsuarioVen := ""
::Data_Receita := CTOD(" / / ")
::Cnpj := ""
::nSolicitacao := ""
::nAutorizacao := ""
::Cpf := ""
::Nome := ""
::Crm := ""
::UF := ""
::lAmbiente := .F.
::CupomFiscal := ""
::Vinculado := ""
::Status := ""
::Mensagem := ""
::aProdutos := {}
::Dna := ""
RETURN( .T. )
************************************************************************
METHOD TFPSolicitacao() CLASS TFPOPULAR
************************************************************************
LOCAL Data_Time, nItem, aItens := {}, cXml, oXmlDoc, oXmlNode, cErrorMsg,;
Response
::TFPConecta()
if !::lConectado
MsgStop('Não Conectado no Farmácia Popular!','Atenção')
Return( .F. )
endif
if empty(dtos(::data_receita))
::data_receita := date()
endif
Data_Time := transform(dtos(::data_receita),"@R 9999-99-99")+"T"+time()
//::nsolicitacao := dtos(date())+strtran(time(),":")
::Status := ""
::CodRetorno := ""
::Mensagem := ""
*---> Gerar DNA do computador <---*
if !::TFPGeraDna()
Return( .F. )
endif
if empty( ::Dna )
MsgStop("Erro na geração do DNA da estação",'Atenção')
return( .F. )
endif
For nItem:=1 To Len(::aProdutos)
if( ::aProdutos[nItem][01] == Nil, ::aProdutos[nItem][01] := "" , Nil ) //coCodigoBarra
if( ::aProdutos[nItem][02] == Nil, ::aProdutos[nItem][02] := "" , Nil ) //dsUnidApresentacao
if( ::aProdutos[nItem][03] == Nil, ::aProdutos[nItem][03] := "" , Nil ) //inAutorizacaoEstorno
if( ::aProdutos[nItem][04] == Nil, ::aProdutos[nItem][04] := "" , Nil ) //inAutorizacaoMedicamento
if( ::aProdutos[nItem][05] == Nil, ::aProdutos[nItem][05] := "0", Nil ) //qtAutorizada
if( ::aProdutos[nItem][06] == Nil, ::aProdutos[nItem][06] := "0", Nil ) //qtDevolvida
if( ::aProdutos[nItem][07] == Nil, ::aProdutos[nItem][07] := "0", Nil ) //qtEstornada
if( ::aProdutos[nItem][08] == Nil, ::aProdutos[nItem][08] := "0", Nil ) //qtPrescrita
if( ::aProdutos[nItem][09] == Nil, ::aProdutos[nItem][09] := "0", Nil ) //qtSolicitada
if( ::aProdutos[nItem][10] == Nil, ::aProdutos[nItem][10] := "" , Nil ) //statusTransacao
if( ::aProdutos[nItem][11] == Nil, ::aProdutos[nItem][11] := "0", Nil ) //vlPrecoSubsidiadoMS
if( ::aProdutos[nItem][12] == Nil, ::aProdutos[nItem][12] := "0", Nil ) //vlPrecoSubsidiadoPaciente
if( ::aProdutos[nItem][13] == Nil, ::aProdutos[nItem][13] := "0", Nil ) //vlPrecoSubsidiadoPacientePosEstorno
if( ::aProdutos[nItem][14] == Nil, ::aProdutos[nItem][14] := "0", Nil ) //vlPrecoVenda
if( ::aProdutos[nItem][15] == Nil, ::aProdutos[nItem][15] := "0", Nil ) //vlrSubsidiadoMSPosEstorno
if( ::aProdutos[nItem][16] == Nil, ::aProdutos[nItem][16] := "0", Nil ) //vlrTotalVendaPosEstorno
Next
if empty( ::aProdutos[01][01] )
MsgStop('Código de Barras inválido!','Atenção')
Return( .F. )
endif
cXml := ""
cXml += ''+CRLF
cXml += ''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
For nItem:=1 To Len(::aProdutos)
cXml += ' '+CRLF
cXml += ' '+::aProdutos[nItem][01]+''+CRLF
cXml += ' '+::aProdutos[nItem][02]+''+CRLF
cXml += ' '+::aProdutos[nItem][03]+''+CRLF
cXml += ' '+::aProdutos[nItem][04]+''+CRLF
cXml += ' '+::aProdutos[nItem][05]+''+CRLF
cXml += ' '+::aProdutos[nItem][06]+''+CRLF
cXml += ' '+::aProdutos[nItem][07]+''+CRLF
cXml += ' '+::aProdutos[nItem][08]+''+CRLF
cXml += ' '+::aProdutos[nItem][09]+''+CRLF
cXml += ' '+::aProdutos[nItem][10]+''+CRLF
cXml += ' '+::aProdutos[nItem][11]+''+CRLF
cXml += ' '+::aProdutos[nItem][12]+''+CRLF
cXml += ' '+::aProdutos[nItem][13]+''+CRLF
cXml += ' '+::aProdutos[nItem][14]+''+CRLF
cXml += ' '+::aProdutos[nItem][15]+''+CRLF
cXml += ' '+::aProdutos[nItem][16]+''+CRLF
cXml += ' '+CRLF
Next
cXml += ' '+CRLF
cXml += ' '+::nSolicitacao+''+CRLF
cXml += ' '+::Dna+''+CRLF
cXml += ' '+Data_Time+''+CRLF
cXml += ' '+::Cnpj+''+CRLF
cXml += ' '+::Cpf+''+CRLF
cXml += ' '+::Crm+''+CRLF
cXml += ' '+::UF+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+::SenhaFar+''+CRLF
cXml += ' '+::SenhaVen+''+CRLF
cXml += ' '+::UsuarioFar+''+CRLF
cXml += ' '+::UsuarioVen+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ''+CRLF
ferase("envioSolic.txt")
memowrit("envioSolic.txt", cXml)
TRY
http:SetRequestHeader( "SOAPAction" , "executarSolicitacao" )
doc:LoadXML( cXml ) // Carrega o request de string
CATCH
MsgStop('Falha na criação do XML','Solicitação')
Return( .F. )
END
if doc:parseError:errorCode # 0
cErrorMsg := "Não foi possivel carregar o documento pois ele não corresponde ao seu Schema"
cErrorMsg := cErrorMsg + " Linha: " + str(doc:parseError:line)
cErrorMsg := cErrorMsg + " Caractere na linha: " + str(doc:parseError:linepos)
cErrorMsg := cErrorMsg + " Causa do erro: " + doc:parseError:reason+"code: " + str(doc:parseError:errorCode)
MsgStop(cErrorMsg,'Atenção')
RETURN( .F. )
endif
TRY
http:SetOption( 2, 13056 )
http:send( doc:xml ) // Envia o request
CATCH
MsgStop('Falha no Site do Farmácia Popular, Tente mais tarde!','Solicitação')
Return( .F. )
END
while http:readyState <> 4
millisec(100)
enddo
response := http:responseText // Recebe a resposta
memowrit("retornoSolic.txt", response)
oXmlDoc:=TXmlDocument():new()
oXmlDoc:read( response )
oXmlNode := oXmlDoc:findFirst( "inAutorizacaoSolicitacao" )
::CodRetorno := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "descMensagemErro" )
::Mensagem := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "noPessoa" )
::Nome := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "nuAutorizacao" )
::nAutorizacao := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( 'coCodigoBarra' )
::aProdutos := {}
while oXmlNode != Nil
while oXmlNode != Nil
aadd( aItens, ConvHTML( oXmlNode:cData ) )
oXmlNode := oXmlNode:oNext
enddo
aadd( ::aProdutos, aItens )
aItens := {}
oXmlNode:= oXmlDoc:findNext()
enddo
RETURN( .T. )
************************************************************************
METHOD TFPConfirmacao() CLASS TFPOPULAR
************************************************************************
local cXml, oXmlDoc, oXmlNode, aItens := {}, cErrorMsg, Response
::TFPConecta()
if !::lConectado
MsgStop('Não Conectado no Farmácia Popular!','Atenção')
Return( .F. )
endif
::Status := ""
::CodRetorno := ""
::Mensagem := ""
cXml := ""
cXml += ''+CRLF
cXml += ''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+::nSolicitacao+''+CRLF
cXml += ' '+::nAutorizacao+''+CRLF
cXml += ' '+::CupomFiscal+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+::SenhaFar+''+CRLF
cXml += ' '+::SenhaVen+''+CRLF
cXml += ' '+::UsuarioFar+''+CRLF
cXml += ' '+::UsuarioVen+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ''+CRLF
ferase("envioConf.txt")
memowrit("envioConf.txt", cXml)
TRY
http:SetRequestHeader( "SOAPAction", "confirmarAutorizacao" )
doc:LoadXML( cXml ) // Carrega o request de string
CATCH
MsgStop('Falha na Criação do XML!','Confirmação')
Return( .F. )
END
if doc:parseError:errorCode # 0
cErrorMsg := "Não foi possivel carregar o documento pois ele não corresponde ao seu Schema"
cErrorMsg := cErrorMsg + " Linha: " + str(doc:parseError:line)
cErrorMsg := cErrorMsg + " Caractere na linha: " + str(doc:parseError:linepos)
cErrorMsg := cErrorMsg + " Causa do erro: " + doc:parseError:reason+"code: " + str(doc:parseError:errorCode)
MsgStop(cErrorMsg,'Atenção')
RETURN( .F. )
endif
TRY
http:SetOption( 2, 13056 )
http:send( doc:xml ) // Envia o request
CATCH
MsgStop('Falha no Site do Farmácia Popular, Tente mais tarde!','Confirmação')
Return( .F. )
END
while http:readyState <> 4
millisec(100)
enddo
response := http:responseText // Recebe a resposta
memowrit("retornoConf.txt", response)
oXmlDoc:=TXmlDocument():new()
oXMlDoc:read( response )
oXmlNode := oXmlDoc:findFirst( "nuAutorizacao" )
::nAutorizacao := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "descMensagemErro" )
::Mensagem := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "statusConfirmacao" )
::Status := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( 'coCodigoBarra' )
::aProdutos := {}
while oXmlNode != Nil
while oXmlNode != Nil
aadd( aItens, ConvHTML( oXmlNode:cData ) )
oXmlNode := oXmlNode:oNext
enddo
aadd( ::aProdutos, aItens )
aItens := {}
oXmlNode:= oXmlDoc:findNext()
enddo
RETURN( .T. )
************************************************************************
METHOD TFPRecebimento() CLASS TFPOPULAR
************************************************************************
LOCAL nItem, cXml, oXmlDoc, oXmlNode, cErrorMsg, Response
::TFPConecta()
if !::lConectado
MsgStop('Não Conectado no Farmácia Popular!','Recebimento')
Return( .F. )
endif
::Status := ""
::CodRetorno := ""
::Mensagem := ""
For nItem:=1 To Len(::aProdutos)
if( ::aProdutos[nItem][01] == Nil, ::aProdutos[nItem][01] := "" , Nil ) //coCodigoBarra
if( ::aProdutos[nItem][02] == Nil, ::aProdutos[nItem][02] := "" , Nil ) //dsUnidApresentacao
if( ::aProdutos[nItem][03] == Nil, ::aProdutos[nItem][03] := "" , Nil ) //inAutorizacaoEstorno
if( ::aProdutos[nItem][04] == Nil, ::aProdutos[nItem][04] := "" , Nil ) //inAutorizacaoMedicamento
if( ::aProdutos[nItem][05] == Nil, ::aProdutos[nItem][05] := "0", Nil ) //qtAutorizada
if( ::aProdutos[nItem][06] == Nil, ::aProdutos[nItem][06] := "0", Nil ) //qtDevolvida
if( ::aProdutos[nItem][07] == Nil, ::aProdutos[nItem][07] := "0", Nil ) //qtEstornada
if( ::aProdutos[nItem][08] == Nil, ::aProdutos[nItem][08] := "0", Nil ) //qtPrescrita
if( ::aProdutos[nItem][09] == Nil, ::aProdutos[nItem][09] := "0", Nil ) //qtSolicitada
if( ::aProdutos[nItem][10] == Nil, ::aProdutos[nItem][10] := "" , Nil ) //statusTransacao
if( ::aProdutos[nItem][11] == Nil, ::aProdutos[nItem][11] := "0", Nil ) //vlPrecoSubsidiadoMS
if( ::aProdutos[nItem][12] == Nil, ::aProdutos[nItem][12] := "0", Nil ) //vlPrecoSubsidiadoPaciente
if( ::aProdutos[nItem][13] == Nil, ::aProdutos[nItem][13] := "0", Nil ) //vlPrecoSubsidiadoPacientePosEstorno
if( ::aProdutos[nItem][14] == Nil, ::aProdutos[nItem][14] := "0", Nil ) //vlPrecoVenda
if( ::aProdutos[nItem][15] == Nil, ::aProdutos[nItem][15] := "0", Nil ) //vlrSubsidiadoMSPosEstorno
if( ::aProdutos[nItem][16] == Nil, ::aProdutos[nItem][16] := "0", Nil ) //vlrTotalVendaPosEstorno
LogFile( "FPopular.log", { "Recebimento, Envio: ", "Produto: "+::aProdutos[nItem][01] } )
Next
if empty( ::aProdutos[01][01] )
MsgStop('Código de Barras inválido!','Recebimento')
Return( .F. )
endif
cXml := ""
cXml += ''+CRLF
cXml += ''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
For nItem:=1 To Len(::aProdutos)
cXml += ' '+CRLF
cXml += ' '+::aProdutos[nItem][01]+''+CRLF
cXml += ' '+::aProdutos[nItem][02]+''+CRLF
cXml += ' '+::aProdutos[nItem][03]+''+CRLF
cXml += ' '+::aProdutos[nItem][04]+''+CRLF
cXml += ' '+::aProdutos[nItem][05]+''+CRLF
cXml += ' '+::aProdutos[nItem][06]+''+CRLF
cXml += ' '+::aProdutos[nItem][07]+''+CRLF
cXml += ' '+::aProdutos[nItem][08]+''+CRLF
cXml += ' '+::aProdutos[nItem][09]+''+CRLF
cXml += ' '+::aProdutos[nItem][10]+''+CRLF
cXml += ' '+::aProdutos[nItem][11]+''+CRLF
cXml += ' '+::aProdutos[nItem][12]+''+CRLF
cXml += ' '+::aProdutos[nItem][13]+''+CRLF
cXml += ' '+::aProdutos[nItem][14]+''+CRLF
cXml += ' '+::aProdutos[nItem][15]+''+CRLF
cXml += ' '+::aProdutos[nItem][16]+''+CRLF
cXml += ' '+CRLF
Next
cXml += ' '+CRLF
cXml += ' '+::nAutorizacao+''+CRLF
cXml += ' '+::CupomFiscal+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+::SenhaFar+''+CRLF
cXml += ' '+::SenhaVen+''+CRLF
cXml += ' '+::UsuarioFar+''+CRLF
cXml += ' '+::UsuarioVen+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ''+CRLF
ferase("envioReceb.txt")
memowrit("envioReceb.txt", cXml)
TRY
http:SetRequestHeader( "SOAPAction", "confirmarRecebimento" )
doc:LoadXML( cXml ) // Carrega o request de string
CATCH
MsgStop('Falha na criação do XML!','Recebimento')
Return( .F. )
END
if doc:parseError:errorCode # 0
cErrorMsg := "Não foi possivel carregar o documento pois ele não corresponde ao seu Schema"
cErrorMsg := cErrorMsg + " Linha: " + str(doc:parseError:line)
cErrorMsg := cErrorMsg + " Caractere na linha: " + str(doc:parseError:linepos)
cErrorMsg := cErrorMsg + " Causa do erro: " + doc:parseError:reason+"code: " + str(doc:parseError:errorCode)
MsgStop(cErrorMsg,'Atenção')
RETURN NIL
endif
TRY
http:SetOption( 2, 13056 )
http:send( doc:xml ) // Envia o request
CATCH
MsgStop('Falha no Site do Farmácia Popular'+CRLF+'A pré-autorização será cancelada!','Recebimento')
Return( .F. )
END
while http:readyState <> 4
millisec(100)
enddo
response := http:responseText // Recebe a resposta
memowrit("retornoReceb.txt", response)
oXmlDoc:=TXmlDocument():new()
oXMlDoc:read( response )
oXmlNode := oXmlDoc:findFirst( "codigoRetorno" )
::CodRetorno := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "mensagemRetorno" )
::Mensagem := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "statusRecebimento" )
::Status := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "cupomVinculado" )
::Vinculado := ConvHTML( oXmlNode:cData )
RETURN( .T. )
************************************************************************
METHOD TFPEstorno() CLASS TFPOPULAR
************************************************************************
LOCAL nItem, aItens := {}, cXml, oXmlDoc, oXmlNode, cErrorMsg, Response
::TFPConecta()
if !::lConectado
MsgStop('Não Conectado no Farmácia Popular!','Estorno')
Return( .F. )
endif
For nItem:=1 To Len(::aProdutos)
if( ::aProdutos[nItem][01] == Nil, ::aProdutos[nItem][01] := "" , Nil ) //coCodigoBarra
if( ::aProdutos[nItem][02] == Nil, ::aProdutos[nItem][02] := "" , Nil ) //dsUnidApresentacao
if( ::aProdutos[nItem][03] == Nil, ::aProdutos[nItem][03] := "" , Nil ) //inAutorizacaoEstorno
if( ::aProdutos[nItem][04] == Nil, ::aProdutos[nItem][04] := "" , Nil ) //inAutorizacaoMedicamento
if( ::aProdutos[nItem][05] == Nil, ::aProdutos[nItem][05] := "0", Nil ) //qtAutorizada
if( ::aProdutos[nItem][06] == Nil, ::aProdutos[nItem][06] := "0", Nil ) //qtDevolvida
if( ::aProdutos[nItem][07] == Nil, ::aProdutos[nItem][07] := "0", Nil ) //qtEstornada
if( ::aProdutos[nItem][08] == Nil, ::aProdutos[nItem][08] := "0", Nil ) //qtPrescrita
if( ::aProdutos[nItem][09] == Nil, ::aProdutos[nItem][09] := "0", Nil ) //qtSolicitada
if( ::aProdutos[nItem][10] == Nil, ::aProdutos[nItem][10] := "" , Nil ) //statusTransacao
if( ::aProdutos[nItem][11] == Nil, ::aProdutos[nItem][11] := "0", Nil ) //vlPrecoSubsidiadoMS
if( ::aProdutos[nItem][12] == Nil, ::aProdutos[nItem][12] := "0", Nil ) //vlPrecoSubsidiadoPaciente
if( ::aProdutos[nItem][13] == Nil, ::aProdutos[nItem][13] := "0", Nil ) //vlPrecoSubsidiadoPacientePosEstorno
if( ::aProdutos[nItem][14] == Nil, ::aProdutos[nItem][14] := "0", Nil ) //vlPrecoVenda
if( ::aProdutos[nItem][15] == Nil, ::aProdutos[nItem][15] := "0", Nil ) //vlrSubsidiadoMSPosEstorno
if( ::aProdutos[nItem][16] == Nil, ::aProdutos[nItem][16] := "0", Nil ) //vlrTotalVendaPosEstorno
Next
if empty( ::aProdutos[01][01] )
MsgStop('Código de Barras inválido!','Estorno')
Return( .F. )
endif
cXml := ""
cXml += ''+CRLF
cXml += ''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
For nItem:=1 To Len(::aProdutos)
cXml += ' '+CRLF
cXml += ' '+::aProdutos[nItem][01]+''+CRLF
cXml += ' '+::aProdutos[nItem][02]+''+CRLF
cXml += ' '+::aProdutos[nItem][03]+''+CRLF
cXml += ' '+::aProdutos[nItem][04]+''+CRLF
cXml += ' '+::aProdutos[nItem][05]+''+CRLF
cXml += ' '+::aProdutos[nItem][06]+''+CRLF
cXml += ' '+::aProdutos[nItem][07]+''+CRLF
cXml += ' '+::aProdutos[nItem][08]+''+CRLF
cXml += ' '+::aProdutos[nItem][09]+''+CRLF
cXml += ' '+::aProdutos[nItem][10]+''+CRLF
cXml += ' '+::aProdutos[nItem][11]+''+CRLF
cXml += ' '+::aProdutos[nItem][12]+''+CRLF
cXml += ' '+::aProdutos[nItem][13]+''+CRLF
cXml += ' '+::aProdutos[nItem][14]+''+CRLF
cXml += ' '+::aProdutos[nItem][15]+''+CRLF
cXml += ' '+::aProdutos[nItem][16]+''+CRLF
cXml += ' '+CRLF
Next
cXml += ' '+CRLF
cXml += ' '+::nAutorizacao+''+CRLF
cXml += ' '+::Cnpj+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ' '+::SenhaFar+''+CRLF
cXml += ' '+::SenhaVen+''+CRLF
cXml += ' '+::UsuarioFar+''+CRLF
cXml += ' '+::UsuarioVen+''+CRLF
cXml += ' '+CRLF
cXml += ' '+CRLF
cXml += ''+CRLF
ferase("envioEst.txt")
memowrit("envioEst.txt", cXml)
TRY
http:SetRequestHeader( "SOAPAction", "executarEstorno" )
doc:LoadXML( cXml ) // Carrega o request de string
CATCH
MsgStop('Falha na criação do XML!','Estorno')
Return( .F. )
END
if doc:parseError:errorCode # 0
cErrorMsg := "Não foi possivel carregar o documento pois ele não corresponde ao seu Schema"
cErrorMsg := cErrorMsg + " Linha: " + str(doc:parseError:line)
cErrorMsg := cErrorMsg + " Caractere na linha: " + str(doc:parseError:linepos)
cErrorMsg := cErrorMsg + " Causa do erro: " + doc:parseError:reason+"code: " + str(doc:parseError:errorCode)
MsgStop(cErrorMsg,'Atenção')
RETURN(.F.)
endif
TRY
http:SetOption( 2, 13056 )
http:send( doc:xml ) // Envia o request
CATCH
MsgStop('Falha no Site do Farmácia Popular, Tente mais tarde!','Estorno')
Return( .F. )
END
while http:readyState <> 4
millisec(100)
enddo
response := http:responseText // Recebe a resposta
memowrit("retornoEst.txt", response)
oXmlDoc:=TXmlDocument():new()
oXMlDoc:read( response )
oXmlNode := oXmlDoc:findFirst( "inSituacaoEstorno" )
::CodRetorno := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( "descMensagemErro" )
::Mensagem := ConvHTML( oXmlNode:cData )
oXmlNode := oXmlDoc:findFirst( 'coCodigoBarra' )
::aProdutos := {}
while oXmlNode != Nil
while oXmlNode != Nil
aadd( aItens, ConvHTML( oXmlNode:cData ) )
oXmlNode := oXmlNode:oNext
enddo
aadd( ::aProdutos, aItens )
aItens := {}
oXmlNode:= oXmlDoc:findNext()
enddo
RETURN( .T. )
********************************************************************************
METHOD TFPGeraDna() CLASS TFPOPULAR
********************************************************************************
local nHandle, cTmpFile := right(dtos(date())+strtran(time(),":"),8)+".dna"
::Dna := ""
ferase( cTmpFile )
if !File('gbasmsb.exe')
MsgStop('Arquivo gbasmsb.exe não localizado!','Atenção')
Return( .F. )
endif
if !WinExec( 'gbasmsb.exe --solicitacao '+AllTrim(::Cpf)+' '+AllTrim(::Cnpj)+' '+AllTrim(::Crm)+' '+AllTrim(::UF)+' '+dtoc(::Data_Receita)+' > '+ cTmpFile )
MsgStop("Erro na geração do DNA","Atenção")
return( .F. )
endif
TRY
nHandle := fOpen( cTmpFile )
HB_FreadLine( nHandle, @::Dna )
fclose( nHandle )
ferase( cTmpFile )
CATCH
END
RETURN( .T. )
********************************************************************************
STATIC FUNCTION CONVHTML( cRet )
********************************************************************************
Default cRet := ""
if Empty( cRet )
Return( cRet )
endif
cRet := strtran( cRet, "À", "À" )
cRet := strtran( cRet, "Á", "Á" )
cRet := strtran( cRet, "Â", "Â" )
cRet := strtran( cRet, "Ã", "Ã" )
cRet := strtran( cRet, "Ä", "Ä" )
cRet := strtran( cRet, "Å", "Å" )
cRet := strtran( cRet, "Ç", "Ç" )
cRet := strtran( cRet, "È", "È" )
cRet := strtran( cRet, "É", "É" )
cRet := strtran( cRet, "Ê", "Ê" )
cRet := strtran( cRet, "Ë", "Ë" )
cRet := strtran( cRet, "Ì", "Ì" )
cRet := strtran( cRet, "Í", "Í" )
cRet := strtran( cRet, "Î", "Î" )
cRet := strtran( cRet, "Ï", "Ï" )
cRet := strtran( cRet, "Ò", "Ò" )
cRet := strtran( cRet, "Ó", "Ó" )
cRet := strtran( cRet, "Ô", "Ô" )
cRet := strtran( cRet, "Õ", "Õ" )
cRet := strtran( cRet, "Ö", "Ö" )
cRet := strtran( cRet, "Ù", "Ù" )
cRet := strtran( cRet, "Ú", "Ú" )
cRet := strtran( cRet, "Û", "Û" )
cRet := strtran( cRet, "Ü", "Ü" )
cRet := strtran( cRet, "à", "à" )
cRet := strtran( cRet, "á", "á" )
cRet := strtran( cRet, "â", "â" )
cRet := strtran( cRet, "ã", "ã" )
cRet := strtran( cRet, "ä", "ä" )
cRet := strtran( cRet, "å", "å" )
cRet := strtran( cRet, "ç", "ç" )
cRet := strtran( cRet, "è", "è" )
cRet := strtran( cRet, "é", "é" )
cRet := strtran( cRet, "ê", "ê" )
cRet := strtran( cRet, "ë", "ë" )
cRet := strtran( cRet, "ì", "ì" )
cRet := strtran( cRet, "í", "í" )
cRet := strtran( cRet, "î", "î" )
cRet := strtran( cRet, "ï", "ï" )
cRet := strtran( cRet, "ò", "ò" )
cRet := strtran( cRet, "ó", "ó" )
cRet := strtran( cRet, "ô", "ô" )
cRet := strtran( cRet, "õ", "õ" )
cRet := strtran( cRet, "ö", "ö" )
cRet := strtran( cRet, "ù", "ù" )
cRet := strtran( cRet, "ú", "ú" )
cRet := strtran( cRet, "û", "û" )
cRet := strtran( cRet, "ü", "ü" )
RETURN( cRet )