ARQUIVO DE CUPOM FISCAL

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

ARQUIVO DE CUPOM FISCAL

Mensagem por ALEX170970 »

Alguem conseguiu transmitir um arquivo de cupom fiscal no portal da Nota Fiscal Paulista?

Sempre que tento, dá o mesmo erro:

O arquivo EL100001.1A7 foi recusado para processamento
Motivo: erro na validação do arquivo

Nem mesmo o suporte deles consegue informar qual é o erro. Somente informam que não atende ao layout.

Para mim o arquivo está correto, com todos os registros inclusive a assinatura de hash de 1024 bits com 256 caracteres.

Outra dúvida: como faço para gerar as extensões dos arquivos, por exemplo: EL100001.1A7 é do dia 01/10/2007, EL100001.2A7 é do dia 02/10/2007 e assim por diante. Eu já consegui gerar a string usando a data, o problema é quando tento renomear o arquivo gerado pelo hash.
NomeArq:="EL100001."+DiaExt+MesEXt+AnoExt //Extensão=1A7
Copy file MYKEY.BAK to NomeArq //DÁ ERRO DE COMPILAÇÃO NESTA LINHA.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Use:

Copy file MYKEY.BAK to &(NomeArq)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

Mensagem por ALEX170970 »

Consegui enviar os arquivos.
Acho que o erro ocorria quando eu renomeava o arquivo, aí o hash ficava invalidado.
Obrigado pela dica.
Editado pela última vez por ALEX170970 em 21 Dez 2007 16:49, em um total de 1 vez.
ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

Mensagem por ALEX170970 »

Consegui enviar os arquivos.
Acho que o erro ocorria quando eu renomeava o arquivo, aí o hash ficava invalidado.
Obrigado pela dica.
ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

Mensagem por ALEX170970 »

O pessoal da Nota Fiscal Paulista quer me deixar doido (e a todos os programadores). Os arquivos que eu estava conseguindo transmitir, agora não estou conseguindo mais. Voltou a aparecer o erro de antes:

O arquivo EL100001.1A7 foi recusado para processamento
Motivo: erro na validação do arquivo

Por favor, me corrijam se eu estiver errado.
Eu estou gerando o arquivo da seguinte forma:

Gravo cada registro no arquivo TXT através do comando "?";
Em seguida gravo os mesmos registros num arquivo DBF (1 campo de 315 posições caractere);
Gero a assinatura de hash lendo o arquivo TXT e gravo um novo registro DBF com a assinatura;
Gravo um arquivo TXT sobrepondo o outro TXT gerado anteriormente, pegando os registros do DBF, desta vez com a assinatura.

PERGUNTO: será que esta nova gravação do TXT está invalidando a assinatura do hash?
Tem como incluir a assinatura no final do TXT sem sobrepor?

Fico na dúvida se o erro é deles (NFP), pois eu estava conseguindo transmitir os arquivos, e agora voltou a dar erro.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

(EDITADO)


Alex, pra que complicar usando essa "ponte" com o DBF? Grave o TXT direto, usando as funções de baixo níivel FCREATE(), FWRITE() etc... aí vc sabe que o que está sendo gravado no arquivo TXT é exatamente o que eles pedem.

Quem sabe essa "ponte" com o DBF está gerando algum caracter a mais que eles não estão aceitando...


Veja o exemplo a seguir. Fiz cada linha do TXT com 315 caracteres, mais a quebra de linha (chr 13 e 10). Vc inclui outros campos e altera o que for preciso.

Código: Selecionar todos

arq="c:\pasta\subpasta\EL100001.2A7" 
arqh=fcreate(arq,0) // cria arquivo 
if !arqh>0 
  ?"Erro na criação" 
  inkey(0) 
  quit 
endi 

use vendas new excl 
go top 
set cent on 
set date brit 
do whil !eof() 

  * forma a linha---------------------------------- 
  linha=pad(nomecli,60) // imaginando NOME com 60 
  linha=linha+strtran(dtoc(datavenda),"/","") // data 17122007 
  linha=linha+strzero(valor*100,10,0) // valor 12.55 -> "0000001255" 
  linha=pad(linha,315) 
  linha=linha+chr(13)+chr(10) // é isso ou é só chr(13)?? 

  * grava linha no TXT------------------------------------- 
  gravou=fwrite(arqh,linha) 
  if !gravou=len(linha) 
    ? "Erro na gravação" 
    inkey(0) 
    quit 
  endi 

  skip // próximo registro do DBF 
endd 

fclose(arqh) // fecha pra gerar o HASH do TXT

* gera hash--------------------------------------------- 
hash="123456swerwefsdfasdf0erif9eri09f 00fd vdf"
hash=pad(hash,315)+chr(13)+chr(10) 

* reabre o TXT
arqh=fopen(arq,2) // reabre arquivo 
if !arqh>0 
  ?"Erro na reabertura" 
  inkey(0) 
  quit 
