Commit 96599235b2ec06b4c0c9f075949f37279f8feb16

Authored by Eduardo Heinske
2 parents 2defe5d0 513534cc

Merge de uma correção não comitada da branch 87_OS026

rn/PENAgendamentoRN.php
1 -<?php  
2 -  
3 -require_once dirname(__FILE__) . '/../../../SEI.php';  
4 -  
5 -class PENAgendamentoRN extends InfraRN {  
6 -  
7 - public function __construct() {  
8 - parent::__construct();  
9 - }  
10 -  
11 - protected function inicializarObjInfraIBanco() {  
12 - return BancoSEI::getInstance();  
13 - }  
14 -  
15 - public function processarPendencias() {  
16 - try {  
17 -  
18 - ini_set('max_execution_time', '0');  
19 - ini_set('memory_limit', '-1');  
20 -  
21 - InfraDebug::getInstance()->setBolLigado(true);  
22 - InfraDebug::getInstance()->setBolDebugInfra(false);  
23 - InfraDebug::getInstance()->setBolEcho(false);  
24 - InfraDebug::getInstance()->limpar();  
25 -  
26 - SessaoSEI::getInstance(false)->simularLogin(SessaoSEI::$USUARIO_SEI, SessaoSEI::$UNIDADE_TESTE);  
27 -  
28 - $numSeg = InfraUtil::verificarTempoProcessamento();  
29 -  
30 - InfraDebug::getInstance()->gravar('ANALISANDO OS TRÂMITES PENDENTES ENVIADOS PARA O ÓRGÃO (PEN)');  
31 -  
32 - // Verifica todas as pendências de trâmite para o órgão atual  
33 - $objReceberProcedimentoRN = new ReceberProcedimentoRN();  
34 - $objEnviarReciboTramiteRN = new EnviarReciboTramiteRN();  
35 - $objReceberReciboTramiteRN = new ReceberReciboTramiteRN();  
36 -  
37 - $result = $objReceberProcedimentoRN->listarPendencias();  
38 -  
39 - if (isset($result) && count($result) > 0) {  
40 -  
41 - //Identificar à natureza da pendência  
42 - foreach ($result as $pendencia) {  
43 -  
44 - try {  
45 -  
46 - switch ($pendencia->getStrStatus()) {  
47 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:  
48 - ;  
49 - break;  
50 -  
51 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:  
52 - $objReceberProcedimentoRN->receberProcedimento($pendencia->getNumIdentificacaoTramite());  
53 - $objEnviarReciboTramiteRN->enviarReciboTramiteProcesso($pendencia->getNumIdentificacaoTramite());  
54 - break;  
55 -  
56 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:  
57 - $objReceberProcedimentoRN->receberProcedimento($pendencia->getNumIdentificacaoTramite());  
58 - $objEnviarReciboTramiteRN->enviarReciboTramiteProcesso($pendencia->getNumIdentificacaoTramite());  
59 - break;  
60 -  
61 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:  
62 - $objReceberProcedimentoRN->receberProcedimento($pendencia->getNumIdentificacaoTramite());  
63 - $objEnviarReciboTramiteRN->enviarReciboTramiteProcesso($pendencia->getNumIdentificacaoTramite());  
64 - break;  
65 -  
66 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:  
67 - $objReceberReciboTramiteRN->receberReciboDeTramite($pendencia->getNumIdentificacaoTramite());  
68 - break;  
69 -  
70 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:  
71 - ;  
72 - break;  
73 -  
74 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO:  
75 - ;  
76 - break;  
77 -  
78 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:  
79 - ;  
80 - break;  
81 -  
82 - default:  
83 - //TODO: Alterar lógica para não deixar de processar demais pendências retornadas pelo PEN  
84 - throw new Exception('Situação do trâmite não pode ser identificada.');  
85 - break;  
86 - }  
87 - } catch (InfraException $e) {  
88 - $strAssunto = 'Erro executando agendamentos.';  
89 - $strErro = InfraException::inspecionar($e);  
90 - LogSEI::getInstance()->gravar($strAssunto . "\n\n" . $strErro);  
91 - }  
92 - }  
93 - }  
94 -  
95 - $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);  
96 - InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: ' . $numSeg . ' s');  
97 - InfraDebug::getInstance()->gravar('FIM');  
98 -  
99 - LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug());  
100 - } catch (Exception $e) {  
101 - InfraDebug::getInstance()->setBolLigado(false);  
102 - InfraDebug::getInstance()->setBolDebugInfra(false);  
103 - InfraDebug::getInstance()->setBolEcho(false);  
104 -  
105 - throw new InfraException('Erro processando pendências de integração com o PEN - Processo Eletrônico Nacional.', $e);  
106 - }  
107 - }  
108 -  
109 - public function verificarTramitesRecusados() {  
110 -  
111 - try {  
112 -  
113 - ini_set('max_execution_time', '0');  
114 - ini_set('memory_limit', '-1');  
115 -  
116 - InfraDebug::getInstance()->setBolLigado(true);  
117 - InfraDebug::getInstance()->setBolDebugInfra(false);  
118 - InfraDebug::getInstance()->setBolEcho(false);  
119 - InfraDebug::getInstance()->limpar();  
120 -  
121 - SessaoSEI::getInstance(false)->simularLogin(SessaoSEI::$USUARIO_SEI, SessaoSEI::$UNIDADE_TESTE);  
122 -  
123 - //BUSCA OS TRÂMITES PENDENTES  
124 - $tramitePendenteDTO = new TramitePendenteDTO();  
125 - $tramitePendenteDTO->retNumIdTramite();  
126 - $tramitePendenteDTO->retNumIdAtividade();  
127 - $tramitePendenteDTO->retNumIdTabela();  
128 - $tramitePendenteDTO->setOrd('IdTabela', InfraDTO::$TIPO_ORDENACAO_ASC);  
129 -  
130 - $tramitePendenteBD = new TramiteBD($this->getObjInfraIBanco());  
131 - $pendentes = $tramitePendenteBD->listar($tramitePendenteDTO);  
132 -  
133 -  
134 - if ($pendentes) {  
135 -  
136 - //Instancia a RN de ProcessoEletronico  
137 - $processoEletronicoRN = new ProcessoEletronicoRN();  
138 - $arrProtocolos = array();  
139 -  
140 - foreach ($pendentes as $tramite) {  
141 - $objTramite = $processoEletronicoRN->consultarTramites($tramite->getNumIdTramite());  
142 - $objTramite = $objTramite[0];  
143 -  
144 - if (isset($arrProtocolos[$objTramite->protocolo])) {  
145 - if ($arrProtocolos[$objTramite->protocolo]['objTramite']->situacaoAtual == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE || $arrProtocolos[$objTramite->protocolo]['objTramite']->situacaoAtual == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO) {  
146 - $tramitePendenteBD->excluir($arrProtocolos[$objTramite->protocolo]['tramitePendente']);  
147 - }  
148 - }  
149 -  
150 - $arrProtocolos[$objTramite->protocolo]['objTramite'] = $objTramite;  
151 - $arrProtocolos[$objTramite->protocolo]['tramitePendente'] = $tramite;  
152 - }  
153 -  
154 -  
155 -  
156 - //Percorre as pendências  
157 - foreach ($arrProtocolos as $protocolo) {  
158 -  
159 - //Busca o status do trâmite  
160 - $tramite = $protocolo['tramitePendente'];  
161 - $objTramite = $protocolo['objTramite'];  
162 - $status = $objTramite->situacaoAtual;  
163 -  
164 - if ($status == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO) {  
165 -  
166 - //Verifica se o processo do trâmite se encontra de fato recusado  
167 - //Busca os dados do procedimento  
168 - $processoEletronicoDTO = new ProcessoEletronicoDTO();  
169 - $processoEletronicoDTO->setStrNumeroRegistro($objTramite->NRE);  
170 - $processoEletronicoDTO->retDblIdProcedimento();  
171 -  
172 - $processoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco());  
173 - $objProcessoEletronico = $processoEletronicoBD->consultar($processoEletronicoDTO);  
174 -  
175 - if ($objProcessoEletronico) {  
176 -  
177 - //Busca o processo  
178 - $objProtocolo = new PenProtocoloDTO();  
179 - $objProtocolo->setDblIdProtocolo($objProcessoEletronico->getDblIdProcedimento());  
180 -  
181 - $protocoloBD = new ProtocoloBD($this->getObjInfraIBanco());  
182 -  
183 - //Verifica se o protocolo foi encontrado nessa tabela  
184 - if ($protocoloBD->contar($objProtocolo) > 0) {  
185 -  
186 - //Altera o registro  
187 - $objProtocolo->setStrSinObteveRecusa('S');  
188 - $protocoloBD->alterar($objProtocolo);  
189 -  
190 - //Busca a unidade de destino  
191 - $atributoAndamentoDTO = new AtributoAndamentoDTO();  
192 - $atributoAndamentoDTO->setNumIdAtividade($tramite->getNumIdAtividade());  
193 - $atributoAndamentoDTO->setStrNome('UNIDADE_DESTINO');  
194 - $atributoAndamentoDTO->retStrValor();  
195 -  
196 - $atributoAndamentoBD = new AtributoAndamentoBD($this->getObjInfraIBanco());  
197 - $atributoAndamento = $atributoAndamentoBD->consultar($atributoAndamentoDTO);  
198 -  
199 - $motivo = $objTramite->motivoDaRecusa;  
200 - $unidadeDestino = $atributoAndamento->getStrValor();  
201 -  
202 - //Realiza o registro da recusa  
203 - ExpedirProcedimentoRN::receberRecusaProcedimento(ProcessoEletronicoRN::$MOTIVOS_RECUSA[$motivo], $unidadeDestino, null, $objProcessoEletronico->getDblIdProcedimento());  
204 -  
205 - $tramitePendenteBD->excluir($tramite);  
206 - }  
207 - }  
208 - } else if ($status == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE || $status == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO) {  
209 -  
210 - $tramitePendenteBD->excluir($tramite);  
211 - }  
212 - }  
213 - }  
214 - } catch (Exception $e) {  
215 - InfraDebug::getInstance()->setBolLigado(false);  
216 - InfraDebug::getInstance()->setBolDebugInfra(false);  
217 - InfraDebug::getInstance()->setBolEcho(false);  
218 -  
219 - throw new InfraException('Erro na Verificação de Processos Recusados.', $e);  
220 - }  
221 - }  
222 -  
223 - public function seiVerificarServicosBarramento() {  
224 - try {  
225 -  
226 - $cont = 0;  
227 - $servico = array();  
228 - $exec = shell_exec('ps -ef');  
229 - if (strpos($exec, '/usr/bin/supervisord') == false) {  
230 - $cont++;  
231 - $servico[] = 'supervisord';  
232 - }  
233 - if (strpos($exec, '/usr/sbin/gearmand') == false) {  
234 - $cont++;  
235 - $servico[] = ' gearmand';  
236 - }  
237 - if (strpos($exec, 'PendenciasTramiteRN.php') == false) {  
238 - $cont++;  
239 - $servico[] = ' PendenciasTramiteRN.php';  
240 - }  
241 - if (strpos($exec, 'ProcessarPendenciasRN.php') == false) {  
242 - $cont++;  
243 - $servico[] = 'ProcessarPendenciasRN.php';  
244 - }  
245 -  
246 - $servicos = implode("\n", $servico);  
247 -  
248 -  
249 -  
250 - if ($cont > 0) {  
251 - $msg = "Falha na execução. \n Os seguintes serviços não estão rodando: \n $servicos";  
252 -// LogSEI::getInstance()->gravar();  
253 - throw new InfraException($msg, $e);  
254 - } else {  
255 - LogSEI::getInstance()->gravar("Todos os serviços estão rodando.");  
256 - }  
257 -// $objInfraParametro = new InfraParametro(BancoSEI::getInstance());  
258 -// InfraMail::enviarConfigurado(ConfiguracaoSEI::getInstance(), $objInfraParametro->getValor('SEI_EMAIL_SISTEMA'), $objInfraParametro->getValor('SEI_EMAIL_ADMINISTRADOR'), null, null, 'Teste Agendamento SEI', 'Agendamento SEI executado com sucesso.');  
259 - } catch (Exception $e) {  
260 - throw new InfraException('Erro ao rodar verificação de status do serviços Gearmand e Supervisord', $e);  
261 - }  
262 - }  
263 -  
264 - /**  
265 - * Atualiza??o das hip?teses legais vindas do barramento  
266 - * @throws InfraException  
267 - */  
268 - public function atualizarHipotesesLegais() {  
269 - try {  
270 - $objBD = new PenHipoteseLegalBD($this->inicializarObjInfraIBanco());  
271 - $processoEletronicoRN = new ProcessoEletronicoRN();  
272 - $hipotesesPen = $processoEletronicoRN->consultarHipotesesLegais();  
273 -  
274 - if(empty($hipotesesPen)){  
275 - throw new InfraException('Não foi possível obter as hipóteses legais dos serviços de integração');  
276 - }  
277 -  
278 - //Para cada hipótese vinda do PEN será verificado a existencia.  
279 - foreach ($hipotesesPen->hipotesesLegais->hipotese as $hipotese) {  
280 -  
281 - $objDTO = new PenHipoteseLegalDTO();  
282 - $objDTO->setNumIdentificacao($hipotese->identificacao);  
283 - $objDTO->setNumMaxRegistrosRetorno(1);  
284 - $objDTO->retStrNome();  
285 - $objDTO->retNumIdHipoteseLegal();  
286 - $objConsulta = $objBD->consultar($objDTO);  
287 -  
288 - //Caso não haja um nome para a hipótese legal, ele pula para a próxima.  
289 - if (empty($hipotese->nome)) {  
290 - continue;  
291 - }  
292 -  
293 - $objDTO->setStrNome($hipotese->nome);  
294 -  
295 - if ($hipotese->status) {  
296 - $objDTO->setStrAtivo('S');  
297 - } else {  
298 - $objDTO->setStrAtivo('N');  
299 - }  
300 -  
301 - //Caso n?o exista a hip?tese ir? cadastra-la no sei.  
302 - if (empty($objConsulta)) {  
303 -  
304 - $objBD->cadastrar($objDTO);  
305 - } else {  
306 - //Caso contr?rio apenas ir? atualizar os dados.  
307 - $objDTO->setNumIdHipoteseLegal($objConsulta->getNumIdHipoteseLegal());  
308 - $objBD->alterar($objDTO);  
309 - }  
310 - }  
311 -  
312 -  
313 - LogSEI::getInstance()->gravar("Hipóteses Legais atualizadas.");  
314 - } catch (Exception $e) {  
315 - throw new InfraException('Erro no agendamento das Hipóteses Legais', $e);  
316 - }  
317 - }  
318 -  
319 -}  
320 -  
321 -// $client = new GearmanClient();  
322 -// $client->addServer('localhost', 4730);  
323 -// $client->setCreatedCallback("create_change");  
324 -// $client->setDataCallback("data_change");  
325 -// $client->setStatusCallback("status_change");  
326 -// $client->setCompleteCallback("complete_change");  
327 -// $client->setFailCallback("fail_change");  
328 -// $data_array =array('mydata'=>'task');  
329 -// $task= $client->addTask("reverse", "mydata", $data_array);  
330 -// $task2= $client->addTaskLow("reverse", "task", NULL);  
331 -// //$result = $client->do("reverse", "teste");  
332 -// $client->runTasks();  
333 -// echo "DONE\n" . $result;  
334 -// function create_change($task)  
335 -// {  
336 -// echo "CREATED: " . $task->jobHandle() . "\n";  
337 -// }  
338 -// function status_change($task)  
339 -// {  
340 -// echo "STATUS: " . $task->jobHandle() . " - " . $task->taskNumerator() .  
341 -// "/" . $task->taskDenominator() . "\n";  
342 -// }  
343 -// function complete_change($task)  
344 -// {  
345 -// echo "COMPLETE: " . $task->jobHandle() . ", " . $task->data() . "\n";  
346 -// }  
347 -// function fail_change($task)  
348 -// {  
349 -// echo "FAILED: " . $task->jobHandle() . "\n";  
350 -// }  
351 -// function data_change($task)  
352 -// {  
353 -// echo "DATA: " . $task->data() . "\n";  
354 -// }  
355 -// Function Client_error()  
356 -// {  
357 -// if (! $client->runTasks())  
358 -// return $client->error() ; 1 +<?php
  2 +
  3 +require_once dirname(__FILE__) . '/../../../SEI.php';
  4 +
  5 +class PENAgendamentoRN extends InfraRN {
  6 +
  7 + public function __construct() {
  8 + parent::__construct();
  9 + }
  10 +
  11 + protected function inicializarObjInfraIBanco() {
  12 + return BancoSEI::getInstance();
  13 + }
  14 +
  15 + public function processarPendencias() {
  16 + try {
  17 +
  18 + ini_set('max_execution_time', '0');
  19 + ini_set('memory_limit', '-1');
  20 +
  21 + InfraDebug::getInstance()->setBolLigado(true);
  22 + InfraDebug::getInstance()->setBolDebugInfra(false);
  23 + InfraDebug::getInstance()->setBolEcho(false);
  24 + InfraDebug::getInstance()->limpar();
  25 +
  26 + SessaoSEI::getInstance(false)->simularLogin(SessaoSEI::$USUARIO_SEI, SessaoSEI::$UNIDADE_TESTE);
  27 +
  28 + $numSeg = InfraUtil::verificarTempoProcessamento();
  29 +
  30 + InfraDebug::getInstance()->gravar('ANALISANDO OS TRÂMITES PENDENTES ENVIADOS PARA O ÓRGÃO (PEN)');
  31 +
  32 + // Verifica todas as pendências de trâmite para o órgão atual
  33 + $objReceberProcedimentoRN = new ReceberProcedimentoRN();
  34 + $objEnviarReciboTramiteRN = new EnviarReciboTramiteRN();
  35 + $objReceberReciboTramiteRN = new ReceberReciboTramiteRN();
  36 +
  37 + $result = $objReceberProcedimentoRN->listarPendencias();
  38 +
  39 + if (isset($result) && count($result) > 0) {
  40 +
  41 + //Identificar à natureza da pendência
  42 + foreach ($result as $pendencia) {
  43 +
  44 + try {
  45 +
  46 + switch ($pendencia->getStrStatus()) {
  47 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:
  48 + ;
  49 + break;
  50 +
  51 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:
  52 + $objReceberProcedimentoRN->receberProcedimento($pendencia->getNumIdentificacaoTramite());
  53 + $objEnviarReciboTramiteRN->enviarReciboTramiteProcesso($pendencia->getNumIdentificacaoTramite());
  54 + break;
  55 +
  56 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:
  57 + $objReceberProcedimentoRN->receberProcedimento($pendencia->getNumIdentificacaoTramite());
  58 + $objEnviarReciboTramiteRN->enviarReciboTramiteProcesso($pendencia->getNumIdentificacaoTramite());
  59 + break;
  60 +
  61 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:
  62 + $objReceberProcedimentoRN->receberProcedimento($pendencia->getNumIdentificacaoTramite());
  63 + $objEnviarReciboTramiteRN->enviarReciboTramiteProcesso($pendencia->getNumIdentificacaoTramite());
  64 + break;
  65 +
  66 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:
  67 + $objReceberReciboTramiteRN->receberReciboDeTramite($pendencia->getNumIdentificacaoTramite());
  68 + break;
  69 +
  70 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:
  71 + ;
  72 + break;
  73 +
  74 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO:
  75 + ;
  76 + break;
  77 +
  78 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:
  79 + ;
  80 + break;
  81 +
  82 + default:
  83 + //TODO: Alterar lógica para não deixar de processar demais pendências retornadas pelo PEN
  84 + throw new Exception('Situação do trâmite não pode ser identificada.');
  85 + break;
  86 + }
  87 + } catch (InfraException $e) {
  88 + $strAssunto = 'Erro executando agendamentos.';
  89 + $strErro = InfraException::inspecionar($e);
  90 + LogSEI::getInstance()->gravar($strAssunto . "\n\n" . $strErro);
  91 + }
  92 + }
  93 + }
  94 +
  95 + $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);
  96 + InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: ' . $numSeg . ' s');
  97 + InfraDebug::getInstance()->gravar('FIM');
  98 +
  99 + LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug());
  100 + } catch (Exception $e) {
  101 + InfraDebug::getInstance()->setBolLigado(false);
  102 + InfraDebug::getInstance()->setBolDebugInfra(false);
  103 + InfraDebug::getInstance()->setBolEcho(false);
  104 +
  105 + throw new InfraException('Erro processando pendências de integração com o PEN - Processo Eletrônico Nacional.', $e);
  106 + }
  107 + }
  108 +
  109 + public function verificarTramitesRecusados() {
  110 +
  111 + try {
  112 +
  113 + ini_set('max_execution_time', '0');
  114 + ini_set('memory_limit', '-1');
  115 +
  116 + InfraDebug::getInstance()->setBolLigado(true);
  117 + InfraDebug::getInstance()->setBolDebugInfra(false);
  118 + InfraDebug::getInstance()->setBolEcho(false);
  119 + InfraDebug::getInstance()->limpar();
  120 +
  121 + SessaoSEI::getInstance(false)->simularLogin(SessaoSEI::$USUARIO_SEI, SessaoSEI::$UNIDADE_TESTE);
  122 +
  123 + //BUSCA OS TRÂMITES PENDENTES
  124 + $tramitePendenteDTO = new TramitePendenteDTO();
  125 + $tramitePendenteDTO->retNumIdTramite();
  126 + $tramitePendenteDTO->retNumIdAtividade();
  127 + $tramitePendenteDTO->retNumIdTabela();
  128 + $tramitePendenteDTO->setOrd('IdTabela', InfraDTO::$TIPO_ORDENACAO_ASC);
  129 +
  130 + $tramitePendenteBD = new TramiteBD($this->getObjInfraIBanco());
  131 + $pendentes = $tramitePendenteBD->listar($tramitePendenteDTO);
  132 +
  133 +
  134 + if ($pendentes) {
  135 +
  136 + //Instancia a RN de ProcessoEletronico
  137 + $processoEletronicoRN = new ProcessoEletronicoRN();
  138 + $arrProtocolos = array();
  139 +
  140 + foreach ($pendentes as $tramite) {
  141 + $objTramite = $processoEletronicoRN->consultarTramites($tramite->getNumIdTramite());
  142 + $objTramite = $objTramite[0];
  143 +
  144 + if (isset($arrProtocolos[$objTramite->protocolo])) {
  145 + if ($arrProtocolos[$objTramite->protocolo]['objTramite']->situacaoAtual == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE || $arrProtocolos[$objTramite->protocolo]['objTramite']->situacaoAtual == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO) {
  146 + $tramitePendenteBD->excluir($arrProtocolos[$objTramite->protocolo]['tramitePendente']);
  147 + }
  148 + }
  149 +
  150 + $arrProtocolos[$objTramite->protocolo]['objTramite'] = $objTramite;
  151 + $arrProtocolos[$objTramite->protocolo]['tramitePendente'] = $tramite;
  152 + }
  153 +
  154 +
  155 +
  156 + //Percorre as pendências
  157 + foreach ($arrProtocolos as $protocolo) {
  158 +
  159 + //Busca o status do trâmite
  160 + $tramite = $protocolo['tramitePendente'];
  161 + $objTramite = $protocolo['objTramite'];
  162 + $status = $objTramite->situacaoAtual;
  163 +
  164 + if ($status == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO) {
  165 +
  166 + //Verifica se o processo do trâmite se encontra de fato recusado
  167 + //Busca os dados do procedimento
  168 + $processoEletronicoDTO = new ProcessoEletronicoDTO();
  169 + $processoEletronicoDTO->setStrNumeroRegistro($objTramite->NRE);
  170 + $processoEletronicoDTO->retDblIdProcedimento();
  171 +
  172 + $processoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco());
  173 + $objProcessoEletronico = $processoEletronicoBD->consultar($processoEletronicoDTO);
  174 +
  175 + if ($objProcessoEletronico) {
  176 +
  177 + //Busca o processo
  178 + $objProtocolo = new PenProtocoloDTO();
  179 + $objProtocolo->setDblIdProtocolo($objProcessoEletronico->getDblIdProcedimento());
  180 +
  181 + $protocoloBD = new ProtocoloBD($this->getObjInfraIBanco());
  182 +
  183 + //Verifica se o protocolo foi encontrado nessa tabela
  184 + if ($protocoloBD->contar($objProtocolo) > 0) {
  185 +
  186 + //Altera o registro
  187 + $objProtocolo->setStrSinObteveRecusa('S');
  188 + $protocoloBD->alterar($objProtocolo);
  189 +
  190 + //Busca a unidade de destino
  191 + $atributoAndamentoDTO = new AtributoAndamentoDTO();
  192 + $atributoAndamentoDTO->setNumIdAtividade($tramite->getNumIdAtividade());
  193 + $atributoAndamentoDTO->setStrNome('UNIDADE_DESTINO');
  194 + $atributoAndamentoDTO->retStrValor();
  195 +
  196 + $atributoAndamentoBD = new AtributoAndamentoBD($this->getObjInfraIBanco());
  197 + $atributoAndamento = $atributoAndamentoBD->consultar($atributoAndamentoDTO);
  198 +
  199 + $motivo = $objTramite->motivoDaRecusa;
  200 + $unidadeDestino = $atributoAndamento->getStrValor();
  201 +
  202 + //Realiza o registro da recusa
  203 + ExpedirProcedimentoRN::receberRecusaProcedimento(ProcessoEletronicoRN::$MOTIVOS_RECUSA[$motivo], $unidadeDestino, null, $objProcessoEletronico->getDblIdProcedimento());
  204 +
  205 + $tramitePendenteBD->excluir($tramite);
  206 + }
  207 + }
  208 + } else if ($status == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE || $status == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO) {
  209 +
  210 + $tramitePendenteBD->excluir($tramite);
  211 + }
  212 + }
  213 + }
  214 + } catch (Exception $e) {
  215 + InfraDebug::getInstance()->setBolLigado(false);
  216 + InfraDebug::getInstance()->setBolDebugInfra(false);
  217 + InfraDebug::getInstance()->setBolEcho(false);
  218 +
  219 + throw new InfraException('Erro na Verificação de Processos Recusados.', $e);
  220 + }
  221 + }
  222 +
  223 + public function seiVerificarServicosBarramento() {
  224 + try {
  225 +
  226 + $cont = 0;
  227 + $servico = array();
  228 + $exec = shell_exec('ps -ef');
  229 + if (strpos($exec, '/usr/bin/supervisord') == false) {
  230 + $cont++;
  231 + $servico[] = 'supervisord';
  232 + }
  233 + if (strpos($exec, '/usr/sbin/gearmand') == false) {
  234 + $cont++;
  235 + $servico[] = ' gearmand';
  236 + }
  237 + if (strpos($exec, 'PendenciasTramiteRN.php') == false) {
  238 + $cont++;
  239 + $servico[] = ' PendenciasTramiteRN.php';
  240 + }
  241 + if (strpos($exec, 'ProcessarPendenciasRN.php') == false) {
  242 + $cont++;
  243 + $servico[] = 'ProcessarPendenciasRN.php';
  244 + }
  245 +
  246 + $servicos = implode("\n", $servico);
  247 +
  248 +
  249 +
  250 + if ($cont > 0) {
  251 + $msg = "Falha na execução. \n Os seguintes serviços não estão rodando: \n $servicos";
  252 +// LogSEI::getInstance()->gravar();
  253 + throw new InfraException($msg, $e);
  254 + } else {
  255 + LogSEI::getInstance()->gravar("Todos os serviços estão rodando.");
  256 + }
  257 +// $objInfraParametro = new InfraParametro(BancoSEI::getInstance());
  258 +// InfraMail::enviarConfigurado(ConfiguracaoSEI::getInstance(), $objInfraParametro->getValor('SEI_EMAIL_SISTEMA'), $objInfraParametro->getValor('SEI_EMAIL_ADMINISTRADOR'), null, null, 'Teste Agendamento SEI', 'Agendamento SEI executado com sucesso.');
  259 + } catch (Exception $e) {
  260 + throw new InfraException('Erro ao rodar verificação de status do serviços Gearmand e Supervisord', $e);
  261 + }
  262 + }
  263 +
  264 + /**
  265 + * Atualiza??o das hip?teses legais vindas do barramento
  266 + * @throws InfraException
  267 + */
  268 + public function atualizarHipotesesLegais() {
  269 + try {
  270 + $objBD = new PenHipoteseLegalBD($this->inicializarObjInfraIBanco());
  271 + $processoEletronicoRN = new ProcessoEletronicoRN();
  272 + $hipotesesPen = $processoEletronicoRN->consultarHipotesesLegais();
  273 +
  274 + if(empty($hipotesesPen)){
  275 + throw new InfraException('Não foi possível obter as hipóteses legais dos serviços de integração');
  276 + }
  277 +
  278 + //Para cada hipótese vinda do PEN será verificado a existencia.
  279 + foreach ($hipotesesPen->hipotesesLegais->hipotese as $hipotese) {
  280 +
  281 + $objDTO = new PenHipoteseLegalDTO();
  282 + $objDTO->setNumIdentificacao($hipotese->identificacao);
  283 + $objDTO->setNumMaxRegistrosRetorno(1);
  284 + $objDTO->retStrNome();
  285 + $objDTO->retNumIdHipoteseLegal();
  286 + $objConsulta = $objBD->consultar($objDTO);
  287 +
  288 + //Caso não haja um nome para a hipótese legal, ele pula para a próxima.
  289 + if (empty($hipotese->nome)) {
  290 + continue;
  291 + }
  292 +
  293 + $objDTO->setStrNome($hipotese->nome);
  294 +
  295 + if ($hipotese->status) {
  296 + $objDTO->setStrAtivo('S');
  297 + } else {
  298 + $objDTO->setStrAtivo('N');
  299 + }
  300 +
  301 + //Caso n?o exista a hip?tese ir? cadastra-la no sei.
  302 + if (empty($objConsulta)) {
  303 +
  304 + $objBD->cadastrar($objDTO);
  305 + } else {
  306 + //Caso contr?rio apenas ir? atualizar os dados.
  307 + $objDTO->setNumIdHipoteseLegal($objConsulta->getNumIdHipoteseLegal());
  308 + $objBD->alterar($objDTO);
  309 + }
  310 + }
  311 +
  312 +
  313 + LogSEI::getInstance()->gravar("Hipóteses Legais atualizadas.");
  314 + } catch (Exception $e) {
  315 + throw new InfraException('Erro no agendamento das Hipóteses Legais', $e);
  316 + }
  317 + }
  318 +
  319 +}
  320 +
  321 +// $client = new GearmanClient();
  322 +// $client->addServer('localhost', 4730);
  323 +// $client->setCreatedCallback("create_change");
  324 +// $client->setDataCallback("data_change");
  325 +// $client->setStatusCallback("status_change");
  326 +// $client->setCompleteCallback("complete_change");
  327 +// $client->setFailCallback("fail_change");
  328 +// $data_array =array('mydata'=>'task');
  329 +// $task= $client->addTask("reverse", "mydata", $data_array);
  330 +// $task2= $client->addTaskLow("reverse", "task", NULL);
  331 +// //$result = $client->do("reverse", "teste");
  332 +// $client->runTasks();
  333 +// echo "DONE\n" . $result;
  334 +// function create_change($task)
  335 +// {
  336 +// echo "CREATED: " . $task->jobHandle() . "\n";
  337 +// }
  338 +// function status_change($task)
  339 +// {
  340 +// echo "STATUS: " . $task->jobHandle() . " - " . $task->taskNumerator() .
  341 +// "/" . $task->taskDenominator() . "\n";
  342 +// }
  343 +// function complete_change($task)
  344 +// {
  345 +// echo "COMPLETE: " . $task->jobHandle() . ", " . $task->data() . "\n";
  346 +// }
  347 +// function fail_change($task)
  348 +// {
  349 +// echo "FAILED: " . $task->jobHandle() . "\n";
  350 +// }
  351 +// function data_change($task)
  352 +// {
  353 +// echo "DATA: " . $task->data() . "\n";
  354 +// }
  355 +// Function Client_error()
  356 +// {
  357 +// if (! $client->runTasks())
  358 +// return $client->error() ;
