Criando um Validador TISS usando PHP

Neste posto irei ensinar como criar um validador TISS de arquivos XML  no padrão TISS da ANS, usando o PHP e banco de dados MySQL. Com o validador será possível validar os arquivos TISS e arquivos do monitoramento TISS.

Obs.: Vou escrever um passo a passo, mas é necessário ter noções básicas da linguagem PHP e banco MySQL.

Vou dividir o post nas seguintes etapas;

1ª Etapa -Criar o formulário HTML para envio do arquivo e seleção da versão

2ª Etapa – Verificar a estrutura do arquivo (que é a comparação com o arquivo XSD da ANS)

3ª Etapa – Validação dos dados do arquivo conforme a codificação da TUSS (Apenas para arquivos TISS)

4ª Etapa – Disponibilização dos arquivos para download e dica de instalação

E é claro, você poderá personalizar conforme a sua necessidade.

Antes de começarmos baixe os arquivos do padrão TISS no site da ANS, usando o link http://www.ans.gov.br/prestadores/tiss-troca-de-informacao-de-saude-suplementar, conforme os prints abaixo, ou clique aqui para baixar o último arquivo disponível (Componente de Comunicação 03.03.03)

Obs.: baixe todas as versões que queira utilizar no seu validador.

Usaremos também o arquivo bootstrap.min.css do Bootstrap (framework web CSS/JavaScript), baixe também neste link (https://getbootstrap.com) (deixarei no final todos os arquivos para download)

Iniciando o projeto crie a estrutura de pastas abaixo.

As pastas devem ser criadas no seu servidor httpd(Apache/IIS), dentro do diretório (www).

-validador-tiss (pasta principal)
–css
–xml (diretório para upload dos arquivos xml enviados)
–tiss (diretório com os arquivos baixados no site da ANS para validação TISS)
–tiss/03_03_03
–tiss/03_03_01
–tiss/03_02_02
–tiss/03_02_01
–tiss/03_02_00

1ª Etapa

Agora vamos criar nosso formulário para envio do arquivo e salvar com o nome index.php

Arquivo index.php

Observe que action do formulário aponta para (validar_arquivo.php), e temos um select para as versões dos XML.

 

<head>
<meta charset=”UTF-8″>
<title>Validador TISS</title>
<link rel=”stylesheet” href=”css/bootstrap.min.css“>
</head>

<body>

<div class=”container”>

<h1 >Validador TISS</h1>
<a class=”btn btn-lg ” href=”#seu-site” role=”button”>Validador de arquivos XML no padrão TISS</a>
<br>
<form id=”upload” name=”upload” enctype=”multipart/form-data” method=”post” action=”validar_arquivo.php“>

<div class=”form-group”>
<label for=”versao” class=”control-label”>Selecione a versão:</label>

<select name=”versao” class=”form-control”>
<option value=”tissV3_03_03.xsd” selected>TISS – 03.03.03</option>
<option value=”tissV3_03_02.xsd” >TISS – 03.03.02</option>
<option value=”tissV3_03_01.xsd” >TISS – 03.03.01</option>
<option value=”tissV3_03_00.xsd” >TISS – 03.03.00</option>
<option value=”tissV3_02_02.xsd” >TISS – 03.02.02</option>
<option value=”tissV3_02_01.xsd” >TISS – 03.02.01</option>
<option value=”tissV3_02_00.xsd” >TISS – 03.02.00</option>
<option value=”tissMonitoramentoV3_03_03“>Monitoramento TISS – 03.03.03</option>
<option value=”tissMonitoramentoV3_03_02“>Monitoramento TISS – 03.03.02</option>
<option value=”tissMonitoramentoV3_03_01“>Monitoramento TISS – 03.03.01</option>
<option value=”tissMonitoramentoV3_03_00“>Monitoramento TISS – 03.03.00</option>
<option value=”tissMonitoramentoV3_02_02“>Monitoramento TISS – 03.02.02</option>
<option value=”tissMonitoramentoV3_02_01“>Monitoramento TISS – 03.02.01</option>
<option value=”tissMonitoramentoV3_02_00“>Monitoramento TISS – 03.02.00</option>

</select>
</label>
</div>

<div class=”form-group”>
<label for=”arquivo_xml” class=”control-label”>Selecione o arquivo (XML) para validação</label>
<input id=”arquivo_xml” name=”arquivo_xml” type=”file” class=”form-control-file” placeholder=”Selecione o arquivo XML para validaçaõ…” />
</div>

<button type=”submit” class=”btn btn-primary”>Validar Arquivo</button>
</form>

</div>
</body>

A página ficará com o layout abaixo;

Agora copie todos os arquivos que baixou no site da ANS e coloque dentro da pasta (tiss), ficando da seguinte forma:

tiss/03_03_03
tiss/03_03_02
tiss/03_03_01
tiss/03_03_00
tiss/03_02_02
tiss/03_02_01
tiss/03_02_00

 

2ª Etapa

Crie um arquivo com o nome function_erros_xml.php

<?php
function display_xml_error($error, $xml)
{
    //$return  = $xml[$error->line - 1] . "\n";
    //$return .= str_repeat('-', $error->column) . "^\n";
  
    $return  = $xml[$error->line - 1] . "";
    //$return .= str_repeat('-', $error->column) . "";
	$return .= str_repeat('', $error->column) . "";
	
    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "Warning $error->code: ";
            break;
         case LIBXML_ERR_ERROR:
            $return .= "Error $error->code: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "Fatal Error $error->code: ";
            break;
    }

    $return .= trim($error->message) .
               "
  Linha: $error->line" .
               "
  Coluna: $error->column";

   // if ($error->file) {
   //     $return .= "
  Arquivo: $error->file";
   // }

    //return "$return\n\n-----\n\n";
	return "$return";
}