endi 

fseek(arqh,0,2) // posiciona ponteiro no fim do TXT

gravou=fwrite(arqh,hash)  // grava hash no fim do TXT
if !gravou=len(hash) 
  ? "Erro na gravação" 
  inkey(0) 
  quit 
endi 

use 
fclose(arqh) 
Sergio Cabral
Usuário Nível 2
Usuário Nível 2
Mensagens: 52
Registrado em: 18 Set 2004 18:51
Localização: São José dos Campos

Nota Fiscal Paulista

Mensagem por Sergio Cabral »

Desculpe a minha ignorancia, parece que quero aproveitar todo o trabalho que voce teve. Em outras oportunidades ajudei colegas que precisavam por exemplo de rotinas para leitura de balanças.
Tenho muitos clientes que estão sendo precionados pelos seus contadores e pela fiscalização para geração do tal arquivo Nota Fiscal Paulista. Tenho muito pouco tempo, alias, não tempo nenhum pois o prazo deste clientes ja se esgotou e nem sei por onde começar.
Nem sei o que é esse tal de hash. Se voce puder me ajudar com relação a geração deste arquivo: como criar, que campos pegar, se tem outros arquivos a serem criados, o hash é um codigo fixo ou é uma formula, etc.
Isso é um pedido urgente mesmo de ajuda.
Ficarei muito grato pela ajuda.
Sou programador em Clipper 5.01 a 15 anos e procuro melhorar meus conhecimentos. Este site me parece muito bom e poderemos nos ajudar.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Não sei nada sobre essa NF paulista, mas sobre hash posso comentar: é um algoritmo que gera um número que corresponde ao conteúdo de um certo conjunto de dados. É como se fosse a impressão digital desse conteúdo. Algoritmos hash existem aos montes: CRC32, MD5, SHA1, etc. Creio que devem estar pedindo o MD5 no seu caso. Se for, melhor. Fiz uma LIB que contém uma função de cálculo do MD5. Veja neste link: http://pub.buzinello.com/index.php?d=./ ... pper/libs/

Se for o caso do CRC32, também não seria problema. É só navegar por entre os diretórios do link que passei, até chegar em sources. Mas eu duvido muito que precise dele pra esse trabalho. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

Mensagem por ALEX170970 »

PESSOAL:

Verificando a "Porcaria" CAT 52/2007, tem 2 layouts diferentes para geração dos arquivos. Ela foi alterada pela Portaria CAT 60/2007.

O LAYOUT QUE ESTÁ VALENDO É O DA PORTARIA CAT 60/2007.

FELIZ NATAL
ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

Mensagem por ALEX170970 »

Para gerar a assinatura de hash, façam o seguite:
Grave o arquivo com todos os registros, menos o EAD.
Inclua os comandos abaixo em seu fonte.

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
run OPENSSL genrsa -out MYKEY.PEM 1024
run OPENSSL rsa -in MYKEY.PEM -pubout -out PUBKEY.PEM
run OPENSSL dgst -md5 -sign MYKEY.PEM -out EAD.TXT -hex ARQENT.TXT
cEadTxt:=space(315)
cEadTxt:="EAD"+substr(memoread("EAD.TXT"),18,256)
cEadTxt:=cEadTxt+chr(13)+chr(10)
gravou:=fwrite(arqh,cEadTxt)
if !gravou=len(cEadTxt)
? "ERRO NA GRAVACAO DO REGISTRO"
inkey(0)
endif
gravou:=space(315)
return
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

//obs: os arquivos EAD.TXT e ARQENT.TXT devem ser previamente criados em branco, sem isso não funciona.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Nem sei o que é esse tal de hash
Sérgio Cabral,

No CPF, vc tem os dígitos de controle, usados pra validar o conjunto, certo? O CPF 123.456.789-09, por exemplo, tem a inscrição 123.456.789 (que é afinal o CPF) e os dígitos de controle 09, que são únicos para este CPF e são obtidos por uns simples cálculos sobre os dígitos da inscrição. Então, se alguém lhe passar o CPF 123.456.798-09 (dois dígitos invertidos), opa!, não confere!

O Hash tem a mesma finalidade. A diferença é que os cálculos que são feitos (o tal algoritmo) são muito mais complexos e visam validar um conjunto muito maior que os 9 dígitos de um CPF (ou os 12 do CPNJ, os 12 do EAN13, os 7 do EAN8 e assim por diante).

Vc cria por exemplo o arquivo TESTE.TXT, com 5.000 linhas, e o manda via e-mail pro Eolo. Como garantir que o Eolo receba todas as linhas corretamente e seja alertado quando por acaso alguma falha na transmissão corromper o arquivo? Uma forma é o HASH: você cria o "número HASH" do TESTE.TXT e o envia junto com o arquivo. O Eolo, quando o receber, recria "o número HASH" e o compara com o que vc mandou. Se os dois forem iguais, bingo!, o Eolo recebeu o arquivo corretamente.