359 // } 359 // }
360 \ No newline at end of file 360 \ No newline at end of file
rn/PendenciasTramiteRN.php
1 -<?php  
2 -  
3 -require_once dirname(__FILE__) . '/../../../SEI.php';  
4 -  
5 -error_reporting(E_ALL);  
6 -  
7 -//TODO: Modificar nome da classe e mtodo para outro mais apropriado  
8 -class PendenciasTramiteRN extends InfraRN {  
9 -  
10 - private static $instance = null;  
11 - private $strEnderecoServicoPendencias = null;  
12 - private $strLocalizacaoCertificadoDigital = null;  
13 - private $strSenhaCertificadoDigital = null;  
14 -  
15 - protected function inicializarObjInfraIBanco(){  
16 - return BancoSEI::getInstance();  
17 - }  
18 -  
19 - public static function getInstance() {  
20 - if (self::$instance == null) {  
21 - self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance());  
22 - }  
23 -  
24 - return self::$instance;  
25 - }  
26 -  
27 - public function __construct() {  
28 - $objPenParametroRN = new PenParametroRN();  
29 -  
30 - $this->strLocalizacaoCertificadoDigital = $objPenParametroRN->getParametro('PEN_LOCALIZACAO_CERTIFICADO_DIGITAL');  
31 - $this->strEnderecoServicoPendencias = $objPenParametroRN->getParametro('PEN_ENDERECO_WEBSERVICE_PENDENCIAS');  
32 - //TODO: Urgente - Remover senha do certificado de autenticao dos servios do PEN da tabela de parâmetros  
33 - $this->strSenhaCertificadoDigital = $objPenParametroRN->getParametro('PEN_SENHA_CERTIFICADO_DIGITAL');  
34 -  
35 - if (InfraString::isBolVazia($this->strEnderecoServicoPendencias)) {  
36 - throw new InfraException('Endereço do serviço de pendências de trâmite do Processo Eletrônico Nacional (PEN) não informado.');  
37 - }  
38 -  
39 - if (!@file_get_contents($this->strLocalizacaoCertificadoDigital)) {  
40 - throw new InfraException("Certificado digital de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não encontrado.");  
41 - }  
42 -  
43 - if (InfraString::isBolVazia($this->strSenhaCertificadoDigital)) {  
44 - throw new InfraException('Dados de autenticação do serviço de integração do Processo Eletrónico Nacional(PEN) não informados.');  
45 - }  
46 - }  
47 -  
48 - public function monitorarPendencias() {  
49 - try{  
50 - ini_set('max_execution_time','0');  
51 - ini_set('memory_limit','-1');  
52 -  
53 - InfraDebug::getInstance()->setBolLigado(true);  
54 - InfraDebug::getInstance()->setBolDebugInfra(false);  
55 - InfraDebug::getInstance()->setBolEcho(false);  
56 - InfraDebug::getInstance()->limpar();  
57 -  
58 - $objPenParametroRN = new PenParametroRN();  
59 - SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'));  
60 -  
61 - $numSeg = InfraUtil::verificarTempoProcessamento();  
62 - InfraDebug::getInstance()->gravar('MONITORANDO OS TRÂMITES PENDENTES ENVIADOS PARA O RGO (PEN)');  
63 - echo "[".date("d/m/Y H:i:s")."] Iniciando serviço de monitoramento de pendências de trâmites de processos...\n";  
64 -  
65 - try{  
66 - $numIdTramiteRecebido = 0;  
67 - $strStatusTramiteRecebido = '';  
68 - $numQuantidadeErroTramite = 0;  
69 - $arrQuantidadeErrosTramite = array();  
70 -  
71 - //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo  
72 - //Alcanado est quantidade, uma pendncia posterior dever ser obtida do barramento  
73 - while (true) {  
74 - $objPendenciaDTO = $this->obterPendenciasTramite($numIdTramiteRecebido);  
75 - if(isset($objPendenciaDTO)) {  
76 - if($numIdTramiteRecebido != $objPendenciaDTO->getNumIdentificacaoTramite() ||  
77 - $strStatusTramiteRecebido != $objPendenciaDTO->getStrStatus()) {  
78 - $numIdTramiteRecebido = $objPendenciaDTO->getNumIdentificacaoTramite();  
79 - $strStatusTramiteRecebido = $objPendenciaDTO->getStrStatus();  
80 - $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);  
81 - }  
82 - }  
83 - sleep(5);  
84 - }  
85 - }  
86 - //TODO: Urgente: Tratar erro especfico de timeout e refazer a requisio  
87 - catch(Exception $e) {  
88 - $strAssunto = 'Erro monitorando pendências.';  
89 - $strErro = InfraException::inspecionar($e);  
90 - LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro);  
91 - }  
92 -  
93 - $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);  
94 - InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s');  
95 - InfraDebug::getInstance()->gravar('FIM');  
96 - LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug());  
97 -  
98 - }  
99 - catch(Exception $e) {  
100 - InfraDebug::getInstance()->setBolLigado(false);  
101 - InfraDebug::getInstance()->setBolDebugInfra(false);  
102 - InfraDebug::getInstance()->setBolEcho(false);  
103 - throw new InfraException('Erro processando pendências de integração com o PEN - Processo Eletrônico Nacional.',$e);  
104 - }  
105 - }  
106 -  
107 - private function configurarRequisicao()  
108 - {  
109 - $curl = curl_init($this->strEnderecoServicoPendencias);  
110 - curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias);  
111 - curl_setopt($curl, CURLOPT_HEADER, 0);  
112 - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  
113 - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);  
114 - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);  
115 - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);  
116 - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital);  
117 - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital);  
118 - curl_setopt($curl, CURLOPT_TIMEOUT, 60); //timeout in seconds  
119 - return $curl;  
120 - }  
121 -  
122 - private function obterPendenciasTramite($parNumIdTramiteRecebido)  
123 - {  
124 - $resultado = null;  
125 - $curl = $this->configurarRequisicao();  
126 -  
127 - try{  
128 - if(isset($parNumIdTramiteRecebido)) {  
129 - curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $parNumIdTramiteRecebido);  
130 - }  
131 -  
132 - //A seguinte requisio ir aguardar a notificao do PEN sobre uma nova pendncia  
133 - //ou at o lanamento da exceo de timeout definido pela infraestrutura da soluo  
134 - //Ambos os comportamentos so esperados para a requisio abaixo.  
135 - $strResultadoJSON = curl_exec($curl);  
136 -  
137 - if(curl_errno($curl)) {  
138 - if (curl_errno($curl) != 28)  
139 - throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl));  
140 - }  
141 -  
142 - if(!InfraString::isBolVazia($strResultadoJSON)) {  
143 - $strResultadoJSON = json_decode($strResultadoJSON);  
144 -  
145 - if(isset($strResultadoJSON) && $strResultadoJSON->encontrou) {  
146 - $objPendenciaDTO = new PendenciaDTO();  
147 - $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT);  
148 - $objPendenciaDTO->setStrStatus($strResultadoJSON->status);  
149 - $resultado = $objPendenciaDTO;  
150 - }  
151 - }  
152 - }  
153 - catch(Exception $e){  
154 - curl_close($curl);  
155 - throw $e;  
156 - }  
157 -  
158 - curl_close($curl);  
159 - return $resultado;  
160 - }  
161 -  
162 - private function enviarPendenciaFilaProcessamento($objPendencia)  
163 - {  
164 - if(isset($objPendencia)) {  
165 -  
166 - $client = new GearmanClient();  
167 - $client->addServer('localhost', 4730);  
168 - //$client->setCreatedCallback("create_change");  
169 - //$client->setDataCallback("data_change");  
170 - //$client->setStatusCallback("status_change");  
171 - //$client->setCompleteCallback("complete_change");  
172 - //$client->setFailCallback("fail_change");  
173 -  
174 - $strWorkload = strval($objPendencia->getNumIdentificacaoTramite());  
175 -  
176 - switch ($objPendencia->getStrStatus()) {  
177 -  
178 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:  
179 - $client->addTaskBackground('enviarComponenteDigital', $strWorkload, null);  
180 - break;  
181 -  
182 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:  
183 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:  
184 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:  
185 - $objPenParametroRN = new PenParametroRN();  
186 - $numTentativas = $objPenParametroRN->getParametro(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);  
187 - $numCont = 0;  
188 - // Executa sempre + 1 alm do configurado no parâmetro para executar a recusa  
189 - while($numCont <= $numTentativas) {  
190 - $client->addTaskBackground('receberProcedimento', $strWorkload, null);  
191 - $numCont++;  
192 - }  
193 - break;  
194 -  
195 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:  
196 - $objPenParametroRN = new PenParametroRN();  
197 - $numTentativas = $objPenParametroRN->getParametro(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);  
198 - $numCont = 0;  
199 -  
200 - while($numCont < $numTentativas) {  
201 - $client->addTaskBackground('receberReciboTramite', $strWorkload, null);  
202 - $numCont++;  
203 - }  
204 - break;  
205 -  
206 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:  
207 - break;  
208 -  
209 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO:  
210 - break;  
211 -  
212 - case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:  
213 - $client->addTaskBackground("receberTramitesRecusados", $strWorkload, null);;  
214 - break;  
215 -  
216 - default:  
217 - //TODO: Alterar lgica para no deixar de processar demais pendncias retornadas pelo PEN  
218 - throw new Exception('Situação do trâmite não pode ser identificada.');  
219 - break;  
220 - }  
221 -  
222 - $client->runTasks();  
223 - }  
224 - }  
225 -}  
226 -  
227 -SessaoSEI::getInstance(false);  
228 -PendenciasTramiteRN::getInstance()->monitorarPendencias(); 1 +<?php
  2 +
  3 +require_once dirname(__FILE__) . '/../../../SEI.php';
  4 +
  5 +error_reporting(E_ALL);
  6 +
  7 +//TODO: Modificar nome da classe e mtodo para outro mais apropriado
  8 +class PendenciasTramiteRN extends InfraRN {
  9 +
  10 + private static $instance = null;
  11 + private $strEnderecoServicoPendencias = null;
  12 + private $strLocalizacaoCertificadoDigital = null;
  13 + private $strSenhaCertificadoDigital = null;
  14 +
  15 + protected function inicializarObjInfraIBanco(){
  16 + return BancoSEI::getInstance();
  17 + }
  18 +
  19 + public static function getInstance() {
  20 + if (self::$instance == null) {
  21 + self::$instance = new PendenciasTramiteRN(ConfiguracaoSEI::getInstance(), SessaoSEI::getInstance(), BancoSEI::getInstance(), LogSEI::getInstance());
  22 + }
  23 +
  24 + return self::$instance;
  25 + }
  26 +
  27 + public function __construct() {
  28 + $objPenParametroRN = new PenParametroRN();
  29 +
  30 + $this->strLocalizacaoCertificadoDigital = $objPenParametroRN->getParametro('PEN_LOCALIZACAO_CERTIFICADO_DIGITAL');
  31 + $this->strEnderecoServicoPendencias = $objPenParametroRN->getParametro('PEN_ENDERECO_WEBSERVICE_PENDENCIAS');
  32 + //TODO: Urgente - Remover senha do certificado de autenticao dos servios do PEN da tabela de parâmetros
  33 + $this->strSenhaCertificadoDigital = $objPenParametroRN->getParametro('PEN_SENHA_CERTIFICADO_DIGITAL');
  34 +
  35 + if (InfraString::isBolVazia($this->strEnderecoServicoPendencias)) {
  36 + throw new InfraException('Endereço do serviço de pendências de trâmite do Processo Eletrônico Nacional (PEN) não informado.');
  37 + }
  38 +
  39 + if (!@file_get_contents($this->strLocalizacaoCertificadoDigital)) {
  40 + throw new InfraException("Certificado digital de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não encontrado.");
  41 + }
  42 +
  43 + if (InfraString::isBolVazia($this->strSenhaCertificadoDigital)) {
  44 + throw new InfraException('Dados de autenticação do serviço de integração do Processo Eletrónico Nacional(PEN) não informados.');
  45 + }
  46 + }
  47 +
  48 + public function monitorarPendencias() {
  49 + try{
  50 + ini_set('max_execution_time','0');
  51 + ini_set('memory_limit','-1');
  52 +
  53 + InfraDebug::getInstance()->setBolLigado(true);
  54 + InfraDebug::getInstance()->setBolDebugInfra(false);
  55 + InfraDebug::getInstance()->setBolEcho(false);
  56 + InfraDebug::getInstance()->limpar();
  57 +
  58 + $objPenParametroRN = new PenParametroRN();
  59 + SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'));
  60 +
  61 + $numSeg = InfraUtil::verificarTempoProcessamento();
  62 + InfraDebug::getInstance()->gravar('MONITORANDO OS TRÂMITES PENDENTES ENVIADOS PARA O RGO (PEN)');
  63 + echo "[".date("d/m/Y H:i:s")."] Iniciando serviço de monitoramento de pendências de trâmites de processos...\n";
  64 +
  65 + try{
  66 + $numIdTramiteRecebido = 0;
  67 + $strStatusTramiteRecebido = '';
  68 + $numQuantidadeErroTramite = 0;
  69 + $arrQuantidadeErrosTramite = array();
  70 +
  71 + //TODO: Tratar quantidade de erros o sistema consecutivos para um tramite de processo
  72 + //Alcanado est quantidade, uma pendncia posterior dever ser obtida do barramento
  73 + while (true) {
  74 + $objPendenciaDTO = $this->obterPendenciasTramite($numIdTramiteRecebido);
  75 + if(isset($objPendenciaDTO)) {
  76 + if($numIdTramiteRecebido != $objPendenciaDTO->getNumIdentificacaoTramite() ||
  77 + $strStatusTramiteRecebido != $objPendenciaDTO->getStrStatus()) {
  78 + $numIdTramiteRecebido = $objPendenciaDTO->getNumIdentificacaoTramite();
  79 + $strStatusTramiteRecebido = $objPendenciaDTO->getStrStatus();
  80 + $this->enviarPendenciaFilaProcessamento($objPendenciaDTO);
  81 + }
  82 + }
  83 + sleep(5);
  84 + }
  85 + }
  86 + //TODO: Urgente: Tratar erro especfico de timeout e refazer a requisio
  87 + catch(Exception $e) {
  88 + $strAssunto = 'Erro monitorando pendências.';
  89 + $strErro = InfraException::inspecionar($e);
  90 + LogSEI::getInstance()->gravar($strAssunto."\n\n".$strErro);
  91 + }
  92 +
  93 + $numSeg = InfraUtil::verificarTempoProcessamento($numSeg);
  94 + InfraDebug::getInstance()->gravar('TEMPO TOTAL DE EXECUCAO: '.$numSeg.' s');
  95 + InfraDebug::getInstance()->gravar('FIM');
  96 + LogSEI::getInstance()->gravar(InfraDebug::getInstance()->getStrDebug());
  97 +
  98 + }
  99 + catch(Exception $e) {
  100 + InfraDebug::getInstance()->setBolLigado(false);
  101 + InfraDebug::getInstance()->setBolDebugInfra(false);
  102 + InfraDebug::getInstance()->setBolEcho(false);
  103 + throw new InfraException('Erro processando pendências de integração com o PEN - Processo Eletrônico Nacional.',$e);
  104 + }
  105 + }
  106 +
  107 + private function configurarRequisicao()
  108 + {
  109 + $curl = curl_init($this->strEnderecoServicoPendencias);
  110 + curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias);
  111 + curl_setopt($curl, CURLOPT_HEADER, 0);
  112 + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  113 + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
  114 + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  115 + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  116 + curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalizacaoCertificadoDigital);
  117 + curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strSenhaCertificadoDigital);
  118 + curl_setopt($curl, CURLOPT_TIMEOUT, 60); //timeout in seconds
  119 + return $curl;
  120 + }
  121 +
  122 + private function obterPendenciasTramite($parNumIdTramiteRecebido)
  123 + {
  124 + $resultado = null;
  125 + $curl = $this->configurarRequisicao();
  126 +
  127 + try{
  128 + if(isset($parNumIdTramiteRecebido)) {
  129 + curl_setopt($curl, CURLOPT_URL, $this->strEnderecoServicoPendencias . "?idTramiteDaPendenciaRecebida=" . $parNumIdTramiteRecebido);
  130 + }
  131 +
  132 + //A seguinte requisio ir aguardar a notificao do PEN sobre uma nova pendncia
  133 + //ou at o lanamento da exceo de timeout definido pela infraestrutura da soluo
  134 + //Ambos os comportamentos so esperados para a requisio abaixo.
  135 + $strResultadoJSON = curl_exec($curl);
  136 +
  137 + if(curl_errno($curl)) {
  138 + if (curl_errno($curl) != 28)
  139 + throw new InfraException("Erro na requisição do serviço de monitoramento de pendências. Curl: " . curl_errno($curl));
  140 + }
  141 +
  142 + if(!InfraString::isBolVazia($strResultadoJSON)) {
  143 + $strResultadoJSON = json_decode($strResultadoJSON);
  144 +
  145 + if(isset($strResultadoJSON) && $strResultadoJSON->encontrou) {
  146 + $objPendenciaDTO = new PendenciaDTO();
  147 + $objPendenciaDTO->setNumIdentificacaoTramite($strResultadoJSON->IDT);
  148 + $objPendenciaDTO->setStrStatus($strResultadoJSON->status);
  149 + $resultado = $objPendenciaDTO;
  150 + }
  151 + }
  152 + }
  153 + catch(Exception $e){
  154 + curl_close($curl);
  155 + throw $e;
  156 + }
  157 +
  158 + curl_close($curl);
  159 + return $resultado;
  160 + }
  161 +
  162 + private function enviarPendenciaFilaProcessamento($objPendencia)
  163 + {
  164 + if(isset($objPendencia)) {
  165 +
  166 + $client = new GearmanClient();
  167 + $client->addServer('localhost', 4730);
  168 + //$client->setCreatedCallback("create_change");
  169 + //$client->setDataCallback("data_change");
  170 + //$client->setStatusCallback("status_change");
  171 + //$client->setCompleteCallback("complete_change");
  172 + //$client->setFailCallback("fail_change");
  173 +
  174 + $strWorkload = strval($objPendencia->getNumIdentificacaoTramite());
  175 +
  176 + switch ($objPendencia->getStrStatus()) {
  177 +
  178 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO:
  179 + $client->addTaskBackground('enviarComponenteDigital', $strWorkload, null);
  180 + break;
  181 +
  182 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE:
  183 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO:
  184 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO:
  185 + $objPenParametroRN = new PenParametroRN();
  186 + $numTentativas = $objPenParametroRN->getParametro(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);
  187 + $numCont = 0;
  188 + // Executa sempre + 1 alm do configurado no parâmetro para executar a recusa
  189 + while($numCont <= $numTentativas) {
  190 + $client->addTaskBackground('receberProcedimento', $strWorkload, null);
  191 + $numCont++;
  192 + }
  193 + break;
  194 +
  195 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO:
  196 + $objPenParametroRN = new PenParametroRN();
  197 + $numTentativas = $objPenParametroRN->getParametro(PenTramiteProcessadoRN::PARAM_NUMERO_TENTATIVAS, false);
  198 + $numCont = 0;
  199 +
  200 + while($numCont < $numTentativas) {
  201 + $client->addTaskBackground('receberReciboTramite', $strWorkload, null);
  202 + $numCont++;
  203 + }
  204 + break;
  205 +
  206 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE:
  207 + break;
  208 +
  209 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO:
  210 + break;
  211 +
  212 + case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO:
  213 + $client->addTaskBackground("receberTramitesRecusados", $strWorkload, null);;
  214 + break;
  215 +
  216 + default:
  217 + //TODO: Alterar lgica para no deixar de processar demais pendncias retornadas pelo PEN
  218 + throw new Exception('Situação do trâmite não pode ser identificada.');
  219 + break;
  220 + }
  221 +
  222 + $client->runTasks();
  223 + }
  224 + }
  225 +}
  226 +
  227 +SessaoSEI::getInstance(false);
  228 +PendenciasTramiteRN::getInstance()->monitorarPendencias();
