Página 1 de 4

Novo projeto

Enviado: 27 Jul 2015 19:45
por JoséQuintas
Pra não depender de autorização, e pra ficar bem clara a proposta, endereço separado.
Depois veremos o que fazer.

Não tem conversão de TXT: Xml chegou pra ficar. Aprender é fácil, e aqui no fórum podemos ajudar.

Não lê do disco: Sabe usar MemoRead(), então pode ler do jeito que quiser.

Não salva no disco: Sabe usar MemoWrit(), então sabe salvar do jeito que quiser.

Só trabalha com XML: pensou em rotina pra gerar INI, melhor gerar no padrão nacional que é XML.
Mudou o projeto? Ok. Só alterar os XMLs/strings.

Ainda não tá pronta pra 3.10: Vamos descobrir que letras alterar.

Precisa tempo e paciência: Uma única letra faz não funcionar, então tempo e paciência pra descobrir essa letra são necessários.

O ponto de partida está aí.
Daqui pra frente é descobrir que "letras" precisa alterar.

Sugestão: começar pela consulta protocolo, assim dá uma visão exata do que esperar, e no momento é uma das que uso 24 horas, então sei que funciona.

https://github.com/JoseQuintas/SpedSefazClass

Como usar o github:
Precisa do software GIT.
Pra baixar, aqui digitei no prompt pra usar a pasta SpedSefazClass\:

Código: Selecionar todos

git clone https://github.com/JoseQuintas/SpedSefazClass.git SpedSefazClass
a partir daí, pra atualizar, é entrar na pasta SpedSefazClass e digitar:

Código: Selecionar todos

git pull
Nota: Exatamente igual no Harbour, só muda endereço, afinal é no mesmo GITHUB.
Também serve o link direto pra quem não quer o git: [url]https://github.com/JoseQuintas/SpedSefa ... er.zip[url]

Novo projeto

Enviado: 27 Jul 2015 19:55
por JoséQuintas
Assinatura:

Código: Selecionar todos

   aDelimitadores := { ;
      { "<enviMDFe",   "</MDFe></enviMDFe>" }, ;
      { "<eventoMDFe", "</eventoMDFe>" }, ;
      { "<eventoCTe",  "</eventoCTe>" }, ;
      { "<infMDFe",    "</MDFe>" }, ;
      { "<infCte",     "</CTe>" }, ;
      { "<infNFe",     "</NFe>" }, ;
      { "<infDPEC",    "</envDPEC>" }, ;
      { "<infInut",    "<inutNFe>" }, ;
      { "<infCanc",    "</cancNFe>" }, ;
      { "<infInut",    "</inutNFe>" }, ;
      { "<infEvento",  "</evento>" }, ;
      { "<infPedidoCancelamento", "</Pedido>" }, ; // NFSE ABRASF Cancelamento
      { "<infRps",     "</Rps>" } }                // NFSE ABRASF
Aqui está bem claro o bloco necessário pra assinatura, aonde começa e aonde termina.
Se tem algum documento novo, só precisa alterar aí.
O detalhe importante é a ordem: por exemplo, MDFE tem tag NFE por isso vém primeiro, senão vai ser considerado NFE.

Novo projeto

Enviado: 27 Jul 2015 20:39
por JoséQuintas
Tudo passa por estes métodos pra comunicação:

Código: Selecionar todos

METHOD XmlSoapPost( cUF, cCertificado, cProjeto ) CLASS SefazClass
METHOD XmlSoapEnvelope( cUF, cProjeto ) CLASS SefazClass
METHOD MicrosoftXmlSoapPost() CLASS SefazClass
Enquanto aqui é uma única rotina, na hbnfe tem isso em cada comunicação.
E isso pra NFE, CTE, MDFE, CCE, etc.

Por incrível que pareça, complicou pra usar isso na hbnfe.
É que tem XML que ela cria pela metade, completando em outro lugar com a outra metade.
E mesmo assim, de uma metade pra outra, lendo e gravando do disco, nas pastas conforme configuração.
Aparentemente uma complicação desnecessária.
E acaba complicando entender qual é exatamente cada XML.

Por essas e outras, melhor trabalhar em separado, até decidir como integrar ao projeto, e até mesmo se vai precisar integrar.
Aqui não precisa de nenhuma. (quem vai precisar é quem usa, e pode decidir do jeito que quiser).

Novo projeto

Enviado: 27 Jul 2015 23:09
por fladimir
Ok José, vou baixar e testar e te falo.

Obrigado.

Novo projeto

Enviado: 28 Jul 2015 16:34
por JoséQuintas
O primeiro teste básico seria este, precisa da chave e do nome do certificado

Código: Selecionar todos

PROCEDURE Main
   LOCAL oSefaz := SefazClass():New()
   oSefaz:NfeConsulta( "chave", "nomeDoCertificado" )
   ? oSefaz:cXmlRetorno
   RETURN

Novo projeto

Enviado: 28 Jul 2015 22:25
por JoséQuintas
Atualizado consulta status pra 3.10.
Testei em SP e ok.
Só mudei a linha com a versão.

Código: Selecionar todos

METHOD NFeStatus( cUF, cCertificado, cAmbiente ) CLASS SefazClass
...
   ::cVersaoXml   := "3.10"
Pra usar:

Código: Selecionar todos