Esta é a idéia.
ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

Mensagem por ALEX170970 »

Uma dica para os "desbravadores" das Portarias CAT 52/2007 e 60/2007:

Para quem precisar, tem os exemplos dos arquivos das referidas Portarias, para fazer o layout correto.

Acesse o site da Nota Fiscal Paulista no endereço abaixo:

http://www.nfp.fazenda.sp.gov.br/exemplos.zip
Avatar do usuário
pringles
Usuário Nível 3
Usuário Nível 3
Mensagens: 278
Registrado em: 29 Mai 2007 16:35
Localização: Botucatu-SP

Mensagem por pringles »

ALEX170970 escreveu: run OPENSSL genrsa -out MYKEY.PEM 1024
run OPENSSL rsa -in MYKEY.PEM -pubout -out PUBKEY.PEM
run OPENSSL dgst -md5 -sign MYKEY.PEM -out EAD.TXT -hex ARQENT.TXT
Isso mesmo, só que as duas primeiras linhas não devem ser executadas toda vez de se gerar o arquivo digital.
Nestas duas primeiras linhas, você cria as chaves, que devem ser utilizadas na geração do arquivo. Mas você deve gerar as chaves uma única vez. Depois disso, você só vai gerar a assinatura baseado nas chaves já geradas.
Sugestão: gere manualmente as chaves e insira no seu fonte somente a terceira linha, que irá gerar a assinatura baseada nas chaves já existentes.
Se gerar uma chave para cada arquivo, as chaves serão aleatórias e, portanto, a assinatura sempre será diferente (até mesmo para o mesmo arquivo, criptografado duas vezes seguidas).
CLIPPER 5.2 / BLINKER
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Olá caríssimos,
montei uma rotina para criar a extensão do arquivo à ser enviado para a receita, conforme a Cat52, e gostaria que os nobres amigos, fizessem as suas críticas. Precisei montar desta maneira, pois a impressora de um cliente aqui, é uma Schalter S-Print 2.04, não encontrável nem em museus. Sequer existe função para extrair o numero de série.

Neste caso específico, o nome foi fácil, haja vista que só existe uma impressora instalada. Complicado é a extensão. Segundo a CAT52, a extensão deve ser criada da seguinte maneira:
DMA - a identificação do dia, mês e ano do movimento, codificados com números de 1 a 9 e letras de A a Z, sendo que a letra A corresponde ao número 10

Código: Selecionar todos

#include "fileio.ch" 
set date format to "DD/MM/YYYY" 
nomearq:= "sc460671." 
extensao:= "" 
extensao:= extensao + montaext( subs(dtoc(date()),1,2) ) 
extensao:= extensao + montaext( subs(dtoc(date()),4,2) ) 
extensao:= extensao + montaext( subs(dtoc(date()),9,2) ) 

if (nhandle:= fcreate(nomearq+extensao,FC_NORMAL)) = -1 
   alert( "Problema na cria‡ao do arquivo. Erro n§ " + str(ferror()) ) 
else 
   fwrite(nhandle,reg00) // Reg00 é o registro E00 
   fclose() 
endif 

Function MontaExt(arg) 
if val(arg) < 10 
   return subs(arg,2,1) 
else 
  dif:= 35-val(arg) // onde 35 pela cat52 equivale ao z 
  dif:= 122-dif     // onde 122 em ascii equivale ao z 
  return chr(dif) 
endif 
Pelas contas, vai dar uma zica no ano 2035. Mas quando chegar lá, já estaremos no banco da praça comendo pipoca (caso ainda tenhamos dentes). Se bem que, estarei com a idade do Eolo hoje. ;)
Por favor, façam suas criticas.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
ALEX170970
Usuário Nível 1
Usuário Nível 1
Mensagens: 29
Registrado em: 06 Dez 2007 18:12
Localização: Santos-SP

Mensagem por ALEX170970 »

Pessoal:

Alguém sabe se os contabilistas de seus clientes estão conseguindo enviar os arquivos da Portaria CAT52/2007?

Sou contabilista e não estou conseguindo enviar nenhum arquivo.

Nem os arquivos novos e nem mesmo os arquivos que eu já enviei, fazendo o teste de envio agora, está dando erro:
O arquivo EL100001.1A7 foi recusado para processamento
Motivo: erro na validação do arquivo

Nem mesmo o suporte deles consegue informar qual é o erro. Somente informam que não atende ao layout.

Para mim o layout do arquivo está correto, com todos os registros inclusive a assinatura de hash de 1024 bits com 256 caracteres.

Meus clientes estão recebendo reclamações dos consumidores, pois os Cupons Fiscais não estão entrando no sistema da Secretaria da Fazenda. Para cada Cupom Fiscal não informado tem multa e não é barata.
Responder