9. Gerar Lote de RPS [18-03-12]
9.2. RPS ABRASF v2.0 [18-03-12]
9.1. RPS ABRASF v1.0 [18-01-13]
« Anterior
9.3. RPS DSF
Próximo »

9.2. RPS ABRASF v2.0 [18-03-12]

Gerar Lote de RPS da recomedação ABRASF v2.0

Implementação da versão 2.0 da recomendação ABRASF

Somente algumas cidades já adotaram a versão 2.0 da recomendação ABRASF, assim consulte a documentação da prefeitura ou do provedor de solução. Nem todas as funcionalidades são oferecidas pelas cidades.

Assinatura

string geraLoteRPS_v2(string tipoLote, string LoteRPSTXT, string nroLote, string nomeCertificado, string cMunicipio, out int resultado, out string msgResultado, out string erros, string licenca);

Descrição:

Funcionalidade para gerar um lote de RPS a partir de um TXT, é a forma mais simples e rápida de gerar um Lote de RPS.

Esta funcionalidade:

Preenchimento do nomeCertificado

informar o Nome do titular (campo Assunto) do certificado digital a ser utlizado na conexão SSL. Ex.: "CN=NFe - Associacao NF-e:99999090910270, C=BR, L=PORTO ALEGRE, O=Teste Projeto NFe RS, OU=Teste Projeto NFe RS, S=RS"

Parâmetros:

nome tipo fluxo descrição
tipoLote string entrada informar o tipo do lote que será gerado, o tipo do lote depende da funcionalidade que for utilizada para fazer o envio do RPS. Informar "G" - GerarNFSe ou "E" - EnviaRPS ou "S" - EnviaRPSSincrono.
loteRPSTXT string entrada informar a string com o TXT gerado de acordo com o leiaute da string TXT de entrada da DLL desta página, existem exemplos de arquivos TXT no pasta ..\NFSe_Util\ExemploXML do demo.
nroLote string entrada informar a string com o número do lote.
nomeCertificado string entrada informar o Nome do titular (campo Assunto) do certificado digital a ser utlizado na conexão SSL. Ex.: "CN=NFe - Associacao NF-e:99999090910270, C=BR, L=PORTO ALEGRE, O=Teste Projeto NFe RS, OU=Teste Projeto NFe RS, S=RS"
cMunicipio string entrada informar o código do IBGE do Município para o qual será enviado o lote de RPS.
Obs: Verifique se a cidade adota a versão 2.00 da recomdação ABRASF, 90% das cidades adotam a versão 1.00 da recomendação ABRASF.
resultado inteiro saída retorna o resultado da chamada da funcionalidade
msgResultado string saída retorna a literal do resultado da chamada da DLL
erros string saída retorna a lista de erros ocorridos na conversão
licenca string entrada informar a chave da licença de uso, deixar em branco para uso em ambiente de homologação

Leiaute da string TXT de entrada:


