Ir para conteúdo
  • Cadastre-se

dev botao

Sugestão De Modificação E Esclarecimento De Duvida


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 4123 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado (editado)

Boa noite pessoal;

 

Estava acompanhando alguns topicos em relação a CTe 2.0 entretanto não consegui localizar maiores informações referente as mesmas, em contrapartida estou enfrentando um pequeno problema durante a autorização de uma CTe;

 

A quem interessar possa, minha sugestão é quanto ao GerarXml e GerarChaveCTe; 

Pra ser mais especifico foram 3 alterações (o motivo explico depois);

 

 

1) pcteCTeWV104.inc, linha 170 +- fiz uma pequena alteração para utilizar o metodo GerarChaveCte o qual fiz uma breve modificação também.

 

.....

....

function TCTeW.GerarXml: boolean;
var
  chave: AnsiString;
  Gerar: boolean;
  xProtCTe : String;
begin
  chave := '';
 
  { comentei
    if not GerarChave(Chave, CTe.ide.cUF, CTe.ide.cCT, StrToInt(CTe.ide.modelo), CTe.ide.serie,
    CTe.ide.nCT, StrToInt(TpEmisToStr(CTe.ide.tpEmis)), CTe.ide.dhEmi, CTe.emit.CNPJ) then}
 
  if not GerarChaveCTe(Chave, CTe.ide.cUF, CTe.ide.cCT, StrToInt(TpEmisToStr(CTe.ide.tpEmis)), StrToInt(CTe.ide.modelo), CTe.ide.serie,
    CTe.ide.nCT, CTe.ide.dhEmi, CTe.emit.CNPJ) then
 
    Gerador.wAlerta('#001', 'infCte', DSC_CHAVE, ERR_MSG_GERAR_CHAVE);
.....
....
 
 
2) Alteração em pcnNFeW 
 
function TNFeW.GerarXml: boolean;
var
  chave: AnsiString;
  Gerar: boolean;
  xProtNFe : String;
begin
  chave := '';
  if NFe.infNFe.Versao >= 2 then
   begin
     FSchema := TsPL006;
     if not GerarChave(Chave, nfe.ide.cUF, nfe.ide.cNF, nfe.ide.modelo, nfe.ide.serie,
       nfe.ide.nNF, StrToInt(TpEmisToStr(nfe.ide.tpEmis)), nfe.ide.dEmi, nfe.emit.CNPJCPF) then
       Gerador.wAlerta('A01', 'infNFe', DSC_CHAVE, ERR_MSG_GERAR_CHAVE);
   end
  else
   begin
     FSchema := TsPL005c;
     if not GerarChaveCTe(chave, nfe.ide.cUF, nfe.ide.cNF, StrToInt(TpEmisToStr(nfe.ide.tpEmis)), nfe.ide.modelo, nfe.ide.serie,
       nfe.ide.nNF, nfe.ide.dEmi, nfe.emit.CNPJCPF) then
       Gerador.wAlerta('A01', 'infNFe', DSC_CHAVE, ERR_MSG_GERAR_CHAVE);
   end;
 
 
3) Modificação do GerarChaveCte, visando estabelecer da forma que consta no manual (ainda) 1.04 referente tpEmis – Forma de emissão do CT-e
 
 
Unit: pcnAuxiliar
 
function GerarChaveCTe(var chave: AnsiString; const codigoUF: integer; codigoNumerico: integer; TipoEmissao : Integer;
  const modelo, serie, numero: integer; const emissao: TDateTime; const CNPJ: string): boolean;
var
  digito: integer;
  wAno, wMes, wDia: Word;
begin
  result := true;
  try
    // Se o usuario informar 0; o código numerico sera gerado de maneira aleatória //
    while codigoNumerico = 0 do
    begin
      Randomize;
      codigoNumerico := Random(999999999);
    end;
    // se o usuario informar -1 o código numerico será gerado atravéz da função
    // GerarCódigoNumerico baseado no numero do documento fiscal.
    if codigoNumerico = -1 then
      codigoNumerico := GerarCodigoNumerico(Numero);
    //
    DecodeDate(emissao, wAno, wMes, wDia);
    chave := 'CTe' +
      IntToStrZero(codigoUF, 2) +
      Copy(FormatFloat('0000', wAno), 3, 2) +
      FormatFloat('00', wMes) +
      copy(SomenteNumeros(CNPJ) + '00000000000000', 1, 14) +
      IntToStrZero(modelo, 2) +
      IntToStrZero(serie, 3) +
      IntToStrZero(Numero, 9) +
      IntToStrZero(TipoEmissao, 1) +     <------------
      IntToStrZero(codigoNumerico, 8);   <------------
    GerarDigito(digito, chave);
    chave := chave + IntToStr(digito);
  except
    chave := '';
    result := false;
    exit;
  end;
