Uma coisa simples: consultar o status
No MDFE, SoapAction e SoapService são fixos, mas existe a lista pra escolher entre endereços de produção e homologação
METHOD MDFeStatusServico( cUF, cCertificado, cAmbiente ) CLASS SefazClass
hb_Default( @::cProjeto, WS_PROJETO_MDFE )
hb_Default( @::cVersao, "3.00" )
::cSoapAction := "MDFeStatusServico"
::cSoapService := "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeStatusServico/mdfeStatusServicoMDF"
::aSoapUrlList := { ;
{ "**", "3.00", WS_AMBIENTE_PRODUCAO, "https://mdfe.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx" }, ;
;
{ "**", "3.00", WS_AMBIENTE_HOMOLOGACAO, "https://mdfe-homologacao.svrs.rs.gov.br/ws/MDFeStatusServico/MDFeStatusServico.asmx" } }
::Setup( cUF, cCertificado, cAmbiente, WS_MDFE_STATUSSERVICO )
::cXmlEnvio := [<consStatServMDFe versao="] + ::cVersao + [" ] + WS_XMLNS_MDFE + [>]
::cXmlEnvio += XmlTag( "tpAmb", ::cAmbiente )
::cXmlEnvio += XmlTag( "cUF", ::UFCodigo( ::cUF ) )
::cXmlEnvio += XmlTag( "xServ", "STATUS" )
::cXmlEnvio += [</consStatServMDFe>]
::XmlSoapPost()
RETURN ::cXmlRetorno
Já no CTE, o endereço de internet também depende de UF.
METHOD CTeStatusServico( cUF, cCertificado, cAmbiente ) CLASS SefazClass
hb_Default( @::cVersao, "3.00" )
hb_Default( @::cProjeto, WS_PROJETO_CTE )
::cSoapAction := "cteStatusServicoCT"
::cSoapService := "http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico"
::aSoapUrlList := { ;
{ "MG", "3.00", WS_AMBIENTE_PRODUCAO, "https://cte.fazenda.mg.gov.br/cte/services/CteStatusServico" }, ;
{ "MT", "3.00", WS_AMBIENTE_PRODUCAO, "https://cte.sefaz.mt.gov.br/ctews/services/CteStatusServico" }, ;
{ "MS", "3.00", WS_AMBIENTE_PRODUCAO, "https://producao.cte.ms.gov.br/ws/CteStatusServico" }, ;
{ "PR", "3.00", WS_AMBIENTE_PRODUCAO, "https://cte.fazenda.pr.gov.br/cte/CteStatusServico?wsdl" }, ;
{ "SP", "3.00", WS_AMBIENTE_PRODUCAO, "https://nfe.fazenda.sp.gov.br/cteWEB/services/cteStatusServico.asmx" }, ;
{ "SVSP", "3.00", WS_AMBIENTE_PRODUCAO, "https://nfe.fazenda.sp.gov.br/cteWEB/services/CteStatusServico.asmx" }, ;
{ "SVRS", "3.00", WS_AMBIENTE_PRODUCAO, "https://cte.svrs.rs.gov.br/ws/ctestatusservico/CteStatusServico.asmx" }, ;
;
{ "SP", "3.00", WS_AMBIENTE_HOMOLOGACAO, "https://homologacao.nfe.fazenda.sp.gov.br/cteWEB/services/cteStatusServico.asmx" }, ;
{ "SVRS", "3.00", WS_AMBIENTE_HOMOLOGACAO, "https://cte-homologacao.svrs.rs.gov.br/ws/ctestatusservico/CteStatusServico.asmx" } }
::Setup( cUF, cCertificado, cAmbiente, WS_CTE_STATUSSERVICO )
::cXmlEnvio := [<consStatServCte versao="] + ::cVersao + [" ] + WS_XMLNS_CTE + [>]
::cXmlEnvio += XmlTag( "tpAmb", ::cAmbiente )
::cXmlEnvio += XmlTag( "xServ", "STATUS" )
::cXmlEnvio += [</consStatServCte>]
::XmlSoapPost()
RETURN ::cXmlRetorno
Já na NFE.... VIXE....
SoapAction e SoapService não são padrão.
Tem a lista de endereços
Tem também a versão 3.10 e 4.00
Tem também NFE e NFCE
Por isso só movi uma parte, por enquanto
METHOD NFeStatusServico( cUF, cCertificado, cAmbiente ) CLASS SefazClass
hb_Default( @::cProjeto, WS_PROJETO_NFE )
hb_Default( @::cVersao, "3.10" )
IF ::cVersao == "3.10"
DO CASE
CASE ::cUF == "BA"
::cSoapAction := "nfeStatusServicoNF"
::cSoapService := "http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico"
OTHERWISE
::cSoapAction := "nfeStatusServicoNF2"
::cSoapService := "http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"
ENDCASE
ELSE
::cSoapAction := "nfeStatusServicoNF"
::cSoapService := "http://www.portalfiscal.inf.br/nfe/wsdl/NFeStatusServico4"
ENDIF
::Setup( cUF, cCertificado, cAmbiente, WS_NFE_STATUSSERVICO )
::cXmlEnvio := [<consStatServ versao="] + ::cVersao + [" ] + WS_XMLNS_NFE + [>]
::cXmlEnvio += XmlTag( "tpAmb", ::cAmbiente )
::cXmlEnvio += XmlTag( "cUF", ::UFCodigo( ::cUF ) )
::cXmlEnvio += XmlTag( "xServ", "STATUS" )
::cXmlEnvio += [</consStatServ>]
::XmlSoapPost()
RETURN ::cXmlRetorno
Mas fica claro o seguinte:
A comunicação é simples, igual pra todos.
A complicação, é o governo ou as UFs inventam.
Existe padrão, mas nem sempre é seguido.
E se a classe não funcionar pra determinada UF.... é conferir SoapAction, SoapService e a lista de endereços
O mesmo se inventarem um serviço novo, ou documento novo.
Aonde pegar essas informações:
- No portal da NFE, CTE, MDFE, de homologação e de produção
- Abrindo o webservice, geralmente mostra SoapAction e SoapService, no meio do XML, só pesquisar a palavra "SoapAction" e "www.portalfiscal.inf.br/...."
Até agora funcionou colocar como SoapAction apenas a última palavra.
É algo como um path do Windows, onde SoapService contém a indicação desde a raiz, então em SoapAction basta a última pasta do path.
Exemplos mais conhecidos:
cSoapService := "d:\harbour\"
cSoapAction := "d:\harbour\bin" que pode ser abreviado para "bin", porque cSoapService já vai indicar a "pasta root"
Em internet é a mesma coisa, só que ao invés de d: contém http:, o domÃnio seria a pasta raiz (www.algumacoisa.com.br), e o restante subpastas.
Então... isso dá uma idéia melhor de que o governo complica, porque não usa nomes padrão pra cada pasta.
A maior parte do fonte, são os IFs/CASEs, por causa do governo não usar padrão.
Na NFE 4.0 vai melhorar um pouco, quando ela estiver sozinha sem a 3.10.