Orientação de preenchimento

  • padrão do string de entrada - o string TXT pode ter até 100 registro RPS de tamanho fixo de 3143 caracteres separados por CR/LF.

  • quantidade máxima de RPS por Lote - cada registro de 3143 caracteres representa um RPS, assim, a quantidade máxima de RPS permitidos é 100 registros de RPS, mas nem todos os municípios aceitam mais de 50 RPS por lote, também pode existir o limite no tamanho da mensagem (Ex. 500Kb), assim verifique os limites na documentação técnica do respectivo município.

  • preenchimento dos campos - Os registros são posicionais e os campos tem tamanho fixo que devem ser preenchidos da seguinte forma:

    • C - campo caractere, preechimento da esquerda para a direita, acrescentar brancos até completar o tamanho do campo;
    • DH - campo data e hora, com o seguinte formato: AAAA-MM-DDTHH:MM:SS;
    • D - campo data, com o seguinte formato: AAAA-MM-DDTHH:MM:SS;
    • N - campo numérico, prenchimento da direita para a esquerda, acrescentar zeros à esquerda até completar o tamanho do campo.
    • V - campo valor monetário, prenchimento da direita para a esquerda, acrescentar zeros à esquerda até completar o tamanho do campo. Os campos de valores devem ser informados sem o ponto decimal, respeitando a quantidade de 2 casas decimais. Informar com 2 decimais: Ex.: 100,00 -> 000000000010000, 1250,35 -> 000000000125035.
    • A - campo alíquota, prenchimento da direita para a esquerda, acrescentar zeros à esquerda até completar o tamanho do campo. Os campos de valores devem ser informados sem o ponto decimal, respeitando a quantidade de 4 casas decimais.
      Dependendo da prefeitura o campo é exigido em % (5.00) ou fração (0.05).
      Para informar em percentual (%), informe: 50000 -> 5.00, 43100 -> 4.31, 20000 -> 2.00
      Para informar na forma fracionária, informe: 00500 -> 0.05, 00431 -> 0.0431, 00200 -> 0.02
      FAQ - preenchimento da Aliquota
  • preenchimento de campos ou grupos opcionais - nem todos os RPS têm os grupos e/ou campos destacados na cor verde, quando não existir a informação o campo deve ser preechido com:

    • zeros, quando o campo for numérico;
    • brancos, quando o campo for caractere
  • diferença de leiaute dos RPS de cada município - não existe um padrão nacional de RPS, assim existem pequenas diferenças nos RPS de cada município ou provedor, sendo necessário consultar a documentação técnica disponibilizada pela prefeitura para fazer o correto preenchimento dos campos.

Solicitamos que entre em contato sempre que identificar alguma informação incorreta ou equívocada.

IMPORTANTE: A DLL somente oferece a funcionalidade para converter os dados informados no TXT para o XML do RPS, os esclarecimentos de como cada campo do RPS deve ser preenchido e quais seriam os valores válidos devem ser obtidos na documentação da prefeitura.

Falha na Assinatura

O certificado digital é responsável pela falha na assinatura, as principais causas são:

  • Uso de Certificado Digital sem chave privada - é comum o desenvolvedoer receber o arquivo de certificado digital de seu cliente sem a chave privada, este tipo de arquivo tem extensão cer, se este for o caso solicite o arquivo novamente e peça para exportar a chave privada. o arquivo gerado deve ter a extensão pfx e será protegido por senha.

  • Certificado Digital do tipo A3 ausente - o certificado digital do tipo A3 pode estar com mal contato ou ausente, tente reconectar o dispositivo e verifique o status do certificado digital no aplicativo de administração do certificado digital.

  • Certificado Digital do tipo A1 da CEF

    Download do Manual da CAIXA

    Existe um "macete" para utilizar o certificado digital da CAIXA:

    O problema deste certificado é que apesar de ser um certificado digital A1, ele age como se fosse um certificado digital A3 e utiliza o CSP próprio (cefcert.dll que fica na pasta csp da aplicação da caixa), que não tem suporte para o tipo de assinatura do projeto (só funciona para autenticação).

    Assim, é necessário fazer com que o certificado utilize o CSP do Windows.

    Os passos são:

    1. instalar o certificado digital conforme orientação da CEF;
    2. verificar o funcionamento do certificado e que o certificado consta da lista de certificados no Internet Explorer;
    3. exportar o certificado digital pelo Internet Explorer;
    4. desinstalar o aplicativo da CAIXA;
    5. verificar se a DLL não ficou na pasta da aplicação da CAIXA;
    6. importar o certificado digital exportado no item 3.

    Os passos acima funcionam para windows XP e vista, mas não existe garantia de funcionamento para o windows 7, assim se o equipamento tiver windows 7, tente fazer o processo em um equipamento que tenha windows XP, o certificado gerado no item 3 deve funcionar no windows 7.

  • Reinstale o Certificado Digital - se não for nenhum dos casos acima, tente reinstalar o certificado digital novamente.


