Commit 9c8fa388693503b9c9ee09f1189c94a7b59d1fa7

Authored by Guilherme Andrade Del Cantoni
1 parent accd0632

Melhorias gerais no mecanismo de processamento das filas de tarefas

PENIntegracao.php
@@ -11,7 +11,7 @@ class PENIntegracao extends SeiIntegracao { @@ -11,7 +11,7 @@ class PENIntegracao extends SeiIntegracao {
11 } 11 }
12 12
13 public function getVersao() { 13 public function getVersao() {
14 - return '1.2.0'; 14 + return '1.2.1';
15 } 15 }
16 16
17 public function getInstituicao() { 17 public function getInstituicao() {
@@ -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
@@ -19,6 +19,7 @@ class PendenciasTramiteRN extends InfraRN { @@ -19,6 +19,7 @@ class PendenciasTramiteRN extends InfraRN {
19 19
20 public static function getInstance() { 20 public static function getInstance() {
21 if (self::$instance == null) { 21 if (self::$instance == null) {
  22 + PENIntegracao::validarCompatibilidadeBanco();
22 self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance()); 23 self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance());
23 } 24 }
24 25
@@ -72,6 +73,8 @@ class PendenciasTramiteRN extends InfraRN { @@ -72,6 +73,8 @@ class PendenciasTramiteRN extends InfraRN {
72 73
73 while (true) { 74 while (true) {
74 try { 75 try {
  76 + PENIntegracao::validarCompatibilidadeBanco();
  77 +
75 $this->gravarLogDebug('Recuperando lista de pendências do PEN', 1); 78 $this->gravarLogDebug('Recuperando lista de pendências do PEN', 1);
76 $arrObjPendenciasDTO = $this->obterPendenciasTramite(); 79 $arrObjPendenciasDTO = $this->obterPendenciasTramite();
77 foreach ($arrObjPendenciasDTO as $objPendenciaDTO) { 80 foreach ($arrObjPendenciasDTO as $objPendenciaDTO) {
@@ -80,6 +83,12 @@ class PendenciasTramiteRN extends InfraRN { @@ -80,6 +83,12 @@ class PendenciasTramiteRN extends InfraRN {
80 $this->gravarLogDebug($mensagemLog, 3, true); 83 $this->gravarLogDebug($mensagemLog, 3, true);
81 $this->enviarPendenciaFilaProcessamento($objPendenciaDTO); 84 $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);
82 } 85 }
  86 +
  87 + } catch(ModuloIncompativelException $e) {
  88 + //Registra a falha no log do sistema e reinicia o ciclo de requisição e
  89 + //sai loop de eventos para finalizar o script e subir uma nova versão atualizada
  90 + LogSEI::getInstance()->gravar(InfraException::inspecionar($e));
  91 + break;
83 } catch (Exception $e) { 92 } catch (Exception $e) {
84 //Apenas registra a falha no log do sistema e reinicia o ciclo de requisição 93 //Apenas registra a falha no log do sistema e reinicia o ciclo de requisição
85 LogSEI::getInstance()->gravar(InfraException::inspecionar($e)); 94 LogSEI::getInstance()->gravar(InfraException::inspecionar($e));
@@ -211,22 +220,22 @@ class PendenciasTramiteRN extends InfraRN { @@ -211,22 +220,22 @@ class PendenciasTramiteRN extends InfraRN {
211 $client = new GearmanClient(); 220 $client = new GearmanClient();
212 $client->addServer("127.0.0.1", 4730); 221 $client->addServer("127.0.0.1", 4730);
213 222
214 - $strWorkload = strval($objPendencia->getNumIdentificacaoTramite()); 223 + $numIDT = strval($objPendencia->getNumIdentificacaoTramite());
215 224
216 switch ($objPendencia->getStrStatus()) { 225 switch ($objPendencia->getStrStatus()) {
217 226
218 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO: 227 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:
219 - $client->addTaskBackground('enviarComponenteDigital', $strWorkload, null); 228 + $client->addTaskBackground('enviarComponenteDigital', $numIDT, null, $numIDT);
220 break; 229 break;
221 230
222 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE: 231 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:
223 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO: 232 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:
224 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO: 233 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:
225 - $client->addTaskBackground('receberProcedimento', $strWorkload, null); 234 + $client->addTaskBackground('receberProcedimento', $numIDT, null, $numIDT);
226 break; 235 break;
227 236
228 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO: 237 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:
229 - $client->addTaskBackground('receberReciboTramite', $strWorkload, null); 238 + $client->addTaskBackground('receberReciboTramite', $numIDT, null, $numIDT);
230 break; 239 break;
231 240
232 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: 241 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:
@@ -236,7 +245,7 @@ class PendenciasTramiteRN extends InfraRN { @@ -236,7 +245,7 @@ class PendenciasTramiteRN extends InfraRN {
236 break; 245 break;
237 246
238 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO: 247 case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:
239 - $client->addTaskBackground("receberTramitesRecusados", $strWorkload, null);; 248 + $client->addTaskBackground("receberTramitesRecusados", $numIDT, null, $numIDT);
240 break; 249 break;
241 250
242 default: 251 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
@@ -42,6 +42,10 @@ class ProcessoEletronicoRN extends InfraRN { @@ -42,6 +42,10 @@ class ProcessoEletronicoRN extends InfraRN {
42 // 02 a 18 estão registrados na tabela rel_tarefa_operacao 42 // 02 a 18 estão registrados na tabela rel_tarefa_operacao
43 public static $OP_OPERACAO_REGISTRO = "01"; 43 public static $OP_OPERACAO_REGISTRO = "01";
44 44
  45 + // 10 minutos de timeout para requisições via webservice
  46 + const WS_CONNECTION_TIMEOUT = 600;
  47 +
  48 +
45 const ALGORITMO_HASH_DOCUMENTO = 'SHA256'; 49 const ALGORITMO_HASH_DOCUMENTO = 'SHA256';
46 50
47 /** 51 /**
@@ -106,6 +110,9 @@ class ProcessoEletronicoRN extends InfraRN { @@ -106,6 +110,9 @@ class ProcessoEletronicoRN extends InfraRN {
106 , 'passphrase' => $this->strLocalCertPassword 110 , 'passphrase' => $this->strLocalCertPassword
107 , 'resolve_wsdl_remote_includes' => true 111 , 'resolve_wsdl_remote_includes' => true
108 , 'cache_wsdl'=> WSDL_CACHE_NONE 112 , 'cache_wsdl'=> WSDL_CACHE_NONE
  113 + , 'connection_timeout' => self::WS_CONNECTION_TIMEOUT
  114 + , CURLOPT_TIMEOUT => self::WS_CONNECTION_TIMEOUT
  115 + , CURLOPT_CONNECTTIMEOUT => self::WS_CONNECTION_TIMEOUT
109 , 'trace' => true 116 , 'trace' => true
110 , 'encoding' => 'UTF-8' 117 , 'encoding' => 'UTF-8'
111 , 'attachment_type' => BeSimple\SoapCommon\Helper::ATTACHMENTS_TYPE_MTOM 118 , 'attachment_type' => BeSimple\SoapCommon\Helper::ATTACHMENTS_TYPE_MTOM
@@ -367,34 +374,37 @@ class ProcessoEletronicoRN extends InfraRN { @@ -367,34 +374,37 @@ class ProcessoEletronicoRN extends InfraRN {
367 public function consultarMotivosUrgencia() 374 public function consultarMotivosUrgencia()
368 { 375 {
369 $curl = curl_init($this->strComumXSD); 376 $curl = curl_init($this->strComumXSD);
370 - curl_setopt($curl, CURLOPT_URL, $this->strComumXSD);  
371 - curl_setopt($curl, CURLOPT_HEADER, 0);  
372 - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  
373 - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);  
374 - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);  
375 - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
376 - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert);  
377 - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword);  
378 - $output = curl_exec($curl);  
379 - curl_close($curl);  
380 -  
381 - $dom = new DOMDocument;  
382 - $dom->loadXML($output);  
383 -  
384 - $xpath = new DOMXPath($dom);  
385 -  
386 - $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI);  
387 - $xpath->registerNamespace('x', $rootNamespace);  
388 - $entries = $xpath->query('/x:schema/x:simpleType[@name="motivoDaUrgencia"]/x:restriction/x:enumeration');  
389 -  
390 - $resultado = array();  
391 - foreach ($entries as $entry) {  
392 - $valor = $entry->getAttribute('value');  
393 -  
394 - $documentationNode = $xpath->query('x:annotation/x:documentation', $entry);  
395 - $descricao = $documentationNode->item(0)->nodeValue;  
396 -  
397 - $resultado[$valor] = utf8_decode($descricao); 377 +
  378 + try{
  379 + curl_setopt($curl, CURLOPT_URL, $this->strComumXSD);
  380 + curl_setopt($curl, CURLOPT_HEADER, 0);
  381 + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  382 + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  383 + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  384 + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  385 + curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert);
  386 + curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword);
  387 + $output = curl_exec($curl);
  388 +
  389 + $dom = new DOMDocument;
  390 + $dom->loadXML($output);
  391 +
  392 + $xpath = new DOMXPath($dom);
  393 +
  394 + $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI);
  395 + $xpath->registerNamespace('x', $rootNamespace);
  396 + $entries = $xpath->query('/x:schema/x:simpleType[@name="motivoDaUrgencia"]/x:restriction/x:enumeration');
  397 +
  398 + $resultado = array();
  399 + foreach ($entries as $entry) {
  400 + $valor = $entry->getAttribute('value');
  401 + $documentationNode = $xpath->query('x:annotation/x:documentation', $entry);
  402 + $descricao = $documentationNode->item(0)->nodeValue;
  403 + $resultado[$valor] = utf8_decode($descricao);
  404 + }
  405 +
  406 + } finally{
  407 + curl_close($curl);
398 } 408 }
399 409
400 return $resultado; 410 return $resultado;