ARQUIVO DE CUPOM FISCAL

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Curiosidade mórbida.
Como vc está gerando este arquivo ?

Uma outra coisa, percebi que voces mencionaram algo a respeito de "315 caracteres".
Apenas informando: o arquivo tem tamanho variável e não delimitado.
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 »

alaminojunior escreveu:Curiosidade mórbida.
Como vc está gerando este arquivo ?

Uma outra coisa, percebi que voces mencionaram algo a respeito de "315 caracteres".
Apenas informando: o arquivo tem tamanho variável e não delimitado.
Alamino Junior:

315 caracteres represanta o tamanho do maior registro do arquivo (no caso o registro E00, que tinha 315 e foi alterado para 297 caracteres pela Portaria CAT 60/2007). É usado apenas para inicializar a variável que recebe os dados para posterior impressão do registro no arquivo TXT. Eu tentei com space(1) e também deu erro.

Estou gerando cada registro com o tamanho solicitado:
E00 297 caracteres;
E01 166 caracteres;
E02 272 caracteres;
E12 101 caracteres;
E13 72 caracteres;
E14 191 caracteres;
E15 267 caracteres;
E16 90 caracteres;
E21 106 caracteres;
EAD 259 caracteres.

Se tiver algum com tamanho errado, por favor me corrija.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Não sei se acabaria dando na mesma, mas eu faço da seguinte maneira:
De um modo geral, vou somando strings, por exemplo:

Código: Selecionar todos

reg01:= "E01"
c2:= "98560671            "
c3:= "N"
c4:= "ECF-IF "
c5:= "SCHALTER            "
c6:= "SCHALTER S-PRINT    "
c7:= "2.04      "
c8:= space(8)
c9:= space(6)
c10:= "001"
c11:= "46081543000181"
c12:= "APL"
c13:= c14:= "00"+str(val(ecfred)-1,4)
c15:= c16:= dtos(ecfdat)
c17:= "01.00.00"
c18:= "PC5207 01.00.00"
Este é o meu registro E01, depois de testar a impressão, conferi as posições de cada registro, com as posições constantes na CAT60. Bateram todas.
Abra o arquivo gerado com um editor de textos e confira estas posições.
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 »

Eu estou fazendo assim, deve dar o mesmo resultado:

Código: Selecionar todos

//REGISTRO E01 *****OK
cEadTxt:=space(1)
cEadTxt:="E01"+cEcfSerie+cEcfMemAd+cEcfTipo+cEcfMarca+cEcfModel+cEcfSoft+cEcfData+cEcfHora+cEcfNume+cEcfCNPJ+"ALT"+ZeroEsq(nRedCRZ-1,6,0)+ZeroEsq(nRedCRZ,6,0)+DataAAAAmmDD(dRedData)+DataAAAAmmDD(dRedData)+"01.00.00PC5207 01.00.00"+chr(13)+chr(10)
GravaLinha()

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                function GravaLinha()
//Com a ajuda do colega EOLO.
gravou:=fwrite(arqh,cEadTxt)
if !gravou=len(cEadTxt)
   ? "ERRO NA GRAVACAO DO REGISTRO"
   inkey(0)
endif
//gravou:=space(315)
gravou:=space(1)
return

//-------------------------------------------------------------------------          
                                      function ZeroEsq(Var,compr,casas)
//acrescenta zeros a esquerda em variavel caractere
local var2:=space(compr), var3:=space(compr)
do case
   case casas = 1
        var:=var*10
   case casas = 2
        var:=var*100
   case casas = 3
        var:=var*1000
   case casas = 4
        var:=var*10000
endcase
var2:=str(Var,compr,0)
var3:=replicate("0",compr-len(alltrim(var2)))+alltrim(var2)
return var3
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -                       
                                      function DataAAAAMMDD(Var)
//Transforma uma data em string no formato AAAAMMDD
local ano:=space(4), mes:=space(2), dia:=space(2)
   ano:=str(year(var))
   mes:=str(month(var))
   if val(mes) < 10
      mes:="0"+ltrim(mes)
   endif
   dia:=str(day(var))
   if val(dia) < 10
      dia:="0"+ltrim(dia)
   endif
   aaaammdd:=alltrim(ano)+alltrim(mes)+alltrim(dia)