Campo tipo tam. posição
inicial
posição
final
observação
IdentificacaoRps Numero N 15 1 15
Serie C 5 16 20
Tipo C 1 21 21 informar o código de tipo de RPS:
1 - RPS
2 - Nota Fiscal Conjugada (Mista)
3 - Cupom
DataEmissao DH 19 22 40 informar no formato:
AAAA-MM-DDTHH:MM:SS
Status C 1 41 41 informar o código de status do RPS:
1 - Normal
2 - Cancelado
RpsSubstituido Numero C 15 42 56 informar brancos nas posições 42 a 62 para omitir o grupo RpsSubstituído
Serie C 5 57 61
Tipo C 1 62 62 informar o Código de tipo de RPS:
1 - RPS
2 - Nota Fiscal Conjugada (Mista)
3 - Cupom
Competencia D 10 63 72 informar no formato:
AAAA-MM-DD
A competência de uma NFS-e é a data da ocorrência do fato gerador.
Servico Valores ValorServicos V 15,2 73 87 Informar o Valor Total dos Serviços
ValorDeducoes V 15,2 88 102 Informar o Valor total das Deduções
ValorPis V 15,2 103 117 Informar o valor total do PIS
ValorCofins V 15,2 118 132 Informar o valor total do COFINS
ValorInss V 15,2 133 147 Informar o valor total do INSS
ValorIr V 15,2 148 162 Informar o valor total do IR
ValorCsll V 15,2 163 177 Informar o valor total do CSLL
OutrasRetencoes V 15,2 178 192 Informar o valor total das Outras Retenções
ValorIss V 15,2 193 207 O valor do ISS é calculado pela aplicação da prefeitura que conhece o alíquota aplicável para o serviço e não precisa ser informado, com exceção de:
O Código do Município da Incidência for diferente ao Município Gerador do Documento (tributada fora do município), a alíquota e o valor do ISS serão informados pelo contribuinte
O contribuinte for Optante pelo Simples Nacional e tiver o ISS retido na fonte em que está sendo emitida, a alíquota será informada pelo contribuinte.
Aliquota A 5,4 208 212 prenchimento da direita para a esquerda, acrescentar zeros à esquerda até completar o tamanho do campo. Os campos de valores devem ser informados sem o ponto decimal, respeitando a quantidade de 4 casas decimais.
Dependendo da prefeitura o campo é exigido em % (5.00) ou fração (0.05).
Para informar em percentual (%), informe: 50000 -> 5.00, 43100 -> 4.31, 20000 -> 2.00
Para informar na forma fracionária, informe: 00500 -> 0.05, 00431 -> 0.0431, 00200 -> 0.02
FAQ - preenchimento da Aliquota
DescontoIncondicionado V 15,2 213 227 Informar o valor total do Desconto Incondicionado
DescontoCondicionado V 15,2 228 242 Informar o valor total do Desconto Condicionado
IssRetido N 1 243 243 informar: 1 - Sim ou 2 - Não
ResponsavelRetencao N 1 244 244 Identificação do responsável pela retenção do ISS:
1-Tomador
2-Intermediário
ItemListaServico C 5 245 249 Tabela de código de Serviços
Em alguns municípios o campo deve ser informado sem ponto, com 4 dígitos ajustado à esquerda com um branco no final
Informar com 4 posições no RPS do provedor ISS.NET

FAQ - preenchimento do ItemListaServico
CodigoCnae N 7 250 256 Pesquisa CNAE
Preencha o campo com zeros se desejar omitir a tag.
CodigoTributacaoMunicipio C 20 257 276 A tag CodigoTributacaoMunicipio - Codigo de Tributação do Município é um código "proprietário" de cada município, não existe qualquer padrão, assim é necessário contatar o município para identificar qual é a codificação utilizada.
Algumas prefeituras adotam o codificação da lista de serviço da LC 116/03 ampliada, como é o caso do prefeitura municipal do Rio de Janeiro/RJ.

Outras adotam a código CNAE completo como é o caso da prefeitura de Belo Horizonte/MG.

As prefeituras que adotam o padrão GINFES utilizam os códigos utilizados no GISS, este é um detalhe importante, verifique se já existia alguma sistema ou padrão de prestação de informação na prefeitura, pois as chances de utilizarem a mesma codificação anterior é enorme.

Belo Horizonte - selecione a opção exportar tabela.

Rio de Janeiro - tabela de serviços.

CIDADES GINFES - Consultar a lista de Atividades da GISS Online

1. Seleciona seu Estado e a Cidade;
2. Selecione a Lista de atividades.

Informar com o seguinte formato "14.03.00 / 00140300" em Ribeirão Preto/SP

