|
Usuários |
|
84 Usuários Online
|
|
[Artigos]
Carta de Correção Eletrônica |
Publicado por rboaro : Quarta, Julho 04, 2012 - 08:33 GMT-3 (2013 leituras)
comentar Enviar para um amigo Versão para impressão
|
Evento para correção de erros na NFe
A Carta de Correção Eletrônica (CC-e) é uma novidade bastante aguardada pelos desenvolvedores que atuam no desenvolvimento de soluções de Nota Fiscal Eletrônica (NFe).
A NFe é um documento emitido e armazenado eletronicamente, com validade jurídica garantida por processo de assinatura digital. O principal objetivo da implantação desta modalidade é o acompanhamento em tempo real das operações comercias pelo Fisco e a substituição do modelo atual de emissão de documentos fiscais em papel, de forma a simplificar uma série de obrigações do contribuinte. Maiores informações podem ser obtidas através do portal nacional em www.nfe.fazenda.gov.br
A Carta de Correção é um evento para corrigir as informações da NFe. Neste artigo abordamos de forma simples e prática como é possível gerar, assinar e transmitir, a partir da sua aplicação, os arquivos XML da Carta de Correção.
Carta de Correção
Em 2010 a Nota Técnica 008 divulgou a primeira definição das especificações técnicas necessárias para a implementação da Carta de correção.
Neste documento fica claro que a CCe pode ser utilizada para corrigir as informações da NFe realizando a regularização de erros ocorridos durante a emissão do documento fiscal, desde que o erro não esteja relacionado com:
• as variáveis que determinam o valor do imposto tais como: base de cálculo, alíquota, diferença de preço, quantidade, valor da operação ou da prestação
• a correção de dados cadastrais que implique mudança do remetente ou do destinatário
• a data de emissão ou de saída
Além disso, o registro de uma nova CCe substitui a CCe anterior, assim a nova CCe deve conter todas as correções a serem consideradas.
A especificação inicial foi então atualizada e substituída em 2011 através da Nota Técnica 003, que divulgou alguns aperfeiçoamentos quanto a estrutura, validações e valores de preenchimento dos arquivos, dentre eles o fato de que a CCe pode ser transmitida em até 30 dias (720) horas após a data de autorização de uso da referida NFe.
A lista completa das Notas Técnicas estão disponíveis no link “Documentos> Notas Técnicas” disponíveis no portal oficial da NFe em www.nfe.fazenda.gov.br.
A Figura 01 mostra um exemplo assinado de arquivo XML de CCe onde é possível identificar o correto preenchimento do conteúdo bem como a estrutura dos campos com base nas especificações técnicas descritas nos documentos citados anteriormente.

Figura 01: Arquivo XML de CCe completo visualizado no Google Chrome Gerando arquivos de CCe
Para gerar arquivos de CCe, utilizamos o aplicativo “Demo_cce_.exe” disponibilizado no site www.igara.com.br/produto.php?cod_produto=121. O aplicativo mostrado da Figura 02 é um demo totalmente funcional desenvolvido em Delphi, que permite a geração dos arquivos XML a partir de informações digitadas pelo usuário em campos de texto que seguem o layout específico vigente. Após abrir o aplicativo, clicamos no botão “Novo CC-e”, alteramos qualquer conteúdo desejado e depois clicamos no botão “Salvar CC-e”. Por fim selecionamos o diretório onde desejamos salvar o arquivo .XML gerado.

Figura 02: Aplicativo em Delphi para geração de CCe
O arquivo gerado pode ser visualizado no Internet Explorer ou em qualquer outro browser de internet com suporte a XML, e o resultado é conforme mostrado na Figura 03. Perceba que o arquivo gerado, mostrado na Figura 03 é diferente do arquivo completo de CCe mostrado na Figura 01, isso porque o arquivo gerado é apenas o primeiro passo, agora teremos de assiná-lo e em seguida colocar o arquivo em um lote de correções.