Nesta etapa vamos criar o arquivo para receber os dados do formulário, que será responsável pelo upload do arquivo, leitura e comparação com o XSD(arquivo copiado acima do site da ANS)

Arquivo validar_arquivo.php

vamos criar a estrutura HTML básica do nosso arquivo.

 

Validador TISS

Validador de arquivos XML no padrão TISS

 

 

Com o código acima teremos o seguinte layout

Verificamos se foi realizado envio do formulário e obtendo a versão selecionada usando um IF

<?php
/**
* Validador TISS
*
* Validador de arquivos XML no padrão TISS
*
* @author Fabiano Bento <eu@fabianobento.com.br>
* @link http://fabianobento.com.br/
*
* @version 1.0
*/


global $_VT;

$_VT['diretorio_tiss'] = 'tiss/'; //diretorio dos arquivos XSD
$_VT['diretorio_upload'] = "xml/"; //diretório para salvarmos os arquivos enviados
$_VT['ds_arquivo'] = date('Y-m-d-H-i-s'); //variavel para cocatermos ao nome do arquivo

if( (isset($_POST['versao'])) && ( $_FILES['arquivo_xml']['name'] != '') ) {

//Declaramos as variáveis enviadas pelo método POST

$versao_arquivo = $_POST['versao'];
$nome_arquivo = basename($_FILES['arquivo_xml']['name']);
 

//Agora criamos um CASE para verificar, validar a escolha de versão e pegarmos o diretório dos arquivos XSD da TISS.

switch ($versao_arquivo) {

//TISS - 03.03.03
case "tissV3_03_03.xsd":
$versao_arquivo_txt = 'TISS 3.03.03';
$versao = '03_03_03/tissV3_03_03.xsd'; 
break;

//TISS - 03.03.01
case "tissV3_03_01.xsd":
$versao_arquivo_txt = 'TISS 3.03.01';
$versao = '03_03_01/tissV3_03_01.xsd'; 
break;
//TISS - 03.02.02
case "tissV3_02_02.xsd":
$versao_arquivo_txt = 'TISS 3.02.02';
$versao = '03_02_02/tissV3_02_02.xsd'; 
break;

//TISS - 03.02.01
case "tissV3_02_01.xsd":
$versao_arquivo_txt = 'TISS 3.02.01';
$versao = '03_02_01/tissV3_02_01.xsd'; 
break;

//TISS - 03.02.00
case "tissV3_02_00.xsd":
$versao_arquivo_txt = 'TISS 3.02.00';
$versao = '03_02_00/tissV3_02_00.xsd';
break;

}


//agora faremos o upload do arquivo para o diretório (xml)
$uploadfile = $_VT['diretorio_upload'] . $_VT['ds_arquivo'] . '_' . basename($_FILES['arquivo_xml']['name']);

//copia o arquivo do computador para o servidor
if(!move_uploaded_file($_FILES['arquivo_xml']['tmp_name'], $uploadfile)){

		echo "falha ao carregar arquivo!";
      }else {
                echo "

“; echo ”

“; }

 

Após o upload do arquivo fazemos a comparação com o XSD usando a classe DomDocument

Nesta etapa vamos analisar se o arquivo XML enviado está de acordo com a estrutura do XSD. Pegamos a versão selecionada no formulário, o arquivo no diretório onde foi feito o upload e a comparação. Em seguida armazenamos todos os erros (se houver) em uma variável. E como resultado se o arquivo está de acordo o padrão ou não e quais erros encontrados.

O código abaixo deverá ser incluído abaixo do comentário “aqui vai o código da validação da estrutura”

libxml_use_internal_errors(true);

/* Cria um novo objeto da classe DomDocument */
$objDom = new DomDocument();

/* Carrega o arquivo XML */
$objDom->load($uploadfile);

/* Tenta validar os dados utilizando o arquivo XSD */

// seleciona a versao correspondente
$versao_tiss = $_VT['diretorio_tiss'] . $versao;
if (!$objDom->schemaValidate($versao_tiss)) { 

/**
* Se não foi possível validar, você pode capturar
* todos os erros em um array
*/
$arrayAllErrors = libxml_get_errors();

/**/
$xmlstr = $objDom->load($uploadfile);
$doc = simplexml_load_string($xmlstr);
$xml = explode("\n", $xmlstr);

require_once('function_erros_xml.php');

if (!$doc) {
$errors = libxml_get_errors();

echo "

 

3ª Etapa

Esta etapa não é obrigatória, mas é a cereja do bolo, digo validador =), pois através desta parte podemos fazer a validação dos dados contidos dentro de cada TAG do XML, ou seja, se os códigos de procedimentos e tabelas estão seguindo o padrão TUSS determinado pela ANS.

Utilizaremos o banco de dados MySQL, pois precisamos armazenar os dados da codificação TUSS. Para criar e configurar o banco você pode usar qualquer programa, segue alguns; MySQL WorkBench, MySQL Front, PHPMyAdmin(Na hospedagem do site).

Vou dividir esta etapa nas seguintes partes(A, B, C, D, E, F);

A-Criação do banco de dados
B-Tabelas do banco
C-Importando os dados para as tabelas
D-Criando as rotinas no banco (functions / procedures)
E-Conexão com o banco de dados MySQL
F-Alteração no arquivo validar_arquivo.php para fazer a leitura dos dados

Vamos começar!

Não vou ficar detalhando(explicando) cada comando SQL, basicamente iremos criar as tabelas conforme a estrutura de representação da ANS/TUSS.

A – Criação do banco de dados

1
CREATE DATABASE validador

B – Criação das tabelas que serão utilizadas

Observe que junto defini o atributo cd_termo como chave para indexação dos dados, assim temos otimização na leitura/busca.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--
-- Estrutura da tabela `tabela_18_diaria_taxa_gase`
--
 
CREATE TABLE IF NOT EXISTS `tabela_18_diaria_taxa_gase` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DS_TERMO_DETALHADO` text,
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_19_opme`
--
 
CREATE TABLE IF NOT EXISTS `tabela_19_opme` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(4000) NOT NULL,
`DS_REF_FABRICANTE` VARCHAR(4000) DEFAULT NULL,
`DS_FABRICANTE` VARCHAR(4000),
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_20_medicamento`
--
 
CREATE TABLE IF NOT EXISTS `tabela_20_medicamento` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DS_APRESENTACAO` text,
`DS_LABORATORIO` text,
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_22_procedimentos`
--
 
CREATE TABLE IF NOT EXISTS `tabela_22_procedimentos` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_TERMO` CHAR(8) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DS_TERMO_DETALHADO` text NOT NULL,
`DT_INICIO_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`),
KEY `CD_TERMO_2` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tabela_24_cbo`
--
 
CREATE TABLE IF NOT EXISTS `tabela_24_cbo` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`NR_SEQ_VERSAO_TISS` INT(11) NOT NULL,
`CD_TERMO` VARCHAR(20) NOT NULL,
`DS_TERMO` VARCHAR(300) NOT NULL,
`DT_VIGENCIA` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`),
KEY `CD_TERMO` (`CD_TERMO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=144 ;
 
-- --------------------------------------------------------
 
--
-- Estrutura da tabela `tiss_versao`
--
 
CREATE TABLE IF NOT EXISTS `tiss_versao` (
`NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT,
`CD_VERSAO` VARCHAR(20) NOT NULL,
`CD_VERSAO_MASCARA` VARCHAR(40) NOT NULL,
`DT_VERSAO` DATE NOT NULL,
PRIMARY KEY (`NR_SEQUENCIA`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
 
--
-- Extraindo dados da tabela `tiss_versao`
--
 
INSERT INTO `tiss_versao` (`NR_SEQUENCIA`, `CD_VERSAO`, `CD_VERSAO_MASCARA`, `DT_VERSAO`) VALUES
(1, '030200', '03.02.00', '2016-01-26'),
(2, '030201', '03.02.01', '2016-02-10'),
(3, '030202', '03.02.02', '2016-05-01'),
(4, '030300', '03.03.00', '2016-06-01'),
(5, '030301', '03.03.01', '2016-10-01'),
(6, '030302', '03.03.02', '2017-04-10'),
(7, '030303', '03.03.03', '2018-01-01');

C – Importando os dados para as tabelas

Baixe os arquivos para importar os dados nas tabelas. Para iniciar o download, clique sobre os nomes de cada tabela.

-> tabela_18_diaria_taxa_gase

-> tabela_19_opme

-> tabela_20_medicamento

-> tabela_22_procedimentos

-> tabela_24_cbo

-> tiss_versao

Execute/importe os arquivos utilizando seu programa de gerenciamento de banco de dados recomendo o( WorkBench) é rápido e gera bons logs, se for instalar junto com seu site, utilize o PHPmyAdmin para importar(pois também é eficiente e rápido(se for online).

Dica: Caso esteja utilizando algum pacote de instalação como o Wampserver, Easyphp, entre outros, será necessário ajustar a configuração do MySQL para importar grandes arquivos SQL. Encontre no diretório de instalação dos arquivos;

MySQL -> my.ini

max_allowed_packet = 512M (ou 1024M)
read_buffer_size = 1024K (ou 2048K)

PHP -> php.ini

max_input_time = 1800 (ou 2600)
memory_limit = 128M (ou 256M)

(D) Criação da View e Function MySQL para consulta

Vamos criar uma function para fazer a consulta e comparação se determinado código do procedimento/material/medicamento/opme, existe nas tabelas da TUSS/TISS, lembrando que vamos comparar de acordo a tabela do arquivo (5 brasíndice, simpro, 00 própria)

Como temos várias tabelas separadas, Procedimentos, taxas, materiais, medicamentos vamos criar uma VIEW para unir e facilitar a consuta.

DROP VIEW IF EXISTS `tabela_tiss_tuss`$$

CREATE  VIEW `tabela_tiss_tuss` AS

SELECT 22 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_22_procedimento` `a`

UNION ALL

SELECT 18 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_18_diaria_taxa_gase` `a`

UNION ALL

SELECT 19 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_19_opme` `a`

UNION ALL

SELECT 5 AS `05`,`a`.`NUM_TISS` AS `num_tiss`,CONCAT(`a`.`MED_DESC`,`a`.`APR_DESC`) AS `ds_item` FROM `tabela_brasindice` `a`$$

DELIMITER ;

Criação da Function – O objetivo da function é verificar se o procedimento, taxa, mat/med existe na tabela indicada.

DELIMITER $$

USE `validador`$$

DROP FUNCTION IF EXISTS `obter_se_item_existe`$$

CREATE DEFINER=`validador`@`%` FUNCTION `obter_se_item_existe`(
st_tipo_item_e CHAR(3),
cd_tabela_e INT(11),
cd_item_e INT(11)

) RETURNS VARCHAR(50) CHARSET latin1
DETERMINISTIC
BEGIN

DECLARE st_item_existe_r VARCHAR(150);

IF (cd_tabela_e IS NOT NULL) THEN

IF (cd_item_e IS NOT NULL) THEN

SELECT
IFNULL(MAX(p.cd_termo),0),
INTO st_item_existe_r
FROM tabela_tiss_tuss p
WHERE p.cd_termo = cd_item_e
AND p.cd_tabela = cd_tabela_e
;
END IF;
END IF;

RETURN st_item_existe_r;

END$$

DELIMITER ;

(E) – Conexão com o banco de dados

Agora vamos criar o arquivo de conexão com o banco de dados, para consultar os dados importados, será um arquivo bem simples.

conectadb.inc.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
//chamaremos a classe de "conexão"
 
class conexao {
 
//declaração das variáveis e informações de conexão com o banco
 
var $host_mysql = "localhost"; // Nome ou IP do Servidor
var $user_mysql = "root"; // Usuário do Servidor MySQL
var $senha_mysql = ""; // Senha do Usuário MySQL
var $db_mysql = "validador"; // Nome do seu Banco de Dados
 
}

(F)Alteração no arquivo validar_arquivo.php 

Agora vamos fazer as alterações em nosso arquivo chamado “validar_arquivo.php”, com a chamada da conexão com o banco  e comparação.

 

 

4ª Etapa –  Download dos arquivos e instalação

Estou deixando este link para download de um RAR com os arquivos deste artigo.

Baixar arquivos

Você pode fazer a instalação do Validador TISS em qualquer computador rede local, usando o (Apache, PHP, MySQL), para facilitar a instalação e configuração utilize os famosos pacotes que já são pré configurado.

Obs.: Usando sua rede local, instale apenas em 1 computador e acesse a partir do navegador (ip local) http://192.168.1.xxx/validador

Ou instale junto ao site da sua empresa (criando o diretório chamado (validador) http://seu-site.com/validador

Windows (Qualquer versão)WAMP, EASY PHP, XAMMP,

Linux – CentOS/RedHat (Instale os pacotes usando o comando #yum -y install httpd php php-mysql mysqld mysql-server

 

 

2 Thoughts on “Criando um Validador TISS usando PHP

  1. Franklin Silva on 3 de abril de 2018 at 17:12 said:

    Fabiano, muito bom o seu artigo, porém ainda falta alguns trechos de código, por exemplo não foi informado o arquivo: function_erros_xml.php e também a alteração a ser feita no arquivo: validar_arquivo.php

    pode passar o restante do código?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Post Navigation