FAQ preenchimento do CodigoTributacaoMunicipio
Discriminacao C 2000 277 2276 É possível descrever vários serviços em um mesmo RPS, desde que relacionados a um único item da Lista, de mesma alíquota e para o mesmo tomador de serviço. Quando a legislação do município assim exigir, no caso da atividade de construção civil, as NFS-e deverão ser emitidas por obra.
A DLL substituí a sequência || por CR/LF na montagem do XML.
CodigoMunicipio N 7 2277 2283 Informar o código do município de prestação do serviço.
CodigoPais N 4 2284 2287 Informar o código de identificação do país conforme tabela do BACEN
informe zeros para omitir o código.
ExigibilidadeISS N 1 2288 2288 informar o código de natureza da operação:
1 - Exigível
2 -Não incidência
3 - Isenção
4 - Exportação
5 - Imunidade
6 - Exigibilidade suspensa por decisão judicial
7 - Exigibilidade suspensa por procedimento administrativo
MunicipioIncidencia N 7 2289 2295
NumeroProcesso C 30 2296 2325
Prestador Cnpj C 14 2326 2339
InscricaoMunicipal C 15 2340 2354
Tomador IdentificacaoTomador CpfCnpj Cpf C 11 2355 2365
Cnpj C 14 2366 2379
InscricaoMunicipal C 15 2380 2394
RazaoSocial C 150 2395 2544
Endereco Endereco C 125 2545 2669
Numero C 10 2670 2679
Complemento C 60 2680 2739
Bairro C 60 2740 2799
CodigoMunicipio C 7 2800 2806
UF C 2 2807 2808
CodigoPais C 4 2809 2812 Informar o código de identificação do país conforme tabela do BACEN
Cep C 8 2813 2820
Contato Telefone C 20 2821 2840
Email C 80 2841 2920
Itermediario IdentificacaoItermediario CpfCnpj Cpf C 11 2921 2931
Cnpj C 14 2932 2945
InscricaoMunicipal C 15 2946 2960
RazaoSocial C 150 2961 3110
ConstrucaoCivil CodigoObra C 15 3111 3125 informar brancos nas posições 3111 a 3140 para omitir o grupo ConstrucaoCivil
Art C 15 3126 3140
RegimeEspecialTributacao C 1 3141 3141 informar o código de identificação do regime especial de tributação:
1 - Microempresa municipal
2 - Estimativa
3 - Sociedade de profissionais
4 - Cooperativa
5 – MEI – Simples Nacional
6 – ME EPP – Simples Nacional
informar branco para omitir o campo
OptanteSimplesNacional C 1 3142 3142 informar: 1 - Sim ou 2 - Não
IncentivoFiscal C 1 3143 3143 informar: 1 - Sim ou 2 - Não

Diagrama de RPS padrão:

ATENÇÃO

1. Divêrgencia de Leiaute do RPS - podem existir pequenas diferenças no leiaute de cada município.

  • Goiânia/GO (AMTEC) - O leiaute do RPS de Goiânia/Go não tem as seguintes tags:

    • Competencia
    • ValorISS
    • DescontoIncondicionado
    • IssRetido
    • ItemListaServico
    • CodigoCnae
    • ExigibilidadeISS
    • MunicipioIncidencia

    A funcionalidade não gera estas tags para a cidade Goiânia/GO.

2. Leiaute padrão ABRASF - O diagrama abaixo, apesar de representar o XML do RPS recomendado pela ABRASF, pode não ter sido adotado pela prefeitura, assim procure consultar a documentação técnica do município para ter o diagrama correto.

Diagrama de RPS v2

Exemplo de Criação do TXT

Delphi

procedure TForm1.Button4Click(Sender: TObject);
var
NumeroRPS: currency;
SerieRPS, TipoRPS:string;
DataEmissao:TDateTime;
VServico, Aliquota: currency;
TXT: widestring;
 
