Boa tarde,
Encontrei um caso nos eventos do CT-e que pode causar problemas no cancelamento quando o CNPJ é informado com máscara.
Na unit ACBrCTe.EnvEvento, procedure Gerar_InfEvento, na linha 759, a forma de preencher a variável sDoc foi alterada.
Antes:
sDoc := OnlyNumber(Evento[Idx].InfEvento.CNPJ);
Agora:
sDoc := RemoverLiteralChave(Evento[Idx].InfEvento.CNPJ);
Logo em seguida existe a validação:
if Length(sDoc) = 14 then
O problema é que, caso Evento[Idx].InfEvento.CNPJ esteja formatado (por exemplo, 18.899.945/0001-52), a função RemoverLiteralChave não remove a máscara, retornando o valor exatamente como foi informado.
Com isso, Length(sDoc) deixa de ser 14 e o código acaba tratando o documento como CPF, gerando a tag <CPF> no XML em vez de <CNPJ>, o que resulta na rejeição pela SEFAZ.
Ao analisar a função RemoverLiteralChave, observei que ela foi projetada para remover prefixos textuais (como em chaves iniciadas por "CTe" ou "NFe"), e não para sanitizar CPF/CNPJ.
Na minha opinião, o comportamento anterior era o mais adequado quando cnpj era numérico agora, poderia ser utilizada a função OnlyAlphaNum (da unit ACBrUtil.Strings) para garantir que o documento contenha apenas os dígitos antes da validação.
Essa alteração foi introduzida na revisão 46791.
Segue em anexo o arquivo com a alteração proposta.
ACBrCTe.EnvEvento.pas