Tratamento de Guia Simples e com Múltiplas Receitas
A partir da versão 2.0 do GNRe Nacional algumas UFs pararam de aceitar o envio de guias com Múltiplas Receitas, isso pode ser conferido acessando o item Consulta de Versões das UF's no site da GNRe Nacional.
Como pode ser visto na imagem a seguir, todas UFs permitem Guia Simples, mas apenas algumas UFs estão permitindo Múltiplas Receitas.
Desta forma, recebemos rejeição quando tentamos enviar guias de algum xml destinatário (NFe ou CTe) que contenha mais de um valor de receita e a UF Favorecida não aceita Múltiplas Receitas. Com isto fica a cargo do desenvolvedor fazer essa tratativa no seu sistema, para enviar apenas Guias Simples quando a UF Favorecida não aceita Múltiplas Receitas.
Percebendo esse problema, disponibilizamos em nosso componente GNRe alguns métodos para facilitar esse controle em seu sistema, os métodos são getUFPermiteAReceita, getUFPermiteMultiplasReceitas e getValorReceitaXml
A seguir estamos disponibilizando um exemplo de como poderia ser feita essa tratativa para enviar apenas Guias Simples para as UFs que não aceitam Múltiplas Receitas.
Exemplo em Delphi
procedure EnviarGuias(aCnpjCpf: string; aXmlDestinatario: string; aTx2Complementar: string;
aReceitasInformadas: string);
var
_spdGnre: TspdGnre;
_uf, _receita, _valorReceita: string;
_listaReceitas: TArray<string>;
_i: Integer;
procedure CarregarListaReceitas;
begin
if aReceitasInformadas <> EmptyStr then
_listaReceitas := TRegEx.Split(aReceitasInformadas, ',') //add ao uses RegularExpressions
else
begin
SetLength(_listaReceitas, 4);
_listaReceitas[0] := 'PartilhaICMS';
_listaReceitas[1] := 'ST';
_listaReceitas[2] := 'FCP';
_listaReceitas[3] := 'Transporte';
end;
end;
procedure EnviarExportarGuia(aReceitas: string);
var
_numeroRecibo, _xmlRetEnvioGNRe, _xmlRetConsultaGNRe: string;
begin
_xmlRetEnvioGNRe := _spdGnre.EnviarGuia(aXmlDestinatario, aTx2Complementar, aReceitas);
_numeroRecibo := _spdGnre.ExtrairNumeroRecibo(_xmlRetEnvioGNRe);
Sleep(2000); //Aguarda 2 segundos, tempo para o WS retornar a resposta completa ao consultar o recibo
_xmlRetConsultaGNRe := _spdGnre.ConsultaReciboGuia(_numeroRecibo, _uf, aCnpjCpf);
_spdGnre.ExportarGnre(_xmlRetConsultaGNRe, '', ExtractFilePath(ParamStr(0)) + 'PDFs\' + _numeroRecibo + '.pdf');
end;
begin
//A partir da versão 2.0 diversas UFs pararam de permitir envio de múltiplas receitas
//Então nesses casos é necessário realizar envio de guias simples
//Esse é um exemplo de como podemos tratar envio de guia simples ou de múltiplas receitas
_spdGnre := TspdGnre.Create(nil);
try
_spdGnre.ConfigurarSoftwareHouse(aCnpjCpf, '*** informar seu token ***');
_spdGnre.LoadConfig(ExtractFilePath(ParamStr(0)) + 'gnreConfig.ini');
_uf := _spdGnre.ExtrairUFDestinatario(aXmlDestinatario);
//1) Se a UF permite multiplas receitas -> podemos enviar nosso xml sem filtrar a receita
// Dessa forma poderá ser gerada 1 guia com multiplas receitas (caso tenha + de 1 receita no xml destinatario)
// ou 1 guia simples (caso tenha apenas 1 receita no xml destinatario)
if (_spdGnre.getUFPermiteMultiplasReceitas(_uf)) then
EnviarExportarGuia(aReceitasInformadas)
//2) Se a UF não permite múltiplas receitas -> criamos um laço com as 4 receitas
// Dessa forma poderão ser geradas + de 1 guia simples para o xml destinatário
else
begin
CarregarListaReceitas;
for _i := 0 to Length(_listaReceitas) - 1 do
begin
_receita := _listaReceitas[_i];
//Só vamos gerar das receitas que a UF permite e que a receita tenha valor
if _spdGnre.getUFPermiteAReceita(_uf, _receita) then
begin
_valorReceita := _spdGnre.getValorReceitaXml(aXmlDestinatario, _receita);
if (_valorReceita <> EmptyStr) and (_valorReceita <> '0.00') then
EnviarExportarGuia(_receita);
end;
end;
end;
finally
_spdGnre.Free;
end;
end;
Exemplo em CSharp
private void EnviarGuias(string aCnpjCpf, string aXmlDestinatario, string aTx2Complementar)
{
//A partir da versão 2.0 diversas UFs pararam de permitir envio de múltiplas receitas
//Então nesses casos é necessário realizar envio de guias simples
//Esse é um exemplo de como podemos tratar envio de guia simples ou de múltiplas receitas
spdGnreX _spdGnreX = new spdGnreX();
var _listaReceitas = new List<string>() { "PartilhaICMS", "ST", "FCP", "Transporte" };
string _numeroRecibo;
string _xmlRetEnvioGNRe;
string _xmlRetConsultaGNRe;
try
{
_spdGnreX.ConfigurarSoftwareHouse(aCnpjCpf, "*** informar seu token ***");
_spdGnreX.LoadConfig(Application.StartupPath + "gnreConfig.ini");
string _uf = _spdGnreX.ExtrairUFDestinatario(aXmlDestinatario);
//1) Se a UF permite multiplas receitas -> podemos enviar nosso xml sem filtrar a receita
// Dessa forma poderá ser gerada 1 guia com multiplas receitas (caso tenha + de 1 receita no xml destinatario)
// ou 1 guia simples (caso tenha apenas 1 receita no xml destinatario)
if (_spdGnreX.getUFPermiteMultiplasReceitas(_uf))
{
//Envia, consulta o recibo e exporta para PDF
_xmlRetEnvioGNRe = _spdGnreX.EnviarGuia(aXmlDestinatario, aTx2Complementar, "");
_numeroRecibo = _spdGnreX.ExtrairNumeroRecibo(_xmlRetEnvioGNRe);
Thread.Sleep(2000); //Aguarda 2 segundos, tempo para o WS retornar a resposta completa ao consultar o recibo
_xmlRetConsultaGNRe = _spdGnreX.ConsultaReciboGuia(_numeroRecibo, _uf, aCnpjCpf);
_spdGnreX.ExportarGnre(_xmlRetConsultaGNRe, "", Application.StartupPath + @"PDFs\" + _numeroRecibo + ".pdf", "");
}
//2) Se a UF não permite múltiplas receitas -> criamos um laço com as 4 receitas
// Dessa forma poderão ser geradas + de 1 guia simples para o xml destinatário
else
{
foreach (var receita in _listaReceitas)
{
//Só vamos gerar das receitas que a UF permite e que a receita tenha valor
if (_spdGnreX.getUFPermiteAReceita(_uf, receita))
{
string _valorReceita = _spdGnreX.getValorReceitaXml(aXmlDestinatario, receita);
if ((_valorReceita != "") && (_valorReceita != "0.00"))
{
//Envia, consulta o recibo e exporta para PDF
_xmlRetEnvioGNRe = _spdGnreX.EnviarGuia(aXmlDestinatario, aTx2Complementar, receita);
_numeroRecibo = _spdGnreX.ExtrairNumeroRecibo(_xmlRetEnvioGNRe);
Thread.Sleep(2000); //Aguarda 2 segundos, tempo para o WS retornar a resposta completa ao consultar o recibo
_xmlRetConsultaGNRe = _spdGnreX.ConsultaReciboGuia(_numeroRecibo, _uf, aCnpjCpf);
_spdGnreX.ExportarGnre(_xmlRetConsultaGNRe, "", Application.StartupPath + @"PDFs\" + _numeroRecibo + ".pdf", "");
}
}
}
}
}
finally
{
//Informando ao Garbage Collector que esse objeto deve ser gerenciado
if (_spdGnreX != null)
Marshal.FinalReleaseComObject(_spdGnreX);
//Passando null ao Objeto para que o Garbage Collector saiba que deve ser recolhido da memória
_spdGnreX = null;
//Chamar o garbage
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
OBS: Esse exemplo é apenas para dar uma ideia. Lembramos que é de responsabilidade do desenvolvedor qualquer implementação em seu sistema.
Comentários
0 comentário
Por favor, entre para comentar.