Sobre as mudanças da SefazClass

Projeto hbNFe (Nota Fiscal Eletronica/Danfe) para [x]Harbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Sobre as mudanças da SefazClass

Mensagem por JoséQuintas »

Acho que vai ficar mais fácil de entender o que altera, e o que alterar
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

Código: Selecionar todos

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.

Código: Selecionar todos

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

Código: Selecionar todos

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Sobre as mudanças da SefazClass

Mensagem por JoséQuintas »

Achei uma forma mais "simpática" de definir os endereços.
Adotei a seguinte nomenclatura: "3.10P", "3.10H", "3.10PC", "3.10HC"

Onde:
P = produção
H = homologação
PC = produção Consumidor
HC = homologação Consumidor

Motivo:
Pra não duplicar as listas, e reduzir os CASEs.
Nota do consumidor pode ser na mesma da nota comum, ou ter serviço em separado.
Então... nota comum usa P ou H.
E nota ao consumidor, primeiro procura por PC ou HC, e se não encontrar usa P ou H que é da nota comum.

Ainda estou terminando as alterações.
Quando finalizar coloco aqui como ficou.

No uso não faz diferença, mas faz pra quem for alterar/conferir os endereços.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Sobre as mudanças da SefazClass

Mensagem por JoséQuintas »

Todos os endereços movidos novamente para um arquivo CH, depois que o esquema foi definido.
Só ainda não sei se separo da sefazclass.ch e deixo igual antes em arquivo próprio.

Coloquei pra rodar hoje, deu só um problema nos eventos de NFE, porque a versão no SOAP é 1.00.
Com certeza tive que resolver na hora.

Caso alguém vá usar pra 4.00 ou outra coisa... não confirmei se vai precisar mexer nesta parte aonde define a versão do SOAP.
Essa parte adicionei HOJE, pra resolver a questão de eventos de NFE.

Código: Selecionar todos

   IF "CadConsultaCadastro" $ ::cSoapAction
      cSoapVersion := "2.00"
   ELSEIF "nfeRecepcaoEvento" $ ::cSoapAction
      cSoapVersion := "1.00"
   ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder