NFS-e PMSP

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

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

NFS-e PMSP

Mensagem por JoséQuintas »

Eu fiz um teste com o meu código do jeito que ta, e funcionou no A3 tbm ! na máquina do financeiro
E o que teve de diferente? alguma coisa que mencionei?

Nota: Eu apenas fui organizando, e na organização algumas coisas chamaram a atenção e postei.
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

NFS-e PMSP

Mensagem por JoséQuintas »

está bem mais bonito o código assim !
Aí que está, não é questão de estar bonito.
É que está claro aonde estão as coisas, e fica melhor de trabalhar no fonte.
Considerar apenas porque é bonito de ver, a gente acaba achando que se trata de "frescura", e acabamos não fazendo.

Na prática, organizado fica bom de trabalhar, de enxergar as coisas, e de resolver problemas.
Estar bonito acaba sendo só uma consequência, não o ponto principal.

Ah é... e também porque aí só trata a parte do governo, não os detalhes de criação do XML.
Separar em partes ajuda, porque não mistura "assuntos".
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

NFS-e PMSP

Mensagem por JoséQuintas »

Só aproveitando... no caso da SefazClass

Código: Selecionar todos

METHOD MDFeStatusServico( cUF, cCertificado, cAmbiente ) CLASS SefazClass

   ::Setup( cUF, cCertificado, cAmbiente, WS_MDFE_STATUSSERVICO )

   ::cSoapVersion := "1.00"
   ::cXmlEnvio    := [<consStatServMDFe versao="] + ::cSoapVersion + [" xmlns="http://www.portalfiscal.inf.br/mdfe">]
   ::cXmlEnvio    +=    XmlTag( "tpAmb", ::cAmbiente )
   ::cXmlEnvio    +=    XmlTag( "cUF", ::UFCodigo( ::cUF ) )
   ::cXmlEnvio    +=    XmlTag( "xServ", "STATUS" )
   ::cXmlEnvio    += [</consStatServMDFe>]
   ::XmlSoapPost()

   RETURN ::cXmlRetorno
Nesse caso cria o XML e já faz a comunicação.
Todos os parâmetros "diferentes" acabam sendo definidos em ::Setup()
A única coisa que resta pra conferir é mesmo o XML de consulta status.

É como eu disse antes: é relativamente simples, mas é chato e com detalhes.

É entregar o XML num endereço e acionar uma ação (SOAP ACTION).
Mas tem vários endereços diferentes, o envelope pode ter algum detalhe diferente, e SEMPRE depende do XML.
Boa parte do projeto NFE, CTE e MDFE é só pra escolher endereço, SOAP Action e Serviço.
A coisa em si, é simples: criar um XML, entregar num endereço, e pegar a resposta.
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/
eduardomc00
Usuário Nível 1
Usuário Nível 1
Mensagens: 43
Registrado em: 07 Out 2014 18:29
Localização: São Paulo

NFS-e PMSP

Mensagem por eduardomc00 »

Zé boa tarde.

Quando digo bonito, quero dizer fácil, legível, que da gosto de ver.

Sobre precisar do EXE da assinatura, tem uns procedimentos antes da assinatura que no Harbour eu não consegui fazer. inclusive, na época postei aqui no fórum e ninguém consegui me ajudar.

Simplesmente troquei de máquina no financeiro e funcionou. pode ser alguma coisa no certificado que foi instalado como novo drive. sei la
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

NFS-e PMSP

Mensagem por Toledo »

JoséQuintas escreveu:Um primeiro protótipo.

https://github.com/JoseQuintas/nfse-sp- ... EClass.prg
Este link está quebrado... teria como compartilhar um novo link para o arquivo?
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

NFS-e PMSP

Mensagem por JoséQuintas »

Como era parcial, e ficou parado, acabei excluindo.
Mas ainda estava aqui na máquina.
NFSEClass.prg
(6.12 KiB) Baixado 125 vezes
Talvez interessante eu deixar na pasta de rascunhos (drafts) da Sefazclass, assim como já tem esocial, e outros mais.
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

NFS-e PMSP

Mensagem por JoséQuintas »

Pronto.
Na dúvida sobre o .XXX, porque nem lembrava mais disso.
Provavelmente é depois das alterações do post.

https://github.com/JoseQuintas/sefazcla ... EClass.prg
https://github.com/JoseQuintas/sefazcla ... nfsesp.xxx

Emito as minhas via TXT, sem certificado, opção disponível pra empresas do simples.
Não sei se fica disponível pra quem usa certificado.
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/
luiz augusto
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 22 Jul 2019 11:37
Localização: Penha/SC

NFS-e PMSP

Mensagem por luiz augusto »

Boa Noite,

Baixei o exe que o Eduardomc00 disponibilizou pra assinar a TAG assinatura da NFSe paulistana, consegui montar o xml, criar a assinatura da TAG e assinar o o arquivo, mas ao enviar recebo a seguinte mensagem de erro:

<Erro xmlns=""><Codigo>1206</Codigo><Descricao>Assinatura Digital do RPS incorreta - String verificada (56663072A 00000003803720190815TNN00000000000010000000000000000008494300000000000000)
Já fiz e refiz varias vezes e dá sempre o mesmo erro. Algum colega que tenha finalizado a rotina de nota paulistana poderia dar alguma dica do que está faltando pra resolver o problema?

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

NFS-e PMSP

Mensagem por JoséQuintas »

Já pesquisou por caracteres especiais?
Eles dão diferença de codepage e acabam causando diferença na assinatura.
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
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

NFS-e PMSP

Mensagem por Nascimento »

acompanhando ... :)Pos
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
luiz augusto
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 22 Jul 2019 11:37
Localização: Penha/SC

NFS-e PMSP

Mensagem por luiz augusto »

Boa noite Quintas,

Obrigado por responder,

O arquivo StringParaAssinar.txt que eu crio com os dados necessarios para criar a assinatura, tem duas linhas, a primeira é o Serial do Certificado e a segunda, a string com as informações do rps, conforme abaixo:

A tag assinatura é composta pelo seguinte conteúdo:

************************COLOCAR AQUI A CHAVE PARA COMPARAR PARA VER SE ESTÁ CERTO*********************

+-------+----+-----------+-------++++--------------+--------------+----++-------------++-------------+
123456781234512345678901212345678111123456789012345123456789012345123451123456789012341123456789012341
+-------+----+-----------+-------++++--------------+--------------+----++-------------++-------------+
| | | | |||| | | || || |
A B C D EFGH I J KL MN O
+------------------------------------------+-------------+
| A-Inscrição Municipal do Prestador | 8 dígitos |
| B-Série do RPS | 5 diditos |
| C-Número do RPS | 12 dígitos |
| D-Data de Emissão do RPS | 8 dígitos |
| E-Tipo de Tributação do RPS | 1 dígito |
| F-Status do RPS | 1 dígito |
| G-ISS Retido | 1 dígito |
| H-Valor dos Serviços | 15 dígitos |
| I-Valor das deduções | 15 dígitos |
| J-Código do Serviço Prestado | 5 dígitos |
| K-Indicador de CPF/CNPJ do tomador | 1 dígito |
| L-CPF/CNPJ do tomador | 14 dígitos |
| M-Indicador de CPF/CNPJ do Intermediário | 1 dígito |
| N-CPF/CNPJ do Intermediário | 14 dígitos |
| O-ISS Retido Intermediário | 1 dígito |
+------------------------------------------+-------------+
| TOTAL DE DÍGITOS | 102 dígitos |
+------------------------------------------+-------------+

o que eu reparei, é que tanto na primeira linha, como na segunda, tem o CR + LF, mas se eu tirar isso da primeira linha, o arquivo passa a ter somente uma linha e dai o executavel não vai ler corretamente o arquivo, pois o mesmo só vai ter uma linha após retirar o CR + LF. Na segunda linha, não dá problema se retirar os caracteres.

Após assinar, dai retiro estes caracteres da string assinada, conforme abaixo:

cRET := MEMOREAD( "StringAssinada.txt" )
cRET := STRTRAN( cRET, CHR(13), "" )
cRET := STRTRAN( cRET, CHR(10), "" )

O fato é que ainda não consegui resolver está pendencia, agradeço quem puder ajudar,

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

NFS-e PMSP

Mensagem por JoséQuintas »

Agora não entendi mais nada.
XML é tudo numa linha só.
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/
luiz augusto
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 22 Jul 2019 11:37
Localização: Penha/SC

NFS-e PMSP

Mensagem por luiz augusto »

Bom dia,

hehe, eu explico:
está é a string pra assinar

7B4A1C1D8CD520A7394E5446394B44F7
56663072A 00000003803720190815TNN00000000000010000000000000000084942300000000000000
que é gravada em um arquivo txt que o exe assinarps vai ler gravado com este comando


nHandle := FCREATE( "StringParaAssinar.txt" )
FWRITE( nHandle, cSerialCert + CHR(13) + CHR(10) + cCHA )
FCLOSE( nHandle )

ok?

Ao assinar, o assinarps.exe cria um arquivo chamado StringAssinada.txt com este conteudo:

Xbv4k4G75Zc4+1zemN54pWal6ky2Zm+xw1WJ8gR9FKngTNAwAM2CDsdkvB/7KmiIaRtTJDzVASAH3UcMK7xWqAVruUjBj9d+EWnZIzloePkO7gUYpt+KuG9InTuq6Uu/ylM+t95clGH+oggpYEkeTtA6nL5an7tIW4o+rsnefZpHAaA56/ofqmQC3Ov4ZL2XVe0IwOMViQjObyFGKmKlIjkxDVMMWeqgFm2cfQ786ck7/QD4E2tprufd1Pta17wbDIYAqL1igVVOUQ5392VVHYrKdpGl7EWRIRa9cDIZPVhHpe9dxNzwQtMysh0HfuR3i8/1WaPfX9AElEEQE+cJkw==

que vou ler com este comando

cRET := MEMOREAD( "StringAssinada.txt" )
cRET := STRTRAN( cRET, CHR(13), "" )
cRET := STRTRAN( cRET, CHR(10), "" )

