Devido as alterações que entrarão em vigor em breve, estou postando aqui um trecho de código demostrando como cancelar uma nota utilizando o ACBrNFe e eventos, adicione a unit pcnConversao ao uses porque foram utilizados alguns conversores dessa unit.
// numero do lote de envio (somente um exemplo, pode-se utilizar seu proprio controle) NumeroLote := StrToInt(FormatDateTime('yymmddhhmm', NOW)); // carregar o xml da nota fiscal eletronica, pode ser omitido ACBrNFe.NotasFiscais.Clear; if not ACBrNFe.NotasFiscais.LoadFromString(XML) then raise Exception.Create('Não foi possível carregar o XML da Nota Fiscal Eletrônica correspondente!'); // Criar o cancelamento ACBrNFe.EventoNFe.Evento.Clear; ACBrNFe.EventoNFe.idLote := NumeroLote; with ACBrNFe.EventoNFe.Evento.Add do begin infEvento.chNFe := ChaveNFE; infEvento.CNPJ := Cnpj; infEvento.dhEvento := NOW; infEvento.tpEvento := teCancelamento; infEvento.detEvento.nProt := Protocolo; infEvento.detEvento.xJust := <Justificativa para o cancelamento, minimo de 15 caracteres>; end; // Enviar o evento de cancelamento if ACBrNFe.EnviarEventoNFe(NumeroLote) then begin with ACBrNFe.WebServices.EnvEvento do begin if EventoRetorno.retEvento.Items[0].RetInfEvento.cStat <> 135 then begin raise Exception.CreateFmt( 'Ocorreu o seguinte erro ao cancelar a nota fiscal eletrônica:' + sLineBreak + 'Código:%d' + sLineBreak + 'Motivo: %s', [ EventoRetorno.retEvento.Items[0].RetInfEvento.cStat, EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo ]); end; // retornos DataHoraEvento := EventoRetorno.retEvento.Items[0].RetInfEvento.dhRegEvento; NumeroProtocolo := EventoRetorno.retEvento.Items[0].RetInfEvento.nProt; XMLCancelamento := EventoRetorno.retEvento.Items[0].RetInfEvento.XML; CodigoStatus := EventoRetorno.retEvento.Items[0].RetInfEvento.cStat; MotivoStatus := EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo; end; end else begin with ACBrNFe.WebServices.EnvEvento do begin raise Exception.Create( 'Ocorreram erros ao tentar efetuar o cancelamento:' + sLineBreak + 'Lote: ' + IntToStr(EventoRetorno.idLote) + sLineBreak + 'Ambiente: ' + TpAmbToStr(EventoRetorno.tpAmb) + sLineBreak + 'Orgao: ' + IntToStr(EventoRetorno.cOrgao) + sLineBreak + sLineBreak + 'Status: ' + IntToStr(EventoRetorno.cStat) + sLineBreak + 'Motivo: ' + EventoRetorno.xMotivo ); end; end;
Sr.Regis:
Qual seria o procedimento para obter a resposta Sefaz Deferindo ou Indeferindo um Lote de Pedido de Prorrogação de Suspensão do Icms ?
Grato
Carlos
Desculpe mas não entendi a pergunta.
Sr. Regys:
A Nota Técnica 01_2015 criou a possibilidade de efetuar a prorrogação da Suspensão do Icms . Assim, o processo é : Envio do Evento e depois obter a resposta de Deferimento ou Indeferimento do Evento de Prorrogação.
Assim, eu gostaria lhe questionar se o sr. já implementou este recurso da Pesquisa do Deferimento/Indeferimento.
Grato
Carlos
Franca-Sp
Agora entendi, estamos falando do evento, segue exemplo:
Olá Régys
Estou com problema ao tentar imprimir a carta de correção.
o procedimento que fiz foi o seguinte:
ACBrNFe.EventoNFe.LerXMLFromString
(cdsConsultaNotaFiscal.FieldByName(‘XML’).AsString);
NotaFiscalDM.ACBrNFe.ImprimirEvento;
Utilizo o fastReport4
arquivo fr3 EVENTOS.fr3 o que vem do svn.
Erro que exibe na hora de imprimir:
Ocorreram os seguintes erros:
primeiro:
Classe não encontrada Datasets
Classe não encontrada Variables
Segundo:
Memo1: Erro na expressão ‘Eventos.”DescricaoTipoEvento”‘: Identifier expected
Variável ou campo desconhecido: Eventos.”TipoEvento”
Variável ou campo desconhecido: Eventos.”xCondUso”
Você deve estar utilizando a versão 4.x do FastReport, o ACBr utiliza a versão 5.x.
Verifique também se seu repositório ACBr está atualizado e se está utilizando o arquivo .fr3 atualizado conforme o repositório.
Boa tarde, quando executo essa rotina aparece: ‘elemento chNFe nao esperado….esperado CNPJ, CPF’
sabe o que pode ser?
Seria melhor você perguntar no fórum do projeto ACBr, anexando o arquivo gerado, assim poderia ser feita uma análise do arquivo e entender o que está ocorrendo, também seria interessante postar sua rotina de envio de cancelamento para verificar como você está fazendo.
Régys, fiz a mudança do cancelamento para o evento e esta tudo normal. Só estou com uma dúvida. Como faço para pegar o nome do xml do evento completo (diretorio+arquivo) após confirmação? É que gravo no banco de dados o caminho e não consegui encontrar. A função EventoRetorno.retEvento.Items[0].RetInfEvento.XML é o xml e não o caminho e nome do arquivo salvo.
Você pode carregar o valor dessa propriedade e gravar em disco ou usar o path do arquivo que é gerado na pasta configurada no componente ACBrNFe, veja a propriedade “Configuracoes.Arquivos.PathEvento”, os arquivos são gerados no path informado nela.
Oi Regys, muito bom o seu trabalho de esclarecimento, pois o cliente relatou que não está mais podendo cancelar NF-E…esta rotina mudou para evento de cancelamento? Estou no RS.
Enviei msg no fórum ACBR .
Grato, gilsonlongo
Obrigado, se você utiliza ACBr vai ser tranquilo então. 🙂
Olá Regys,
Estou atualizando a rotina de “cancelamento nfe – Como enviar um evento de cancelamento utilizando o ACBrNFe”, conforme trecho de code sugerido, mas dá erro logo que entra na rotina…
…
if not ACBrNFe1.NotasFiscais.LoadFromString(XML) then
raise Exception.Create(‘Não foi possível carregar o XML da Nota Fiscal Eletrônica correspondente!’);
dá erro
unit pcnNFeR;
raise Exception.Create(‘Não encontrei inicio do URI: Id=’);
Tentei usar o método open para pegar o arquivo xml já gerado pelo sistema, mas não deu certo.
… ACBrNFe1.NotasFiscais.LoadFromFile(OpenDialog1.FileName);
Se puder dar uma olhada, lhe agradeço.
Obrigado,
gilsonlongo
Passo Fundo RS
O método ACBrNFe1.NotasFiscais.LoadFromString deve ser usado quando você tem o conteúdo do XML, provavelmente você está passando o caminho do XML, se quiser passar o caminho do XML então utilize LoadFromFile.
Desculpa amigo, mas qual seria o camando para salvar o XML?
Após fazer o processo de carga e checagem da situação, bastaria salvar normalmente como um XML normal da NF-e: ACBrNFe.NotasFiscais.Items[X].XML, lembrando que precisa seguir o que falei anteriormente antes.
No caso o comando de salvar o XML seria o comando ACBrNFe.Configuracoes.Geral.Save(Diretorio de destino + nome do XML, XML)
Utilize: ACBrNFe.NotasFiscais.Items[X].SaveToFile(‘‘)
Amigo, muito obrigado agora entendi!!!
Amigo, estou lendo todas as respostas e consigo efetuar o cancelamento e carregar o XML, mas não estou entendendo a forma de gerar o arquivo XML do cancelamento para armazenar na pasta CAN, uma vez que utilizo comando LoadXML(), tem algum comando direto que consigo salvar o XML do cancelado?
Para ter um XML de NF-e com cancelamento precisa fazer o seguinte, primeiro colocar true na propriedade AtualizaXMLCancelamento do componente ACBrNFe, depois carregar o XML da NF-e, enviar o cancelamento, executar a rotina de verificação da situação da NF-e e ai sim, salvar o XML depois de retornado o status, mas lembre, guarde sempre o XML original porque esse é que é válido.
Para o pessoal de SP, adicionar os código abaixo para o cancelamento por evento.
Como na NT2012.003 achei que estava confuso o entendimento sobre 101 e 151, direcionei email para Sefaz de SP e obtive o seguinte retorno:
No caso do cancelamento como evento, o retorno poderá ser:
“135-Evento registrado e vinculado a NF-e” correspondente a “101” (cancelamento homologado) ou
“155-Evento registrado fora do prazo e vinculado a NF-e” correspondente a “151” (cancelamento homologado fora de prazo)
Quando você faz “if ACBrNFe.EnviarEventoNFe(NumeroLote) then” o componente já checa os códigos de retorno necessários, não precisa analisar o retorno, ele se encarrega de checar e retornar sempre verdadeiro ou falso.
ola estou com um problema para gerar uma NFe com o seguinte codigo:
CST := cst00;
ICMS.modBC := dbiValorOperacao;
ICMS.orig := oeNacional;
ICMS.pICMS := 17.00;
ICMS.vICMS := (CDSItemMovNota.FieldByName(‘SubTotal’).AsCurrency * 17.00) / 100;
ICMS.vBC := CDSItemMovNota.FieldByName(‘SubTotal’).AsCurrency;
esta dando o erro:
Total da BC ICMS difere do somatorio dos itens.
alguem pode me ajudar?
Por favor utilize o fórum do projeto ACBr (http://www.projetoacbr.com.br/) para sanar dúvidas, essa dúvida já foi discutida no fórum. Adiantando, você informou um valor diferente para o somatório das bases de icms do que foi calculado.
Poderia me ajudar e me dizer se este arquivo está correto os parâmetros amigo?
Qual arquivo?
UBALDO , provavelmente voce está informando base de calculo e icms para uma empresa do simples nacional (crt=1) . verifique !
Existe uma Forma de Cancelar sem ter que carregar o XML, já que tenho CHAVE E NUMERO DO PROTOCOLO ?
Para o cancelamento não é obrigatório carregar o XML, isso é feito para que atualize o XML e coisas do tipo.
Regys.. bom dia fiz a atualização do componente acbr mais quando vo no
ACBrNFe.EventoNFe meu componente não acho esta propriedade
tem alguma coisa a setar? me ajudem.. preciso resolver isso..
Sempre que atualizar recompile todos os pacotes utilizados para que o Delphi atualize as propriedades.
BLZ CONSEGUI ATUALIZAR… AGORA TA PEGANDO QUE NÃO TA ENCONTRANDO O CAMINHO DO XML.. TEM ALGUMA OPÇÃO QUE POSSO FAZER.. QUAL O CAMINHO QUE O ACBR VAI BUSCAR ESTE XML..? AGUARDO ABRAÇO
EventoRetorno.retEvento.Items[0].RetInfEvento.XML;
Utilize essa propriedade para ler o XML de retorno e gravar no seu Banco de Dados, mas os arquivos são sempre salvos a não ser que você não tenha marcado para salvar (ACBrNFe.Arquivos.Salvar)
O XML da CCe é gravado no diretório configurado na propriedade PathCCE
EU TO FAZENDO O CANCELAMENTO DA NFE NÃO CCE.. É A MESMA COISA..
Cancelamento é uma coisa CC-e(Carta de Correção Eletrônica) é outra, cancelamento cancela a nota, a carta de correção corrige a nota.
Li noutro artigo que os campos infEvento.chNFe, infEvento.CNPJ e infEvento.detEvento.nProt não são necessários se o XML for carregado anteriormente.
Isto é verdade?
Sim, é verdade, se ler o XML ele vai carregar automaticamente.
Entendi..
eu tinha desabilitado a opção de imprimir o DANFE com mensagem de cancelamento, assim como a atualização do XML na minha aplicação…
Mas usuário, sabe como é né… quer porque quer que fique da forma antiga.
Muito obrigado, mais uma vez.
Muito obrigado pelas ajudas que tem nos dado no blog!
Conteúdo objetivo e muito útil! Parabéns!
Uma pergunta:
Com o modo antigo de cancelamento o ACBr permitia imprimir um DANFE com os dizeres “Nota Cancelada” em vermelho, e enviava junto ao XML por email ao cliente.
Com o cancelamento por evento, a impressão de DANFE Cancelado, e envio de XML de cancelamento não são mais possíveis?
Mais uma vez,
Muito Obrigado.
Com os eventos não existe mais DANFE cancelado, existe sim o evento de cancelamento, você deve enviar o XML da NF-e e também o XML do evento de cancelamento para o destinatário.
No ACBr se você marcar a propriedade AtualizaXMLCancelamento para True, carregar o XML da NF-e e fazer a consulta ele vai atualizar e ficar da forma antiga.
Mas lembre de guardar o XML original da NF-e porque o XML válido é ele.
eu fiz em homologação e deu certo o cancelamento, mas não gerou XML nenhum, ficou apenas o XML anterior, o que falta fazer para gera-lo?
Você precisa ler o retorno do evento, como é mostrado no exemplo.
Eu não gravo o numero de protocolo no Banco de Dados, como posso recuperá-lo para passar como parâmetro no código? Obg!
Você pode lê-lo do XML da nota fiscal.
Caro Regys, esse cnpj é do emissor ou do cliente da nota?
Do emissor.
Boa Noite Regys.
Cancelei a nf-e por evento igual você fez no exemplo, mas eu consulto a nfe no sefaz e a mesma não consta o protocolo de cancelamento. Sabe dizer o que estou fazendo de errado ?
Você verificou se o evento de cancelamento foi registrado, não existe mais protocolo de cancelamento e sim o evento de cancelamento, todos os eventos são listados no site de consulta da NF-e.
Regys.
O Evento foi registro o Acbr não retornou nenhum erro, antes a gente consultava o cancelamento no site do sefaz. Agora onde eu vejo esse evento cancelado na nf-e ?
Att.
Como eu disse anteriormente, a consulta continua igual, o que muda é que agora ao invés de um protocolo de cancelamento você tem o evento de cancelamento, todos os eventos são listados juntamente com os dados da nota durante a consulta.
Estranho que para mim ocorre mesma coisa. E é muito estranho. Eu envio o evento de cancelamento e faço a consulta e me retorna que está autorizado o uso, não está cancelando. E detalhe só está ocorrendo com um único cliente. Eu pegando a base de dados dele e aqui na empresa eu cancelo funciona porém lá interno não faz o cancelamento. Porem consulta, envio, essas coisas tudo funciona normalmente.
Pode ser algum no webservice dele, você deve estar testando em ambiente de homologação, já seu cliente funciona em ambiente de produção, teria que ver melhor o cstat que retorna para seu cliente.
Regys, o que seria esse protocolo?
Número do protocolo de autorização da Nota Fiscal Eletrônica que você está tentando cancelar.
Já vi o erro aqui, obrigado, mas tenho uma duvida, quando eu faço um cancelamento eu tenho que criar algum xml? se sim, é um xml diferendo do padrão de envio?
Mais uma coisa, essa nota cancelada eu enho que anotar algo no xml dela?
Grato.
As regras da nota eletrônica valem também para o cancelamento, você deve enviar para o destinatário e também para a transportadora se houver.
A anotação que existe no cancelamento é somente o motivo do cancelamento.
Foi de muita ajuda! mas régys, como eu faco pra atualizar meu xml original? mudei aquela propriedade ACBrNFe1.Configuracoes.Geral.AtualizarXMLCancelado para True mas nao mudou :~ ainda permanece ao imprimir Autorizada. Se puder me ajudar..
Deixe marcado normal como está, e após o cancelamento faça uma consulta da situação da nota, lembrando que o XML precisa estar carregado no componente.
entendeu! no caso, depois de cancelar carrego o xml no componente e executo o comando: ACBrNFe1.Consultar;
seria boa se o componente ja fizesse isso, uma vez que digo pra ele atualizar apos o cancelamento 😉 vlw parceiro deu certinho aqui.
Veja que atualizar o XML da nota é errado, porque com os eventos, cada coisa passa a ter seu próprio XML, diferente do que era antigamente. O correto seria deixar o XML da nota quieto, sem alterar, e gravar o XML do evento também, eu particularmente gravo tudo, XML da Nota, esse depois de autorizados não mecho mais, XML de cancelamento, também não mecho, e todos os XMLs de eventos.
hum.. certo! entao vou apenas setar o danfe pra cancelado na hora da impressao e enviar o xml autorizado junto com o cancelado 😉
Obrigado régys, alterei o meu projeto como voce orientou e deu certo o cancelamento.
Otimo topico de Ajuda…
Muito bom msm… Nota 10
A rotina tem que ser implementada pois quando cancela uma nota fora do prazo retorna o código 155, e a rotina só trata como o código 135.
Pois também cometi este erro no sistema, o cliente cancelou a nota e o sistema deu o erro e não atualizou, pois saiu com a nota e foi multado por andar com uma nota cancelada.
RetInfEvento.cStat 135
O componente checa ambos os códigos, isso aconteceu porque você está checando a mão e você se esqueceu de checar, ao invés de fazer a checagem a mão, teste o retorno do método “EnviarEventoNFe” ele vai ser verdadeiro ou falso, falso sempre que não conseguir enviar ou o status retornado não for o esperado como aceito, ai sim, você checa o status para saber o que porque não aceitou.