Figura 03: Arquivo .xml de CCe visualizado no Google Chrome
Até o momento, o arquivo gerado não tem valor jurídico, pois ainda não foi assinado de forma que o emissor possa certificar a validade das informações fornecidas, bem como não há nada que garanta que este documento não foi alterado por terceiros sem o conhecimento prévio do emitente.
No artigo “Assinatura Digital para NF-e”, publicado anteriormente nesta coluna, abordamos e exemplificamos os aspectos envolvidos no uso de certificados digitais da CertiSign para assinatura dos arquivos NF-e gerados. O processo de assinatura de um arquivo de CCe é idêntico ao mostrado e as etapas descritas no artigo podem ser seguidas para assinar arquivos de CCe ou você pode continuar sua leitura e mostraremos como assinar os arquivos utilizando uma outra solução, indicada para aqueles que já estão mais familiarizados com o processo. Após assinados os arquivos estão prontos para serem colocados em um lote de correções. Para gerar arquivos de lote de CCe, utilizamos o aplicativo “Demo_enviCCe_.exe” disponibilizado no site www.igara.com.br/produto.php?cod_produto=121. O aplicativo mostrado da Figura 04 é um demo totalmente funcional desenvolvido em Delphi, que permite a geração dos arquivos XML de lote a partir de arquivos de Carta de Correção, previamente assinados ou não.

Figura 04: Aplicativo em Delphi para geração de Lote de CCe
Após abrir o aplicativo, selecionamos o caminho dos arquivos a serem colocados no lote através da árvore de pastas apresentada à esquerda da tela. À direita podem ser visualizados os arquivos contidos na pasta escolhida. Selecione quais arquivos XML de CCe devem ser adicionados ao lote que deseja gerar. Para selecionar mais de um, segure a tecla Ctrl e clique sobre os arquivos desejados. Uma vez selecionados os arquivos da NFe, é possível:
• Botão “Assinar arquivos Selecionados”: Assinar digitalmente todos os arquivos de CCe selecionados;
• Botão “Gerar Lote dos arquivos Selecionados”: Criar um lote contendo todas as cartas selecionadas; Para o uso desta opção parte-se do princípio que os arquivos de CCe selecionados já se encontram assinados.
• Botão “Assinar e Gerar Lote dos arquivos Selecionados”:Assinar todos os arquivos de CCe e logo em seguida criar um lote com todas as notas selecionadas; Para o uso desta opção parte-se do princípio que os arquivos de CCe selecionados não se encontram assinados.
Para realizar a assinatura dos arquivos XML de CCe o aplicativo faz chamada de função contida na Assinatura32dll.dll, passando conteúdo do arquivo a ser assinado conforme declaração mostrada a seguir.
Function fncAssinarXML(sXml: TStrings): String; SafeCall; external 'assinaturaNFe32dll.dll';
A assinaturaNFe32dll.dll é um produto desenvolvido para facilitar e agilizar o processo de assinatura digital de arquivos de NFe. O objetivo é disponibilizar uma solução simples e acessível a todos os desenvolvedores onde, através da chamada de uma única função, seja possível se indicar o conteúdo a ser assinado, abstraindo a complexidade desta camada, que envolve conhecimentos aprofundados acerca de funções e tecnologias de certificação. Sendo assim a dll contém um única função que recebe como parâmetro uma variável TStrings com o conteúdo a ser assinado e retorna o conteúdo devidamente assinada como String. Mais simples que isso, impossível! Com a chamada de uma única função o arquivo desejado já está assinado! Não é preciso ter nenhum conhecimento aprofundado sobre como se dá o processo de assinatura digital, e dessa forma abstrai-se completamente a camada relativa às funções necessárias e tecnologias utilizadas. A diferença entre o arquivo não assinado e o arquivo assinado digitalmente estará no conteúdo das últimas chaves do arquivo XML em questão, onde após o processo de assinatura, os campos de DigestValue, SignatureValue e X509Certificate passarão a conter dados criptografados que identificam unicamente o arquivo XML em questão e atestam que o mesmo foi assinado somente por pessoa detentora de determinado token e da senha de acesso do mesmo, bem como que seu conteúdo não foi alterado após a assinatura. Após assinado e adicionado a um lote o arquivo de CCe estará com estrutura idêntica a mostrada na Figura 01 e pronto para ser transmitido. Para se certificar que o arquivo foi corretamente gerado, assinado e adicionado a um lote, podemos utilizar o validador oficial de arquivos de NFe disponibilizado pela SEFAZ em http://www.sefaz.rs.gov.br/nfe/nfe-val.aspx
Para testar seu arquivo basta abrir o arquivo XML desejado no Bloco de Notas do Windows, copiar seu conteúdo completo, colá-lo no campo de dados e clicar no botão “Validar”. Quando submetemos o arquivo mostrado na Figura01 ao validador o resultado da validação foi conforme mostrado na Figura 03, indicando que tanto o conteúdo quanto a estrutura do arquivo estão corretos.

