== IRPF-Livre 2010

Este é um projeto que usa o código publicado em 2007 pela Receita
Federal para criar uma versão Livre do programa para preenchimento de
declarações de Imposto de Renda de Pessoa Física, IRPF.

Com ele, você vai poder preparar sua declaração de imposto de renda em
liberdade, podendo gravá-la em disquete para entrega em agências do
Banco do Brasil ou da Caixa Econômica Federal.

Agradeço à Receita Federal por publicar o código da versão de 2007 sob
a GNU LGPL versão 2 (licença mais visível no IRPF.jar), ainda que
tenham "esquecido" de publicar os fontes correspondentes, inclusive
das outras bibliotecas LGPL que usaram.  De toda forma, publicaram
código Java não ofuscado e com informação de debugging, o que permitiu
a descompilação quase que completa.

Para a versão de 2008, o trabalho foi um pouco maior, pois IRPF2008 é
claramente não-Livre, ainda que esteja repleto de ilegalidades.
Apesar da criptografia, foi possível fazer engenharia reversa para
perceber algumas modificações necessárias para a versão nova, mas a
maior parte das atualizações para 2008 pode ser feita meramente
comparando os arquivos gerados pelo IRPF-Livre com os gerados pelo
IRPF2008.  Somente para questões de compatibilidade, como códigos e
disposição de informações nos arquivos, foi necessário consultar os
arquivos do IRPF2008.

O mesmo procedimento foi seguido para a versão deste ano, com o mesmo
sucesso dos anos anteriores.

Dada a dificuldade de reproduzir exatamente as alterações efetuadas
desde a versão de 2007 sem contaminar o IRPF-Livre com os termos de
licenciamento não-Livres das versões mais novas, há algum risco de que
alguma atualização tenha faltado.  O que é certo é que nem todas as
funcionalidades adicionadas desde a versão de 2008 foram adicionadas
ao IRPF-Livre: ganhos de capital, renda variável e declarações de
espólio são casos ainda não tratados no IRPF-Livre.

Para localizar limitações e completar a versão Livre, sugiro que se
use a versão privativa para o único propósito moralmente legítimo de
um software privativo: para o desenvolvimento de um substituto Livre.
Isto é, prepare sua declaração utilizando a versão Livre, gere a cópia
de segurança e/ou o arquivo para envio, e depois copie o diretório
"aplicacao" para uso pela versão privativa, e então gere os arquivos
novamente.  Verifique que os arquivos gerados sejam idênticos.

Se não forem, há algo errado na versão Livre.  Por favor tente criar
uma declaração fictícia que reproduza a diferença e envie para
softwares-impostos@fsfla.org.

Se forem idênticos, você terá certeza de que sua declaração é
perfeitamente indistinguível de uma preparada pela versão privativa, e
poderá entregá-la com toda a confiança.


== Como usar

Não há interface gráfica, somente uma interface "linha de comando",
introduzida já em 2007.  Sabe o quê?  Eu a adorei!  Pude fazer tudo
que sempre quis e o programa não permitia, tipo copiar e ajustar
contas bancárias quando um banco compra o outro, substituição global
ou parcial de CNPJs, alteração da ordem dos itens para seguir a dos
documentos recebidos, etc.

Então...  Rodando algo tipo

  gij -jar irpf-livre-cl.jar

(pode trocar gij pelo interpretador Java de sua preferência; funciona
bem com o IcedTea também), você vai receber uma mensagem de ajuda que
indica os comandos disponíveis.  Como a gente vai usar bastante esse
comando, sugiro criar uma função shell, um alias, um script, seja o
que for:

  irpf () { gij -jar irpf-livre-cl.jar $1 @CPF@; }

Por exemplo, o comando shell acima vai permitir que você execute
comandos como 'irpf comando', e ele já vai passar seu CPF
implicitamente (supondo que você substituiu @CPF@ acima pelo seu CPF,
né? :-)  Vou supor daqui pra frente que você fez algo nessa linha.

A idéia é usar comandos para criar uma declaração nova:

  irpf nova

ou importar uma declaração do ano passado:

  irpf importa

Se você criar uma declaração do zero e depois resolver importar uma
com o mesmo cpf, ou vice-versa, ele vai dar erro.  Use:

  irpf remove

antes que a importação ou a criação funcione.