end;
 
 
Sugestão de preenchimento das tags CTe;
....
...
    FCTe.Ide.modelo  := '57';
    FCTe.Ide.serie   := FSerie;
    FCte.Ide.cCT     := -1;           <<<<------------ informe -1
    FCTe.Ide.nCT     := FNumero;
    FCTe.Ide.dhEmi   := dhEmissao;
    FCTe.Ide.tpImp   := tiRetrato;
...
...
 
 
 
Motivo;
 
Hoje a tarde, depois de dias, inúmeros testes, e por necessidade houve a primeira tentativa de emissão de uma CTe em produção, resultado? o pior possivel: nenhum;
Simplesmente não sei o que houve, agora tentando com o mesmo numero de CTe 1, Serie 1; Obtenho a seguinte mensagem de erro:
 
1->Rejeicao: Duplicidade de CT-e, com diferença na Chave de Acesso  [chCTe:43100003741872000107570010000000011078888360][nRec:431000004474279]
 
Estranho que consultando a chave citada mostra a mesma como homologação, mas a mensagem ocorre durante a tentativa de autorização em produção; Enfim; Vou estudar mais um pouco e aguardar as opiniões dos colegas, mas esgotadas as possibilidades mais um teste farei (com numero 2);
 
As modificações sugeridas surgiram em virtude de a funcão anterior GerarChave utilizar o tal cCT por padrão para criar um numero randomico para os penultimos 9 digitos da Chave da CTe. O que em certo caso, de maneira prática vai impossibilitar a consulta da CTe (se já emitida), porque teria que ir 'testando' a chave até achar o numero;
 
 
Por curiosidade (duvidas)
Porque estes 8 digitos (cCT - Código Numérico que compõe a Chave de Acesso) na chave tem que ser "de certa forma" aleatórios e preenchidos? não pode ser zeros? só gostaria de entender os motivos... se ainda for relevante!
 
 
 
 
Editado por Elazar
  • Moderadores
Postado

Bom dia 

vou aproveitar que li o tópico e responder

o caso seria Elazar que é fácil qualquer um saber a chave de seu ct-e

não concorda? pois seria um sequencial, eu só precisaria de informações básicas se sua empresa 

e poderia consultar seu movimento todo, pois é possível através do portal e da chave eu ver!!;)

acho que é a mesma forma que ocorre com a chave da nf-e.

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Amigo, sugiro que você leia o manual do contribuinte, na página 77 tem a forma como deve ser montada e ela não possui este novo campo que você incluiu.  Lá está informando também sobre o campo aleatório que citou.

- Sou desenvolvedor.

- De que linguagem, delphi? .NET? Java?

- Qualquer uma, sou desenvolvedor.

Postado

Juliomar, Realmente não tinha pensado por este ponto de vista, por experiencia foi justamente este o motivo de perguntar. Mas acabei utilizando a outra opção (com o valor -1) que ele não preenche com zeros e sim faz um calculo com o numero do documento (ou seja é possível chegar ao valor da chave novamente se souber como foi feito internamente); Acredito que desta forma não fica simplesmente com zeros de forma fácil de ser reconhecida por qualquer um!

 

Mark Apollo, Acabei de verificar e está correto como informei, no manual 1.04 onde tem a diferença de 1 digito (a menos) no campo cCT para deixar espaço para o tipo de emissão. Olhe na pagina 78, exatamente as duas ultimas linhas (continuando na 79) descrevem este fato; Logo a sugestão não está descartada.. hehe, ficou irrisória, vou manter por hora!

De forma consolidada para a 1.04 a especificação diz (abaixo) ... mas claro que acredito que isto não é um problema!
 