rn/ReceberProcedimentoRN.php
@@ -353,8 +353,10 @@ class ReceberProcedimentoRN extends InfraRN @@ -353,8 +353,10 @@ class ReceberProcedimentoRN extends InfraRN
353 } 353 }
354 354
355 355
356 - $objInfraParametro = new InfraParametro(BancoSEI::getInstance());  
357 - $numTamDocExterno = $objInfraParametro->getValor('SEI_TAM_MB_DOC_EXTERNO'); 356 +// $objInfraParametro = new InfraParametro(BancoSEI::getInstance());
  357 +// $numTamDocExterno = $objInfraParametro->getValor('SEI_TAM_MB_DOC_EXTERNO');
  358 + $objPenParametroRN = new PenParametroRN();
  359 + $numTamDocExterno = $objPenParametroRN->getParametro('PEN_TAMANHO_MAXIMO_DOCUMENTO_EXPEDIDO');
358 360
359 361
360 foreach($arrObjDocumentos as $objDocument) { 362 foreach($arrObjDocumentos as $objDocument) {
@@ -463,8 +465,13 @@ class ReceberProcedimentoRN extends InfraRN @@ -463,8 +465,13 @@ class ReceberProcedimentoRN extends InfraRN
463 throw new InfraException('Parâmetro $objMetadadosProcedimento não informado.'); 465 throw new InfraException('Parâmetro $objMetadadosProcedimento não informado.');
464 } 466 }
465 467
466 - $objDestinatario = $objMetadadosProcedimento->metadados->destinatario;  
467 - 468 +
  469 + if ($this->destinatarioReal) {
  470 + $objDestinatario = $this->destinatarioReal;
  471 + } else {
  472 + $objDestinatario = $objMetadadosProcedimento->metadados->destinatario;
  473 + }
  474 +
468 //TODO: Refatorar código para criar método de pesquisa do procedimento e reutilizá-la 475 //TODO: Refatorar código para criar método de pesquisa do procedimento e reutilizá-la
469 476
470 //$objProcedimentoDTO = new ProcedimentoDTO(); 477 //$objProcedimentoDTO = new ProcedimentoDTO();