PROCEDURE Main
   LOCAL oSefaz := SefazClass():New()
   oSefaz:NfeStatus( "SP", "NomeCertificado", "1" )
   ? oSefaz:cXmlRetorno
   RETURN
Como eu disse antes, é uma classe curta e grossa, para a parte que interessa.
É enviar XML e receber XML, sem nem precisar arquivo em disco.
E pra atualizar, é alterar algumas letras.
Para o status foi fácil descobrir as letras a alterar.

Novo projeto

Enviado: 28 Jul 2015 22:53
por fladimir
Testei aki antes do teu ultimo post e o Seleciona Certificado esta Ok, o Consulta Status NFe da erro.

Código: Selecionar todos

na Linha 696: oServer:Open( "POST", ::cWebService, .F.)

o ::cWebService ficou  "https://nfe.fazenda.ms.gov.br/producao/services2/NfeStatusServico2" devido ter escolhido "MS"
o XML Enviado é:

Código: Selecionar todos

<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Header><nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><cUF>50</cUF><versaoDados>2.00</versaoDados></nfeCabecMsg></soap12:Header><soap12:Body><nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><consStatServ versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>1</tpAmb><cUF>50</cUF><xServ>STATUS</xServ></consStatServ></nfeDadosMsg></soap12:Body></soap12:Envelope>
o Retorno é:

Código: Selecionar todos

Retorno: Erro: No componente SOAP

Novo projeto

Enviado: 28 Jul 2015 23:16
por JoséQuintas
Apesar da mensagem de erro, dá pra ver 2.00 nessa quarta linha.
Altere primeiro no método NfeStatus() pra 3.10, que foi o que postei acima.
Enquanto isso vou fazer um teste aqui.

Novo projeto

Enviado: 28 Jul 2015 23:20
por JoséQuintas
Aqui ok para MS.
É só mesmo a alteração que mencionei.
Usei o próprio teste.prg que acompanha a classe.

Notas:
O certificado de SP serviu pra isso, pra consultar status em MS.
No seu teste, o webservice simplesmente rejeitou e a mensagem de erro não ajudaria em nada.
Se obrigasse um certificado de MS, eu nem teria como testar.
Desta vez foi rápido resolver, aliás, tava resolvido antes.... rs

Novo projeto

Enviado: 28 Jul 2015 23:35
por fladimir
mesmo com a alteração o erro mencionado persiste, será q não é algo q preciso registar (DLL etc?) apesar do ACBr estar funcionando aki.

Novo projeto

Enviado: 29 Jul 2015 00:02
por JoséQuintas
É ACBR com capicom?
Pra comunicação e assinatura, é Capicom e Xml5.
E o nome correto do certificado, qualquer coisa use o teste.prg, que ele deixa selecionar certificado.
E pra isso, já usa a capicom.

Xml5

Novo projeto

Enviado: 29 Jul 2015 00:06
por fladimir
É ACBR com capicom?
Sim
Pra comunicação e assinatura, é Capicom e Xml5.
Não mexi em nada, como o ACBr funciona com Capicom penso q o projeto tb deva funcionar...
E o nome correto do certificado, qualquer coisa use o teste.prg, que ele deixa selecionar certificado.
E pra isso, já usa a capicom.
Estou compilando o teste executando escolhendo via Teste o certificado e depois vou no Consulta Status NFe e da o Erro no componente SOAP

Não estou entendendo, como ai funciona aki tinha q funcionar.

Novo projeto

Enviado: 29 Jul 2015 00:08
por JoséQuintas
Também o XML 5.0. Acabou entrando a alteração antes do seu post, tá anexo.
O W7 64 bits tem registro diferente pra programas 32 bits e 64 bits.
Dá uma olhada no readme.txt se precisar.
Em todo caso:

Código: Selecionar todos

Windows 32 bits: copiar as DLLs para c:\windows\system32
Windows 64 bits: copiar as DLLs pra c:\windows\syswow64

Dentro da pasta pra onde foram copiados os arquivos:
(porque cada uma tem um regsvr32.exe diferente)

regsvr32 capicom.dll
regsvr32 msxml5.dll
regsvr32 msxml5r.dll

Novo projeto

Enviado: 29 Jul 2015 00:17
por fladimir
ja tinha instalado, mas em todo caso baixei as q vc mandou e substitui e desregistrei e registrei novamente conforme readme.txt

o Erro permaneceu.

Não sei o q pode ser, amanhã vou fazer o seguinte vou testar em uma maquina XP q tenho aki (virtual) zerada e retorno com os resultados.

Obrigado
[]´s

Novo projeto

Enviado: 29 Jul 2015 00:19
por JoséQuintas
Apesar da classe não estar preparada para o formato do retorno, pra retirar esse envelope, aqui mostrou este retorno.

Código: Selecionar todos

Erro SOAP: XML retorno não está no padrão <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Header><nfeCabecMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><cUF>50</cUF><versaoDados>3.10</versaoDados></nfeCabecMsg></soapenv:Header><soapenv:Body><nfeStatusServicoNF2Result xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2"><retConsStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10"><tpAmb>1</tpAmb><verAplic>MS201503300900</verAplic><cStat>107</cStat><xMotivo>Servico em Operacao</xMotivo><cUF>50</cUF><dhRecbto>2015-07-28T23:14:41-04:00</dhRecbto><tMed>1</tMed></retConsStatServ></nfeStatusServicoNF2Result></soapenv:Body></soapenv:Envelope>