-
-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial
Versão canônica no repo: docs/TUTORIAL.md. Esta página da wiki é a porta de entrada; o documento no repo é a fonte única de verdade.
Tempo estimado: 15 a 20 min. Nível: iniciante; se você nunca rodou um script Python, este guia é para você. O que você terá ao fim: um programa de 3 linhas que lê um arquivo XML e imprime um hash na tela.
Este é um tutorial: feito para você aprender fazendo, do começo ao fim, na ordem. Cada passo tem o comando exato e o que você deve ver acontecer. Se algo não bater com o esperado, pare e confira o passo anterior antes de seguir.
Para usar a lib de verdade no seu projeto (e nas outras 8 linguagens), veja Como usar. Para os conceitos por trás de tudo isto, veja Conceitos.
-
Hash: um código de tamanho fixo calculado a partir de um conteúdo. Uma "impressão digital" do arquivo: muda um caractere, muda o hash inteiro. Aqui sai como 32 caracteres entre
0-9ea-f(formato hexadecimal, ou "hex"). Exemplo sintético:3aa0c578c95cdb861a125f480a8a4de5. - MD5: o nome do algoritmo que produz esse hash. O Padrão TISS exige MD5.
-
XML: um formato de arquivo de texto que guarda dados em "etiquetas" (tags) como
<nome>João</nome>. A saúde suplementar brasileira troca dados nesse formato, no chamado Padrão TISS.
Os demais termos (parser, namespace, byte, encoding, epílogo, dependência, CLI) aparecem explicados no passo onde forem usados.
A lib deste tutorial é escrita em Python. Para rodá-la, seu computador precisa ter o Python instalado. Talvez já tenha. Abra o terminal (Linux/macOS: app "Terminal"; Windows: "PowerShell" ou "Prompt de Comando") e digite:
python3 --versionO que esperar: uma linha como Python 3.12.4. O número precisa ser 3.10 ou maior. Se aparecer 3.9 ou menos, ou "comando não encontrado", instale do site oficial: https://www.python.org/downloads/.
Dica para Windows: no instalador, marque "Add Python to PATH" antes de instalar. Sem isso, o terminal não acha o
python3. Depois, feche e reabra o terminal e rodepython3 --versionde novo.
Uma biblioteca (ou "lib", ou dependência) é código pronto que você reaproveita em vez de escrever do zero. A nossa se chama tiss-hash. Para instalar libs Python existe o pip, que vem junto com o Python.
Antes, crie um ambiente virtual (em inglês virtual environment, abreviado venv): uma "caixa" isolada onde você instala as libs de um projeto sem misturar com o resto do sistema.
python3 -m venv .venvAtive o venv:
# Linux ou macOS:
source .venv/bin/activate
# Windows (PowerShell):
.venv\Scripts\Activate.ps1O que esperar: o prompt passa a começar com (.venv). Tudo que o pip instalar daqui pra frente vai pra dentro dessa caixa. (Para sair depois, digite deactivate.)
Agora baixe o código do projeto. Clonar um repositório é copiar todos os arquivos do servidor para a sua máquina, com a ferramenta git:
git clone https://github.com/petrinhu/TISS_ANS_hash.git
cd TISS_ANS_hash/langs/pythonSem
git? Baixe em https://git-scm.com/downloads, ou use o botão "Code" no repositório para baixar um.zipe descompactar.
Instale a lib a partir do código baixado:
pip install -e .O -e significa "editável" (instala apontando para os arquivos baixados). O . é "a pasta atual" (você está em langs/python, que tem a configuração da lib).
O que esperar: linhas de progresso terminando em algo como Successfully installed tiss-hash-0.1.0 defusedxml-.... O defusedxml é a única dependência da lib (proteção de segurança ao ler o XML); o pip a instala sozinho. Confirme:
python3 -c "import tiss_hash; print('ok', tiss_hash.__version__)"O que esperar: ok 0.1.0. Se aparecer ModuleNotFoundError, confira se o venv está ativo (prompt com (.venv)) e repita o pip install -e ..
Agora você vai criar o arquivo de entrada. Usaremos um exemplo mínimo e sintético (inventado, sem dado real de paciente). Antes, dois termos:
-
Namespace: um "sobrenome" dado às tags do XML para não confundir tags de origens diferentes. No TISS, as tags levam o prefixo
ans:, ligado a um endereço oficial no atributoxmlns:ans="...". É só identificação; você não precisa acessar o endereço. -
Epílogo: a parte final da mensagem TISS, dentro da tag
<ans:epilogo>. É onde mora a<ans:hash>, que recebe a impressão digital do conteúdo.
Crie um arquivo lote.xml (qualquer editor serve) com exatamente este conteúdo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ans:mensagemTISS xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
<ans:cabecalho>
<ans:tipoTransacao>ENVIO_LOTE_GUIAS</ans:tipoTransacao>
<ans:sequencialTransacao>1</ans:sequencialTransacao>
</ans:cabecalho>
<ans:epilogo>
<ans:hash></ans:hash>
</ans:epilogo>
</ans:mensagemTISS>O que cada parte faz:
- A primeira linha (
<?xml ...?>) é a "ficha técnica": diz que é XML e qual o encoding declarado. -
<ans:mensagemTISS ...>envolve tudo; oxmlns:ans="..."define o namespace. -
<ans:cabecalho>tem dois dados de exemplo. -
<ans:hash></ans:hash>está vazia de propósito: é o espaço reservado do hash. A lib ignora o que estiver aqui dentro e calcula o hash do resto.
Por que a
<ans:hash>fica vazia? Porque o hash é calculado sobre todo o conteúdo, exceto o próprio campo de hash (senão seria impossível calcular). A lib zera esse campo internamente. Você pode deixar vazio ou com qualquer lixo dentro: o resultado é o mesmo.
Salve o lote.xml na mesma pasta onde você está no terminal (langs/python).
Crie um arquivo meu_hash.py, na mesma pasta, com estas três linhas:
from tiss_hash import hash_tiss_file
digest = hash_tiss_file("lote.xml")
print(digest)Linha a linha:
-
from tiss_hash import hash_tiss_filetraz a função pronta da lib. Função é um pedaço de código com nome que você manda executar. -
digest = hash_tiss_file("lote.xml")chama a função passando o nome do arquivo; ela lê o XML e devolve o hash, guardado na variáveldigest. -
print(digest)mostra o resultado na tela.
Execute (você está usando a CLI, command-line interface, a forma de mandar comandos digitando texto no terminal):
python3 meu_hash.pyO que esperar: uma única linha com 32 caracteres hex, parecida com esta (valor ilustrativo, só para você ver o formato):
3aa0c578c95cdb861a125f480a8a4de5
O hash que você vai ver pode ser diferente deste, porque depende exatamente do conteúdo do seu
lote.xml(espaços, quebras de linha, acentos). O valor acima é um hash sintético do projeto, mostrado só como exemplo de formato. O que importa: saiu uma linha com 32 caracteres hex, sem erro. Se foi isso, você calculou seu primeiro hash TISS.
Em uma frase: a lib leu os bytes do seu XML, juntou em sequência o texto de todas as tags-folha (as que não têm tags-filhas), tratou esse texto como UTF-8 e calculou o MD5 desses bytes, devolvendo 32 caracteres hex. Dois termos que faltavam:
- Byte: a menor unidade de dado do computador (um número de 0 a 255). Um arquivo de texto é, no fundo, uma sequência de bytes.
-
Encoding: a regra que diz como cada caractere (por exemplo
çouã) vira bytes. A mesma letra acentuada vira bytes diferentes em UTF-8 e em ISO-8859-1, e por isso o encoding muda o hash.
Aqui mora o detalhe mais importante (e a razão deste projeto existir): o manual do TISS sugere ISO-8859-1, mas o hash que a ANS de fato aceita é calculado em UTF-8. A lib já faz a coisa certa nas 9 linguagens; você não decide nada sobre encoding, só passa os bytes do arquivo. A regra exata está no SPEC; o "porquê" conceitual em Conceitos.
Se o conteúdo não for um XML bem-formado (uma tag aberta e não fechada, por exemplo), a lib avisa com o erro InvalidTissXml (o parser, que lê e interpreta o XML, não entende o arquivo). Teste de propósito: troque o conteúdo por <isto-nao-fecha> e rode. Você verá um traceback terminando em tiss_hash._core.InvalidTissXml: .... Conserte o XML (toda tag aberta <x> precisa de uma fechada </x>) e volte ao conteúdo do passo 3.
Nome errado ou rodar de uma pasta diferente da do lote.xml gera:
FileNotFoundError: [Errno 2] No such file or directory: 'lote.xml'
Confirme que meu_hash.py e lote.xml estão na mesma pasta e que você roda python3 meu_hash.py de dentro dela. Use ls (Linux/macOS) ou dir (Windows) para conferir.
Iniciantes às vezes abrem o arquivo como texto e reconvertem antes de passar para a lib. Não faça isso. A lib precisa dos bytes brutos para acertar o encoding internamente. Usando hash_tiss_file("lote.xml") (como aqui) você nem corre esse risco, porque ela mesma abre o arquivo do jeito certo. Detalhe na seção de pegadinhas de Como usar.
Você instalou o Python (3.10+), criou um venv, instalou a lib tiss-hash, escreveu um XML TISS mínimo com a <ans:hash> vazia, rodou um script de 3 linhas, obteve 32 caracteres hex e entendeu, em alto nível, o que o algoritmo faz e por que o encoding é UTF-8.
Repositório · Release v0.2.1 · Licença MIT · Esta wiki é a porta de entrada; o detalhe técnico mora no repo.