incluindo na TAG assinatura.

Ao enviar para webservice, recebo este retorno:

<Erro xmlns=""><Codigo>1206</Codigo><Descricao>Assinatura Digital do RPS incorreta - String verificada (56663072A 00000003803720190815TNN00000000000010000000000000000008494300000000000000)</Descricao><ChaveRPS><InscricaoPrestador>56663072</InscricaoPrestador><SerieRPS>A</SerieRPS><NumeroRPS>38037</NumeroRPS></ChaveRPS></Erro>

É isso.

Luiz
malcarli
Usuário Nível 3
Usuário Nível 3
Mensagens: 239
Registrado em: 20 Ago 2015 18:14
Localização: marilia/sp

NFS-e PMSP

Mensagem por malcarli »

Bom dia, preciso implementar nfse para sp. A classe do Mestre Quintas, falta a assinatura e portanto infelizmente não dá para usar e não sei implementar a mesma. Alguém teria os arquivos mais atualizados da versão do colega Eduardo e que esteja funcionando para compartilhar para todos nós?

Obrigado


Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®
https://malc-informatica.ueniweb.com
Insta: @malcarli25
Email / Skype: malcarli@life.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

NFS-e PMSP

Mensagem por JoséQuintas »

Eu dei uma idéia de como assinar usando a sefazclass.
Primeiro é assinar a nota, e depois o lote.
Na assinatura da nota, é direto, normal.

Dentro de ze_sefazassina:

Código: Selecionar todos

STATIC FUNCTION AssinaAjustaInformacao( cTxtXml, cXmlTagInicial, cXmlTagFinal, cRetorno, lComURI )

   LOCAL aDelimitadores, nPos, nPosIni, nPosFim, cURI

   aDelimitadores := { ;
      { "<enviMDFe",              "</MDFe></enviMDFe>" }, ;
      { "<eventoMDFe",            "</eventoMDFe>" }, ;
      { "<eventoCTe",             "</eventoCTe>" }, ;
      { "<infMDFe",               "</MDFe>" }, ;
      { "<infCte",                "</CTe>" }, ;
      { "<infNFe",                "</NFe>" }, ;
      { "<infDPEC",               "</envDPEC>" }, ;
      { "<infInut",               "<inutNFe>" }, ;
      { "<infCanc",               "</cancNFe>" }, ;
      { "<infInut",               "</inutNFe>" }, ;
      { "<infInut",               "</inutCTe>" }, ;
      { "<infEvento",             "</evento>" }, ;
      { "<evtInfoEmpregador",     "</eSocial>" }, ;
      { "<PedidoEnvioLoteRPS",    "</RPS>" }, ;
      { "<PedidoEnvioRPS",        "</RPS>" }, ;
      { "<infPedidoCancelamento", "</Pedido>" }, ;               // NFSE ABRASF Cancelamento
      { "<LoteRps",               "</EnviarLoteRpsEnvio>" }, ;   // NFSE ABRASF Lote
      { "<infRps",                "</Rps>" } }                   // NFSE ABRASF RPS
Acima é referência do que deve existir no XML.

Código: Selecionar todos

FUNCTION CapicomAssinaXml( cTxtXml, cCertCN, lRemoveAnterior, cPassword, lComURI )
Não tem muito o que mexer, talvez confunda quem não está acostumado com XML.
cTxtXml -> o arquivo XML
cCertCN -> o nome do certificado
lRemoveAnterior - Se remove assinatura(s) anterior(es)
cPassword -> senha do certificado
lComURI -> se o bloco de assinatura vai indicar a URI, que é o nome do bloco a ser assinado

Na assinatura normal, o lRemoveAnterior é verdadeiro, no caso da prefeitura é a nota individual
Na assinatura de lote, o lRemoveAnterior é falso, pra não remover a assinatura da(s) nota(s)
Acho que no lote esse lComURI é falso, talvez possa confirmar em alguma nota exemplo.

Código: Selecionar todos

STATIC FUNCTION AssinaBlocoAssinatura( cURI, lComURI )

   LOCAL cSignatureNode := ""

   IF lComURI
      cURI := "#" + cURI
   ENDIF
A diferença entre com e sem URI é a acima, dá pra confirmar olhando um lote assinado, ou, na tentativa/erro, ao assinar o lote.

olhando novamente a função:

Código: Selecionar todos

FUNCTION CapicomAssinaXml( cTxtXml, cCertCN, lRemoveAnterior, cPassword, lComURI )
Não lembro mais, mas numa primeira tentativa, a mais provável

Código: Selecionar todos

cXmlNota := "xxxxxx"
cXmlAssinado := ze_assinaXml( cXmlNota, "nomecertificado", .T.,"senha se precisar" )
cXmlLote := "xxxx" + cXmlAssinado + "xxxx" 
cXmlTransmite := ze_AssinaXml( cXmlNota, "nomecertificado", .F.,  "senha se precisar", .F. )
Como deve estar olhando o manual, pra gerar o XML, deve ter o esquema do lote no manual pra ajustar a linha que cria cXmlLote.
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