cUF - Código da UF do emitente do Documento Fiscal 
• AAMM - Ano e Mês de emissão do CT-e 
• CNPJ - CNPJ do emitente 
• mod - Modelo do Documento Fiscal 
• serie - Série do Documento Fiscal 
• nCT - Número do Documento Fiscal 
• tpEmis – Forma de emissão do CT-e   1 digito
• cCT - Código Numérico que compõe a Chave de Acesso *8 digitos
• cDV - Dígito Verificador da Chave de Acesso 
 
 
Resolução do problema
Aproveito o post para explicar o que houve comigo, pois achei a solução. Ocorre que uso alguns procedimentos internos no fonte para evitar que acidentalmente eu, funcionários, colegas utilizem o sistema em modo de produção indevidamente, e isto mesmo que ocorreu, minha "trava alonsos" me pegou :-(; Logo tentava sempre autorizar em homologação, descobri ao ativar a opção para salvar os arquivos de resposta;
 
Fica a dica pra quem pensar nas próprias caso já tenha enganado-se com os ambientes de produção/homologação: Use a diretiva {$IFOPT D+} (delphi debugger information no google), claro por si só não é o suficiente, invente as suas, a que me atrapalhou/salvou foi uma do IP (de dentro da empresa) ninguém autoriza nada de verdade!
 
 
Galera;
Obrigado pelas respostas
  • Curtir 2
  • Consultores
Postado

Boa tarde Elazar,

 

Desculpe, não faz nenhum sentido a alteração que você fez.

 

Pois a lógica da função GerarChaveCTe é usada para gerar a chave do CTe na versão 1.03

 

Já a lógica da função GerarChave é usada para gerar a chave da NFe, CTe (versão 1.04 e 2.00).

 

Da forma que os fontes estão escritos, o componente gera o XML do CTe em conformidade com o manual.

 

A minha aplicação faz mais de 2 anos que esta emitindo CT-e em ambiente de produção.

 

E temos o ACBrNFeMonitor que utiliza o componente ACBrCTe e esta gerando o XML sem nenhum problema.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado (editado)

Italo, boa noite, não se desculpe hehe; ainda mais se não faz sentido! :-P

 

Como havia duas funções, GerarChaveCTe e apenas GerarChave inicialmente havia imaginado que eu estava com algum problema nos fontes pois apenas a segunda era utilizada, o que não confirma dado sua resposta; O que houve é que dado um problema imaginei que era outro (com a chave) juntando com a existência dos dois métodos e ainda mais, sem saber da finalidade do primeiro (pra 1.03) me levou a modificar o mesmo e indicar como sugestão, pois, logo queria apenas frisar sobre a utilização de 9 digitos para o cCT ao invés dos 8 indicados no manual!

 

Bem, confirmando, sim, está correto desta forma como vocês todos indicaram!

 

Apenas uma ressalva quanto ao utilizar o cCT de forma randômica, pois se por algum motivo a chave for perdida não há meios descobrir a mesma, então de forma parcial a minha dica de utilizar o -1 para o cCT continua;

Editado por Elazar
  • Consultores
  • Solution
Postado

Bom dia a todos,

 

No que diz respeito a chave, não importa se é da NFe ou CTe, temos um campo que a SEFAZ chama de código que nas primeiras versões era de 9 digitos, agora é de 8.

 

A SEFAZ recomenda que esse código seja um número aleatório, muitos desenvolvedores acabam atribuindo a esse código o mesmo numero do documento fiscal.

 

Esta errado não, mas também não é o correto, por dois motivos:

 

1. a chave não tem um código de seguraça.

2. o numero do documento é de 9 digitos e o código de 8, logo no futuro essa aplicação vai ter que sofrer alterações.

 

Concordo com a resposta do Juliomar e dou uma outra dica.

 

A unica informação da chave que seria impossível recuperar no caso de perda é o código, pois bem, como estamos falado da chave do CT-e, ao salvar os dados do mesmo no banco de dados, podemos gerar utilizando o Randomize o código aleatório de 8 digitos e salvar o mesmo junto com os demais dados em um campo chamado CodigoCTe.

 

Pronto desta forma você consegue compor a chave sem nenhum problema quando houver a necessidade.

 

No meu sistema alem do campo CodigoCTe tenho também um outro campo chamado ChaveCTe onde armazeno a chave completa.

 

O CodigoCTe é salvo junto com os demais dados antes da emissão do CTe, neste momento o campo ChaveCTe recebe vazio.

 

Após a emissão do CTe atualizo o registro, em especial o campo ChaveCTe.

 

Como você pode ver com dois campos a mais na sua tabela fica resolvido o problema.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Excelente! Retiro o que disse sobre o código aleatório!

 

Por isto que digo que é bom falar com pessoas inteligentes :-)

 

...acho que tenho já algumas modificações anotadas pra fazer por aqui, estão incluídas as sugestões!

  • Este tópico foi criado há 4123 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.