Nos dois casos, ele vai criar um arquivo que representa a declaração
em aplicacao/dados/@CPF@/@CPF@.xml.  Naturalmente, pro segundo você
vai precisar do arquivo de declaração (backup ou gravada para
transmissão) e, se quiser, o recibo correspondente, ambos no diretório
corrente.  O do recibo é em tese desnecessário, pois o número do
recibo já está presente no arquivo gerado para envio (sério!) mas,
para evitar acidentes, a interface de linha de comando só vai
registrar o número de recibo se o arquivo de recibo estiver presente.
Note que o número do recibo não era importado na versão 2007 do
IRPF-Livre.

Atente para o fato de que aplicacao/dados/iddeclaracoes.xml contém
informação de identificação (nome, cpf, recibo do ano anterior, etc).
Para preservar uma declaração, não basta preservar o arquivo de nome
@CPF@.xml.

Antes de fazer qualquer coisa, sugiro fazer um backup dessa
declaração, até pra poder acompanhar as alterações que você vá fazer:

  irpf grava

Aí, só de farra, tire uma cópia do arquivo xml e vê se o backup volta
do mesmo jeito:

  cp aplicacao/dados/@CPF@/@CPF@.xml copia.xml
  irpf restaura
  diff copia.xml aplicacao/dados/@CPF@/@CPF@.xml

Tá ganhando confiança, né?  Então vamos em frente...


=== Preenchendo a declaração

Então, agora que você já tem um arquivo xml pronto pra preencher,
talvez já com dados de uma declaração anterior, mãos à obra.  É um
arquivinho texto.

O chato é a linha longa: não tem quebra de linha alguma no xml gerado.
Recomendo passar os arquivos xml através de um filtro pra deixá-los
mais bonitinhos antes de sair editando.  Pro programa, não faz
diferença nenhuma, mas pra nós, humanos, é a diferença entre sair
correndo em desespero ou tudo fazer sentido.

O que usei pra deixar o xml bonitinho foi xmllint, do libxml2.  Tipo
assim:

  xmllint --format aplicacao/dados/@CPF@/@CPF@.xml > decl.xml

aí edita o CPF.xml.  Não precisa se preocupar em fazer as contas,
basta ir preenchendo o que está lá.  Se você estiver usando versões
antigas do gij, não ligue para os "0.,00" (ponto e vírgula um do lado
do outro no lugar só da vírgula); não sei por que os dois pontos
decimais estão aparecendo, mas eu deixei eles lá e tudo funcionou
normal.  Melhor não mexer, né?  :-)  Com o IcedTea, aparece só a
vírgula.

Quando você tiver editado um pouco e quiser ver no que dá:

  cp decl.xml aplicacao/dados/@CPF@/@CPF@.xml
  irpf grava
  irpf restaura
  mv decl.xml diff.xbk
  xmllint --format aplicacao/dados/@CPF@/@CPF@.xml > decl.xml
  diff -U0 decl.xbk decl.xml

Viu só, ele já atualiza os valores calculados a partir de outros.
Legal, né? (*)  Pode também verificar que as coisas que você editou
entraram no arquivo de declaração:

  diff -U0 @CPF@-IRPF-2007-2006-ORIGI.{BAK,DBK}

Se for declaração retificadora, substitua ORIGI por RETIF.

(*) Preste atenção para o fato de que os totais de listas de nome
QuadroAuxiliar NÃO SÃO levados em conta automaticamente.  Os valores
totalizados precisam ser transportados manualmente.  Os totais de
rendimentos não tributáveis e com tributação exclusiva na fonte também
não são calculados automaticamente.


==== Códigos e listas

Então...  Editar o xml é relativamente fácil quando você sabe o que
está fazendo.  O duro é quando você não sabe.  Tipo, no caso de campos
em que entram códigos, ou listas cujos componentes você nem tem idéia.

Sobre os códigos, a dica é procurar dentro do .jar (use o Emacs para
abri-lo como zip, ou expanda o conteúdo) algum arquivo .xml
relacionado.  São neles que as tabelas de códigos estão descritas.
Pode haver descrições mais legíveis em help/html.  Veja help/index.xml
(como arquivo texto) para uma lista dos tópicos e os respectivos
arquivos html (target=), ou abuse do grep help/html.

Sobre listas, não consegui sacar onde a estrutura do xml está
descrita, se é que está em algum lugar.  Achei que talvez fosse
mapeamentoTxt.xml, mas não, essa é só uma versão mais computeira da
especificação do formato dos arquivos que a Receita publicou,
antendendo aos nossos pedidos.