Figura 05: Validação de arquivo de CCe usando validador oficial online.
Importante ressaltar que este validador pode ser utilizado para validar qualquer tipo de mensagem de NFe, incluindo Notas em si, Cartas de Correção, Cancelamento, Inutilização, Consulta e etc. Transmitindo arquivos de CCe
Para demonstrar como é fácil transmitir uma CCe, utilizaremos a transmissaoNFe32dll.dll e o aplicativo demo totalmente funcional que a acompanha e pode ser obtido a partir do site www.igara.com.br/produto.php?cod_produto=121.
Após o download, executamos o aplicativo e clicamos no botão “1. Selecione o arquivo XML a ser transmitido”. Um componente da classe TOpenDialog é utilizado para apresentar ao usuário uma caixa de seleção de arquivos, onde o mesmo indicará o arquivo .XML a ser transmitido. O código do evento OnClick do botão é conforme mostrado a seguir.
procedure TForm1.Button12Click(Sender: TObject);
begin
//Diretório inicial será o diretório onde a aplicação está executando
opendialog1.InitialDir := ExtractFileDir(application.ExeName);
//Abre caixa de seleção de arquivos
if OpenDialog1.Execute then
begin
xml_filename := OpenDialog1.FileName;
//Apresenta XML escolhido em modo browser
WebBrowser1.Navigate(xml_filename);
//Apresenta XML escolhido em modo texto
memo1.Lines.LoadFromFile(xml_filename);
end;
end;
A Figura 06 apresenta o resultado da execução de tal procedimento, onde após a seleção do arquivo .XML, o mesmo é carregado em componentes da classe TMemo e TWebBrowser, conforme mostrado no lado esquerdo da Figura 06.