begin
//
// inicializa valores
//
NumeroRPS := 1234;
SerieRPS  := 'A';
TipoRPS   := '1';
//
DataEmissao := now();
//
VServico := 120.25;
Aliquota := 0.02;
//
//  Monta linha de RPS
//------------------------------------------------------------
//  Exemplo para formatar CARACTER
//
//  Format('%-5s',[SerieRPS]);
//
//   signficados de %-5s:
//   -  ---> ajustar o texto a esquerda
//   5  ---> tamanho final da string
//
//   signficados de %-2000s:
//   -  ---> ajustar o texto a esquerda
//   2000  ---> tamanho final da string
//
//------------------------------------------------------------
//  Exemplo para formatar VALOR
//
//  FormatCurr('000000000000', NumeroRPS);
//
//  Mascara deve ter a quantidade de zeros previsto para campo
//
//  IMPORTANTE: necessário "eliminar os decimais" dos valores
//       multiplique o valor por 100 nos campos de valor
//       multiplique o valor por 10000 nos campos de aliquota
//
//------------------------------------------------------------
//  Exemplo para formatar DATA
//
//  FormatDateTime('yyyy-mm-dd',DataEmissao)+'T'+FormatDateTime('hh:nn:ss',DataEmissao)
//
//------------------------------------------------------------
// Concatenar RPS:
//
// Arquivo := Arquivo + #13+#10+ TXT;
//
 
TXT :='';
TXT := TXT + FormatCurr('000000000000', NumeroRPS);
TXT := TXT + Format('%-5s',[SerieRPS]);
TXT := TXT + Format('%-1s',[TipoRPS]);
TXT := TXT + FormatDateTime('yyyy-mm-dd',DataEmissao)+'T'+FormatDateTime('hh:nn:ss',DataEmissao);
TXT := TXT + FormatCurr('000000000000', VServico * 100);
TXT := TXT + FormatCurr('00000', Aliquota * 10000);
 
ShowMessage(TXT);
 
end;

VB 6.0

Private Sub Command1_Click()
 
Dim NumeroRPS As Double
Dim SerieRPS As String
Dim TipoRPS As String
Dim DataEmissao As Date
Dim Vservico As Double
Dim Aliquota As Double
Dim TXT As String
 
'
' inicializa valores
'
NumeroRPS = 1234
SerieRPS = "A"
TipoRPS = "1"
'
DataEmissao = Now()
'
Vservico = 120.25
Aliquota = 0.0215
'
'  Monta linha de RPS
'------------------------------------------------------------
'  Exemplo para formatar CARACTERE
'
'  Left(SerieRPS + Space(5), 5)
'
'  onde 5 e tamanha maximo do campo desejado
'
'------------------------------------------------------------
'  Exemplo para formatar VALOR
'
'  Format(NumeroRPS, "000000000000" )
'
'  Mascara deve ter a quantidade de zeros previsto para campo
'
'  IMPORTANTE: necessário "eliminar os decimais" dos valores
'       multiplique o valor por 100 nos campos de valor
'       multiplique o valor por 10000 nos campos de aliquota
'
'------------------------------------------------------------
'  Exemplo para formatar DATA
'
'  Format(DataEmissao, "yyyy-mm-dd") + "T" + Format(DataEmissao, "hh:mm:ss")
'
'------------------------------------------------------------
' Concatenar RPS:
'
' Arquivo = Arquivo + chr(13)+ chr(10)+ TXT
'

TXT = ""
TXT = TXT + Format(NumeroRPS, "000000000000")
TXT = TXT + Left(SerieRPS + Space(5), 5)
TXT = TXT + Left(TipoRPS + Space(1), 1)
TXT = TXT + Format(DataEmissao, "yyyy-mm-dd") + "T" + Format(DataEmissao, "hh:mm:ss")
TXT = TXT + Format(Vservico * 100, "000000000000")
TXT = TXT + Format(Aliquota * 10000, "00000")
 
MsgBox TXT
 
End Sub

Visual FoxPro

Local NumeroRPS as Double
Local SerieRPS as String
Local TipoRPS as String
Local DataEmissao as DateTime
Local Vservico as Double
Local Aliquota as Short
Local TXT as String
 