De todo modo, sempre que houver alguma entrada do tipo:

  <algumaCoisaQueInteresse ... tipoItens="serpro...."/>

e você não souber direito como preencher, troque por:

  <algumaCoisaQueInteresse ... tipoItens="serpro....">
    <item/>
  </algumaCoisaQueInteresse>

(atente para o fato de que a barra antes do sinal de maior foi
removida)

Aí faça a dança do grava/restaura e você vai ver que ele expandiu o
item pra você com todos os campos necessários.  Bacana, né? :-)


=== Finalizando

Então, depois de vários ciclos de edição, você acha que tá tudo
pronto, né?  Não custa dar uma verificadinha:

  irpf verifica

Se houver pendências, fatais ou não, ele vai avisar.  Se você por
acaso extraiu manualmente um arquivo de recibo com apenas 10 dígitos,
o sistema vai acusar que o número é inválido.  Há um comando para
calcular os dígitos verificadores:

  irpf calculaDV

Feitas as correções (ou não), pode preparar a declaração para entrega:

  irpf prepara

Aí é só copiar o @CPF@-IRPF-2009-2008-ORIGI.DEC pra um disquete ou pen
drive e levar pro Banco do Brasil ou pra Caixa Econômica Federal.

Pois é, não tem versão Livre do ReceitaNET ainda.  Quando eu tinha uma
pronta, mudaram o protocolo todo :-(  Fazer o quê? :-(

Não sabe?  Assine a petição contra os Softwares Impostos!

http://www.fsfla.org/svnwiki/anuncio/2007-03-irpf2007


=== Imprimindo

Em tese, tem código que poderia permitir a impressão da declaração e
do recibo, mas não consegui fazer funcionar :-(

Como a urgência era conseguir entregar a declaração, parei de debugar
e preparei a minha, e agora vou correr atrás do prejuízo de minhas
outras tarefas que ficaram de lado por causa disso.

Se alguma boa alma se animar a arrumar isso (quem sabe eu mesmo),
vamos poder imprimir as declarações e os recibos.  Se não, quando
alguém pedir a declaração ou o recibo, a gente imprime o xml ou o par
.DEC/.REC mesmo.  Certo?  Afinal, agora os formatos são públicos :-)

Se você quiser ajudar, rode:

  svn co http://www.fsfla.org/svn/fsfla/software/irpf-livre

e mande patches, sugestões ou comentários para
softwares-impostos@fsfla.org.  Consulte meu blog e/ou minha home page
para outras notícias:

  http://fsfla.org/blogs/lxo/
  http://fsfla.org/~lxoliva/

Pode haver versões mais novas, ou versões atualizadas para retificar
declarações antigas, em:

  http://fsfla.org/~lxoliva/snapshots/irpf-livre

Faça bom uso!

--
Alexandre Oliva


== Histórico

Os números após o "r" abaixo são o identificador da versão dentro no
nosso repositório Subversion.  Tipo, svn co -r3330 vai baixar os
fontes da versão r3330.  Versões anteriores estão em outro local do
repositório.


=== r6622

Atualizado para 2010.


=== r4952

Atualizado para 2009.


=== r4871

Rejeita número de recibo inadequado para a declaração, seja
retificadora ou não.


=== r4715

Adiciona facilidades para obtenção de número de recibo no momento da
gravação da declaração e para cálculo dos dígitos verificadores de
recibos do ano anterior e de declaração a retificar.


=== r3397

O programa não capota mais ao ser executado sem argumentos.  Reportado
por Claudio "Patola" Sampaio.

Menção implícita à versão 2007-r3373, para retificar declarações de
2007.


=== r3330

Primeira versão experimental para 2008.  Já funciona com a minha
declaração, gerando um arquivo igualzinho ao do IRPF2008 da Receita
Federal.  A declaração gerada com esta versão foi entregue com sucesso
dia 2008-04-28, na Agência 4259-5 do Banco do Brasil.


=== r1003

Corrige um erro na geração de declaração para envio.  A única
diferença entre a versão que eu usei pra preparar minha declaração e
esta que publiquei é que eu atualizei este arquivo com o histórico.


=== r987

Todas as funcionalidades exceto impressão estão contempladas.


=== r976

Primeira versão com interface de linha de comando, ainda com muitas
limitações.


=== r952

Primeira versão livre publicada empacotada, com binário que talvez
rodasse com interface gráfica em máquinas virtuais Java privativas.
Aparentemente, nem isso :-(
