Commit ec7dbadd8b59ecebae06bf0788b623f5bdc23375

Authored by Guilherme Andrade Del Cantoni
2 parents bb237619 9c8fa388

Merge remote-tracking branch 'origin/fix-gearman' into desenv

PENIntegracao.php
@@ -353,11 +353,38 @@ class PENIntegracao extends SeiIntegracao { @@ -353,11 +353,38 @@ class PENIntegracao extends SeiIntegracao {
353 return $xml; 353 return $xml;
354 } 354 }
355 355
356 - public static function validarCompatibilidadeModulo($bolGerarExcecao = true, $strVersaoSEI = SEI_VERSAO) 356 + public static function validarCompatibilidadeModulo($parStrVersaoSEI=null)
357 { 357 {
  358 + $strVersaoSEI = $parStrVersaoSEI ?: SEI_VERSAO;
358 $objPENIntegracao = new PENIntegracao(); 359 $objPENIntegracao = new PENIntegracao();
359 if(!in_array($strVersaoSEI, self::COMPATIBILIDADE_MODULO_SEI)) { 360 if(!in_array($strVersaoSEI, self::COMPATIBILIDADE_MODULO_SEI)) {
360 throw new InfraException(sprintf("Módulo %s (versão %s) não é compatível com a versão %s do SEI.", $objPENIntegracao->getNome(), $objPENIntegracao->getVersao(), $strVersaoSEI)); 361 throw new InfraException(sprintf("Módulo %s (versão %s) não é compatível com a versão %s do SEI.", $objPENIntegracao->getNome(), $objPENIntegracao->getVersao(), $strVersaoSEI));
361 } 362 }
362 } 363 }
  364 +
  365 + /**
  366 + * Método responsável pela validação da compatibilidade do banco de dados do módulo em relação ao versão instalada.
  367 + *
  368 + * @param boolean $bolGerarExcecao Flag para geração de exceção do tipo InfraException caso base de dados incompatível
  369 + * @return boolean Indicardor se base de dados é compatível
  370 + */
  371 + public static function validarCompatibilidadeBanco($bolGerarExcecao=true)
  372 + {
  373 + $objInfraParametro = new InfraParametro(BancoSEI::getInstance());
  374 + $strVersaoBancoModulo = $objInfraParametro->getValor(PenAtualizarSeiRN::PARAMETRO_VERSAO_MODULO, false) ?: $objInfraParametro->getValor(PenAtualizarSeiRN::PARAMETRO_VERSAO_MODULO_ANTIGO, false);
  375 +
  376 + $objPENIntegracao = new PENIntegracao();
  377 + $strVersaoModulo = $objPENIntegracao->getVersao();
  378 +
  379 + $bolBaseCompativel = ($strVersaoModulo === $strVersaoBancoModulo);
  380 +
  381 + if(!$bolBaseCompativel && $bolGerarExcecao){
  382 + throw new ModuloIncompativelException(sprintf("Base de dados do módulo '%s' (versão %s) encontra-se incompatível. A versão da base de dados atualmente instalada é a %s. \n ".
  383 + "Favor entrar em contato com o administrador do sistema.", $objPENIntegracao->getNome(), $strVersaoModulo, $strVersaoBancoModulo));
  384 + }
  385 +
  386 + return $bolBaseCompativel;
  387 + }
363 } 388 }
  389 +
  390 +class ModuloIncompativelException extends InfraException { }
@@ -80,8 +80,8 @@ Estes dois componentes são utilizados para gerenciar a fila de recebimento de n @@ -80,8 +80,8 @@ Estes dois componentes são utilizados para gerenciar a fila de recebimento de n
80 user=apache 80 user=apache
81 autostart=true 81 autostart=true
82 autorestart=true 82 autorestart=true
83 - startsecs=15  
84 - startretries=3 83 + startsecs=5
  84 + startretries=1000
85 log_stdout=true 85 log_stdout=true
86 log_stderr=true 86 log_stderr=true
87 logfile_backups=50 87 logfile_backups=50
@@ -99,8 +99,8 @@ Estes dois componentes são utilizados para gerenciar a fila de recebimento de n @@ -99,8 +99,8 @@ Estes dois componentes são utilizados para gerenciar a fila de recebimento de n
99 user=apache 99 user=apache
100 autostart=true 100 autostart=true
101 autorestart=true 101 autorestart=true
102 - startsecs=15  
103 - startretries=3 102 + startsecs=5
  103 + startretries=1000
