Autor: Lessandro.sup.pack
Este artigo orienta sobre a identificação e correção da rejeição retornada pela Receita Federal ao transmitir o evento de fechamento R-2099 da EFD-Reinf na DCTFWeb.
Quando ocorre o erro
A rejeição ocorre durante o envio do evento de fechamento R-2099 à EFD-Reinf, momento em que a Receita Federal impede a consolidação dos débitos na DCTFWeb. As causas do problema são:
-
Valores Zerados de Contribuição: Transmissão do evento R-2055 sem o devido destaque dos tributos ou com valores zerados de retenção, o que não é admitido pelas regras de validação da Receita Federal, salvo exceções previstas expressamente na legislação.
-
Reestruturação do Código de Receita: Descontinuidade do Código de Receita 121309 para novas apurações a partir da competência 04/2026, em atendimento à Nota Técnica EFD-Reinf nº 01/2026 e à Lei Complementar nº 224/2025.
Retorno de Erro do Webservice da Receita Federal:
Ticket = 01.000000001288615593 - Tipo: 2; Codigo 210; Descricao: 'O valor do ctValor do
DebitoApurado com codTrib = 121309 deve ser maior que ZERO'
Enquadramento Legal e Regras do Evento R-2055
Na aquisição de produção rural de Pessoa Jurídica por Entidade Executora do PAA (Programa de Aquisição de Alimentos), a responsabilidade tributária é distribuída da seguinte forma:
-
R-2050 (Vendedor - Produtor Rural PJ): Indicativo 8, responsável pelo recolhimento exclusivo do SENAR (0,25%).
-
R-2055 (Comprador - Entidade Executora): Indicativo 3, responsável pela apuração e recolhimento da CPP (Patronal) e do GIL-RAT (o SENAR não é destacado no evento R-2055 neste indicativo).
Com a entrada em vigor da Lei Complementar nº 224/2025 e o reajuste dos totalizadores pela NT EFD-Reinf 01/2026, as alíquotas aplicáveis ao Produtor Rural PJ sofreram as seguintes atualizações:
|
TRIBUTO / CONTRIBUIÇÃO |
ALÍQUOTA ANTERIOR (ATÉ 03/2026) |
NOVA ALÍQUOTA
|
OBSERVAÇÃO |
|---|---|---|---|
|
CPP (Contribuição Patronal) |
1,70% |
1,87% |
Informado no
|
|
GIL-RAT |
0,10% |
0,11% |
Informado no
|
|
SENAR |
0,25% |
0,25% |
Mantido (Recolhido no R-2050 pelo vendedor) |
Comportamento do Sistema e Atribuição do Código de Receita
O sistema não possui campo para digitação manual do Código de Receita, sendo responsável por gerar o arquivo XML do evento R-2055 estruturado com as bases de cálculo e os valores apurados das contribuições (CPP e GIL-RAT). A atribuição do Código de Receita e a consolidação dos débitos na DCTFWeb são efetuadas exclusivamente pelo webservice do totalizador R-9001 da Receita Federal no momento da recepção do evento.
Como efetuar o ajuste
-
Conferir os Parâmetros de Alíquota: Confirmar no sistema a aplicação das alíquotas de 1,87% (CPP) e 0,11% (GIL-RAT) para fatos geradores com competência a partir de 04/2026.
-
Verificar o Destaque dos Valores no R-2055: Garantir que as notas fiscais referentes a aquisições sob o Indicativo 3 possuam valores de retenção devidamente calculados e superiores a zero sobre a base de cálculo.
-
Retificar e Reenviar o Evento R-2055: Transmitir novamente os eventos R-2055 corrigidos para processamento das informações tributárias válidas pela Receita Federal.
-
Transmitir o Fechamento (R-2099): Após o reprocessamento correto do R-2055 pelo webservice, gerar e transmitir o evento de fechamento R-2099, permitindo a aceitação e consolidação dos débitos na DCTFWeb.
Caso possua alguma dúvida em relação às verificações desses tópicos, clique aqui.
<span style="opacity: 0">Como resolver o erro do Código de Receita 121309 na DCTFWeb ao enviar o R-2099? Quais são as alíquotas de CPP e GIL-RAT no evento R-2055 a partir da competência 04/2026? como corrigir o rro no evento de fechamento R-2099 Tipo: 2; Codigo 210; Descricao: 'O valor do ctValor do DebitoApurado com codTrib = 121309 deve ser maior que ZERO?</span>
<div id="text-end"></div>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-193974933-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag2(){dataLayer.push(arguments);}
gtag2('js', new Date());
gtag2('config', 'UA-193974933-1');
function gtagevents (action,category) {
console.log(category + ':' + action);
gtag2('event',action,{event_category:category,event_label: document.title});
};
</script>
<script src="https://player.vimeo.com/api/player.js"></script>
<script>
(function(){
// RASTREIO DE USO DO VÍDEO
function gtagvideo(action){
gtagevents(action,'Video')
}
var iframe = document.querySelector('iframe');
var player = new Vimeo.Player(iframe);
var seeking = false;
var priorTime = 0;
var currentTime = 0;
var reportouFinalDoConteudo = false;
// se pausar o play é acionado também.
player.on('play', function(data) {
if(data.seconds == 0){
gtagvideo('video-iniciado');
}
priorTime = data.seconds;
});
player.on('ended', function() {
gtagvideo('video-finalizado');
});
//seeking e timeupdate são disparados juntos, logo o tempo dos 2 é atualizado também. Preciso garantir que a variavel starttime seja atualizada ordenadamente (sempre antes ou após o seeking).
// pra isso preciso setar uma variavel no timeupdate e ler no seeking para garantir a ordem. Se ela estiver false será alterada na próxima iteração.
player.on('seeking', function(data) {
seeking = true;
});
player.on('pause',function(data){
gtagvideo('video-pausado');
});
player.on('timeupdate', function(data) {
if(seeking){
if(currentTime < priorTime){
gtagvideo('video-voltando');
}
if(currentTime > priorTime){
gtagvideo('video-avancando')
}
seeking = false;
}
priorTime = currentTime;
currentTime = data.seconds;
var finalDoConteudo = (data.duration - data.seconds) < 5;
if(finalDoConteudo && !reportouFinalDoConteudo){
gtagvideo('conteudo-finalizado')
reportouFinalDoConteudo = true;
}
});
player.on('fullscreenchange', function() {
gtagvideo('video-fullscreen');
});
})();
</script>
<script>
// RASTREIO DO USO DE AUDIO
(function(){
function gtagaudio(action){
gtagevents(action,'Audio')
}
var audio = document.querySelector("audio");
var seeking = false;
var priorTime = 0;
var currentTime = 0;
audio.addEventListener('play',function(){
if(audio.currentTime == 0){
gtagaudio('audio-iniciado');
}
priorTime = audio.currentTime;
});
audio.addEventListener('ended',function(){
gtagaudio('audio-finalizado');
});
audio.addEventListener('pause',function(){
gtagaudio('audio-pausado');
});
audio.addEventListener('seeking', function(data) {
seeking = true;
});
audio.addEventListener('timeupdate', function(data) {
if(seeking){
if(currentTime < priorTime){
gtagaudio('audio-voltando');
}
if(currentTime > priorTime){
gtagaudio('audio-avancando')
}
seeking = false;
}
priorTime = currentTime;
currentTime = audio.currentTime;
});
})();
</script>
<script>
(function(){
var terminou = false;
//RASTREIO DE LEITURA ATÉ O FINAL DA PÁGINA
document.addEventListener('scroll',() => {
if(document.getElementById('text-end').getBoundingClientRect().top < window.innerHeight){
if(!terminou){
terminou = true;
gtagevents('artigo-lido','Pagina')
}
}else{
terminou = false;
}
});
})();
</script>
<div id="text-end"></div>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-19PXZY9EEV"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag3(){dataLayer.push(arguments);}
gtag3('js', new Date());
gtag3('config', 'G-19PXZY9EEV');
function gtagevents (action,category) {
console.log(category + ':' + action);
gtag3('event',action,{event_category:category,event_label: document.title});
};
</script>
<script src="https://player.vimeo.com/api/player.js"></script>
<script>
(function(){
// RASTREIO DE USO DO VÍDEO
function gtagvideo(action){
gtagevents(action,'Video')
}
var iframe = document.querySelector('iframe');
var player = new Vimeo.Player(iframe);
var seeking = false;
var priorTime = 0;
var currentTime = 0;
var reportouFinalDoConteudo = false;
var reportouMetadeAssistido = false;
// se pausar o play é acionado também.
player.on('play', function(data) {
if(data.seconds == 0){
gtagvideo('video-iniciado');
}
priorTime = data.seconds;
});
player.on('ended', function() {
gtagvideo('video-finalizado');
});
//seeking e timeupdate são disparados juntos, logo o tempo dos 2 é atualizado também. Preciso garantir que a variavel starttime seja atualizada ordenadamente (sempre antes ou após o seeking).
// pra isso preciso setar uma variavel no timeupdate e ler no seeking para garantir a ordem. Se ela estiver false será alterada na próxima iteração.
player.on('seeking', function(data) {
seeking = true;
});
player.on('pause',function(data){
gtagvideo('video-pausado');
});
player.on('timeupdate', function(data) {
if(seeking){
if(currentTime < priorTime){
gtagvideo('video-voltando');
}
if(currentTime > priorTime){
gtagvideo('video-avancando')
}
seeking = false;
}
priorTime = currentTime;
currentTime = data.seconds;
var finalDoConteudo = (data.duration - data.seconds) < 5;
if(finalDoConteudo && !reportouFinalDoConteudo){
gtagvideo('video-conteudo-finalizado')
reportouFinalDoConteudo = true;
}
var metadeAssistido = data.seconds > (data.duration/2);
if(metadeAssistido && !reportouMetadeAssistido){
gtagvideo('video-metade-assistido')
reportouMetadeAssistido = true;
}
});
player.on('fullscreenchange', function() {
gtagvideo('video-fullscreen');
});
})();
</script>
<script>
// RASTREIO DO USO DE AUDIO
(function(){
function gtagaudio(action){
gtagevents(action,'Audio')
}
var audio = document.querySelector("audio");
var seeking = false;
var priorTime = 0;
var currentTime = 0;
audio.addEventListener('play',function(){
if(audio.currentTime == 0){
gtagaudio('audio-iniciado');
}
priorTime = audio.currentTime;
});
audio.addEventListener('ended',function(){
gtagaudio('audio-finalizado');
});
audio.addEventListener('pause',function(){
gtagaudio('audio-pausado');
});
audio.addEventListener('seeking', function(data) {
seeking = true;
});
audio.addEventListener('timeupdate', function(data) {
if(seeking){
if(currentTime < priorTime){
gtagaudio('audio-voltando');
}
if(currentTime > priorTime){
gtagaudio('audio-avancando')
}
seeking = false;
}
priorTime = currentTime;
currentTime = audio.currentTime;
});
})();
</script>
<script>
(function(){
const tamanhoDaTela = window.innerHeight;
let terminou = false;
let chegouNaMetade = false;
// se não remover o tamanho da tela do meio da página, o evento só será disparado quando o meio da página estiver acima da área visível.
// fazendo dessa forma assim que o meio da página estiver visível na base da janela o evento será disparado.
const meioDoTexto = (document.getElementById('text-end').getBoundingClientRect().top / 2) - tamanhoDaTela;
//RASTREIO DE LEITURA ATÉ O FINAL DA PÁGINA
document.addEventListener('scroll',() => {
if(document.getElementById('text-end').getBoundingClientRect().top < tamanhoDaTela){
if(!terminou){
terminou = true;
gtagevents('artigo-lido','Pagina')
}
}else{
terminou = false;
}
//RASTREIO DE LEITURA ATÉ O MEIO DA PÁGINA
if(meioDoTexto < window.scrollY) {
if(!chegouNaMetade){
gtagevents('artigo-lido-ate-metade','Pagina');
chegouNaMetade = true;
}
} else {
chegouNaMetade = false;
}
});
})();
</script>