Isso é um projeto em desenvolvimento que usa o código publicado pela
Receita Federal para criar uma versão livre do 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.

Pra versão de 2008, deu um pouco mais de trabalho, pois o 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.

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 do IRPF2008, há um risco significativo,
praticamente uma certeza, de que alguma coisa tenha faltado.

Para localizar limitações e completar a versão Livre, sugiro que se
use a versão proprietária para o único propósito moralmente legítimo
de um software proprietário: 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 proprietária, 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
proprietária, e poderá entregá-la com toda a confiança.


== Como usar

A interface gráfica não funciona.  Para 2008, nem tentei, não deu
tempo de olhar pra isso.  Recomendo a interface "linha de comando",
introduzida 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 o 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.


==== 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-2007-2006-ORIGI.DEC pra um disquete e
levar pro Banco do Brasil ou pra Caixa Econômica Federal.

Pois é, não tem versão livre do ReceitaNET ainda, 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://www.fsfla.org/svnwiki/blogs/lxo/
  http://www.fsfla.org/~lxoliva/

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

  http://www.lsd.ic.unicamp.br/~oliva/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.


=== 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 proprietárias.
Aparentemente, nem isso :-(