Figura 06: Aplicativo demo de transmissão de arquivos de NFe incluindo CCe. Seleção da NFe a ser transmitida.
Uma vez carregado o arquivo desejado, selecione o tipo de transação que será executada com o servidor. Para cada tipo de transação disponível existe uma opção no componente da classe TRadioGroup. Os Portais das Secretarias de Fazenda Estaduais disponibilizam serviços diferentes para a transmissão de cada tipo de arquivo, o os arquivos de CCe devem ser transmitidos utilizando o serviço fncRecepcaoEvento.
Os serviços disponibilizados seguem a seguinte sistemática, conforme descrito na documentação oficial de NF-e:
• Para cada serviço oferecido existe um WebService específico. O fluxo de comunicação é sempre iniciado pelo aplicativo do contribuinte através do envio de uma mensagem ao WebService com a solicitação do serviço desejado.
• O WebService sempre devolve uma mensagem de resposta confirmando o recebimento da solicitação de serviço ao aplicativo do contribuinte na mesma conexão.
• A solicitação de serviço poderá ser atendida na mesma conexão ou ser armazenada em filas de processamento nos serviços mais críticos para um melhor aproveitamento dos recursos de comunicação e de processamento das Secretarias de Fazenda Estaduais.
• Os serviços podem ser síncronos ou assíncronos em função da forma de processamento da solicitação de serviços:
o Serviços síncronos – o processamento da solicitação de serviço é concluído na mesma conexão, com a devolução de uma mensagem com o resultado do processamento do serviço solicitado;
o Serviços assíncronos – o processamento da solicitação de serviço não é concluído na mesma conexão, havendo a devolução de uma mensagem de resposta com um recibo que apenas confirma o recebimento da solicitação de serviço. O aplicativo do contribuinte deverá realizar uma nova conexão para consultar o resultado do processamento do serviço solicitado anteriormente.
WebService é uma tecnologia utilizada para facilitar a comunicação e integração de sistemas distintos, tornando-os compatíveis, assim, aplicativos, independente de suas linguagens, utilizam uma padronização para enviar e receber dados de forma transparente. O que o WebService propõe é uma integração compreensível, reutilizável e padronizada. Para tanto, utiliza-se, como base de construção, o padrão XML e, para encapsulamento, o protocolo SOAP (Simple Object Access Protocol). Seu transporte normalmente é feito via protocolo HTTP. Após selecionar o serviço fncRecepcaoEvento, basta selecionar a UF para onde o arquivo será enviado e clicar no botão “5. Transmitir XML” para dar início ao processo de transmissão. O código executado no evento OnClick do botão é conforme segue. O procedimento executa uma chamada a uma das funções de transmissão contidas na dll, passando como parâmetro do tipo PChar o conteúdo do arquivo .XML carregado anteriormente. O resultado da chamada da função, contendo o retorno da transmissão, é atribuído a um segundo componente da classe TMemo.
procedure TForm1.Button1Click(Sender: TObject);
var
MyiUF, MyiTipo, i: Integer;
MysXML, MyversaoDados: PChar;
datahora_ini, datahorafim: TDateTime;
retorno: Pchar;
mystr: String;
begin
try
datahora_ini := now;
//Atribue valores das variáveis q serão passadas como parâmetro durante a transmissão
MyiUF := Cod_UF_IBGE(combobox1.text); //Consultar Anexo VII – Tabelas de UF, Município e País do Manual de Integração
MyiTipo := combobox2.ItemIndex + 1; //1 – Produção / 2 - Homologação
MysXML := PChar(memo1.Lines.Text); //Conteúdo XML a ser transmitido
MyversaoDados := PChar(copy_SubStr(MysXML, 'versao="', 4)); //versão do leiaute da estrutura XML informada na área de dados da mensagem
//Realiza a chamada da função da dll de acordo com o tipo de transação escolhida
//Consulte Manual de Integração para informações referentes ao valores dos parâmetros versão e versaoDados no cabeçalho da transmissão
retorno := '';
case radiogroup1.ItemIndex of
0: retorno := fncNfeRecepcao(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
1: retorno := fncCadConsultaCadastro(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
2: retorno := fncNfeCancelamento(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
3: retorno := fncNfeConsulta(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
4: retorno := fncNfeInutilizacao(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
5: retorno := fncNfeRetRecepcao(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
6: retorno := fncNfeStatusServico(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
7: retorno := fncSCERecepcaoRFB(MysXML, MyiTipo, MyversaoDados, checkbox3.checked, checkbox4.checked);
8: retorno := fncSCEConsultaRFB(MysXML, MyiTipo, MyversaoDados, checkbox3.checked, checkbox4.checked);
9: retorno := fncRecepcaoEvento(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked);
end;
//Este loop foi necessário pois o retorno do tipo PChar vem com #0 ao final. Isso fazia com q o ultimo caractere '>' sumisse ao converter PChar para String
mystr := '';
i := 0;
while retorno[i] <> #0 do
begin
mystr := mystr + retorno[i];
inc(i);
end;
memo2.Lines.text := mystr;
//memo2.Lines.text := retorno;
datahorafim := now;
except
showmessage('ATENÇAO: Erro durante a transmissão');
exit;
end;
showmessage('XML transmitido com sucesso. Verifique o retorno para informações de retorno');
label5.caption := 'Arquivo transmitido em ' + inttostr(SecondsBetween(datahorafim, datahora_ini)) + 'segundos';
end;
No momento da execução do código apresentado, surgirá uma tela para seleção do certificado digital a ser utilizado no processo de transmissão, conforme mostrado na Figura 07. Importante ressaltar que nesta tela é possível verificar as informações contidas no certificado, de forma a diferenciar os certificados entre si, para os casos de mais um certificado disponível em uma mesma máquina.

Figura 07: Seleção de certificado a ser utilizado no processo de transmissão
Após selecionar o certificado desejado, clique no botão “Ok”. Surgirá então a tela apresentada na Figura 08 a seguir. Neste momento, para finalizar o processo e efetivamente transmitir o documento é preciso fornecer a senha de registro do certificado digital selecionado. Conforme abordado em artigo anterior, no momento da aquisição do token, uma senha de acesso deve ser fornecida, sendo pessoal e intransferível, onde somente através dela é possível se utilizar das funcionalidades do certificado.

Figura 08: Confirmação de senha para uso do certificado
Após preencher a senha e clicar no botão “Ok”, o arquivo XML selecionado anteriormente será transmitido e o retorno do webService para a transmissão do XML será apresentado conforme demonstrado na Figura 09 a seguir.

Figura 09: Aplicativo demo de transmissão de NF-e. Retorno da transmissão da CCe
No exemplo mostrado na Figura 09, a transmissão foi realizada com sucesso e o retorno indicou que o lote foi processado corretamente, no entanto, a CCe foi rejeitada por motivo de duplicidade, uma vez que este arquivo já havia sido transmitido anteriormente e estávamos apenas realizando um teste usando um arquivo já validado. Novos arquivos funcionarão corretamente!
Agora basta clicar no botão “7. Salvar XML de Retorno” para que o procedimento de OnClick do botão execute a chamada a um componente da classe TSaveDialog, utilizado para apresentar ao usuário uma caixa de seleção de arquivos, onde o mesmo indicará o local em que arquivo .XML de retorno deve ser salvo. O código do evento OnClick do botão é conforme mostrado a seguir:
procedure TForm1.Button2Click(Sender: TObject);
begin
try
//Diretório inicial será o diretório onde a aplicação está executando
savedialog1.InitialDir := ExtractFileDir(application.ExeName);
//Concatena nome para arquivo de retorno
SaveDialog1.FileName := 'retorno_' + combobox1.Text + '_' + ExtractFileName(xml_filename);
//Salva arquivo de retorno
if savedialog1.Execute then
begin
memo2.Lines.SaveToFile(savedialog1.filename);
end;
except
showmessage('ATENÇAO: Erro durante o salvamento do retorno');
exit;
end;
showmessage('Arquivo de retorno salvo com sucesso');
end;
Qual o código necessário para chamar as funções de transmissão da dll e executar esta aplicação? Primeiramente é preciso fazer a declaração das funções da dll conforme mostrado a seguir
var
Form1: TForm1;
nfe_filename: String;
implementation
{$R *.dfm}
//Declaração de Funções disponiveis na dll
function fncNfeRecepcao(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
function fncCadConsultaCadastro(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
function fncNfeCancelamento(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
function fncNfeConsulta(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
function fncNfeInutilizacao(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
function fncNfeRetRecepcao(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
function fncNfeStatusServico(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
function fncRecepcaoEvento(sXML: PChar; iUF, iTipo: integer; versaoDados: PChar; usa_SCAN: Boolean; retorno_detalhado: Boolean; IgnoreInvalidCert: Boolean): PChar; StdCall; external 'transmissaoNFe32dll.dll';
Uma vez feita a declaração, é preciso realizar uma única chamada à função de transmissão do serviço desejado. O retorno da função conterá a resposta do webService para o arquivo transmitido. Para o caso de transmissão de um arquivo de Lote de CCe, o código a seguir demonstra da simplicidade da chamada realizada pelo aplicativo.
retorno := fncRecepcaoEvento(MysXML, MyiUF, MyiTipo, MyversaoDados, checkbox2.checked, checkbox3.checked, checkbox4.checked)
Note que não foi preciso ter nenhum conhecimento aprofundado sobre como se dá o processo de transmissão, e dessa forma abstrai-se completamente a camada relativa às funções necessárias e tecnologias utilizadas. Com a chamada de uma única função, o arquivo desejado já está transmitido!
A transmissaoNFe32dll.dll é um produto desenvolvido para facilitar e agilizar o processo de transmissão de arquivos de Nota Fiscal Eletrônica. O objetivo é disponibilizar uma solução simples e acessível a todos os desenvolvedores onde, através da chamada de uma única função para cada serviço, seja possível indicar o conteúdo a ser transmitido, abstraindo a complexidade desta camada, que envolve conhecimentos aprofundados acerca de funções e tecnologias de comunicação via WebService.
Sendo assim a dll contém uma função para cada serviço que recebe como parâmetro uma variável PChar com o conteúdo a ser transmitido e retorna a resposta do WebService. Mais simples que isso, impossível!
Conclusão
Com este artigo abordamos conceitos gerais sobre geração, assinatura e transmissão de arquivos de Carta de Correção Eletrônica, e vimos como é fácil emitir e transmitir tais documentos. Com a CCe tornou-se possível corrigir as informações da NFe realizando a regularização de erros ocorridos durante a emissão do documento fiscal.
A NF-e já é uma realidade, e a grande maioria das empresas já está obrigada a adotar este formato.
De agora em diante, transmitir uma CCe é questão apenas de chamar algumas funções sem se preocupar com muitos detalhes, simples assim!
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|