return
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -                    
Editado pela última vez por ALEX170970 em 21 Jan 2008 18:00, em um total de 1 vez.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Já conferiu as posições ?
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Um detalhe: Consultando aqui a CAT60, este registro E01, deve terminar exatamente na coluna 166.
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 »

Verifiquei todos os registros conforme a CAT 60, o layout está ok.

O seu cliente (ou o contador dele) está conseguindo transmitir para a Secretaria da Fazenda os arquivos que você está gerando?

Eu não estou conseguindo, dá sempre o mesmo erro:

O arquivo EL100001.1C7 foi recusado para processamento
Motivo: erro na validação do arquivo.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Erro na validação é uma resposta um tanto ambigua, não acha ?
Poderia este erro ser retornado por falha na transmissão ?
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Se achar conveniente, mande este arquivo para eu dar uma confrontada com o meu.
alaminojunior@ig.com.br
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
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 »

Os pacotes da Internet contém algoritmo de validação. Difícil passar algum erro.
[]'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 »

pringles escreveu:
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).
Ainda tenho uma dúvida:

Na linha de comando da geração do hash, (run OPENSSL dgst -md5 -sign MYKEY.PEM -out EAD.TXT -hex ARQENT.TXT) onde entra o arquivo para ser validado?

Já substituí por MYKEY.PEM, EAD.TXT e ARQENT.TXT, mas só gera o hash se a linha estiver exatamente como consta acima.

O problema é que está gerando sempre a mesma assinatura, até para arquivos diferentes.

Por favor, me ajude. Obrigado.
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 »

alaminojunior escreveu:Se achar conveniente, mande este arquivo para eu dar uma confrontada com o meu.
Verifiquei os registros que você mencionou, realmente tinha erros, mas agora está ok. Obrigado.

Apenas o registro EAD que continua gerando sempre igual. Como você está gerando a assinatura de hash?
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Alexandre, veja bem:

Código: Selecionar todos

run OPENSSL genrsa -out MYKEY.PEM 1024
run OPENSSL rsa -in MYKEY.PEM -pubout -out PUBKEY.PEM
Estas duas linhas vc executa uma unica vez, para gerar a sua chave privada baseada numa chave publica. Chave esta que fica gravada no arquivo MYKEY.PEM.
A ultima linha:

Código: Selecionar todos

run OPENSSL dgst -md5 -sign MYKEY.PEM -out EAD.TXT -hex ARQENT.TXT
Só lembrando que: ao invéz de mencionar o arquivo "arqent.txt", voce deve mencionar o arquivo que voce havia gerado com os registros.
Com isso é gerada a assinatura digital, que vai estar gravada em EAD.TXT
Depois disso vc precisa ler o conteudo de EAD.TXT e escrever no final do arquivo com os registros.

Que verborréia .... Espero que tenha ajudado menos que atrapalhado.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Outro detalhe: O arquivo EAD.TXT vai conter alguns caracteres a mais. Certifique de ler apenas o que interessa.

#define F_BLOCK 290
cbuffer:= space(F_BLOCK)

nhandley:= fopen("EAD.TXT")
if ferror() != 0
alert("Erro na abertura do arquivo de Assinatura Digital")
quit
else
if fread(nhandley,@cbuffer,F_BLOCK) <> F_BLOCK
alert("Quantidade de Bytes do HASH nÆo confere.")
quit
endif
endif
cbuffer:= subst(cbuffer,-256) // Aqui vc pega só o que interessa.
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 »

alaminojunior escreveu:Outro detalhe: O arquivo EAD.TXT vai conter alguns caracteres a mais. Certifique de ler apenas o que interessa.
Infelizmente, não estou conseguindo enviar o arquivo.

Fiz as alterações necessárias, mas continua o mesmo erro:
"O arquivo EL123456.1C7 foi recusado para processamento.
Motivo: erro na validação do arquivo"

Alguém sabe o que é ou já teve este problema?
Responder