&&
&& inicializa valores
&&
NumeroRPS = 1234
SerieRPS = "A"
TipoRPS = "1"
&&
DataEmissao = DATETIME()
&&
Vservico = 120.25
Aliquota = 0.0215
&&
&&  Monta linha de RPS
&&------------------------------------------------------------
&&  Exemplo para formatar CARACTERE
&&
&&  Left(SerieRPS + Space(5), 5)
&&
&&  onde 5 e tamanha maximo do campo desejado
&&
&&------------------------------------------------------------
&&  Exemplo para formatar VALOR
&&
&&  TXT + TRANSFORM(Vservico * 100, "@L 999999999999")
&&
&&  Mascara deve ter a quantidade de zeros previsto para campo
&&
&&  IMPORTANTE: necessário "eliminar os decimais" dos valores
&&       multiplique o valor por 100 nos campos de valor
&&       multiplique o valor por 10000 nos campos de aliquota
&&
&&------------------------------------------------------------
&&  Exemplo para formatar DATA
&&
&&  TRANSFORM(TTOC(DataEmissao,1),"@R 9999-99-99T99:99:99")
&&
&&------------------------------------------------------------
&& Concatenar RPS:
&&
&& Arquivo = Arquivo + chr(13)+ chr(10)+ TXT
&&
TXT = ""
TXT = TXT + TRANSFORM(NumeroRPS, "@L 999999999999")
TXT = TXT + Left(SerieRPS + Space(5), 5)
TXT = TXT + Left(TipoRPS + Space(1), 1)
TXT = TXT + TRANSFORM(TTOC(DataEmissao,1),"@R 9999-99-99T99:99:99")
TXT = TXT + TRANSFORM(Vservico * 100, "@L 999999999999")
TXT = TXT + TRANSFORM(Aliquota * 10000, "@L 99999")
 
? TXT

Retorno:

O resultado da chamada do geraLoteRPS é o XML de lote de RPS.

O parâmetro resultado retorna um código numérico com os seguintes significados:

código Mensagem origem regra
5800 Lote de RPS gerado com sucesso! DLL -
5801 Erro: O parâmetro LoteRPSTXT sem conteúdo DLL -
5802 Erro: O parâmetro nroLote não contém um valor numérico: [valor recebido pela DLL] DLL -
5803 Erro: O parâmetro nroLote contém um valor fora do intervalo válido (1-999999999999999): [valor recebido pela DLL] DLL -
5804 Erro: O parâmetro nomeCertificado sem conteúdo DLL -
5805 Erro: O parâmetro LoteRPSTXT com conteúdo inválido, veja os erros: [lista de erros] DLL -
5806 Erro: O parâmetro LoteRPSTXT informado com erro de preenchimento, analise o log de erros DLL -
5807 Erro: Erro inesperado no tratamento da leitura do LoteRPSTXT: [mensagem do Windows DLL -
5808 Erro: A quantidade de RPS existente no lote: [{0:0}] fora do intervadlo válido (1-50) DLL -
5809 Erro: O parâmetro LoteRPSTXT informado com erro de preenchimento, analise o log de erros DLL -
5810 Erro: A DLL ainda não foi customizada para gerar o LoteRPS para o Município: [cMunicipio], contate o suporte (www.flexdocs.com.br/suporte) para outras informações DLL -
5811 Erro: Falha na assinatura do lote DLL -
5812 Erro: O parâmetro CNPJRemetente sem conteúdo" DLL -
5813 Erro: O parâmetro CNPJRemetente conteúdo inválido: [valor Informado] DLL -
5814 Erro: O parâmetro RazaoSocialRemetente sem conteúdo DLL -
5815 Erro: Utilize a funcionalidade geraRPSTXT DLL -
5816 Erro: Utilize a funcionalidade geraRPSTXTDSF DLL -
5817 Erro: Utilize a funcionalidade geraRPSTXTSP DLL -
5818 Erro: O parâmetro tipoLote contém um valor: [valor Informado] diferente do esperado [G]erarNFSe ou [E]nviaRPS ou EnviaRPS[S]incrono DLL -
5819 Erro: A quantidade de RPS existente no lote: [quantidade] é inválida para [G]erarNFSe por ser diferente de 1 DLL -

Histórico de atualização:

9.2. RPS ABRASF v2.0 [18-03-12]
9. Gerar Lote de RPS [18-03-12]
« Anterior
9.1. RPS ABRASF v1.0 [18-01-13]
Próximo »
9.3. RPS DSF