Vou fazer um artigo no qual recebo várias perguntas: Como gerar arquivos XML no padrão TISS da ANS.  Vou demonstrar usando PHP e API DOM nesta primeira parte e futuramente complementarei com dados a partir de banco de dados MySQL.

O padrão TISS é determinado pela ANS, você poderá consultar outras informações do padrão TISS no site da Agência Nacional de Saúde.

Para seguir, é necessário ter noções básicas da linguagem PHP.

Obs.: Não vou ensinar como desenvolver um sistema com a finalidade de faturamento, apenas o passo a passo da geração do XML no padrão TISS usando o PHP e a biblioteca DOM.

Basicamente o faturamento dos atendimentos/contas, consiste no atendimento do beneficiário pelo prestador(clínica, hospital, laboratório, banco de sangue, clínicas de imagem, entre outros), que é credenciado as operadoras de saúde (Bradesco Saúde, Unimed, Postal Saúde, Geap, Cassi, Capesp, Saúde Itaú, Sul América,…).

O envio do faturamento é feito por lotes(vários atendimentos no mesmo lote, geralmente até 100 atendimentos no mesmo lote) e pode ser via portal da Operadora por digitação das contas (quando a mesma oferece o recurso) ou a partir do envio de arquivos XML. E cada operadora permite e aceita o envio até uma data limite de cada mês(competência), por exemplo; a operadora XYZ aceita que o envio seja feito até o dia 20, e fará o pagamento até o dia 19 do mês subsequente(30 dias após o envio). Desta forma os prestadores precisam ficar atentos ao cumprimento de envio nas datas certas para receber no prazo, caso contrário o pagamento pela operadora é feito na próxima competência.

A geração do XML consiste em dados dos pilares: Operadora de Saúde <-> Prestador de Serviços <-> Beneficiários/Segurados,  ou seja, precisamos das informações de credenciamento do prestador de saúde,  dados do prestador e do segurado. Abaixo uma exemplificação dos dados;

Dados da operadora:
Registro ANS: 1111
Versão TISS: 03.03.03

Dados do Prestador:
Código de Credenciamento: 12345
CNPJ: 00.000.000/0000-0 (Fictício)

Dados de faturamento:
Número da remessa/fatura/Lote: 123

Dados do atendimento:
Data e Hora: 03/04/2018 22:15:00
Nome: Fulano de Tal
Carteira: 4444444444444444
Validade da carteira: 31/12/2030
Recém nascido: Não
Tipo de Atendimento: Ambulatorial
Caráter do atendimento: Eletivo
Guia/Senha: 1111/2222

Médico: Dr. Fabiano
CRM: 0000
CBOS:

Código da tabela: 22
Procedimento TUSS: 10101012
Descrição do Procedimento: Consulta em consultório
Valor unitário: 500,00
Valor Total:  500,00

 

<?php
#Definindo as variáveis

#Dados Operadora:
$_XML['versao_tiss']='030303';
$_XML['registro_ans'] = '1111';

#Dados Prestador:
$_XML['codigo_credenciamento'] = '12345';
$_XML['cnpj'] = '0000000000000';
$_XML['prestador'] = 'Hospital ABCD';

#Dados do atendimento e beneficiário
$_XML['data_hora'] = '03/04/2018 22:15:00';
$_XML['rn'] = 'N'; #Não 
$_XML['tipo_atd'] = 'Ambulatorial'; 
$_XML['carater'] = 'E'; #Eletivo 
$_XML['guia'] = '1111'; 
$_XML['senha'] = '2222'; 
$_XML['medico'] = 'Dr. Fabiano'; 
$_XML['crm'] = '0000'; 
$_XML['cbos'] = '';
#Dados do beneficiário
$_XML['nome'] = 'Fulano de Tal';
$_XML['dt_nascimento'] = '01/01/1980';
$_XML['carteira']  = '4444444444444444';
$_XML['validade'] = '31/12/2030';

#Dados da Fatura / Lote
$_XML['fatura_remessa'] = '123';

#Dados do procedimento realizado
$_XML['tabela'] = '22';
$_XML['procedimento_tuss'] = '10101012';
$_XML['descricao_proced'] = 'Consulta em consultório';
$_XML['valor_unitario'] = '500,00';
$_XML['qtde'] = '1';
$_XML['valor_total'] = '500,00';