104 log_stdout=true 104 log_stdout=true
105 log_stderr=true 105 log_stderr=true
106 logfile_maxbytes=10MB 106 logfile_maxbytes=10MB
rn/EnviarReciboTramiteRN.php
@@ -84,45 +84,57 @@ class EnviarReciboTramiteRN extends InfraRN @@ -84,45 +84,57 @@ class EnviarReciboTramiteRN extends InfraRN
84 84
85 public function enviarReciboTramiteProcesso($parNumIdTramite, $parArrayHash = null, $parDthRecebimento = null) 85 public function enviarReciboTramiteProcesso($parNumIdTramite, $parArrayHash = null, $parDthRecebimento = null)
86 { 86 {
87 - date_default_timezone_set('America/Sao_Paulo'); 87 + try{
  88 + date_default_timezone_set('America/Sao_Paulo');
88 89
89 - if(!isset($parNumIdTramite) || $parNumIdTramite == 0) {  
90 - throw new InfraException('Parâmetro $parNumIdTramite não informado.');  
91 - } 90 + if(!isset($parNumIdTramite) || $parNumIdTramite == 0) {
  91 + throw new InfraException('Parâmetro $parNumIdTramite não informado.');
  92 + }
92 93
93 - //Verifica se todos os componentes digitais já foram devidamente recebido  
94 - $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdTramite);  
95 - if(!isset($arrObjTramite) || count($arrObjTramite) != 1) {  
96 - throw new InfraException("Trâmite não pode ser localizado pelo identificador $parNumIdTramite.");  
97 - } 94 + //Verifica se todos os componentes digitais já foram devidamente recebido
  95 + $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdTramite);
  96 + if(!isset($arrObjTramite) || count($arrObjTramite) != 1) {
  97 + throw new InfraException("Trâmite não pode ser localizado pelo identificador $parNumIdTramite.");
  98 + }
98 99
99 - $objTramite = $arrObjTramite[0];  
100 - $strNumeroRegistro = $objTramite->NRE; 100 + $objTramite = $arrObjTramite[0];
  101 + $strNumeroRegistro = $objTramite->NRE;
101 102
102 - if($objTramite->situacaoAtual != ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO) {  
103 - throw new InfraException('Situação do Trâmite diferente da permitida para o envio do recibo de conclusão de trâmite.');  
104 - } 103 + if($objTramite->situacaoAtual != ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO) {
  104 + throw new InfraException('Situação do Trâmite diferente da permitida para o envio do recibo de conclusão de trâmite.');
  105 + }
105 106
106 - $dthRecebimentoComponentesDigitais = $this->obterDataRecebimentoComponentesDigitais($objTramite);  
107 - $dthRecebimentoComponentesDigitais = $dthRecebimentoComponentesDigitais ?: date();  
108 - $dthRecebimento = gmdate("Y-m-d\TH:i:s.000\Z", InfraData::getTimestamp($dthRecebimentoComponentesDigitais)); 107 + $dthRecebimentoComponentesDigitais = $this->obterDataRecebimentoComponentesDigitais($objTramite);
  108 + $dthRecebimentoComponentesDigitais = $dthRecebimentoComponentesDigitais ?: date();
  109 + $dthRecebimento = gmdate("Y-m-d\TH:i:s.000\Z", InfraData::getTimestamp($dthRecebimentoComponentesDigitais));
109 110
110 - $strReciboTramite = "<recibo>";  
111 - $strReciboTramite .= "<IDT>$parNumIdTramite</IDT>";  
112 - $strReciboTramite .= "<NRE>$strNumeroRegistro</NRE>";  
113 - $strReciboTramite .= "<dataDeRecebimento>$dthRecebimento</dataDeRecebimento>";  
114 - sort($parArrayHash); 111 + $strReciboTramite = "<recibo>";
  112 + $strReciboTramite .= "<IDT>$parNumIdTramite</IDT>";
  113 + $strReciboTramite .= "<NRE>$strNumeroRegistro</NRE>";
  114 + $strReciboTramite .= "<dataDeRecebimento>$dthRecebimento</dataDeRecebimento>";
  115 + sort($parArrayHash);
115 116
116 - foreach ($parArrayHash as $strHashConteudo) {  
117 - if(!empty($strHashConteudo)){  
118 - $strReciboTramite .= "<hashDoComponenteDigital>$strHashConteudo</hashDoComponenteDigital>";  
119 - }  
120 - }  
121 - $strReciboTramite .= "</recibo>"; 117 + foreach ($parArrayHash as $strHashConteudo) {
  118 + if(!empty($strHashConteudo)){
  119 + $strReciboTramite .= "<hashDoComponenteDigital>$strHashConteudo</hashDoComponenteDigital>";
  120 + }
  121 + }
  122 + $strReciboTramite .= "</recibo>";
  123 +
  124 + //Envia o Recibo de salva no banco
  125 + $hashAssinatura = $this->objProcessoEletronicoRN->enviarReciboDeTramite($parNumIdTramite, $dthRecebimento, $strReciboTramite);
  126 + $this->cadastrarReciboTramiteRecebimento($strNumeroRegistro, $parNumIdTramite, $hashAssinatura, $parArrayHash);
122 127
123 - //Envia o Recibo de salva no banco  
124 - $hashAssinatura = $this->objProcessoEletronicoRN->enviarReciboDeTramite($parNumIdTramite, $dthRecebimento, $strReciboTramite);  
125 - $this->cadastrarReciboTramiteRecebimento($strNumeroRegistro, $parNumIdTramite, $hashAssinatura, $parArrayHash); 128 + } catch (Exception $e) {
  129 + $detalhes = null;
  130 + $mensagem = InfraException::inspecionar($e);
  131 +
  132 + if(isset($strReciboTramite)){
  133 + $detalhes = "Falha na validação do recibo de conclusão do trâmite do processo. Recibo: \n" . $strReciboTramite;
  134 + }
  135 +
  136 + throw new InfraException($mensagem, $e, $detalhes);
  137 + }