$_XML['tipoTransacao'] = 'ENVIO_LOTE_GUIAS';
$_XML['sequencialTransacao'] = '6658';
$_XML['dataRegistroTransacao'] = '2018-01-18';
$_XML['horaRegistroTransacao'] = '10:00:00';

 # Utilize a variável $_XML['hash_dados'] para concatenar os dados e calcular o HASH antes do terceiro bloco
$_XML['hash_dados'] = '';

#A variável $_XML['hash'] está nula pois deve ser calculada com os dados dos elementos(tags) do XML
$_XML['hash'] = 'calculo do HASH';

//$_XML[''] = ''; // para criar novas variáveis apenas siga o padrão

Após a declaração das variáveis, vamos iniciar a geração da estrutura no nosso arquivo.

 

#versao XML e codificação
$xml = new DOMDocument("1.0", "ISO-8859-1"); 
//também poderia ser UTF-8
 
#remove os espacos em branco
$xml->preserveWhiteSpace = false;

#Realizar a quebra dos blocos do XML por linha
$xml->formatOutput = true;

		//Criação dos elementos do Namespace ans:mensagemTISS
		$xml->createAttributeNS( 'http://www.w3.org/2000/09/xmldsig#', 'ds:attr' );
		$xml->createAttributeNS( 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:attr' );
		$xml->createAttributeNS( 'http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_03_01.xsd', 'schemaLocation:attr' );
		$xml->createAttributeNS( 'http://www.ans.gov.br/padroes/tiss/schemas', 'ans:attr' );
        
        
// Nó / Bloco Principal
// ans:mensagemTISS
$mensagemTISS = $xml->createElement("ans:mensagemTISS");
$xml->appendChild($mensagemTISS);

	/* primeiro bloco */
	// ans:mensagemTISS / ans:cabecalho
	$cabecalho = $xml->createElement("ans:cabecalho");
	$mensagemTISS->appendChild($cabecalho);
	
	
		// ans:mensagemTISS / ans:cabecalho / ans:identificacaoTransacao
		$identificacaoTransacao = $xml->createElement("ans:identificacaoTransacao");
		$cabecalho->appendChild($identificacaoTransacao);
		
				# ans:tipoTransacao
				$tipoTransacao = $xml->createElement("ans:tipoTransacao", $_XML['tipoTransacao']);
				$identificacaoTransacao->appendChild($tipoTransacao);
				
				#sequencialTransacao
				$sequencialTransacao = $xml->createElement("ans:sequencialTransacao", $_XML['sequencialTransacao']);
				$identificacaoTransacao->appendChild($sequencialTransacao);

				#dataRegistroTransacao
				$dataRegistroTransacao = $xml->createElement("ans:dataRegistroTransacao", $_XML['dataRegistroTransacao']);
				$identificacaoTransacao->appendChild($dataRegistroTransacao);

				#horaRegistroTransacao
				$horaRegistroTransacao = $xml->createElement("ans:horaRegistroTransacao", $_XML['horaRegistroTransacao']);
				$identificacaoTransacao->appendChild($horaRegistroTransacao);
			
		
		// ans:mensagemTISS / ans:cabecalho / ans:origem
		$origem = $xml->createElement("ans:origem");
		$cabecalho->appendChild($origem);
		
				// ans:mensagemTISS / ans:cabecalho / ans:origem / identificacaoPrestador
				$identificacaoPrestador = $xml->createElement("ans:identificacaoPrestador", $_XML['cnpj']);
				$origem->appendChild($identificacaoPrestador);
				
		
		// ans:mensagemTISS / ans:cabecalho / ans:destino
		$destino = $xml->createElement("ans:destino");
		$cabecalho->appendChild($destino);
		
				// ans:mensagemTISS / ans:cabecalho / ans:registroANS
				$registroANS = $xml->createElement("ans:registroANS", $_XML['registro_ans']);
				$destino->appendChild($registroANS);
		
		// ans:mensagemTISS / ans:cabecalho / ans:Padrao
		$Padrao = $xml->createElement("ans:Padrao", $_XML['padrao_tiss']);
		$cabecalho->appendChild($Padrao);
	
	
	/* segundo bloco */
	// ans:mensagemTISS / ans:prestadorParaOperadora
	$prestadorParaOperadora = $xml->createElement("ans:prestadorParaOperadora");
	$mensagemTISS->appendChild($prestadorParaOperadora);
	
		// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias
		$loteGuias = $xml->createElement("ans:loteGuias");
		$prestadorParaOperadora->appendChild($loteGuias);		

			// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / numeroLote
			$numeroLote = $xml->createElement("ans:numeroLote", $_XML['lote_remessa']);
			$loteGuias->appendChild($numeroLote);	
 
 			// ans:mensagemTISS / ans:prestadorParaOperadora / loteGuias / guiasTISS
			$guiasTISS = $xml->createElement("ans:guiasTISS");
			$loteGuias->appendChild($guiasTISS);	

// Calculo o Hash - Você poderia gerar os dados, usar um (replace do PHP) para substituir as tags, e pegar apenas os dados
$_XML['hash_dados'] = '' 
$_XML['hash'] = md5($_XML['hash_dados']);	

	/* terceiro bloco */
	// ans:mensagemTISS / ans:epilogo
	$epilogo = $xml->createElement("ans:epilogo");
	$mensagemTISS->appendChild($epilogo);
	
		// ans:mensagemTISS / ans:epilogo / ans:hash
		$hash = $xml->createElement("ans:hash", $_XML['hash']);
		$epilogo->appendChild($hash);	

# Comando para salvar/gerar o arquivo XML TISS
# Geralmente o nome do arquivo é o HASH que foi calculado ou número do lote, pois são informações únicas.
# você pode usar as variáveis: $_XML['fatura_remessa'] . $_XML['hash']

$xml->save("xml_tiss.xml");


# Imprime / Gera o xml em tela
echo $xml->saveXML();
?>

Com o comando acima você terá o seguinte retorno: xml_tiss.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<ans:mensagemTISS xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:schemaLocation="http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_03_01.xsd" 
xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
 <ans:cabecalho>
 <ans:identificacaoTransacao>
 <ans:tipoTransacao>ENVIO_LOTE_GUIAS</ans:tipoTransacao>
 <ans:sequencialTransacao>6658</ans:sequencialTransacao>
 <ans:dataRegistroTransacao>2018-01-18</ans:dataRegistroTransacao>
 <ans:horaRegistroTransacao>10:00:00</ans:horaRegistroTransacao>
 </ans:identificacaoTransacao>
 <ans:origem>
 <ans:identificacaoPrestador>0000000000000</ans:identificacaoPrestador>
 </ans:origem>
 <ans:destino>
 <ans:registroANS>111111</ans:registroANS>
 </ans:destino>
 <ans:Padrao>03.03.03</ans:Padrao>
 </ans:cabecalho>
 <ans:prestadorParaOperadora>
 <ans:loteGuias>
 <ans:numeroLote>123</ans:numeroLote>
 <ans:guiasTISS/>
 </ans:loteGuias>
 </ans:prestadorParaOperadora>
 <ans:epilogo>
 <ans:hash>calculo do HASH</ans:hash>
 </ans:epilogo>
</ans:mensagemTISS>

 

Download do Arquivo: gerador_xml_tiss

 

Validador TISS – Validação de arquivos XML TISS 3.03.01 (ANS TISS)

O validador foi atualizado para a versão mais recente da ANS.

Validador: http://fabianobento.com.br/validadortiss/

Aprenda a criar seu próprio validador: blog.fabianobento.com.br/2018/02/criando-um-validador-tiss-usando-php/

Post original: http://blog.fabianobento.com.br/2015/07/validador-tiss-validacao-de-arquivos-xml-tiss-3-02-00-ans-tiss/

Validador TISS – Validação de arquivos XML TISS 3.02.00 (ANS TISS)

Validador TISS – Validador de arquivo XML no padrão TISS

Software gratuito para validação e análise de arquivos no padrão TISS da ANS.

Você poderá validar gratuitamente seus arquivos XML no padrão TISS, sem a necessidade de instalar.

-Não é necessário instalar
-Padrão TISS
-Codificação TUSS
-Dados do Prestador
-Suporte a arquivos do monitoramento

-Informações das contas e valores

– Versão do arquivo

– Estrutura

Clique no link ou imagem abaixo para abrir o validador de arquivo XML no padrão da TISS

VALIDADOR TISS  —>  http://fabianobento.com.br/validadortiss/

validador-tiss-ans

http://www.ans.gov.br/a-ans/sala-de-noticias-ans/operadoras-e-servicos-de-saude/2486-ans-disponibiliza-arquivos-da-versao-30200-do-padrao-tiss

IV. Histórico de alterações na versão 3.02.00

5. As alterações do Padrão TISS em relação à versão 03.01.00 são:

Inclusões

5.1.No Componente de Comunicação, incluídos os campos dente, região e face
do dente no protocolo de recebimento de recurso de glosas no WebService
(protocoloRecebimentoRecursoWS);

5.2.No Componente de Comunicação e no Componente de Representação de
Conceitos em Saúde foram incluídos 30 termos na terminologia de
mensagens de retorno referentes a certificado e assinatura digitais e
referentes às criticas no envio de dados para a ANS (tissSimpleTypes);

5.3. No Componente de Representação de Conceitos em Saúde, na terminologia
de diárias, taxas e gases medicinais foram incluídos 44 termos.

5.4. No Componente de Representação de Conceitos em Saúde, na terminologia
de medicamentos foram incluídos 773 termos.

5.5. No Componente de Representação de Conceitos em Saúde, na terminologia
de procedimentos e eventos em saúde foram incluídos 10 termos.

5.6. No Componente de Representação de Conceitos em Saúde, na terminologia
de mensagens foram incluídos 30 termos.

5.7.No Componente Organizacional foi incluída a regra sobre o namespace
estabelecido nos schemas XSD e descritores WSDL.

5.8.No Componente Organizacional foram incluídas regras sobre assinatura
digital.

Alterações

5.9. Alterado neste componente, as regras sobre pacotes no envio de dados à
ANS;

5.10. Alteradas neste componente, as regras de nomenclatura dos arquivos
no envio de dados à ANS;

5.11. Alterada neste componente, a regra sobre os tipos de arquivos válidos
no envio de dados à ANS;

5.12. No Componente de Comunicação, na mensagem de recebimento de
anexo pela operadora, o campo diagnosticoHistopatologico teve sua
condição de preenchimento corrigida de obrigatório para opcional nos
anexos de quimioterapia e de radioterapia;

5.13. No Componente de Conteúdo e Estrutura e no Componente de
Comunicação, na mensagem de envio de dados para a ANS, os campos
quantidade informada e quantidade paga tiveram seus tamanhos corrigidos
para 4 inteiros e 4 decimais;

5.14. No Componente de Comunicação, o campo data de realização da guia
foi corrigido para preenchimento opcional na mensagem de
recebimentoLote e na mensagem situacaoProtocolo ;

5.15. No Componente de Comunicação foi alterado o tamanho do campo de
senha do prestador de 20 para 32 posições;

5.16. No Componente de Comunicação, foi colocada a possibilidade na
mensagem de recurso de glosa do prestador poder informar mais de um
código de glosa com sua justificativa;

5.17. No Componente de Comunicação, na mensagem de cobrança da guia de
odontologia, foi corrigida a condição de preenchimento dos campos: CBO do
profissional, CNES do profissional executante, quantidade de
procedimentos, valor do procedimento, tipo de atendimento, tipo de
faturamento, indicador de autorização e valor total de procedimentos para
obrigatório;

5.18. No Componente de Representação de Conceitos em Saúde, na
terminologia de medicamentos foram alterados 17 termos.

5.19. No Componente de Representação de Conceitos em Saúde, na
terminologia de diárias, taxas e gases medicinais foi alterado 1 termo.

5.20. No Componente de Representação de Conceitos em Saúde, na
terminologia de procedimentos e eventos em saúde foram alterados 4
termos.

5.21. No Componente de Representação de Conceitos em Saúde, na
terminologia de mensagens foram alterados 3 termos.

5.22. No Componente de Representação de Conceitos em Saúde, nas
terminologias de materiais e OPME, de medicamentos e de diárias, taxas e
gases medicinais a data de fim de implantação foi alterada para
30/11/2014 para todos os termos.

5.23. No Componente de Comunicação, na mensagem de demonstrativo de
pagamento de odontologia, foi alterada a tag de identificação do prestador
contratado para explicitar a informação de CPF ou CNPJ do contratado;
Exclusões

5.24. No Componente de Representação de Conceitos em Saúde, na
terminologia de diárias, taxas e gases medicinais foram inativados 2
termos.

5.25. No Componente de Representação de Conceitos em Saúde, na
terminologia de procedimentos e eventos em saúde foi inativado 1 termo.

5.26. No Componente de Representação de Conceitos em Saúde, na
terminologia de medicamentos foram inativados 18 termos.

5.27. No Componente de Representação de Conceitos em Saúde, na
terminologia de mensagens foram inativados 8 termos e inativados por
alteração 3 termos.