126 } 138 }
127 139
128 private function obterDataRecebimentoComponentesDigitais($parObjTramite){ 140 private function obterDataRecebimentoComponentesDigitais($parObjTramite){
@@ -147,7 +159,7 @@ class EnviarReciboTramiteRN extends InfraRN @@ -147,7 +159,7 @@ class EnviarReciboTramiteRN extends InfraRN
147 /** 159 /**
148 * Consulta o componente digital no barramento. Utilizado para casos de retrasmissão, 160 * Consulta o componente digital no barramento. Utilizado para casos de retrasmissão,
149 * onde esta unidade esta recebendo um componente digital que pertence à ela 161 * onde esta unidade esta recebendo um componente digital que pertence à ela
150 - * própria, então o id_tramite de envio, que foi gravado, é diferente do de recebimento 162 + * própria, então o id_tramite de envio, que foi gravado, é diferente do recebimento
151 * 163 *
152 * @param int $numIdTramite 164 * @param int $numIdTramite
153 * @return array[ComponenteDigitalDTO] 165 * @return array[ComponenteDigitalDTO]
@@ -188,7 +200,6 @@ class EnviarReciboTramiteRN extends InfraRN @@ -188,7 +200,6 @@ class EnviarReciboTramiteRN extends InfraRN
188 $objDocumentoDTO = $objDocumentoBD->consultar($objDocumentoDTO); 200 $objDocumentoDTO = $objDocumentoBD->consultar($objDocumentoDTO);
189 201
190 if(empty($objDocumentoDTO)) { 202 if(empty($objDocumentoDTO)) {
191 -  
192 $dblIdDocumento = $objDocumentoDTO->getDblIdDocumento(); 203 $dblIdDocumento = $objDocumentoDTO->getDblIdDocumento();
193 } 204 }
194 } 205 }
rn/PendenciasTramiteRN.php
@@ -20,6 +20,7 @@ class PendenciasTramiteRN extends InfraRN { @@ -20,6 +20,7 @@ class PendenciasTramiteRN extends InfraRN {
20 20
21 public static function getInstance() { 21 public static function getInstance() {
22 if (self::$instance == null) { 22 if (self::$instance == null) {
  23 + PENIntegracao::validarCompatibilidadeBanco();
23 self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance()); 24 self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance());
24 } 25 }
25 26
@@ -73,6 +74,8 @@ class PendenciasTramiteRN extends InfraRN { @@ -73,6 +74,8 @@ class PendenciasTramiteRN extends InfraRN {
73 74
74 while (true) { 75 while (true) {
75 try { 76 try {
  77 + PENIntegracao::validarCompatibilidadeBanco();
  78 +
76 $this->gravarLogDebug('Recuperando lista de pendências do PEN', 1); 79 $this->gravarLogDebug('Recuperando lista de pendências do PEN', 1);
77 $arrObjPendenciasDTO = $this->obterPendenciasTramite(); 80 $arrObjPendenciasDTO = $this->obterPendenciasTramite();
78 foreach ($arrObjPendenciasDTO as $objPendenciaDTO) { 81 foreach ($arrObjPendenciasDTO as $objPendenciaDTO) {
@@ -81,6 +84,12 @@ class PendenciasTramiteRN extends InfraRN { @@ -81,6 +84,12 @@ class PendenciasTramiteRN extends InfraRN {
81 $this->gravarLogDebug($mensagemLog, 3, true); 84 $this->gravarLogDebug($mensagemLog, 3, true);
82 $this->enviarPendenciaFilaProcessamento($objPendenciaDTO); 85 $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);
83 } 86 }
  87 +
  88 + } catch(ModuloIncompativelException $e) {
  89 + //Registra a falha no log do sistema e reinicia o ciclo de requisição e
  90 + //sai loop de eventos para finalizar o script e subir uma nova versão atualizada
  91 + LogSEI::getInstance()->gravar(InfraException::inspecionar($e));
  92 + break;
84 } catch (Exception $e) { 93 } catch (Exception $e) {
85 //Apenas registra a falha no log do sistema e reinicia o ciclo de requisição 94 //Apenas registra a falha no log do sistema e reinicia o ciclo de requisição
86 LogSEI::getInstance()->gravar(InfraException::inspecionar($e)); 95 LogSEI::getInstance()->gravar(InfraException::inspecionar($e));
@@ -212,22 +221,22 @@ class PendenciasTramiteRN extends InfraRN { @@ -212,22 +221,22 @@ class PendenciasTramiteRN extends InfraRN {
212 $client = new GearmanClient(); 221 $client = new GearmanClient();
213 $client->addServer("127.0.0.1", 4730); 222 $client->addServer("127.0.0.1", 4730);
214 223
215 - $strWorkload = strval($objPendencia->getNumIdentificacaoTramite()); 224 + $numIDT = strval($objPendencia->getNumIdentificacaoTramite());
216 225
217 switch ($objPendencia->getStrStatus()) { 226 switch ($objPendencia->getStrStatus()) {
218 227
219 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO: 228 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:
220 - $client->addTaskBackground('enviarComponenteDigital', $strWorkload, null); 229 + $client->addTaskBackground('enviarComponenteDigital', $numIDT, null, $numIDT);
221 break; 230 break;
222 231
223 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE: 232 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:
224 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO: 233 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:
225 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO: 234 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:
226 - $client->addTaskBackground('receberProcedimento', $strWorkload, null); 235 + $client->addTaskBackground('receberProcedimento', $numIDT, null, $numIDT);
227 break; 236 break;
228 237
229 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO: 238 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:
230 - $client->addTaskBackground('receberReciboTramite', $strWorkload, null); 239 + $client->addTaskBackground('receberReciboTramite', $numIDT, null, $numIDT);
231 break; 240 break;
232 241
233 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: 242 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:
@@ -237,7 +246,7 @@ class PendenciasTramiteRN extends InfraRN { @@ -237,7 +246,7 @@ class PendenciasTramiteRN extends InfraRN {
237 break; 246 break;
238 247
239 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO: 248 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:
240 - $client->addTaskBackground("receberTramitesRecusados", $strWorkload, null);; 249 + $client->addTaskBackground("receberTramitesRecusados", $numIDT, null, $numIDT);
241 break; 250 break;
242 251
243 default: 252 default:
rn/ProcessarPendenciasRN.php
@@ -49,6 +49,9 @@ class ProcessarPendenciasRN extends InfraAgendamentoTarefa @@ -49,6 +49,9 @@ class ProcessarPendenciasRN extends InfraAgendamentoTarefa
49 49
50 while($this->objGearmanWorker->work()) 50 while($this->objGearmanWorker->work())
51 { 51 {
  52 + PENIntegracao::validarCompatibilidadeBanco();
  53 +
  54 + $this->gravarLogDebug("Gearman worker return code: " . $this->objGearmanWorker->returnCode(), 0, true);
52 if ($this->objGearmanWorker->returnCode() != GEARMAN_SUCCESS) { 55 if ($this->objGearmanWorker->returnCode() != GEARMAN_SUCCESS) {
53 $strErro = 'Erro no processamento de pendências do PEN. ErrorCode: ' . $this->objGearmanWorker->returnCode(); 56 $strErro = 'Erro no processamento de pendências do PEN. ErrorCode: ' . $this->objGearmanWorker->returnCode();
54 LogSEI::getInstance()->gravar($strErro); 57 LogSEI::getInstance()->gravar($strErro);
rn/ProcessoEletronicoRN.php
@@ -43,6 +43,10 @@ class ProcessoEletronicoRN extends InfraRN { @@ -43,6 +43,10 @@ class ProcessoEletronicoRN extends InfraRN {
43 // 02 a 18 estão registrados na tabela rel_tarefa_operacao 43 // 02 a 18 estão registrados na tabela rel_tarefa_operacao
44 public static $OP_OPERACAO_REGISTRO = "01"; 44 public static $OP_OPERACAO_REGISTRO = "01";
45 45
  46 + // 10 minutos de timeout para requisições via webservice
  47 + const WS_CONNECTION_TIMEOUT = 600;
  48 +
  49 +
46 const ALGORITMO_HASH_DOCUMENTO = 'SHA256'; 50 const ALGORITMO_HASH_DOCUMENTO = 'SHA256';
47 51
48 /** 52 /**
@@ -107,6 +111,9 @@ class ProcessoEletronicoRN extends InfraRN { @@ -107,6 +111,9 @@ class ProcessoEletronicoRN extends InfraRN {
107 , 'passphrase' => $this->strLocalCertPassword 111 , 'passphrase' => $this->strLocalCertPassword
108 , 'resolve_wsdl_remote_includes' => true 112 , 'resolve_wsdl_remote_includes' => true
109 , 'cache_wsdl'=> WSDL_CACHE_NONE 113 , 'cache_wsdl'=> WSDL_CACHE_NONE
  114 + , 'connection_timeout' => self::WS_CONNECTION_TIMEOUT
  115 + , CURLOPT_TIMEOUT => self::WS_CONNECTION_TIMEOUT
  116 + , CURLOPT_CONNECTTIMEOUT => self::WS_CONNECTION_TIMEOUT
110 , 'trace' => true 117 , 'trace' => true
111 , 'encoding' => 'UTF-8' 118 , 'encoding' => 'UTF-8'
112 , 'attachment_type' => BeSimple\SoapCommon\Helper::ATTACHMENTS_TYPE_MTOM 119 , 'attachment_type' => BeSimple\SoapCommon\Helper::ATTACHMENTS_TYPE_MTOM
@@ -368,34 +375,37 @@ class ProcessoEletronicoRN extends InfraRN { @@ -368,34 +375,37 @@ class ProcessoEletronicoRN extends InfraRN {
368 public function consultarMotivosUrgencia() 375 public function consultarMotivosUrgencia()
369 { 376 {
370 $curl = curl_init($this->strComumXSD); 377 $curl = curl_init($this->strComumXSD);
371 - curl_setopt($curl, CURLOPT_URL, $this->strComumXSD);  
372 - curl_setopt($curl, CURLOPT_HEADER, 0);  
373 - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  
374 - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);  
375 - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);  
376 - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
377 - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert);  
378 - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword);  
379 - $output = curl_exec($curl);  
380 - curl_close($curl);  
381 -  
382 - $dom = new DOMDocument;  
383 - $dom->loadXML($output);  
384 -  
385 - $xpath = new DOMXPath($dom);  
386 -  
387 - $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI);  
388 - $xpath->registerNamespace('x', $rootNamespace);  
389 - $entries = $xpath->query('/x:schema/x:simpleType[@name="motivoDaUrgencia"]/x:restriction/x:enumeration');  
390 -  
391 - $resultado = array();  
392 - foreach ($entries as $entry) {  
393 - $valor = $entry->getAttribute('value');  
394 -  
395 - $documentationNode = $xpath->query('x:annotation/x:documentation', $entry);  
396 - $descricao = $documentationNode->item(0)->nodeValue;  
397 -  
398 - $resultado[$valor] = utf8_decode($descricao); 378 +
  379 + try{
  380 + curl_setopt($curl, CURLOPT_URL, $this->strComumXSD);
  381 + curl_setopt($curl, CURLOPT_HEADER, 0);
  382 + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  383 + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  384 + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  385 + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  386 + curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert);
  387 + curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword);
  388 + $output = curl_exec($curl);
  389 +
  390 + $dom = new DOMDocument;
  391 + $dom->loadXML($output);
  392 +
  393 + $xpath = new DOMXPath($dom);
  394 +
  395 + $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI);
  396 + $xpath->registerNamespace('x', $rootNamespace);
  397 + $entries = $xpath->query('/x:schema/x:simpleType[@name="motivoDaUrgencia"]/x:restriction/x:enumeration');
  398 +
  399 + $resultado = array();
  400 + foreach ($entries as $entry) {
  401 + $valor = $entry->getAttribute('value');
  402 + $documentationNode = $xpath->query('x:annotation/x:documentation', $entry);
  403 + $descricao = $documentationNode->item(0)->nodeValue;
  404 + $resultado[$valor] = utf8_decode($descricao);
  405 + }
  406 +
  407 + } finally{
  408 + curl_close($curl);
399 } 409 }
400 410
401 return $resultado; 411 return $resultado;