From b085220003e696dfeec6d70cf995dbf47742253a Mon Sep 17 00:00:00 2001 From: Mauro Wendel Rodrigues Costa Date: Fri, 30 Dec 2022 11:14:49 -0300 Subject: [PATCH 01/19] =?UTF-8?q?feat:=20melhoria=20na=20mensagem=20de=20a?= =?UTF-8?q?ltera=C3=A7=C3=A3o=20de=20ordem=20de=20documentos=20do=20proces?= =?UTF-8?q?so?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rn/ExpedirProcedimentoRN.php | 36 +++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/rn/ExpedirProcedimentoRN.php b/src/rn/ExpedirProcedimentoRN.php index e6dc0e8e6..8d5cad47d 100755 --- a/src/rn/ExpedirProcedimentoRN.php +++ b/src/rn/ExpedirProcedimentoRN.php @@ -2449,6 +2449,39 @@ private function validarAssinaturas(InfraException $objInfraException, $objProce } } + private function validarMudancaOrdemDocumentos(InfraException $objInfraException, $objProcedimentoDTO, $strAtributoValidacao) + { + //Busca metadados do processo registrado em trâmite anterior + $objMetadadosProcessoTramiteAnterior = $this->consultarMetadadosPEN($objProcedimentoDTO->getDblIdProcedimento()); + + //Construção do cabeçalho para envio do processo + $objProcessoEletronicoPesquisaDTO = new ProcessoEletronicoDTO(); + $objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($objProcedimentoDTO->getDblIdProcedimento()); + $objUltimoTramiteRecebidoDTO = $this->objProcessoEletronicoRN->consultarUltimoTramiteRecebido($objProcessoEletronicoPesquisaDTO); + $strNumeroRegistro = isset($objUltimoTramiteRecebidoDTO) ? $objUltimoTramiteRecebidoDTO->getStrNumeroRegistro() : $objMetadadosProcessoTramiteAnterior->NRE; + + //Cancela trâmite anterior caso este esteja travado em status inconsistente 1 - STA_SITUACAO_TRAMITE_INICIADO + $objTramitesAnteriores = $this->consultarTramitesAnteriores($strNumeroRegistro); + if (!is_null(count($objTramitesAnteriores)) && count($objTramitesAnteriores)) { + $objAtividadeDTO = new AtividadeDTO(); + $objAtividadeDTO->setDblIdProtocolo($objProcedimentoDTO->getDblIdProcedimento()); + $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); + $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); + $objAtividadeDTO->retNumIdAtividade(); + $objAtividadeDTO->retDblIdProcedimentoProtocolo(); + $objAtividadeBD = new AtividadeBD(BancoSEI::getInstance()); + $arrObjAtividadeDTO = $objAtividadeBD->listar($objAtividadeDTO); + + if (!is_null($arrObjAtividadeDTO) && count($arrObjAtividadeDTO)) { + // "Inconsist?ncia identificada no documento de ordem \'1\' do processo tramitado por este NRE, \'0000004460802022\', com protocolo \'99990.000001/2022-20\': hash de ao menos um componente digital n?o confere" + $mensagem = "Inconsistência identificada no documento de ordem do processo tramitado por este NRE, " . $objMetadadosProcessoTramiteAnterior->NRE + . " com protocolo " . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() + . ": a ordem dos documentos foram modificadas na árvore do processo"; + $objInfraException->adicionarValidacao($mensagem, $strAtributoValidacao); + } + } + } + private function validarProcedimentoCompartilhadoSeiFederacao(InfraException $objInfraException, $objProcedimentoDTO, $strAtributoValidacao) { $bolProcedimentoCompartilhado = false; $objProtocoloFederacaoDTO = new ProtocoloFederacaoDTO(); @@ -2504,7 +2537,8 @@ public function validarPreCondicoesExpedirProcedimento(InfraException $objInfraE $this->validarNivelAcessoProcesso($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); $this->validarHipoteseLegalEnvio($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); $this->validarAssinaturas($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); - + $this->validarMudancaOrdemDocumentos($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); + try{ if(!$bolSinProcessamentoEmLote){ $this->validarPossibilidadeBloqueio($objProcedimentoDTO); From 7043eb594b1f107e5570f70bd404b715fcbe5031 Mon Sep 17 00:00:00 2001 From: Mauro W R Costa Date: Tue, 7 Feb 2023 11:32:56 -0300 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20corre=C3=A7=C3=B5es=20para=20vali?= =?UTF-8?q?da=C3=A7=C3=B5es=20de=20tramite=20de=20ordem=20alterada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rn/ExpedirProcedimentoRN.php | 35 +------------------------------ src/rn/ProcessoEletronicoRN.php | 36 +++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/rn/ExpedirProcedimentoRN.php b/src/rn/ExpedirProcedimentoRN.php index 1725991c8..3938c8781 100755 --- a/src/rn/ExpedirProcedimentoRN.php +++ b/src/rn/ExpedirProcedimentoRN.php @@ -217,6 +217,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $param->novoTramiteDeProcesso = new stdClass(); $param->novoTramiteDeProcesso->cabecalho = $objCabecalho; $param->novoTramiteDeProcesso->processo = $objProcesso; + $param->objExpedirProcedimentoDTO = $objExpedirProcedimentoDTO; $novoTramite = $this->objProcessoEletronicoRN->enviarProcesso($param); $numIdTramite = $novoTramite->dadosTramiteDeProcessoCriado->IDT; @@ -2475,39 +2476,6 @@ private function validarAssinaturas(InfraException $objInfraException, $objProce } } - private function validarMudancaOrdemDocumentos(InfraException $objInfraException, $objProcedimentoDTO, $strAtributoValidacao) - { - //Busca metadados do processo registrado em trâmite anterior - $objMetadadosProcessoTramiteAnterior = $this->consultarMetadadosPEN($objProcedimentoDTO->getDblIdProcedimento()); - - //Construção do cabeçalho para envio do processo - $objProcessoEletronicoPesquisaDTO = new ProcessoEletronicoDTO(); - $objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($objProcedimentoDTO->getDblIdProcedimento()); - $objUltimoTramiteRecebidoDTO = $this->objProcessoEletronicoRN->consultarUltimoTramiteRecebido($objProcessoEletronicoPesquisaDTO); - $strNumeroRegistro = isset($objUltimoTramiteRecebidoDTO) ? $objUltimoTramiteRecebidoDTO->getStrNumeroRegistro() : $objMetadadosProcessoTramiteAnterior->NRE; - - //Cancela trâmite anterior caso este esteja travado em status inconsistente 1 - STA_SITUACAO_TRAMITE_INICIADO - $objTramitesAnteriores = $this->consultarTramitesAnteriores($strNumeroRegistro); - if (!is_null(count($objTramitesAnteriores)) && count($objTramitesAnteriores)) { - $objAtividadeDTO = new AtividadeDTO(); - $objAtividadeDTO->setDblIdProtocolo($objProcedimentoDTO->getDblIdProcedimento()); - $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); - $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); - $objAtividadeDTO->retNumIdAtividade(); - $objAtividadeDTO->retDblIdProcedimentoProtocolo(); - $objAtividadeBD = new AtividadeBD(BancoSEI::getInstance()); - $arrObjAtividadeDTO = $objAtividadeBD->listar($objAtividadeDTO); - - if (!is_null($arrObjAtividadeDTO) && count($arrObjAtividadeDTO)) { - // "Inconsist?ncia identificada no documento de ordem \'1\' do processo tramitado por este NRE, \'0000004460802022\', com protocolo \'99990.000001/2022-20\': hash de ao menos um componente digital n?o confere" - $mensagem = "Inconsistência identificada no documento de ordem do processo tramitado por este NRE, " . $objMetadadosProcessoTramiteAnterior->NRE - . " com protocolo " . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() - . ": a ordem dos documentos foram modificadas na árvore do processo"; - $objInfraException->adicionarValidacao($mensagem, $strAtributoValidacao); - } - } - } - private function validarProcedimentoCompartilhadoSeiFederacao(InfraException $objInfraException, $objProcedimentoDTO, $strAtributoValidacao) { $bolProcedimentoCompartilhado = false; $objProtocoloFederacaoDTO = new ProtocoloFederacaoDTO(); @@ -2563,7 +2531,6 @@ public function validarPreCondicoesExpedirProcedimento(InfraException $objInfraE $this->validarNivelAcessoProcesso($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); $this->validarHipoteseLegalEnvio($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); $this->validarAssinaturas($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); - $this->validarMudancaOrdemDocumentos($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); try{ if(!$bolSinProcessamentoEmLote){ diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index e6cb10c56..bc5b62c05 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -553,10 +553,14 @@ public function enviarProcesso($parametros) } catch (\SoapFault $e) { $strMensagem = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript(utf8_decode($e->faultstring))); if ($e instanceof \SoapFault && !empty($e->detail->interoperabilidadeException->codigoErro) && $e->detail->interoperabilidadeException->codigoErro == '0005') { - $$strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.'; + $strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.'; } $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + if (strstr(strtolower($detalhes), "hash de ao menos um componente digital não confere")) { + $this->validarMudancaOrdemDocumentos($parametros->objProcedimentoDTO, $detalhes); + } throw new InfraException($strMensagem, $e, $strDetalhes); } catch (\Exception $e) { $mensagem = "Falha no envio externo do processo. Verifique log de erros do sistema para maiores informações."; @@ -565,6 +569,36 @@ public function enviarProcesso($parametros) } } + private function validarMudancaOrdemDocumentos($objProcedimentoDTO, $strMensagem) + { + //Busca metadados do processo registrado em trâmite anterior + $objMetadadosProcessoTramiteAnterior = $this->consultarMetadadosPEN($objProcedimentoDTO->getDblIdProcedimento()); + + //Construção do cabeçalho para envio do processo + $objProcessoEletronicoPesquisaDTO = new ProcessoEletronicoDTO(); + $objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($objProcedimentoDTO->getDblIdProcedimento()); + $objUltimoTramiteRecebidoDTO = $this->consultarUltimoTramiteRecebido($objProcessoEletronicoPesquisaDTO); + $strNumeroRegistro = isset($objUltimoTramiteRecebidoDTO) ? $objUltimoTramiteRecebidoDTO->getStrNumeroRegistro() : $objMetadadosProcessoTramiteAnterior->NRE; + + //Cancela trâmite anterior caso este esteja travado em status inconsistente 1 - STA_SITUACAO_TRAMITE_INICIADO + $objTramitesAnteriores = $this->consultarTramitesAnteriores($strNumeroRegistro); + if (!is_null(count($objTramitesAnteriores)) && count($objTramitesAnteriores)) { + $objAtividadeDTO = new AtividadeDTO(); + $objAtividadeDTO->setDblIdProtocolo($objProcedimentoDTO->getDblIdProcedimento()); + $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); + $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); + $objAtividadeDTO->retNumIdAtividade(); + $objAtividadeDTO->retDblIdProcedimentoProtocolo(); + $objAtividadeBD = new AtividadeBD(BancoSEI::getInstance()); + $arrObjAtividadeDTO = $objAtividadeBD->listar($objAtividadeDTO); + + if (!is_null($arrObjAtividadeDTO) && count($arrObjAtividadeDTO)) { + $strMensagem = str_replace('hash de ao menos um componente digital não confere', 'a ordem dos documentos foram modificadas na árvore do processo', $strMensagem); + throw new InfraException($strMensagem); + } + } + } + public function listarPendencias($bolTodasPendencias) { $arrObjPendenciaDTO = array(); From b4f7e32eca8ab97aa7399a962b675aaa6251588c Mon Sep 17 00:00:00 2001 From: Mauro W R Costa Date: Tue, 7 Feb 2023 11:36:51 -0300 Subject: [PATCH 03/19] =?UTF-8?q?fix:=20corre=C3=A7=C3=A3o=20de=20arquivo?= =?UTF-8?q?=20diferente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rn/ExpedirProcedimentoRN.php | 365 +++++++++++++++---------------- 1 file changed, 182 insertions(+), 183 deletions(-) diff --git a/src/rn/ExpedirProcedimentoRN.php b/src/rn/ExpedirProcedimentoRN.php index 3938c8781..64e5951de 100755 --- a/src/rn/ExpedirProcedimentoRN.php +++ b/src/rn/ExpedirProcedimentoRN.php @@ -123,7 +123,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe { $numIdTramite = 0; try { - //Valida Permissão + //Valida Permiss?o SessaoSEI::getInstance()->validarAuditarPermissao('pen_procedimento_expedir',__METHOD__, $objExpedirProcedimentoDTO); $dblIdProcedimento = $objExpedirProcedimentoDTO->getDblIdProcedimento(); @@ -149,7 +149,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe } $objInfraException = new InfraException(); - //Carregamento dos dados de processo e documento para validação e envio externo + //Carregamento dos dados de processo e documento para valida??o e envio externo $objProcedimentoDTO = $this->consultarProcedimento($dblIdProcedimento); $objProcedimentoDTO->setArrObjDocumentoDTO($this->listarDocumentos($dblIdProcedimento)); $objProcedimentoDTO->setArrObjParticipanteDTO($this->listarInteressados($dblIdProcedimento)); @@ -160,7 +160,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe if($objInfraException->contemValidacoes()){ if(!$bolSinProcessamentoEmLote){ $this->barraProgresso->mover(0); - $this->barraProgresso->setStrRotulo('Erro durante validação dos dados do processo.'); + $this->barraProgresso->setStrRotulo('Erro durante valida??o dos dados do processo.'); $objInfraException->lancarValidacoes(); }else{ @@ -173,16 +173,16 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $arrErros[$strAtributo][] = utf8_encode($objInfraValidacao->getStrDescricao()); } - $this->gravarLogDebug(sprintf('Erro durante validação dos dados do processo %s.', $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado(), $arrErros), 2); + $this->gravarLogDebug(sprintf('Erro durante valida??o dos dados do processo %s.', $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado(), $arrErros), 2); PenLoteProcedimentoRN::desbloquearProcessoLoteControlado($dblIdProcedimento); return false; } } - //Busca metadados do processo registrado em trâmite anterior + //Busca metadados do processo registrado em tr?mite anterior $objMetadadosProcessoTramiteAnterior = $this->consultarMetadadosPEN($dblIdProcedimento); - //Construção do cabeçalho para envio do processo + //Constru??o do cabe?alho para envio do processo $objProcessoEletronicoPesquisaDTO = new ProcessoEletronicoDTO(); $objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($dblIdProcedimento); $objUltimoTramiteRecebidoDTO = $this->objProcessoEletronicoRN->consultarUltimoTramiteRecebido($objProcessoEletronicoPesquisaDTO); @@ -190,24 +190,24 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $objCabecalho = $this->construirCabecalho($objExpedirProcedimentoDTO, $strNumeroRegistro, $dblIdProcedimento); - //Construção do processo para envio + //Constru??o do processo para envio $objProcesso = $this->construirProcesso($dblIdProcedimento, $objExpedirProcedimentoDTO->getArrIdProcessoApensado(), $objMetadadosProcessoTramiteAnterior); - //Obtém o tamanho total da barra de progreso + //Obt?m o tamanho total da barra de progreso $nrTamanhoTotalBarraProgresso = $this->obterTamanhoTotalDaBarraDeProgresso($objProcesso); if(!$bolSinProcessamentoEmLote){ - //Atribui o tamanho máximo da barra de progresso + //Atribui o tamanho m?ximo da barra de progresso $this->barraProgresso->setNumMax($nrTamanhoTotalBarraProgresso); - //Exibe a barra de progresso após definir o seu tamanho + //Exibe a barra de progresso ap?s definir o seu tamanho $this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_PROCEDIMENTO); $this->barraProgresso->setStrRotulo(sprintf(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_PROCEDIMENTO, $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado())); }else{ $this->gravarLogDebug(sprintf(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_PROCEDIMENTO, $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()), 2); } - //Cancela trâmite anterior caso este esteja travado em status inconsistente 1 - STA_SITUACAO_TRAMITE_INICIADO + //Cancela tr?mite anterior caso este esteja travado em status inconsistente 1 - STA_SITUACAO_TRAMITE_INICIADO $objTramitesAnteriores = $this->consultarTramitesAnteriores($strNumeroRegistro); if($objTramiteInconsistente = $this->necessitaCancelamentoTramiteAnterior($objTramitesAnteriores)){ $this->objProcessoEletronicoRN->cancelarTramite($objTramiteInconsistente->IDT); @@ -217,7 +217,6 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $param->novoTramiteDeProcesso = new stdClass(); $param->novoTramiteDeProcesso->cabecalho = $objCabecalho; $param->novoTramiteDeProcesso->processo = $objProcesso; - $param->objExpedirProcedimentoDTO = $objExpedirProcedimentoDTO; $novoTramite = $this->objProcessoEletronicoRN->enviarProcesso($param); $numIdTramite = $novoTramite->dadosTramiteDeProcessoCriado->IDT; @@ -262,7 +261,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe //TODO: Erro no BARRAMENTO: Processo no pode ser enviado se possuir 2 documentos iguais(mesmo hash) //TODO: Melhoria no barramento de servios. O mtodo solicitar metadados no deixa claro quais os componentes digitais que - //precisam ser baixados. No cenrio de retorno de um processo existente, a nica forma consultar o status do trâmite para + //precisam ser baixados. No cenrio de retorno de um processo existente, a nica forma consultar o status do tr?mite para //saber quais precisam ser baixados. O processo poderia ser mais otimizado se o retorno nos metadados j informasse quais os //componentes precisam ser baixados, semelhante ao que ocorre no enviarProcesso onde o barramento informa quais os componentes //que precisam ser enviados @@ -276,26 +275,26 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe //TODO: Implementar o registro de auditoria, armazenando os metadados xml enviados para o PEN - //TODO: Alterar atualizao para somente apresentar ao final de todo o trâmite + //TODO: Alterar atualizao para somente apresentar ao final de todo o tr?mite //$this->barraProgresso->mover(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_CONCLUSAO); if(!$bolSinProcessamentoEmLote){ $this->barraProgresso->mover($this->barraProgresso->getNumMax()); $this->barraProgresso->setStrRotulo(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_CONCLUSAO); }else{ - $this->gravarLogDebug('Concluído envio dos componentes do processo', 2); + $this->gravarLogDebug('Conclu?do envio dos componentes do processo', 2); $objPenLoteProcedimentoDTO->setNumIdAndamento(ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE); $objLoteProcedimentoRN->alterarLoteProcedimento($objPenLoteProcedimentoDTO); } - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'S')); + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Conclu?do envio dos componentes do processo', 'S')); $this->receberReciboDeEnvio($objTramite->IDT); - $this->gravarLogDebug(sprintf('Trâmite do processo %s foi concluído', $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()), 2); + $this->gravarLogDebug(sprintf('Tr?mite do processo %s foi conclu?do', $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()), 2); $numTempoTotalRecebimento = round(microtime(true) - $numTempoInicialRecebimento, 2); - $this->gravarLogDebug("Finalizado o envio de protocolo número " . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() . " (Tempo total: {$numTempoTotalRecebimento}s)", 0, true); + $this->gravarLogDebug("Finalizado o envio de protocolo n?mero " . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() . " (Tempo total: {$numTempoTotalRecebimento}s)", 0, true); } catch (\Exception $e) { //Realiza o desbloqueio do processo @@ -310,7 +309,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $this->registrarAndamentoExpedicaoAbortada($objProcesso->idProcedimentoSEI); - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Concluído envio dos componentes do processo', 'N')); + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Conclu?do envio dos componentes do processo', 'N')); throw $e; } } @@ -321,12 +320,12 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe } $this->gravarLogDebug("Erro processando envio de processo [expedirProcedimento]: $e", 0, true); - throw new InfraException('Falha de comunicação com o serviços de integração. Por favor, tente novamente mais tarde.', $e); + throw new InfraException('Falha de comunica??o com o servi?os de integra??o. Por favor, tente novamente mais tarde.', $e); } } /** - * Busca metadados do processo registrado no Barramento de Serviços do PEN em trâmites anteriores + * Busca metadados do processo registrado no Barramento de Servi?os do PEN em tr?mites anteriores * @return stdClass Metadados do Processo */ private function consultarMetadadosPEN($parDblIdProcedimento) @@ -353,18 +352,18 @@ private function consultarMetadadosPEN($parDblIdProcedimento) } } catch(Exception $e){ - //Em caso de falha na comunicação com o barramento neste ponto, o procedimento deve serguir em frente considerando - //que os metadados do protocolo não pode ser obtida - LogSEI::getInstance()->gravar("Falha na obtenção dos metadados de trâmites anteriores do processo ($parDblIdProcedimento) durante trâmite externo.", LogSEI::$AVISO); + //Em caso de falha na comunica??o com o barramento neste ponto, o procedimento deve serguir em frente considerando + //que os metadados do protocolo n?o pode ser obtida + LogSEI::getInstance()->gravar("Falha na obten??o dos metadados de tr?mites anteriores do processo ($parDblIdProcedimento) durante tr?mite externo.", LogSEI::$AVISO); } return $objMetadadosProtocolo; } /** - * Método responsável por obter o tamanho total que terá a barra de progresso, considerando os diversos componentes digitais - * a quantidade de partes em que cada um será particionado - * @author Josinaldo Júnior + * M?todo respons?vel por obter o tamanho total que ter? a barra de progresso, considerando os diversos componentes digitais + * a quantidade de partes em que cada um ser? particionado + * @author Josinaldo J?nior * @param $parObjProcesso * @return float|int $totalBarraProgresso */ @@ -478,7 +477,7 @@ private function registrarAndamentoExpedicaoProcesso($objExpedirProcedimentoDTO, private function construirCabecalho(ExpedirProcedimentoDTO $objExpedirProcedimentoDTO, $strNumeroRegistro, $dblIdProcedimento=null) { if(!isset($objExpedirProcedimentoDTO)){ - throw new InfraException('Parâmetro $objExpedirProcedimentoDTO não informado.'); + throw new InfraException('Par?metro $objExpedirProcedimentoDTO n?o informado.'); } return $this->objProcessoEletronicoRN->construirCabecalho( @@ -497,7 +496,7 @@ private function construirCabecalho(ExpedirProcedimentoDTO $objExpedirProcedimen private function construirProcesso($dblIdProcedimento, $arrIdProcessoApensado=null, $parObjMetadadosTramiteAnterior=null) { if(!isset($dblIdProcedimento)){ - throw new InfraException('Parâmetro $dblIdProcedimento não informado.'); + throw new InfraException('Par?metro $dblIdProcedimento n?o informado.'); } $objProcedimentoDTO = $this->consultarProcedimento($dblIdProcedimento); @@ -539,7 +538,7 @@ private function atribuirDadosHistorico($objProcesso, $dblIdProcedimento) $arrObjAtividadeDTO = $objProcedimentoDTO->getArrObjAtividadeDTO(); if($arrObjAtividadeDTO == null || count($arrObjAtividadeDTO) == 0) { - throw new InfraException("Não foi possível obter andamentos do processo {$objProcesso->protocolo}"); + throw new InfraException("N?o foi poss?vel obter andamentos do processo {$objProcesso->protocolo}"); } $arrObjOperacao = array(); @@ -573,7 +572,7 @@ private function atribuirDadosHistorico($objProcesso, $dblIdProcedimento) public static function mudarEstadoProcedimento($objProcesso, $strStaEstado) { if(!isset($objProcesso)) { - throw new InfraException('Parâmetro $objProcesso não informado.'); + throw new InfraException('Par?metro $objProcesso n?o informado.'); } try { @@ -594,7 +593,7 @@ public static function mudarEstadoProcedimento($objProcesso, $strStaEstado) $objAtributoAndamentoDTO = new AtributoAndamentoDTO(); $objAtributoAndamentoDTO->setStrNome('MOTIVO'); $objAtributoAndamentoDTO->setStrIdOrigem(null); - $objAtributoAndamentoDTO->setStrValor('Processo está em processamento devido ao seu trâmite externo para outra unidade.'); + $objAtributoAndamentoDTO->setStrValor('Processo est? em processamento devido ao seu tr?mite externo para outra unidade.'); $objAtividadeDTO->setArrObjAtributoAndamentoDTO(array($objAtributoAndamentoDTO)); $objAtividadeRN = new AtividadeRN(); @@ -698,7 +697,7 @@ public function desbloquearProcessoExpedicao($numIdProcedimento) public function registrarAndamentoExpedicaoAbortada($dblIdProtocolo) { - //Seta todos os atributos do histórico de aborto da expedio + //Seta todos os atributos do hist?rico de aborto da expedio $objAtividadeDTO = new AtividadeDTO(); $objAtividadeDTO->setDblIdProtocolo($dblIdProtocolo); $objAtividadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); @@ -756,14 +755,14 @@ public static function receberRecusaProcedimento($motivo, $unidade_destino, $num private function atribuirDataHoraDeRegistro($objContexto, $dblIdProcedimento, $dblIdDocumento = null) { - //Validar parâmetro $objContexto + //Validar par?metro $objContexto if(!isset($objContexto)) { - throw new InfraException('Parâmetro $objContexto não informado.'); + throw new InfraException('Par?metro $objContexto n?o informado.'); } - //Validar parâmetro $dbIdProcedimento + //Validar par?metro $dbIdProcedimento if(!isset($dblIdProcedimento)) { - throw new InfraException('Parâmetro $dbIdProcedimento não informado.'); + throw new InfraException('Par?metro $dbIdProcedimento n?o informado.'); } $objProcedimentoHistoricoDTO = new ProcedimentoHistoricoDTO(); @@ -790,7 +789,7 @@ private function atribuirDataHoraDeRegistro($objContexto, $dblIdProcedimento, $d private function atribuirProdutorProcesso($objProcesso, $dblIdProcedimento, $numIdUnidadeGeradora) { if(!isset($objProcesso)){ - throw new InfraException('Parâmetro $objProcesso não informado.'); + throw new InfraException('Par?metro $objProcesso n?o informado.'); } $objProcesso->produtor = new stdClass(); @@ -798,7 +797,7 @@ private function atribuirProdutorProcesso($objProcesso, $dblIdProcedimento, $num if(isset($objUsuarioProdutor)) { //Dados do produtor do processo $objProcesso->produtor->nome = utf8_encode($this->objProcessoEletronicoRN->reduzirCampoTexto($objUsuarioProdutor->getStrNome(), 150)); - //TODO: Obter tipo de pessoa física dos contatos do SEI + //TODO: Obter tipo de pessoa f?sica dos contatos do SEI $objProcesso->produtor->numeroDeIdentificacao = $objUsuarioProdutor->getDblCpfContato(); $objProcesso->produtor->tipo = self::STA_TIPO_PESSOA_FISICA; //TODO: Informar dados da estrutura organizacional (estruturaOrganizacional) @@ -816,7 +815,7 @@ private function atribuirProdutorProcesso($objProcesso, $dblIdProcedimento, $num private function atribuirDadosInteressados($objProcesso, $dblIdProcedimento) { if(!isset($objProcesso)){ - throw new InfraException('Parâmetro $objProcesso não informado.'); + throw new InfraException('Par?metro $objProcesso n?o informado.'); } $arrParticipantesDTO = $this->listarInteressados($dblIdProcedimento); @@ -835,13 +834,13 @@ private function atribuirDadosInteressados($objProcesso, $dblIdProcedimento) private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior) { if(!isset($objProcesso)) { - throw new InfraException('Parâmetro $objProcesso não informado.'); + throw new InfraException('Par?metro $objProcesso n?o informado.'); } $arrDocumentosRelacionados = $this->listarDocumentosRelacionados($dblIdProcedimento); if(!isset($arrDocumentosRelacionados)) { - throw new InfraException('Documentos não encontrados.'); + throw new InfraException('Documentos n?o encontrados.'); } $arrObjCompIndexadoPorIdDocumentoDTO = array(); @@ -863,7 +862,7 @@ private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMet $documento = new stdClass(); $objPenRelHipoteseLegalRN = new PenRelHipoteseLegalEnvioRN(); - //Considera o número/nome do documento externo para descrição do documento + //Considera o n?mero/nome do documento externo para descri??o do documento $boolDocumentoRecebidoComNumero = $documentoDTO->getStrStaProtocoloProtocolo() == ProtocoloRN::$TP_DOCUMENTO_RECEBIDO && $documentoDTO->getStrNumero() != null; $strDescricaoDocumento = ($boolDocumentoRecebidoComNumero) ? $documentoDTO->getStrNumero() : "***"; @@ -872,14 +871,14 @@ private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMet $documento->retirado = ($documentoDTO->getStrStaEstadoProtocolo() == ProtocoloRN::$TE_DOCUMENTO_CANCELADO) ? true : false; $documento->nivelDeSigilo = $this->obterNivelSigiloPEN($documentoDTO->getStrStaNivelAcessoLocalProtocolo()); - //Verifica se o documento faz parte de outro processo devido à sua anexação ou à sua movimentação + //Verifica se o documento faz parte de outro processo devido ? sua anexa??o ou ? sua movimenta??o if($documentoDTO->getStrProtocoloProcedimentoFormatado() != $objProcesso->protocolo){ if($staAssociacao != RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO){ - // Caso o documento não tenha sido movido, seu protocolo é diferente devido à sua anexação à outro processo + // Caso o documento n?o tenha sido movido, seu protocolo ? diferente devido ? sua anexa??o ? outro processo $documento->protocoloDoProcessoAnexado = $documentoDTO->getStrProtocoloProcedimentoFormatado(); $documento->idProcedimentoAnexadoSEI = $documentoDTO->getDblIdProcedimento(); } else { - // Em caso de documento movido, ele será tratado como cancelado para trâmites externos + // Em caso de documento movido, ele ser? tratado como cancelado para tr?mites externos $documento->retirado = true; } } @@ -887,7 +886,7 @@ private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMet if($documentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO){ $documento->hipoteseLegal = new stdClass(); $documento->hipoteseLegal->identificacao = $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($documentoDTO->getNumIdHipoteseLegalProtocolo()); - //TODO: Adicionar nome da hipótese legal atribuida ao documento + //TODO: Adicionar nome da hip?tese legal atribuida ao documento } $documento->dataHoraDeProducao = $this->objProcessoEletronicoRN->converterDataWebService($documentoDTO->getDtaGeracaoProtocolo()); $documento->produtor = new stdClass(); @@ -949,7 +948,7 @@ private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMet $this->atribuirComponentesDigitais($documento, $documentoDTO, $dblIdProcedimento); } - // TODO: Necessário tratar informações abaixo + // TODO: Necess?rio tratar informa??es abaixo //- protocoloDoDocumentoAnexado //- protocoloDoProcessoAnexado //- protocoloAnterior @@ -964,26 +963,26 @@ public function atribuirComponentesDigitaisRetirados($documentoDTO){ } /** - * Obtém a espécie documental relacionada ao documento do processo. - * A espécie documental, por padrão, é obtida do mapeamento de espécies realizado pelo administrador - * nas configurações do módulo. - * Caso o documento tenha sido produzido por outro órgão externamente, a espécie a ser considerada será + * Obt?m a esp?cie documental relacionada ao documento do processo. + * A esp?cie documental, por padr?o, ? obtida do mapeamento de esp?cies realizado pelo administrador + * nas configura??es do m?dulo. + * Caso o documento tenha sido produzido por outro ?rg?o externamente, a esp?cie a ser considerada ser? * aquela definida originalmente pelo seu produtor * * @param int $parDblIdProcedimento Identificador do processo * @param int $parDblIdDocumento Identificador do documento - * @return int Código da espécie documental + * @return int C?digo da esp?cie documental * */ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, $parObjMetadadosTramiteAnterior) { - //Validação dos parâmetros da função + //Valida??o dos par?metros da fun??o if(!isset($parDocumentoDTO)){ - throw new InfraException('Parâmetro $parDocumentoDTO não informado.'); + throw new InfraException('Par?metro $parDocumentoDTO n?o informado.'); } if(!isset($parMetaDocumento)){ - throw new InfraException('Parâmetro $parMetaDocumento não informado.'); + throw new InfraException('Par?metro $parMetaDocumento n?o informado.'); } $numCodigoEspecie = null; @@ -991,12 +990,12 @@ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, $dblIdProcedimento = $parDocumentoDTO->getDblIdProcedimento(); $dblIdDocumento = $parDocumentoDTO->getDblIdDocumento(); - //Inicialmente, busca espécie documental atribuida pelo produtor em trâmite realizado anteriormente + //Inicialmente, busca esp?cie documental atribuida pelo produtor em tr?mite realizado anteriormente $objComponenteDigitalDTO = new ComponenteDigitalDTO(); $objComponenteDigitalDTO->retNumCodigoEspecie(); $objComponenteDigitalDTO->retStrNomeEspecieProdutor(); - // Verifica se o documento é de um processo anexado ou não e busca no + // Verifica se o documento ? de um processo anexado ou n?o e busca no // campo correto if(isset($parMetaDocumento->idProcedimentoAnexadoSEI)){ $objComponenteDigitalDTO->setDblIdProcedimentoAnexado($dblIdProcedimento); @@ -1017,14 +1016,14 @@ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, $strNomeEspecieProdutor = utf8_encode($objComponenteDigitalDTO->getStrNomeEspecieProdutor()); } - //Caso a informação sobre mapeamento esteja nulo, necessário buscar tal informação no Barramento - //A lista de documentos recuperada do trâmite anterior será indexada pela sua ordem no protocolo e - //a espécie documental e o nome do produtor serão obtidos para atribuição ao documento + //Caso a informa??o sobre mapeamento esteja nulo, necess?rio buscar tal informa??o no Barramento + //A lista de documentos recuperada do tr?mite anterior ser? indexada pela sua ordem no protocolo e + //a esp?cie documental e o nome do produtor ser?o obtidos para atribui??o ao documento if($objComponenteDigitalDTO != null && $numCodigoEspecie == null) { if(isset($parObjMetadadosTramiteAnterior)){ $arrObjMetaDocumentosTramiteAnterior = []; - //Obtenção de lista de documentos do processo + //Obten??o de lista de documentos do processo $objProcesso = $parObjMetadadosTramiteAnterior->processo; $objDocumento = $parObjMetadadosTramiteAnterior->documento; $objProtocolo = isset($objProcesso) ? $objProcesso : $objDocumento; @@ -1034,13 +1033,13 @@ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, $arrObjMetaDocumentosTramiteAnterior = array($arrObjMetaDocumentosTramiteAnterior); } - //Indexação dos documentos pela sua ordem + //Indexa??o dos documentos pela sua ordem $arrMetaDocumentosAnteriorIndexado = []; foreach ($arrObjMetaDocumentosTramiteAnterior as $objMetaDoc) { $arrMetaDocumentosAnteriorIndexado[$objMetaDoc->ordem] = $objMetaDoc; } - //Atribui espécie documental definida pelo produtor do documento e registrado no PEN, caso exista + //Atribui esp?cie documental definida pelo produtor do documento e registrado no PEN, caso exista if(count($arrMetaDocumentosAnteriorIndexado) > 0 && array_key_exists($parMetaDocumento->ordem, $arrMetaDocumentosAnteriorIndexado)){ $numCodigoEspecie = $arrMetaDocumentosAnteriorIndexado[$parMetaDocumento->ordem]->especie->codigo; $strNomeEspecieProdutor = utf8_encode($arrMetaDocumentosAnteriorIndexado[$parMetaDocumento->ordem]->especie->nomeNoProdutor); @@ -1048,7 +1047,7 @@ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, } } - //Aplica o mapeamento de espécies definida pelo administrador para os novos documentos + //Aplica o mapeamento de esp?cies definida pelo administrador para os novos documentos if($numCodigoEspecie == null) { $numCodigoEspecie = $this->obterEspecieMapeada($parDocumentoDTO->getNumIdSerie()); $strNomeEspecieProdutor = utf8_encode($parDocumentoDTO->getStrNomeSerie()); @@ -1064,7 +1063,7 @@ private function atribuirEspecieDocumental($parMetaDocumento, $parDocumentoDTO, private function obterEspecieMapeada($parNumIdSerie) { if(!isset($parNumIdSerie) || $parNumIdSerie == 0) { - throw new InfraException('Parâmetro $parNumIdSerie não informado.'); + throw new InfraException('Par?metro $parNumIdSerie n?o informado.'); } $objPenRelTipoDocMapEnviadoDTO = new PenRelTipoDocMapEnviadoDTO(); @@ -1085,7 +1084,7 @@ private function obterEspecieMapeada($parNumIdSerie) $numCodigoEspecieMapeada = $numCodigoEspecieMapeada ?: $this->objPenRelTipoDocMapEnviadoRN->consultarEspeciePadrao(); if(!isset($numCodigoEspecieMapeada)) { - throw new InfraException("Código de identificação da espécie documental não pode ser localizada para o tipo de documento {$parNumIdSerie}."); + throw new InfraException("C?digo de identifica??o da esp?cie documental n?o pode ser localizada para o tipo de documento {$parNumIdSerie}."); } return $numCodigoEspecieMapeada; @@ -1095,10 +1094,10 @@ private function obterEspecieMapeada($parNumIdSerie) private function atribuirAssinaturaEletronica($objComponenteDigital, AssinaturaDTO $objAssinaturaDTO) { if(!isset($objComponenteDigital)){ - throw new InfraException('Parâmetro $objComponenteDigital não informado.'); + throw new InfraException('Par?metro $objComponenteDigital n?o informado.'); } - //TODO: Obter as informações corretas dos metadados da assinatura digital + //TODO: Obter as informa??es corretas dos metadados da assinatura digital if(isset($objAssinaturaDTO)) { $objComponenteDigital->assinaturaDigital = new stdClass(); $objComponenteDigital->assinaturaDigital->dataHora = $this->objProcessoEletronicoRN->converterDataWebService($objComponenteDigital->getDthAberturaAtividade()); @@ -1110,11 +1109,11 @@ private function atribuirAssinaturaEletronica($objComponenteDigital, AssinaturaD private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDocumentoDTO, $dblIdProcedimento=null) { if(!isset($objDocumento)){ - throw new InfraException('Parâmetro $objDocumento não informado.'); + throw new InfraException('Par?metro $objDocumento n?o informado.'); } if(!isset($objDocumentoDTO)){ - throw new InfraException('Parâmetro $objDocumentoDTO não informado.'); + throw new InfraException('Par?metro $objDocumentoDTO n?o informado.'); } $arrObjDocumentoDTOAssociacao = $this->listarDocumentosRelacionados($dblIdProcedimento, $objDocumentoDTO->getDblIdDocumento()); @@ -1125,14 +1124,14 @@ private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDoc foreach ($arrObjDadosArquivos as $numOrdemComponente => $objDadosArquivos) { if(!isset($objDadosArquivos) || count($objDadosArquivos) == 0){ - throw new InfraException('Erro durante obtenção de informações sobre o componente digital do documento {$objDocumentoDTO->getStrProtocoloDocumentoFormatado()}.'); + throw new InfraException('Erro durante obten??o de informa??es sobre o componente digital do documento {$objDocumentoDTO->getStrProtocoloDocumentoFormatado()}.'); } $strAlgoritmoHash = self::ALGORITMO_HASH_DOCUMENTO; $hashDoComponenteDigital = $objDadosArquivos['HASH_CONTEUDO']; $strAlgoritmoHash = $objDadosArquivos['ALGORITMO_HASH_CONTEUDO']; - //TODO: Revisar tal implementação para atender a gerao de hash de arquivos grandes + //TODO: Revisar tal implementa??o para atender a gerao de hash de arquivos grandes $objComponenteDigital = new stdClass(); $objComponenteDigital->ordem = $numOrdemComponente; $objComponenteDigital->nome = utf8_encode($objDadosArquivos["NOME"]); @@ -1152,7 +1151,7 @@ private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDoc //TODO: Preencher dados complementares do tipo de arquivo //$objComponenteDigital->dadosComplementaresDoTipoDeArquivo = ''; - //TODO: Carregar informações da assinatura digital + //TODO: Carregar informa??es da assinatura digital //$this->atribuirAssinaturaEletronica($objComponenteDigital, $objDocumentoDTO); $objComponenteDigital->idAnexo = $objDadosArquivos['ID_ANEXO']; @@ -1165,7 +1164,7 @@ private function atribuirComponentesDigitais($objDocumento, DocumentoDTO $objDoc /** - * Atribui a informação textual das tarjas de assinatura em metadados para envio, removendo os conteúdos de script e html + * Atribui a informa??o textual das tarjas de assinatura em metadados para envio, removendo os conte?dos de script e html * * @param DocumentoDTO $objDocumentoDTO * @param stdClass $objDocumento @@ -1256,7 +1255,7 @@ private function consultarComponenteDigital($parDblIdDocumento) private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAssociacao, $bolMultiplosComponentes=false, $numOrdemComponenteDigital=1) { if(!isset($objDocumentoDTO)){ - throw new InfraException('Parâmetro $objDocumentoDTO não informado.'); + throw new InfraException('Par?metro $objDocumentoDTO n?o informado.'); } $objInformacaoArquivo = array(); @@ -1267,16 +1266,16 @@ private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAs $strConteudoAssinatura = $this->obterConteudoInternoAssinatura($objDocumentoDTO); $hashDoComponenteDigital = base64_encode(hash(self::ALGORITMO_HASH_DOCUMENTO, $strConteudoAssinatura, true)); - //Busca registro de tramitações anteriores para este componente digital para identificar se o Barramento do PEN já havia registrado o hash do documento gerado da - //forma antiga, ou seja, considerando o link do Número SEI. Este link foi removido para manter o padrão de conteúdo de documentos utilizado pelo SEI para assinatura - //Para não bloquear os documentos gerados anteriormente, aqueles já registrados pelo Barramento com o hash antigo deverão manter a geração de conteúdo anteriormente utilizada. + //Busca registro de tramita??es anteriores para este componente digital para identificar se o Barramento do PEN j? havia registrado o hash do documento gerado da + //forma antiga, ou seja, considerando o link do N?mero SEI. Este link foi removido para manter o padr?o de conte?do de documentos utilizado pelo SEI para assinatura + //Para n?o bloquear os documentos gerados anteriormente, aqueles j? registrados pelo Barramento com o hash antigo dever?o manter a gera??o de conte?do anteriormente utilizada. $objComponenteDigital = $this->consultarComponenteDigital($objDocumentoDTO->getDblIdDocumento()); $hashDoComponenteDigitalAnterior = (isset($objComponenteDigital)) ? $objComponenteDigital->getStrHashConteudo() : null; if(isset($hashDoComponenteDigitalAnterior) && ($hashDoComponenteDigitalAnterior <> $hashDoComponenteDigital)){ $strConteudoAssinatura = $this->obterConteudoInternoAssinatura($objDocumentoDTO, true); } - //Testa o hash com a tarja de validação contendo antigos URLs do órgão + //Testa o hash com a tarja de valida??o contendo antigos URLs do ?rg?o $hashDoComponenteDigital = base64_encode(hash(self::ALGORITMO_HASH_DOCUMENTO, $strConteudoAssinatura, true)); $objConfiguracaoModPEN = ConfiguracaoModPEN::getInstance(); $arrControleURL = $objConfiguracaoModPEN->getValor("PEN", "ControleURL", false); @@ -1346,13 +1345,13 @@ private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAs $strConteudoAssinatura = $this->obterConteudoInternoAssinatura($objDocumentoDTO,false,false,null,false,true, true); } - //Caso o hash ainda esteja inconsistente teremos que forcar a geracao do arquivo usando as funções do sei 3.0.11 + //Caso o hash ainda esteja inconsistente teremos que forcar a geracao do arquivo usando as fun??es do sei 3.0.11 $hashDoComponenteDigital = base64_encode(hash(self::ALGORITMO_HASH_DOCUMENTO, $strConteudoAssinatura, true)); if(isset($hashDoComponenteDigitalAnterior) && $hashDoComponenteDigital <> $hashDoComponenteDigitalAnterior){ $strConteudoAssinatura = $this->obterConteudoInternoAssinatura($objDocumentoDTO, true, true); } - //Caso o hash ainda esteja inconsistente teremos que forcar a geracao do arquivo usando as funções do sei 3.0.11 + //Caso o hash ainda esteja inconsistente teremos que forcar a geracao do arquivo usando as fun??es do sei 3.0.11 $hashDoComponenteDigital = base64_encode(hash(self::ALGORITMO_HASH_DOCUMENTO, $strConteudoAssinatura, true)); if(isset($hashDoComponenteDigitalAnterior) && $hashDoComponenteDigital <> $hashDoComponenteDigitalAnterior){ $strConteudoAssinatura = $this->obterConteudoInternoAssinatura($objDocumentoDTO, true, true, null, false, false, true); @@ -1427,8 +1426,8 @@ private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAs } } elseif ($objDocumentoDTO->getStrStaEstadoProtocolo() == ProtocoloRN::$TE_DOCUMENTO_CANCELADO || $paramStrStaAssociacao == RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO) { - //Quando não é localizado um Anexo para um documento cancelado, os dados de componente digital precisam ser enviados - //pois o Barramento considera o componente digital do documento de forma obrigatória + //Quando n?o ? localizado um Anexo para um documento cancelado, os dados de componente digital precisam ser enviados + //pois o Barramento considera o componente digital do documento de forma obrigat?ria $objInformacaoArquivo['NOME'] = 'cancelado.html'; $objInformacaoArquivo['CONTEUDO'] = "[documento cancelado]"; $objInformacaoArquivo['TAMANHO'] = 0; @@ -1438,7 +1437,7 @@ private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAs $hashDoComponenteDigital = hash(self::ALGORITMO_HASH_DOCUMENTO, $objInformacaoArquivo['CONTEUDO'], true); $objInformacaoArquivo['HASH_CONTEUDO'] = base64_encode($hashDoComponenteDigital); } else { - throw new InfraException("Componente digital do documento {$strProtocoloDocumentoFormatado} não pode ser localizado."); + throw new InfraException("Componente digital do documento {$strProtocoloDocumentoFormatado} n?o pode ser localizado."); } } else { @@ -1464,7 +1463,7 @@ private function obterDadosArquivo(DocumentoDTO $objDocumentoDTO, $paramStrStaAs private function descompactarComponenteDigital($strCaminhoAnexoCompactado, $numOrdemComponenteDigital){ if(!is_readable($strCaminhoAnexoCompactado)) { - throw new InfraException("Anexo de documento não pode ser localizado"); + throw new InfraException("Anexo de documento n?o pode ser localizado"); } $objAnexoRN = new AnexoRN(); @@ -1501,7 +1500,7 @@ private function obterDadosComplementaresDoTipoDeArquivo($strCaminhoAnexo, $arrP $strMimeType = 'outro'; } } catch(Exception $e) { - throw new InfraException("Erro obtendo informações do anexo do documento {$strProtocoloDocumentoFormatado}", $e); + throw new InfraException("Erro obtendo informa??es do anexo do documento {$strProtocoloDocumentoFormatado}", $e); } finally{ finfo_close($finfo); @@ -1549,18 +1548,18 @@ private function listarComponentesDigitaisUltimoTramite($objDocumentoDTO){ /** - * Método de obtenção do conteúdo do documento interno para envio e cálculo de hash + * M?todo de obten??o do conte?do do documento interno para envio e c?lculo de hash * - * Anteriormente, os documentos enviados para o Barramento de Serviços do PEN continham o link para o número SEI do documento. - * Este link passou a não ser mais considerado pois é uma informação dinâmica e pertinente apenas quando o documento é visualizado - * dentro do sistema SEI. Quando o documento é tramitado externamente, este link não possui mais sentido. + * Anteriormente, os documentos enviados para o Barramento de Servi?os do PEN continham o link para o n?mero SEI do documento. + * Este link passou a n?o ser mais considerado pois ? uma informa??o din?mica e pertinente apenas quando o documento ? visualizado + * dentro do sistema SEI. Quando o documento ? tramitado externamente, este link n?o possui mais sentido. * - * Para tratar esta transição entre os formatos de documentos, existe o parâmetro $bolFormatoLegado para indicar qual formato deverá + * Para tratar esta transi??o entre os formatos de documentos, existe o par?metro $bolFormatoLegado para indicar qual formato dever? * ser utilizado na montagem dos metadados para envio. * * * @param Double $parDblIdDocumento Identificador do documento - * @param boolean $bolFormatoLegado Flag indicando se a forma antiga de recuperação de conteúdo para envio deverá ser utilizada - * @return String Conteúdo completo do documento para envio + * @param boolean $bolFormatoLegado Flag indicando se a forma antiga de recupera??o de conte?do para envio dever? ser utilizada + * @return String Conte?do completo do documento para envio */ private function obterConteudoInternoAssinatura(DocumentoDTO $objDocumentoDTO, $bolFormatoLegado=false, $bolFormatoLegado3011=false, $dadosURL=null, $bolSeiVersao4=false,$bolTarjaLegada402=false, $bolSiglaSistemaSUPER = false) { @@ -1583,7 +1582,7 @@ private function obterConteudoInternoAssinatura(DocumentoDTO $objDocumentoDTO, $ $objEditorDTO->setStrSinCarimboPublicacao('N'); } - //para o caso de URLs antigos do órgão, ele testa o html com a tarja antiga + //para o caso de URLs antigos do ?rg?o, ele testa o html com a tarja antiga $dados=[ "parObjEditorDTO" => $objEditorDTO, "montarTarja" => $dadosURL==null?false:true, @@ -1614,10 +1613,10 @@ private function obterConteudoInternoAssinatura(DocumentoDTO $objDocumentoDTO, $ if(!empty($arrSiglaOrgaoLegado)){ $alterarTitle = true; - //Busca metadados do processo registrado em trâmite anterior + //Busca metadados do processo registrado em tr?mite anterior $objMetadadosProcessoTramiteAnterior = $this->consultarMetadadosPEN($objDocumentoDTO->getDblIdProcedimento()); - //gerar o hash do conteúdo do documento + //gerar o hash do conte?do do documento $hashDoComponenteDigital = base64_encode(hash(self::ALGORITMO_HASH_DOCUMENTO, $strResultado, true)); if(!empty($objMetadadosProcessoTramiteAnterior)){ @@ -1649,7 +1648,7 @@ private function obterConteudoInternoAssinatura(DocumentoDTO $objDocumentoDTO, $ private function obterTipoDeConteudo($strMimeType) { if(!isset($strMimeType)){ - throw new InfraException('Parâmetro $strMimeType não informado.'); + throw new InfraException('Par?metro $strMimeType n?o informado.'); } $resultado = self::TC_TIPO_CONTEUDO_OUTROS; @@ -1672,7 +1671,7 @@ private function atribuirNumeracaoDocumento($objDocumento, DocumentoDTO $parObjD $objSerieDTO = $this->consultarSerie($parObjDocumentoDTO->getNumIdSerie()); if(!isset($objSerieDTO)){ - throw new InfraException("Tipo de Documento não pode ser localizado. (Código: ".$parObjDocumentoDTO->getNumIdSerie().")"); + throw new InfraException("Tipo de Documento n?o pode ser localizado. (C?digo: ".$parObjDocumentoDTO->getNumIdSerie().")"); } $strStaNumeracao = $objSerieDTO->getStrStaNumeracao(); @@ -1717,7 +1716,7 @@ private function adicionarProcessosApensados($objProcesso, $arrIdProcessoApensad private function consultarUnidade($numIdUnidade) { if(!isset($numIdUnidade)){ - throw new InfraException('Parâmetro $numIdUnidade não informado.'); + throw new InfraException('Par?metro $numIdUnidade n?o informado.'); } $objUnidadeDTO = new UnidadeDTO(); @@ -1731,7 +1730,7 @@ private function consultarUnidade($numIdUnidade) private function consultarSerie($numIdSerie) { if(!isset($numIdSerie)){ - throw new InfraException('Parâmetro $numIdSerie não informado.'); + throw new InfraException('Par?metro $numIdSerie n?o informado.'); } $objSerieDTO = new SerieDTO(); @@ -1756,7 +1755,7 @@ private function consultarOrgao($numIdOrgao) public function consultarProcedimento($numIdProcedimento) { if(!isset($numIdProcedimento)){ - throw new InfraException('Parâmetro $numIdProcedimento não informado.'); + throw new InfraException('Par?metro $numIdProcedimento n?o informado.'); } $objProcedimentoDTO = new ProcedimentoDTO(); @@ -1780,7 +1779,7 @@ public function consultarProcedimento($numIdProcedimento) public function listarInteressados($numIdProtocolo) { if(!isset($numIdProtocolo)){ - throw new InfraException('Parâmetro $numIdProtocolo não informado.'); + throw new InfraException('Par?metro $numIdProtocolo n?o informado.'); } $objParticipanteDTO = new ParticipanteDTO(); @@ -1808,7 +1807,7 @@ private function consultarProtocoloDocumento($numIdProcedimento) private function consultarAnexo($dblIdDocumento) { if(!isset($dblIdDocumento)){ - throw new InfraException('Parâmetro $dblIdDocumento não informado.'); + throw new InfraException('Par?metro $dblIdDocumento n?o informado.'); } $objAnexoDTO = new AnexoDTO(); @@ -1826,7 +1825,7 @@ private function consultarAnexo($dblIdDocumento) private function consultarUsuario($numIdUsuario) { if(!isset($numIdUsuario)){ - throw new InfraException('Parâmetro $numIdUsuario não informado.'); + throw new InfraException('Par?metro $numIdUsuario n?o informado.'); } $objUsuarioDTO = new UsuarioDTO(); @@ -1839,11 +1838,11 @@ private function consultarUsuario($numIdUsuario) } /** - * Recupera a lista de documentos do processo, mantendo sua ordem conforme definida pelo usuário após reordenações e - * movimentações de documentos + * Recupera a lista de documentos do processo, mantendo sua ordem conforme definida pelo usu?rio ap?s reordena??es e + * movimenta??es de documentos * - * Esta função basicamente aplica a desestruturação do retorno da função listarDocumentosRelacionados para obter somente - * as instãncias dos objetos DocumentoDTO + * Esta fun??o basicamente aplica a desestrutura??o do retorno da fun??o listarDocumentosRelacionados para obter somente + * as inst?ncias dos objetos DocumentoDTO * * @param num $idProcedimento * @return array @@ -1862,7 +1861,7 @@ function($item){ public function listarDocumentosRelacionados($idProcedimento, $paramDblIdDocumentoFiltro=null) { if(!isset($idProcedimento)){ - throw new InfraException('Parâmetro $idProcedimento não informado.'); + throw new InfraException('Par?metro $idProcedimento n?o informado.'); } $arrObjDocumentoDTO = array(); @@ -1897,7 +1896,7 @@ public function listarDocumentosRelacionados($idProcedimento, $paramDblIdDocumen $arrObjDocumentoDTOBanco = $this->objDocumentoRN->listarRN0008($objDocumentoDTO); $arrObjDocumentoDTOIndexado = InfraArray::indexarArrInfraDTO($arrObjDocumentoDTOBanco, 'IdDocumento'); - //Mantem ordenação definida pelo usuário, indicando qual a sua associação com o processo + //Mantem ordena??o definida pelo usu?rio, indicando qual a sua associa??o com o processo $arrObjDocumentoDTO = array(); foreach($arrAssociacaoDocumentos as $objAssociacaoDocumento){ $dblIdDocumento = $objAssociacaoDocumento["IdProtocolo"]; @@ -1946,7 +1945,7 @@ private function consultarNomeDocumentoPEN(DocumentoDTO $objDocumentoDTO){ private function consultarDocumento($dblIdDocumento) { if(!isset($dblIdDocumento)){ - throw new InfraException('Parâmetro $dblIdDocumento não informado.'); + throw new InfraException('Par?metro $dblIdDocumento n?o informado.'); } $documentoDTO = new DocumentoDTO(); @@ -1978,15 +1977,15 @@ private function consultarDocumento($dblIdDocumento) private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $strProtocolo, $bolSinProcessamentoEmLote=false) { if (!isset($strNumeroRegistro)) { - throw new InfraException('Parâmetro $strNumeroRegistro não informado.'); + throw new InfraException('Par?metro $strNumeroRegistro n?o informado.'); } if (!isset($numIdTramite)) { - throw new InfraException('Parâmetro $numIdTramite não informado.'); + throw new InfraException('Par?metro $numIdTramite n?o informado.'); } if (!isset($strProtocolo)) { - throw new InfraException('Parâmetro $strProtocolo não informado.'); + throw new InfraException('Par?metro $strProtocolo n?o informado.'); } //Obter dados dos componetes digitais @@ -2037,20 +2036,20 @@ private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $s $strStaAssociacao = count($arrObjDocumentoDTOAssociacao) == 1 ? $arrObjDocumentoDTOAssociacao[0]['StaAssociacao'] : null; $strNomeDocumento = $this->consultarNomeDocumentoPEN($objDocumentoDTO); - //Verifica se existe o objeto anexoDTO para recuperar informações do arquivo + //Verifica se existe o objeto anexoDTO para recuperar informa??es do arquivo $nrTamanhoArquivoMb = 0; $nrTamanhoBytesArquivo = 0; $nrTamanhoMegasMaximo = $this->objPenParametroRN->getParametro('PEN_TAMANHO_MAXIMO_DOCUMENTO_EXPEDIDO'); $nrTamanhoBytesMaximo = ($nrTamanhoMegasMaximo * pow(1024, 2)); //Qtd de MB definido como parametro try { - //Verifica se o arquivo é maior que o tamanho máximo definido para envio, se for, realiza o particionamento do arquivo + //Verifica se o arquivo ? maior que o tamanho m?ximo definido para envio, se for, realiza o particionamento do arquivo if(!in_array($objComponenteDigitalDTO->getStrHashConteudo(), $arrHashComponentesEnviados)){ if($objDocumentoDTO->getStrStaProtocoloProtocolo() == ProtocoloRN::$TP_DOCUMENTO_RECEBIDO){ $objAnexoDTO = $this->consultarAnexo($objDocumentoDTO->getDblIdDocumento()); if(!$objAnexoDTO){ $strProtocoloDocumento = $objDocumentoDTO->getStrProtocoloDocumentoFormatado(); - throw new InfraException("Anexo do documento $strProtocoloDocumento não pode ser localizado."); + throw new InfraException("Anexo do documento $strProtocoloDocumento n?o pode ser localizado."); } $strCaminhoAnexoTemporario = null; @@ -2066,7 +2065,7 @@ private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $s $nrTamanhoBytesArquivo = filesize($strCaminhoAnexo); //Tamanho total do arquivo $nrTamanhoArquivoMb = ($nrTamanhoBytesArquivo / pow(1024, 2)); - //Método que irá particionar o arquivo em partes para realizar o envio + //M?todo que ir? particionar o arquivo em partes para realizar o envio $this->particionarComponenteDigitalParaEnvio( $strCaminhoAnexo, $dadosDoComponenteDigital, $nrTamanhoArquivoMb, $nrTamanhoMegasMaximo, $nrTamanhoBytesMaximo, $objComponenteDigitalDTO, $numIdTramite, $bolSinProcessamentoEmLote @@ -2109,7 +2108,7 @@ private function enviarComponentesDigitais($strNumeroRegistro, $numIdTramite, $s $arrHashComponentesEnviados[] = $objComponenteDigitalDTO->getStrHashConteudo(); - //Bloquea documento para atualizao, já que ele foi visualizado + //Bloquea documento para atualizao, j? que ele foi visualizado $this->objDocumentoRN->bloquearConteudo($objDocumentoDTO); $this->objProcedimentoAndamentoRN->cadastrar( ProcedimentoAndamentoDTO::criarAndamento(sprintf('Enviando %s %s', $strNomeDocumento, @@ -2164,7 +2163,7 @@ protected function salvarAnexoImutavelControlado($dados){ $strNomeArquivoUploadHtml = $objAnexoRN->gerarNomeArquivoTemporario(); if (file_put_contents(DIR_SEI_TEMP.'/'.$strNomeArquivoUploadHtml, $strConteudoAssinatura) === false) { - throw new InfraException('Erro criando arquivo html temporário para envio do e-mail.'); + throw new InfraException('Erro criando arquivo html tempor?rio para envio do e-mail.'); } @@ -2212,7 +2211,7 @@ protected function salvarAnexoImutavelControlado($dados){ }catch(Exception $e){ - throw new InfraException("Erro salvando anexo imutável", $e); + throw new InfraException("Erro salvando anexo imut?vel", $e); } } @@ -2230,13 +2229,13 @@ private function corrigirNumeroOrdemComponentes($arrComponentesDigitaisDTO, $str $arrOrdensAtualizadas = InfraArray::converterArrInfraDTO($arrComponentesDigitaisDTO, "Ordem"); if(count($arrOrdensAtualizadas) != count(array_unique($arrOrdensAtualizadas))){ - throw new InfraException("Falha identificada na definição da ordem dos componentes digitais do documento $strProtocoloDocumento"); + throw new InfraException("Falha identificada na defini??o da ordem dos componentes digitais do documento $strProtocoloDocumento"); } } /** - * Método responsável por realizar o particionamento do componente digital a ser enviado, de acordo com o parametro (PEN_TAMANHO_MAXIMO_DOCUMENTO_EXPEDIDO) - * @author Josinaldo Júnior + * M?todo respons?vel por realizar o particionamento do componente digital a ser enviado, de acordo com o parametro (PEN_TAMANHO_MAXIMO_DOCUMENTO_EXPEDIDO) + * @author Josinaldo J?nior * @param $strCaminhoAnexo * @param $dadosDoComponenteDigital * @param $nrTamanhoArquivoMb @@ -2254,7 +2253,7 @@ private function enviarComponenteDigitalParticionado($strCaminhoAnexo, $dadosDoC try{ $inicio = 0; - //Lê o arquivo em partes para realizar o envio + //L? o arquivo em partes para realizar o envio for ($i = 1; $i <= $qtdPartes; $i++) { $this->barraProgresso->setStrRotulo(sprintf(ProcessoEletronicoINT::TEE_EXPEDICAO_ETAPA_DOCUMENTO , $objComponenteDigitalDTO->getStrProtocoloDocumentoFormatado())." (Componente digital: parte $i de $qtdPartes)"); @@ -2286,32 +2285,32 @@ private function enviarComponenteDigitalParticionado($strCaminhoAnexo, $dadosDoC private function validarParametrosExpedicao(InfraException $objInfraException, ExpedirProcedimentoDTO $objExpedirProcedimentoDTO) { if(!isset($objExpedirProcedimentoDTO)){ - $objInfraException->adicionarValidacao('Parâmetro $objExpedirProcedimentoDTO não informado.'); + $objInfraException->adicionarValidacao('Par?metro $objExpedirProcedimentoDTO n?o informado.'); } //TODO: Validar se repositrio de origem foi informado if (InfraString::isBolVazia($objExpedirProcedimentoDTO->getNumIdRepositorioOrigem())){ - $objInfraException->adicionarValidacao('Identificação do repositório de estruturas da unidade atual não informado.'); + $objInfraException->adicionarValidacao('Identifica??o do reposit?rio de estruturas da unidade atual n?o informado.'); } //TODO: Validar se unidade de origem foi informado if (InfraString::isBolVazia($objExpedirProcedimentoDTO->getNumIdUnidadeOrigem())){ - $objInfraException->adicionarValidacao('Identificação da unidade atual no repositório de estruturas organizacionais não informado.'); + $objInfraException->adicionarValidacao('Identifica??o da unidade atual no reposit?rio de estruturas organizacionais n?o informado.'); } //TODO: Validar se repositrio foi devidamente informado if (InfraString::isBolVazia($objExpedirProcedimentoDTO->getNumIdRepositorioDestino())){ - $objInfraException->adicionarValidacao('Repositório de estruturas organizacionais não informado.'); + $objInfraException->adicionarValidacao('Reposit?rio de estruturas organizacionais n?o informado.'); } //TODO: Validar se unidade foi devidamente informada if (InfraString::isBolVazia($objExpedirProcedimentoDTO->getNumIdUnidadeDestino())){ - $objInfraException->adicionarValidacao('Unidade de destino não informado.'); + $objInfraException->adicionarValidacao('Unidade de destino n?o informado.'); } //TODO: Validar se motivo de urgncia foi devidamente informado, caso expedio urgente if ($objExpedirProcedimentoDTO->getBolSinUrgente() && InfraString::isBolVazia($objExpedirProcedimentoDTO->getNumIdMotivoUrgencia())){ - $objInfraException->adicionarValidacao('Motivo de urgência não informado.'); + $objInfraException->adicionarValidacao('Motivo de urg?ncia n?o informado.'); } } @@ -2319,18 +2318,18 @@ private function validarDocumentacaoExistende(InfraException $objInfraException, { $arrObjDocumentoDTO = $objProcedimentoDTO->getArrObjDocumentoDTO(); if(!isset($arrObjDocumentoDTO) || count($arrObjDocumentoDTO) == 0) { - $objInfraException->adicionarValidacao('Não é possível tramitar um processo sem documentos', $strAtributoValidacao); + $objInfraException->adicionarValidacao('N?o ? poss?vel tramitar um processo sem documentos', $strAtributoValidacao); } } private function validarDadosProcedimento(InfraException $objInfraException, ProcedimentoDTO $objProcedimentoDTO, $strAtributoValidacao) { if($objProcedimentoDTO->isSetStrDescricaoProtocolo() && InfraString::isBolVazia($objProcedimentoDTO->getStrDescricaoProtocolo())) { - $objInfraException->adicionarValidacao("Descrição do processo {$objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()} não informado.", $strAtributoValidacao); + $objInfraException->adicionarValidacao("Descri??o do processo {$objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()} n?o informado.", $strAtributoValidacao); } if(!$objProcedimentoDTO->isSetArrObjParticipanteDTO() || count($objProcedimentoDTO->getArrObjParticipanteDTO()) == 0) { - $objInfraException->adicionarValidacao("Interessados do processo {$objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()} não informados.", $strAtributoValidacao); + $objInfraException->adicionarValidacao("Interessados do processo {$objProcedimentoDTO->getStrProtocoloProcedimentoFormatado()} n?o informados.", $strAtributoValidacao); } } @@ -2349,7 +2348,7 @@ private function validarDadosDocumentos(InfraException $objInfraException, $arrD if($objDocumentoDTO->getStrStaEstadoProtocolo() != ProtocoloRN::$TE_DOCUMENTO_CANCELADO){ if(empty($strMapeamentoEnvioPadrao) && $objGenericoBD->contar($objDocMapDTO) == 0) { $strDescricao = sprintf( - 'Não existe mapeamento de envio para %s no documento %s', + 'N?o existe mapeamento de envio para %s no documento %s', $objDocumentoDTO->getStrNomeSerie(), $objDocumentoDTO->getStrProtocoloDocumentoFormatado() ); @@ -2371,10 +2370,10 @@ private function validarDadosDocumentos(InfraException $objInfraException, $arrD } if (!empty($objDocumentoDTO->getNumIdHipoteseLegalProtocolo()) && empty($objPenRelHipoteseLegalEnvioRN->getIdHipoteseLegalPEN($objDocumentoDTO->getNumIdHipoteseLegalProtocolo()))) { - $objInfraException->adicionarValidacao('Hipótese legal "'.$dados->getStrNome().'" do documento '.$objDocumentoDTO->getStrNomeSerie(). ' ' . $objDocumentoDTO->getStrProtocoloDocumentoFormatado() .' não mapeada', $strAtributoValidacao); + $objInfraException->adicionarValidacao('Hip?tese legal "'.$dados->getStrNome().'" do documento '.$objDocumentoDTO->getStrNomeSerie(). ' ' . $objDocumentoDTO->getStrProtocoloDocumentoFormatado() .' n?o mapeada', $strAtributoValidacao); }else{ if($dados->getStrSinAtivo() == 'N'){ - $objInfraException->adicionarValidacao('Hipótese legal "'.$dados->getStrNome().'" do documento '.$objDocumentoDTO->getStrNomeSerie(). ' ' . $objDocumentoDTO->getStrProtocoloDocumentoFormatado() .' está inativa', $strAtributoValidacao); + $objInfraException->adicionarValidacao('Hip?tese legal "'.$dados->getStrNome().'" do documento '.$objDocumentoDTO->getStrNomeSerie(). ' ' . $objDocumentoDTO->getStrProtocoloDocumentoFormatado() .' est? inativa', $strAtributoValidacao); } } } @@ -2396,14 +2395,14 @@ private function validarProcessoAbertoUnidade(InfraException $objInfraException, if(isset($arrObjAtividadeDTO) && count($arrObjAtividadeDTO) > 1) { $strSiglaUnidade = implode(', ', InfraArray::converterArrInfraDTO($arrObjAtividadeDTO, 'SiglaUnidade')); - $objInfraException->adicionarValidacao("Não é possível tramitar um processo aberto em mais de uma unidade. ($strSiglaUnidade)", $strAtributoValidacao); + $objInfraException->adicionarValidacao("N?o ? poss?vel tramitar um processo aberto em mais de uma unidade. ($strSiglaUnidade)", $strAtributoValidacao); } } private function validarNivelAcessoProcesso(InfraException $objInfraException, ProcedimentoDTO $objProcedimentoDTO, $strAtributoValidacao) { if ($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_SIGILOSO) { - $objInfraException->adicionarValidacao('Não é possível tramitar um processo com informações sigilosas.', $strAtributoValidacao); + $objInfraException->adicionarValidacao('N?o ? poss?vel tramitar um processo com informa??es sigilosas.', $strAtributoValidacao); } } @@ -2417,7 +2416,7 @@ private function validarHipoteseLegalEnvio(InfraException $objInfraException, Pr { if ($objProcedimentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO) { if (empty($objProcedimentoDTO->getNumIdHipoteseLegalProtocolo())) { - $objInfraException->adicionarValidacao('Não é possível tramitar um processo de nível restrito sem a hipótese legal mapeada.', $strAtributoValidacao); + $objInfraException->adicionarValidacao('N?o ? poss?vel tramitar um processo de n?vel restrito sem a hip?tese legal mapeada.', $strAtributoValidacao); } $objHipoteseLegalDTO = new HipoteseLegalDTO(); @@ -2431,10 +2430,10 @@ private function validarHipoteseLegalEnvio(InfraException $objInfraException, Pr $objPenRelHipoteseLegalEnvioRN = new PenRelHipoteseLegalEnvioRN(); if(!empty($dados)){ if (!empty($objProcedimentoDTO->getNumIdHipoteseLegalProtocolo()) && empty($objPenRelHipoteseLegalEnvioRN->getIdHipoteseLegalPEN($objProcedimentoDTO->getNumIdHipoteseLegalProtocolo()))) { - $objInfraException->adicionarValidacao('Hipótese legal "' . $dados->getStrNome() . '" do processo ' . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() . ' não mapeada', $strAtributoValidacao); + $objInfraException->adicionarValidacao('Hip?tese legal "' . $dados->getStrNome() . '" do processo ' . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() . ' n?o mapeada', $strAtributoValidacao); }else{ if($dados->getStrSinAtivo() == 'N'){ - $objInfraException->adicionarValidacao('Hipótese legal "' . $dados->getStrNome() . '" do processo ' . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() . ' está inativa', $strAtributoValidacao); + $objInfraException->adicionarValidacao('Hip?tese legal "' . $dados->getStrNome() . '" do processo ' . $objProcedimentoDTO->getStrProtocoloProcedimentoFormatado() . ' est? inativa', $strAtributoValidacao); } } } @@ -2464,7 +2463,7 @@ private function validarAssinaturas(InfraException $objInfraException, $objProce foreach($arrObjDocumentoDTO as $objDocumentoDTO) { $objAssinaturaDTO->setDblIdDocumento($objDocumentoDTO->getDblIdDocumento()); - // Se o documento no tem assinatura e não foi cancelado então cai na regra de validao + // Se o documento no tem assinatura e n?o foi cancelado ent?o cai na regra de validao if($this->objAssinaturaRN->contarRN1324($objAssinaturaDTO) == 0 && $objDocumentoDTO->getStrStaEstadoProtocolo() != ProtocoloRN::$TE_DOCUMENTO_CANCELADO && ($objDocumentoDTO->getStrStaDocumento() == DocumentoRN::$TD_EDITOR_EDOC || $objDocumentoDTO->getStrStaDocumento() == DocumentoRN::$TD_EDITOR_INTERNO) ){ $bolAssinaturaCorretas = false; } @@ -2472,7 +2471,7 @@ private function validarAssinaturas(InfraException $objInfraException, $objProce } if($bolAssinaturaCorretas !== true) { - $objInfraException->adicionarValidacao('Não é possível tramitar um processos com documentos gerados e não assinados', $strAtributoValidacao); + $objInfraException->adicionarValidacao('N?o ? poss?vel tramitar um processos com documentos gerados e n?o assinados', $strAtributoValidacao); } } @@ -2493,22 +2492,22 @@ private function validarProcedimentoCompartilhadoSeiFederacao(InfraException $ob } if($bolProcedimentoCompartilhado) { - $objInfraException->adicionarValidacao('Não é possível tramitar o processo pois ele foi compartilhado através do SEI Federação.', $strAtributoValidacao); + $objInfraException->adicionarValidacao('N?o ? poss?vel tramitar o processo pois ele foi compartilhado atrav?s do SEI Federa??o.', $strAtributoValidacao); } } /** * Valida se o processo pode ser bloqueado pelo sistema antes do seu envio * - * Regra necessária para evitar que regras internas do SEI ou módulos possam impedir o bloqueio do processo após o seu envio externo, - * exceção esta que pode deixar o processo aberto tanto no remetente como no destinatário. + * Regra necess?ria para evitar que regras internas do SEI ou m?dulos possam impedir o bloqueio do processo ap?s o seu envio externo, + * exce??o esta que pode deixar o processo aberto tanto no remetente como no destinat?rio. */ protected function validarPossibilidadeBloqueioControlado($objProcedimentoDTO){ - // Bloqueia temporariamente o processo para garantir que não exista restrições sobre ele + // Bloqueia temporariamente o processo para garantir que n?o exista restri??es sobre ele $objProcedimentoRN = new ProcedimentoRN(); $objProcedimentoRN->bloquear([$objProcedimentoDTO]); - // Desfaz a operação anterior para voltar ao estado original do processo + // Desfaz a opera??o anterior para voltar ao estado original do processo $objProtocoloDTOBanco = new ProcedimentoDTO(); $objProtocoloDTOBanco->setDblIdProcedimento($objProcedimentoDTO->getDblIdProcedimento()); $objProtocoloDTOBanco->retStrStaEstadoProtocolo(); @@ -2517,10 +2516,10 @@ protected function validarPossibilidadeBloqueioControlado($objProcedimentoDTO){ } /** - * Validação das pré-condições necessárias para que um processo e seus documentos possam ser expedidos para outra entidade + * Valida??o das pr?-condi??es necess?rias para que um processo e seus documentos possam ser expedidos para outra entidade * @param InfraException $objInfraException Instncia da classe de exceo para registro dos erros - * @param ProcedimentoDTO $objProcedimentoDTO Informações sobre o procedimento a ser expedido - * @param string $strAtributoValidacao índice para o InfraException separar os processos + * @param ProcedimentoDTO $objProcedimentoDTO Informa??es sobre o procedimento a ser expedido + * @param string $strAtributoValidacao ?ndice para o InfraException separar os processos */ public function validarPreCondicoesExpedirProcedimento(InfraException $objInfraException, ProcedimentoDTO $objProcedimentoDTO, $strAtributoValidacao = null, $bolSinProcessamentoEmLote = false) { @@ -2531,7 +2530,7 @@ public function validarPreCondicoesExpedirProcedimento(InfraException $objInfraE $this->validarNivelAcessoProcesso($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); $this->validarHipoteseLegalEnvio($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); $this->validarAssinaturas($objInfraException, $objProcedimentoDTO, $strAtributoValidacao); - + try{ if(!$bolSinProcessamentoEmLote){ $this->validarPossibilidadeBloqueio($objProcedimentoDTO); @@ -2572,7 +2571,7 @@ public function listarProcessosApensados($dblIdProcedimentoAtual, $idUnidadeAtua $idUnidadeAtual = filter_var($idUnidadeAtual, FILTER_SANITIZE_NUMBER_INT); if(!$idUnidadeAtual){ - $objInfraException->adicionarValidacao('Processo inválido.'); + $objInfraException->adicionarValidacao('Processo inv?lido.'); } $objInfraException->lancarValidacoes(); @@ -2655,7 +2654,7 @@ public function listarProcessosApensadosAvancado(AtividadeDTO $objAtividadeDTO, $idUnidadeAtual = filter_var($idUnidadeAtual, FILTER_SANITIZE_NUMBER_INT); if(!$idUnidadeAtual){ - $objInfraException->adicionarValidacao('Processo inválido.'); + $objInfraException->adicionarValidacao('Processo inv?lido.'); } $objInfraException->lancarValidacoes(); @@ -2708,8 +2707,8 @@ public function listarProcessosApensadosAvancado(AtividadeDTO $objAtividadeDTO, } /** - * Método responsável por realizar o particionamento do componente digital a ser enviado, de acordo com o parametro (PEN_TAMANHO_MAXIMO_DOCUMENTO_EXPEDIDO) - * @author Josinaldo Júnior + * M?todo respons?vel por realizar o particionamento do componente digital a ser enviado, de acordo com o parametro (PEN_TAMANHO_MAXIMO_DOCUMENTO_EXPEDIDO) + * @author Josinaldo J?nior * @param $strCaminhoAnexo * @param $dadosDoComponenteDigital * @param $nrTamanhoArquivoMb @@ -2721,14 +2720,14 @@ public function listarProcessosApensadosAvancado(AtividadeDTO $objAtividadeDTO, private function particionarComponenteDigitalParaEnvio($strCaminhoAnexo, $dadosDoComponenteDigital, $nrTamanhoArquivoMb, $nrTamanhoMegasMaximo, $nrTamanhoBytesMaximo, $objComponenteDigitalDTO, $numIdTramite, $bolSinProcessamentoEmLote=false) { - //Faz o cálculo para obter a quantidade de partes que o arquivo será particionado, sempre arrendondando para cima + //Faz o c?lculo para obter a quantidade de partes que o arquivo ser? particionado, sempre arrendondando para cima $qtdPartes = ceil($nrTamanhoArquivoMb / $nrTamanhoMegasMaximo); //Abre o arquivo para leitura $fp = fopen($strCaminhoAnexo, "rb"); try { $inicio = 0; - //Lê o arquivo em partes para realizar o envio + //L? o arquivo em partes para realizar o envio for ($i = 1; $i <= $qtdPartes; $i++) { $parteDoArquivo = stream_get_contents($fp, $nrTamanhoBytesMaximo, $inicio); @@ -2741,13 +2740,13 @@ private function particionarComponenteDigitalParaEnvio($strCaminhoAnexo, $dadosD } $this->contadorDaBarraDeProgresso++; }catch (Exception $e){ - //Armazena as partes que não foram enviadas para tentativa de reenvio posteriormente + //Armazena as partes que n?o foram enviadas para tentativa de reenvio posteriormente $arrPartesComponentesDigitaisNaoEnviadas[] = $inicio; } $inicio = ($nrTamanhoBytesMaximo * $i); } - //Verifica se existem partes do componente digital que não foram enviadas para tentar realizar o envio novamente + //Verifica se existem partes do componente digital que n?o foram enviadas para tentar realizar o envio novamente if(isset($arrPartesComponentesDigitaisNaoEnviadas)){ $nrTotalPartesNaoEnviadas = count($arrPartesComponentesDigitaisNaoEnviadas); $i = 1; @@ -2771,8 +2770,8 @@ private function particionarComponenteDigitalParaEnvio($strCaminhoAnexo, $dadosD /** - * Método responsavel por realizar o envio de uma parte especifica de um componente digital - * @author Josinaldo Júnior + * M?todo responsavel por realizar o envio de uma parte especifica de um componente digital + * @author Josinaldo J?nior * @param $parInicio * @param $parFim * @param $parParteDoArquivo @@ -2795,8 +2794,8 @@ private function enviarParteDoComponenteDigital($parInicio, $parFim, $parParteDo /** - * Método responsável por realizar o envio da parte de um componente digital - * @author Josinaldo Júnior + * M?todo respons?vel por realizar o envio da parte de um componente digital + * @author Josinaldo J?nior * @param $parametros * @return mixed * @throws InfraException @@ -2814,8 +2813,8 @@ public function enviarParteDeComponenteDigital($parametros) /** - * Método responsável por sinalizar o término do envio das partes de um componente digital - * @author Josinaldo Júnior + * M?todo respons?vel por sinalizar o t?rmino do envio das partes de um componente digital + * @author Josinaldo J?nior * @param $parametros * @return mixed * @throws InfraException @@ -2825,7 +2824,7 @@ public function sinalizarTerminoDeEnvioDasPartesDoComponente($parametros) try { return $this->getObjPenWs()->sinalizarTerminoDeEnvioDasPartesDoComponente($parametros); } catch (\Exception $e) { - $mensagem = "Falha em sinalizar o término de envio das partes do componente digital"; + $mensagem = "Falha em sinalizar o t?rmino de envio das partes do componente digital"; $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); throw new InfraException($mensagem, $e, $detalhes); } @@ -2882,7 +2881,7 @@ protected function receberReciboDeEnvioControlado($parNumIdTramite) return true; } catch (\Exception $e) { - $strMensagem = "Falha na obtenção do recibo de envio de protocolo do trâmite $parNumIdTramite. $e"; + $strMensagem = "Falha na obten??o do recibo de envio de protocolo do tr?mite $parNumIdTramite. $e"; LogSEI::getInstance()->gravar($strMensagem, InfraLog::$ERRO); } } @@ -2980,7 +2979,7 @@ protected function cancelarTramiteInternoControlado(ProtocoloDTO $objDtoProtocol $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTO); if(!isset($objTramiteDTO)){ - throw new InfraException("Trâmite não encontrado para o processo {$objDtoProtocolo->getDblIdProtocolo()}."); + throw new InfraException("Tr?mite n?o encontrado para o processo {$objDtoProtocolo->getDblIdProtocolo()}."); } $tramites = $this->objProcessoEletronicoRN->consultarTramites($objTramiteDTO->getNumIdTramite(), null, $objPenUnidadeDTO->getNumIdUnidadeRH(), null, null, $numIdRespositorio); @@ -2989,16 +2988,16 @@ protected function cancelarTramiteInternoControlado(ProtocoloDTO $objDtoProtocol if (!$tramite) { $numIdTramite = $objTramiteDTO->getNumIdTramite(); $numIdProtoloco = $objDtoProtocolo->getDblIdProtocolo(); - throw new InfraException("Trâmite $numIdTramite não encontrado para o processo $numIdProtoloco."); + throw new InfraException("Tr?mite $numIdTramite n?o encontrado para o processo $numIdProtoloco."); } - //Verifica se o trâmite est com o status de iniciado + //Verifica se o tr?mite est com o status de iniciado if ($tramite->situacaoAtual == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_INICIADO) { $this->objProcessoEletronicoRN->cancelarTramite($tramite->IDT); return true; } - //Busca o processo eletrônico + //Busca o processo eletr?nico $objDTOFiltro = new ProcessoEletronicoDTO(); $objDTOFiltro->setDblIdProcedimento($dblIdProcedimento); $objDTOFiltro->retStrNumeroRegistro(); @@ -3008,7 +3007,7 @@ protected function cancelarTramiteInternoControlado(ProtocoloDTO $objDtoProtocol $objProcessoEletronicoDTO = $objBD->consultar($objDTOFiltro); if (empty($objProcessoEletronicoDTO)) { - throw new InfraException('Não foi encontrado o processo pelo ID ' . $dblIdProcedimento); + throw new InfraException('N?o foi encontrado o processo pelo ID ' . $dblIdProcedimento); } //Armazena a situao atual @@ -3017,17 +3016,17 @@ protected function cancelarTramiteInternoControlado(ProtocoloDTO $objDtoProtocol //Valida os status switch ($numSituacaoAtual) { case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO: - throw new InfraException("O sistema destinatário já iniciou o recebimento desse processo, portanto não é possível realizar o cancelamento"); + throw new InfraException("O sistema destinat?rio j? iniciou o recebimento desse processo, portanto n?o ? poss?vel realizar o cancelamento"); break; case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: - throw new InfraException("O sistema destinatário já recebeu esse processo, portanto não é possivel realizar o cancelamento"); + throw new InfraException("O sistema destinat?rio j? recebeu esse processo, portanto n?o ? possivel realizar o cancelamento"); break; case ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO: - throw new InfraException("O trâmite externo para esse processo encontra-se recusado."); + throw new InfraException("O tr?mite externo para esse processo encontra-se recusado."); break; } - //Somente solicita cancelamento ao PEN se processo ainda não estiver cancelado + //Somente solicita cancelamento ao PEN se processo ainda n?o estiver cancelado if(!in_array($numSituacaoAtual, array(ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO_AUTOMATICAMENTE, ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO))) { $this->objProcessoEletronicoRN->cancelarTramite($tramite->IDT); } @@ -3207,9 +3206,9 @@ private function necessitaCancelamentoTramiteAnterior($parArrTramitesAnteriores) /** * Recupera lista de tarjas de assinaturas aplicadas ao documento em seu formato HTML * - * Este método foi baseado na implementação presente em AssinaturaRN::montarTarjas. - * Devido a estrutura interna do SEI, não existe uma forma de reaproveitar as regras de montagem de tarjas - * de forma individual, restando como última alternativa a reprodução das regras até que esta seja encapsulado pelo core do SEI + * Este m?todo foi baseado na implementa??o presente em AssinaturaRN::montarTarjas. + * Devido a estrutura interna do SEI, n?o existe uma forma de reaproveitar as regras de montagem de tarjas + * de forma individual, restando como ?ltima alternativa a reprodu??o das regras at? que esta seja encapsulado pelo core do SEI * * @param DocumentoDTO $objDocumentoDTO * @return array @@ -3246,7 +3245,7 @@ protected function listarTarjasHTMLConectado(DocumentoDTO $objDocumentoDTO) { foreach ($arrObjAssinaturaDTO as $objAssinaturaDTO) { if (!isset($arrObjTarjaAssinaturaDTO[$objAssinaturaDTO->getNumIdTarjaAssinatura()])) { - throw new InfraException('Tarja associada com a assinatura "' . $objAssinaturaDTO->getNumIdAssinatura() . '" não encontrada.'); + throw new InfraException('Tarja associada com a assinatura "' . $objAssinaturaDTO->getNumIdAssinatura() . '" n?o encontrada.'); } $objTarjaAutenticacaoDTOAplicavel = $arrObjTarjaAssinaturaDTO[$objAssinaturaDTO->getNumIdTarjaAssinatura()]; From 024e065b6722f8035964bbbc32493fc5a05d722d Mon Sep 17 00:00:00 2001 From: Mauro W R Costa Date: Tue, 7 Feb 2023 12:24:43 -0300 Subject: [PATCH 04/19] =?UTF-8?q?feat:=20melhoria=20na=20mensagem=20de=20a?= =?UTF-8?q?ltera=C3=A7=C3=A3o=20de=20ordem=20de=20documentos=20do=20proces?= =?UTF-8?q?so?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rn/ExpedirProcedimentoRN.php | 1 + src/rn/ProcessoEletronicoRN.php | 34 ++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/rn/ExpedirProcedimentoRN.php b/src/rn/ExpedirProcedimentoRN.php index 64e5951de..6b1666816 100755 --- a/src/rn/ExpedirProcedimentoRN.php +++ b/src/rn/ExpedirProcedimentoRN.php @@ -217,6 +217,7 @@ protected function expedirProcedimentoControlado(ExpedirProcedimentoDTO $objExpe $param->novoTramiteDeProcesso = new stdClass(); $param->novoTramiteDeProcesso->cabecalho = $objCabecalho; $param->novoTramiteDeProcesso->processo = $objProcesso; + $param->dblIdProcedimento = $dblIdProcedimento; $novoTramite = $this->objProcessoEletronicoRN->enviarProcesso($param); $numIdTramite = $novoTramite->dadosTramiteDeProcessoCriado->IDT; diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index bc5b62c05..4c93bc373 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -558,8 +558,8 @@ public function enviarProcesso($parametros) $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - if (strstr(strtolower($detalhes), "hash de ao menos um componente digital não confere")) { - $this->validarMudancaOrdemDocumentos($parametros->objProcedimentoDTO, $detalhes); + if (strpos(strtolower($strMensagem), "hash de ao menos um componente digital não confere")) { + $strMensagem = $this->validarMudancaOrdemDocumentos($parametros->dblIdProcedimento, $strMensagem); } throw new InfraException($strMensagem, $e, $strDetalhes); } catch (\Exception $e) { @@ -569,22 +569,39 @@ public function enviarProcesso($parametros) } } - private function validarMudancaOrdemDocumentos($objProcedimentoDTO, $strMensagem) + private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem) { + $objMetadadosProcessoTramiteAnterior = null; //Busca metadados do processo registrado em trâmite anterior - $objMetadadosProcessoTramiteAnterior = $this->consultarMetadadosPEN($objProcedimentoDTO->getDblIdProcedimento()); + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->setNumIdProcedimento($dblIdProcedimento); + $objTramiteDTO->setStrStaTipoTramite(ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO); + $objTramiteDTO->setOrd('IdTramite', InfraDTO::$TIPO_ORDENACAO_DESC); + $objTramiteDTO->setNumMaxRegistrosRetorno(1); + $objTramiteDTO->retNumIdTramite(); + + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTO); + if(isset($objTramiteDTO)) { + $parNumIdentificacaoTramite = $objTramiteDTO->getNumIdTramite(); + $objRetorno = $this->solicitarMetadados($parNumIdentificacaoTramite); + + if(isset($objRetorno)){ + $objMetadadosProcessoTramiteAnterior = $objRetorno->metadados; + } + } //Construção do cabeçalho para envio do processo $objProcessoEletronicoPesquisaDTO = new ProcessoEletronicoDTO(); - $objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($objProcedimentoDTO->getDblIdProcedimento()); + $objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($dblIdProcedimento); $objUltimoTramiteRecebidoDTO = $this->consultarUltimoTramiteRecebido($objProcessoEletronicoPesquisaDTO); $strNumeroRegistro = isset($objUltimoTramiteRecebidoDTO) ? $objUltimoTramiteRecebidoDTO->getStrNumeroRegistro() : $objMetadadosProcessoTramiteAnterior->NRE; //Cancela trâmite anterior caso este esteja travado em status inconsistente 1 - STA_SITUACAO_TRAMITE_INICIADO - $objTramitesAnteriores = $this->consultarTramitesAnteriores($strNumeroRegistro); + $objTramitesAnteriores = isset($strNumeroRegistro) ? $this->consultarTramites(null, $strNumeroRegistro) : null; if (!is_null(count($objTramitesAnteriores)) && count($objTramitesAnteriores)) { $objAtividadeDTO = new AtividadeDTO(); - $objAtividadeDTO->setDblIdProtocolo($objProcedimentoDTO->getDblIdProcedimento()); + $objAtividadeDTO->setDblIdProtocolo($dblIdProcedimento); $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); $objAtividadeDTO->retNumIdAtividade(); @@ -594,9 +611,10 @@ private function validarMudancaOrdemDocumentos($objProcedimentoDTO, $strMensagem if (!is_null($arrObjAtividadeDTO) && count($arrObjAtividadeDTO)) { $strMensagem = str_replace('hash de ao menos um componente digital não confere', 'a ordem dos documentos foram modificadas na árvore do processo', $strMensagem); - throw new InfraException($strMensagem); } } + + return $strMensagem; } public function listarPendencias($bolTodasPendencias) From 46c343a00743288b884d7852ac81b05c7e47a4f0 Mon Sep 17 00:00:00 2001 From: Mauro W R Costa Date: Mon, 20 Feb 2023 12:56:09 -0300 Subject: [PATCH 05/19] =?UTF-8?q?feat:=20melhoria=20de=20c=C3=B3digo=20par?= =?UTF-8?q?a=20melhoria=20da=20mensagem=20para=20altera=C3=A7=C3=A3o=20na?= =?UTF-8?q?=20ordem=20de=20documentos=20do=20processo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rn/ProcessoEletronicoRN.php | 50 +++++++++++---------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 4c93bc373..ae786f1b5 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -571,46 +571,30 @@ public function enviarProcesso($parametros) private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem) { - $objMetadadosProcessoTramiteAnterior = null; - //Busca metadados do processo registrado em trâmite anterior - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->setNumIdProcedimento($dblIdProcedimento); - $objTramiteDTO->setStrStaTipoTramite(ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO); - $objTramiteDTO->setOrd('IdTramite', InfraDTO::$TIPO_ORDENACAO_DESC); - $objTramiteDTO->setNumMaxRegistrosRetorno(1); - $objTramiteDTO->retNumIdTramite(); - - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTO); - if(isset($objTramiteDTO)) { - $parNumIdentificacaoTramite = $objTramiteDTO->getNumIdTramite(); - $objRetorno = $this->solicitarMetadados($parNumIdentificacaoTramite); - - if(isset($objRetorno)){ - $objMetadadosProcessoTramiteAnterior = $objRetorno->metadados; - } - } - - //Construção do cabeçalho para envio do processo - $objProcessoEletronicoPesquisaDTO = new ProcessoEletronicoDTO(); - $objProcessoEletronicoPesquisaDTO->setDblIdProcedimento($dblIdProcedimento); - $objUltimoTramiteRecebidoDTO = $this->consultarUltimoTramiteRecebido($objProcessoEletronicoPesquisaDTO); - $strNumeroRegistro = isset($objUltimoTramiteRecebidoDTO) ? $objUltimoTramiteRecebidoDTO->getStrNumeroRegistro() : $objMetadadosProcessoTramiteAnterior->NRE; - - //Cancela trâmite anterior caso este esteja travado em status inconsistente 1 - STA_SITUACAO_TRAMITE_INICIADO - $objTramitesAnteriores = isset($strNumeroRegistro) ? $this->consultarTramites(null, $strNumeroRegistro) : null; - if (!is_null(count($objTramitesAnteriores)) && count($objTramitesAnteriores)) { + $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); + $objProcessoEletronicoDTO->setDblIdProcedimento($dblIdProcedimento); + + $objProcessoEletronicoRN = new ProcessoEletronicoRN(); + $objUltimoTramiteDTO = $objProcessoEletronicoRN->consultarUltimoTramite($objProcessoEletronicoDTO); + $numIdTramite = $objUltimoTramiteDTO->getNumIdTramite(); + + if (!is_null($numIdTramite) && $numIdTramite > 0) { $objAtividadeDTO = new AtividadeDTO(); $objAtividadeDTO->setDblIdProtocolo($dblIdProcedimento); $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); $objAtividadeDTO->retNumIdAtividade(); $objAtividadeDTO->retDblIdProcedimentoProtocolo(); - $objAtividadeBD = new AtividadeBD(BancoSEI::getInstance()); - $arrObjAtividadeDTO = $objAtividadeBD->listar($objAtividadeDTO); - if (!is_null($arrObjAtividadeDTO) && count($arrObjAtividadeDTO)) { - $strMensagem = str_replace('hash de ao menos um componente digital não confere', 'a ordem dos documentos foram modificadas na árvore do processo', $strMensagem); + $objAtividadeRN = new AtividadeRN(); + $arrObjAtividadeDTO = $objAtividadeRN->contarRN0035($objAtividadeDTO); + + if ($arrObjAtividadeDTO > 0) { + $strMensagem = str_replace( + 'hash de ao menos um componente digital não confere', + ' Possivelmente a falha ocorreu devido a mundaça de ordem do documento na árvore do processo.', + $strMensagem + ); } } From 1ab9aa01f4f0ace8144ea91f095bd489a45b2034 Mon Sep 17 00:00:00 2001 From: Michael Oliveira Ferreira Date: Sat, 22 Apr 2023 22:54:02 -0300 Subject: [PATCH 06/19] feat: complementacao da mensagem de indicacao de ordem do documento --- src/rn/ProcessoEletronicoRN.php | 4397 ++++++++++++++++--------------- 1 file changed, 2207 insertions(+), 2190 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index ae786f1b5..381c7b383 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -1,2190 +1,2207 @@ - "Formato de componente digital não suportado", - "02" => "Componente digital corrompido", - "03" => "Falta de componentes digitais", - "04" => "Espécie documental não mapeada no destinatário", - "99" => "Outro" - ); - - private $objPenWs; - private $strEnderecoWebService; - private $options; - private $numTentativasErro; - private $strComumXSD; - private $strLocalCert; - private $strLocalCertPassword; - - public function __construct() - { - $objConfiguracaoModPEN = ConfiguracaoModPEN::getInstance(); - $strEnderecoWebService = $objConfiguracaoModPEN->getValor("PEN", "WebService"); - $strLocalizacaoCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "LocalizacaoCertificado"); - $strSenhaCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "SenhaCertificado"); - $numTentativasErro = $objConfiguracaoModPEN->getValor("PEN", "NumeroTentativasErro"); - $numTentativasErro = (is_numeric($numTentativasErro)) ? intval($numTentativasErro) : self::WS_TENTATIVAS_RECONEXAO; - - - - $this->strEnderecoWebService = $strEnderecoWebService; - $this->strComumXSD = $this->strEnderecoWebService . '?xsd=comum.xsd'; - $this->strLocalCert = $strLocalizacaoCertificadoDigital; - $this->strLocalCertPassword = $strSenhaCertificadoDigital; - $this->numTentativasErro = $numTentativasErro; - - $this->options = array( - 'soap_version' => SOAP_1_1 - , 'local_cert' => $this->strLocalCert - , 'passphrase' => $this->strLocalCertPassword - , 'resolve_wsdl_remote_includes' => true - , 'connection_timeout' => self::WS_TIMEOUT_CONEXAO - , 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP - , 'encoding' => 'UTF-8' - , 'attachment_type' => BeSimple\SoapCommon\Helper::ATTACHMENTS_TYPE_MTOM - , 'ssl' => array( - 'allow_self_signed' => true, - ) - ); - } - - - protected function inicializarObjInfraIBanco() - { - return BancoSEI::getInstance(); - } - - - /** - * Construtor do objeto SoapClien utilizado para comunicação Webservice SOAP - * - * @return void - */ - private function getObjPenWs() - { - if($this->objPenWs == null) { - - if (InfraString::isBolVazia($this->strEnderecoWebService)) { - throw new InfraException('Endereço do serviço de integração do Processo Eletrônico Nacional (PEN) não informado.'); - } - - if (InfraString::isBolVazia($this->strLocalCertPassword)) { - throw new InfraException('Dados de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não informados.'); - } - - $this->validarDisponibilidade(); - - try { - $strWSDL = $this->strEnderecoWebService . '?wsdl'; - $this->objPenWs = new BeSimple\SoapClient\SoapClient($strWSDL, $this->options); - } catch (Exception $e) { - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - $mensagem = "Falha de comunicação com o Processo Eletrônico Nacional: " . $detalhes; - throw new \SoapFault("HTTP", $mensagem); - } - } - - return $this->objPenWs; - } - - - /** - * Consulta a lista de repositório de estruturas disponíveis no Barramento de Serviços do PEN - * - * @param int $numIdentificacaoDoRepositorioDeEstruturas Código de identificação do repositório de estruturas do PEN - * @return void - */ - public function consultarRepositoriosDeEstruturas($numIdentificacaoDoRepositorioDeEstruturas) - { - $objRepositorioDTO = null; - try{ - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura->ativos = false; - - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarRepositoriosDeEstruturas($parametros); - }); - - if(isset($result->repositoriosEncontrados->repositorio)){ - - if(!is_array($result->repositoriosEncontrados->repositorio)) { - $result->repositoriosEncontrados->repositorio = array($result->repositoriosEncontrados->repositorio); - } - - foreach ($result->repositoriosEncontrados->repositorio as $repositorio) { - if($repositorio->id == $numIdentificacaoDoRepositorioDeEstruturas){ - $objRepositorioDTO = new RepositorioDTO(); - $objRepositorioDTO->setNumId($repositorio->id); - $objRepositorioDTO->setStrNome(utf8_decode($repositorio->nome)); - $objRepositorioDTO->setBolAtivo($repositorio->ativo); - } - } - } - } catch(Exception $e){ - $mensagem = "Falha na obtenção dos Repositórios de Estruturas Organizacionais"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - - return $objRepositorioDTO; - } - - /** - * Lista todo os repositórios de estruturas disponíveis no Barramento de Serviços do PEN - * - * @return void - */ - public function listarRepositoriosDeEstruturas() - { - $arrObjRepositorioDTO = array(); - - try{ - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura = new stdClass(); - $parametros->filtroDeConsultaDeRepositoriosDeEstrutura->ativos = true; - - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarRepositoriosDeEstruturas($parametros); - }); - - if(isset($result->repositoriosEncontrados->repositorio)){ - if(!is_array($result->repositoriosEncontrados->repositorio)) { - $result->repositoriosEncontrados->repositorio = array($result->repositoriosEncontrados->repositorio); - } - - foreach ($result->repositoriosEncontrados->repositorio as $repositorio) { - $item = new RepositorioDTO(); - $item->setNumId($repositorio->id); - $item->setStrNome(utf8_decode($repositorio->nome)); - $item->setBolAtivo($repositorio->ativo); - $arrObjRepositorioDTO[] = $item; - } - } - } catch(Exception $e){ - $mensagem = "Falha na obtenção dos Repositórios de Estruturas Organizacionais"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - - return $arrObjRepositorioDTO; - } - - /** - * Método responsável por consultar as estruturas das unidades externas no barramento - * @param $idRepositorioEstrutura - * @param $numeroDeIdentificacaoDaEstrutura - * @param bool $bolRetornoRaw - * @return EstruturaDTO|mixed - * @throws InfraException - */ - public function consultarEstrutura($idRepositorioEstrutura, $numeroDeIdentificacaoDaEstrutura, $bolRetornoRaw=false) - { - try { - - $parametros = new stdClass(); - $parametros->filtroDeEstruturas = new stdClass(); - $parametros->filtroDeEstruturas->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstrutura = $numeroDeIdentificacaoDaEstrutura; - $parametros->filtroDeEstruturas->apenasAtivas = false; - - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarEstruturas($parametros); - }); - - if ($result->estruturasEncontradas->totalDeRegistros == 1) { - $arrObjEstrutura = is_array($result->estruturasEncontradas->estrutura) ? $result->estruturasEncontradas->estrutura : array($result->estruturasEncontradas->estrutura); - $objEstrutura = current($arrObjEstrutura); - - $objEstrutura->nome = utf8_decode($objEstrutura->nome); - $objEstrutura->sigla = utf8_decode($objEstrutura->sigla); - - if ($bolRetornoRaw !== false) { - if (isset($objEstrutura->hierarquia) && isset($objEstrutura->hierarquia->nivel)) { - if (!is_array($objEstrutura->hierarquia->nivel)) { - $objEstrutura->hierarquia->nivel = array($objEstrutura->hierarquia->nivel); - } - - foreach ($objEstrutura->hierarquia->nivel as &$objNivel) { - $objNivel->nome = utf8_decode($objNivel->nome); - } - } - return $objEstrutura; - } - else { - $objEstruturaDTO = new EstruturaDTO(); - $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($objEstrutura->numeroDeIdentificacaoDaEstrutura); - $objEstruturaDTO->setStrNome($objEstrutura->nome); - $objEstruturaDTO->setStrSigla($objEstrutura->sigla); - $objEstruturaDTO->setBolAtivo($objEstrutura->ativo); - $objEstruturaDTO->setBolAptoParaReceberTramites($objEstrutura->aptoParaReceberTramites); - $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($objEstrutura->codigoNoOrgaoEntidade); - return $objEstruturaDTO; - } - } - } - catch (Exception $e) { - $mensagem = "Falha na obtenção de unidades externas"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - /** - * Método responsável por recuperar pela estutura pai a estrutura de filhos de uma unidade - * @param $idRepositorioEstrutura - * @param null $numeroDeIdentificacaoDaEstrutura - * @param bool $bolRetornoRaw - * @return array - * @throws InfraException - */ - public function consultarEstruturasPorEstruturaPai($idRepositorioEstrutura, $numeroDeIdentificacaoDaEstrutura = null, $bolRetornoRaw = false) - { - try { - $parametros = new stdClass(); - $parametros->filtroDeEstruturasPorEstruturaPai = new stdClass(); - $parametros->filtroDeEstruturasPorEstruturaPai->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; - - if(!is_null($numeroDeIdentificacaoDaEstrutura)){ - $parametros->filtroDeEstruturasPorEstruturaPai->numeroDeIdentificacaoDaEstrutura = $numeroDeIdentificacaoDaEstrutura; - } - - $parametros->filtroDeEstruturasPorEstruturaPai->apenasAtivas = true; - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarEstruturasPorEstruturaPai($parametros); - }); - - $estruturasUnidades = is_array($result->estruturasEncontradasNoFiltroPorEstruturaPai->estrutura) ? $result->estruturasEncontradasNoFiltroPorEstruturaPai->estrutura : array($result->estruturasEncontradasNoFiltroPorEstruturaPai->estrutura); - - //Cria um array com os nomes da unidades para realizar a ordenação das mesmas - $nomesUnidades = []; - foreach ($estruturasUnidades as $estrutura) { - $nomesUnidades[] = $estrutura->nome; - } - - //Ordena as unidades pelo nome - array_multisort($nomesUnidades, SORT_ASC, $estruturasUnidades); - - return $estruturasUnidades; - } - catch (Exception $e) { - $mensagem = "Falha na obtenção de unidades externas"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public function listarEstruturas($idRepositorioEstrutura, $nome='', $numeroDeIdentificacaoDaEstruturaRaizDaConsulta = null, - $nomeUnidade=null, $siglaUnidade=null, $offset=null, $registrosPorPagina=null, $parBolPermiteRecebimento=null, $parBolPermiteEnvio=null) - { - $arrObjEstruturaDTO = array(); - - try{ - $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); - if(!$idRepositorioEstrutura) { - throw new InfraException("Repositório de Estruturas inválido"); - } - - $parametros = new stdClass(); - $parametros->filtroDeEstruturas = new stdClass(); - $parametros->filtroDeEstruturas->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; - $parametros->filtroDeEstruturas->apenasAtivas = true; - - if(!is_null($numeroDeIdentificacaoDaEstruturaRaizDaConsulta)){ - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstruturaRaizDaConsulta = $numeroDeIdentificacaoDaEstruturaRaizDaConsulta; - }else{ - $nome = trim($nome); - if(is_numeric($nome)) { - $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstrutura = intval($nome); - } else { - $parametros->filtroDeEstruturas->nome = utf8_encode($nome); - } - } - - if(!is_null($siglaUnidade)){ - $parametros->filtroDeEstruturas->sigla = $siglaUnidade; - } - - if(!is_null($nomeUnidade)){ - $parametros->filtroDeEstruturas->nome = utf8_encode($nomeUnidade); - } - - if(!is_null($registrosPorPagina) && !is_null($offset)){ - $parametros->filtroDeEstruturas->paginacao = new stdClass(); - $parametros->filtroDeEstruturas->paginacao->registroInicial = $offset; - $parametros->filtroDeEstruturas->paginacao->quantidadeDeRegistros = $registrosPorPagina; - } - - if(!is_null($parBolPermiteRecebimento) && $parBolPermiteRecebimento === true){ - $parametros->filtroDeEstruturas->permiteRecebimento = true; - } - - if(!is_null($parBolPermiteEnvio) && $parBolPermiteEnvio === true){ - $parametros->filtroDeEstruturas->permiteEnvio = true; - } - - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarEstruturas($parametros); - }); - - if($result->estruturasEncontradas->totalDeRegistros > 0) { - - if(!is_array($result->estruturasEncontradas->estrutura)) { - $result->estruturasEncontradas->estrutura = array($result->estruturasEncontradas->estrutura); - } - - foreach ($result->estruturasEncontradas->estrutura as $estrutura) { - $item = new EstruturaDTO(); - $item->setNumNumeroDeIdentificacaoDaEstrutura($estrutura->numeroDeIdentificacaoDaEstrutura); - $item->setStrNome(utf8_decode($estrutura->nome)); - $item->setStrSigla(utf8_decode($estrutura->sigla)); - $item->setBolAtivo($estrutura->ativo); - $item->setBolAptoParaReceberTramites($estrutura->aptoParaReceberTramites); - $item->setStrCodigoNoOrgaoEntidade($estrutura->codigoNoOrgaoEntidade); - $item->setNumTotalDeRegistros($result->estruturasEncontradas->totalDeRegistros); - - if(!empty($estrutura->hierarquia->nivel)) { - $array = array(); - foreach($estrutura->hierarquia->nivel as $nivel) { - $array[] = utf8_decode($nivel->sigla); - } - $item->setArrHierarquia($array); - } - - $arrObjEstruturaDTO[] = $item; - } - } - - } catch (Exception $e) { - $mensagem = "Falha na obtenção de unidades externas"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - - return $arrObjEstruturaDTO; - } - - public function consultarMotivosUrgencia() - { - $curl = curl_init($this->strComumXSD); - - try{ - curl_setopt($curl, CURLOPT_URL, $this->strComumXSD); - curl_setopt($curl, CURLOPT_HEADER, false); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - - if(!ConfiguracaoSEI::getInstance()->getValor('SEI', 'Producao')){ - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); - } - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert); - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword); - - $output = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($curl) { - return curl_exec($curl); - }); - - $dom = new DOMDocument; - $dom->loadXML($output); - - $xpath = new DOMXPath($dom); - - $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI); - $xpath->registerNamespace('x', $rootNamespace); - $entries = $xpath->query('/x:schema/x:simpleType[@name="motivoDaUrgencia"]/x:restriction/x:enumeration'); - - $resultado = array(); - foreach ($entries as $entry) { - $valor = $entry->getAttribute('value'); - $documentationNode = $xpath->query('x:annotation/x:documentation', $entry); - $descricao = $documentationNode->item(0)->nodeValue; - $resultado[$valor] = utf8_decode($descricao); - } - } finally{ - curl_close($curl); - } - - return $resultado; - } - - - /** - * Busca as espécies documentais aceitas pelo Barramento de Serviços do PEN - * - * As espécies aceitas estão registradas no WSDL do serviço e são obtidas a partir de análise deste descritor do serviço - * - * @return array - */ - public function consultarEspeciesDocumentais() - { - $curl = curl_init($this->strComumXSD); - - try{ - curl_setopt($curl, CURLOPT_URL, $this->strComumXSD); - curl_setopt($curl, CURLOPT_HEADER, 0); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - - if(!ConfiguracaoSEI::getInstance()->getValor('SEI', 'Producao')){ - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); - } - curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert); - curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword); - - $output = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($curl) { - return curl_exec($curl); - }); - - $dom = new DOMDocument; - $dom->loadXML($output); - - $xpath = new DOMXPath($dom); - $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI); - $xpath->registerNamespace('x', $rootNamespace); - $entries = $xpath->query('/x:schema/x:complexType[@name="especie"]/x:sequence/x:element[@name="codigo"]/x:simpleType/x:restriction/x:enumeration'); - - $resultado = array(); - foreach ($entries as $entry) { - $valor = $entry->getAttribute('value'); - $documentationNode = $xpath->query('x:annotation/x:documentation', $entry); - $descricao = $documentationNode->item(0)->nodeValue; - $resultado[$valor] = utf8_decode($descricao); - } - } finally{ - curl_close($curl); - } - - return $resultado; - } - - - public function enviarProcesso($parametros) - { - try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->enviarProcesso($parametros); - }); - - } catch (\SoapFault $e) { - $strMensagem = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript(utf8_decode($e->faultstring))); - if ($e instanceof \SoapFault && !empty($e->detail->interoperabilidadeException->codigoErro) && $e->detail->interoperabilidadeException->codigoErro == '0005') { - $strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.'; - } - - $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - if (strpos(strtolower($strMensagem), "hash de ao menos um componente digital não confere")) { - $strMensagem = $this->validarMudancaOrdemDocumentos($parametros->dblIdProcedimento, $strMensagem); - } - throw new InfraException($strMensagem, $e, $strDetalhes); - } catch (\Exception $e) { - $mensagem = "Falha no envio externo do processo. Verifique log de erros do sistema para maiores informações."; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem) - { - $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); - $objProcessoEletronicoDTO->setDblIdProcedimento($dblIdProcedimento); - - $objProcessoEletronicoRN = new ProcessoEletronicoRN(); - $objUltimoTramiteDTO = $objProcessoEletronicoRN->consultarUltimoTramite($objProcessoEletronicoDTO); - $numIdTramite = $objUltimoTramiteDTO->getNumIdTramite(); - - if (!is_null($numIdTramite) && $numIdTramite > 0) { - $objAtividadeDTO = new AtividadeDTO(); - $objAtividadeDTO->setDblIdProtocolo($dblIdProcedimento); - $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); - $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); - $objAtividadeDTO->retNumIdAtividade(); - $objAtividadeDTO->retDblIdProcedimentoProtocolo(); - - $objAtividadeRN = new AtividadeRN(); - $arrObjAtividadeDTO = $objAtividadeRN->contarRN0035($objAtividadeDTO); - - if ($arrObjAtividadeDTO > 0) { - $strMensagem = str_replace( - 'hash de ao menos um componente digital não confere', - ' Possivelmente a falha ocorreu devido a mundaça de ordem do documento na árvore do processo.', - $strMensagem - ); - } - } - - return $strMensagem; - } - - public function listarPendencias($bolTodasPendencias) - { - $arrObjPendenciaDTO = array(); - - try { - $parametros = new stdClass(); - $parametros->filtroDePendencias = new stdClass(); - $parametros->filtroDePendencias->todasAsPendencias = $bolTodasPendencias; - $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->listarPendencias($parametros); - }); - - if(isset($result->listaDePendencias->IDT)){ - if(!is_array($result->listaDePendencias->IDT)) { - $result->listaDePendencias->IDT = array($result->listaDePendencias->IDT); - } - - foreach ($result->listaDePendencias->IDT as $idt) { - $item = new PendenciaDTO(); - $item->setNumIdentificacaoTramite($idt->_); - $item->setStrStatus($idt->status); - $arrObjPendenciaDTO[] = $item; - } - } - } catch (\Exception $e) { - $mensagem = "Falha na listagem de pendências de trâmite de processos"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - - return $arrObjPendenciaDTO; - } - - private function tratarFalhaWebService(Exception $fault) - { - $mensagem = InfraException::inspecionar($fault); - if($fault instanceof SoapFault && isset($fault->detail->interoperabilidadeException)) { - $strWsException = $fault->detail->interoperabilidadeException; - $mensagem = utf8_decode($strWsException->mensagem); - - // Fixação de mensagem de erro para quando já existe um trâmite em andamento - if($strWsException->codigoErro == "0044"){ - $mensagem = 'Processo já possui um trâmite em andamento'; - } - } - - return $mensagem; - } - - public function construirCabecalho($strNumeroRegistro, $idRepositorioOrigem, $idUnidadeOrigem, $idRepositorioDestino, - $idUnidadeDestino, $urgente = false, $motivoUrgencia = 0, $enviarTodosDocumentos = false,$dblIdProcedimento=null) - { - $cabecalho = new stdClass(); - - if(isset($strNumeroRegistro)) { - $cabecalho->NRE = $strNumeroRegistro; - } - - $cabecalho->remetente = new stdClass(); - $cabecalho->remetente->identificacaoDoRepositorioDeEstruturas = $idRepositorioOrigem; - $cabecalho->remetente->numeroDeIdentificacaoDaEstrutura = $idUnidadeOrigem; - - $cabecalho->destinatario = new stdClass(); - $cabecalho->destinatario->identificacaoDoRepositorioDeEstruturas = $idRepositorioDestino; - $cabecalho->destinatario->numeroDeIdentificacaoDaEstrutura = $idUnidadeDestino; - - $cabecalho->urgente = $urgente; - $cabecalho->motivoDaUrgencia = $motivoUrgencia; - $cabecalho->obrigarEnvioDeTodosOsComponentesDigitais = $enviarTodosDocumentos; - - $this->atribuirInformacoesAssunto($cabecalho,$dblIdProcedimento); - $this->atribuirInformacoesModulo($cabecalho); - - return $cabecalho; - } - - private function atribuirInformacoesModulo($objCabecalho) - { - - try{ - - $objInfraParametro = new InfraParametro(BancoSEI::getInstance()); - $arrPropAdicionais=$objCabecalho->propriedadeAdicional; - $arrPropAdicionais[] = new SoapVar("". $objInfraParametro->getValor('VERSAO_MODULO_PEN') . "", XSD_ANYXML); - - $objCabecalho->propriedadeAdicional= $arrPropAdicionais; - - }catch(Exception $e){ - - throw new InfraException($mensagem, $e); - } - - - } - - - private function atribuirInformacoesAssunto($objCabecalho,$dblIdProcedimento) - { - - - try{ - - - if(!isset($dblIdProcedimento)){ - throw new InfraException('Parâmetro $dblIdProcedimento não informado.'); - } - - $objRelProtocoloAssuntoDTO = new RelProtocoloAssuntoDTO(); - $objRelProtocoloAssuntoDTO->setDblIdProtocolo($dblIdProcedimento); - $objRelProtocoloAssuntoDTO->retStrDescricaoAssunto(); - $objRelProtocoloAssuntoDTO->retNumIdAssunto(); - $objRelProtocoloAssuntoDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); - - $objRelProtocoloAssuntoRN = new RelProtocoloAssuntoRN(); - $arrobjRelProtocoloAssuntoDTO = $objRelProtocoloAssuntoRN->listarRN0188($objRelProtocoloAssuntoDTO); - - $arrDadosAssunto = array(); - $contagem=1; - $objProcessoEletronicoRN = new ProcessoEletronicoRN(); - - foreach ($arrobjRelProtocoloAssuntoDTO as $objRelProtocoloAssuntoDTO) { - - $idAssunto = $objRelProtocoloAssuntoDTO->getNumIdAssunto(); - $assuntoDTO = new AssuntoDTO(); - $assuntoDTO->setNumIdAssunto($idAssunto); - $assuntoDTO->retNumPrazoCorrente(); - $assuntoDTO->retNumPrazoIntermediario(); - $assuntoDTO->retStrStaDestinacao(); - $assuntoDTO->retStrObservacao(); - $assuntoDTO->retStrCodigoEstruturado(); - - $objAssuntoRN = new AssuntoRN(); - $infoAssunto = $objAssuntoRN->consultarRN0256($assuntoDTO); - - switch ($infoAssunto->getStrStaDestinacao()) { - case AssuntoRN::$TD_ELIMINACAO: - $destinacao = "Eliminação"; - break; - - case AssuntoRN::$TD_GUARDA_PERMANENTE: - $destinacao = "Guarda Permanente"; - break; - } - - - $valorInput=$objRelProtocoloAssuntoDTO->getStrDescricaoAssunto()?utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($objRelProtocoloAssuntoDTO->getStrDescricaoAssunto()), 10000)):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getStrCodigoEstruturado()?utf8_encode($infoAssunto->getStrCodigoEstruturado()):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getNumPrazoCorrente()? (int) $infoAssunto->getNumPrazoCorrente() :"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getNumPrazoIntermediario()?(int) $infoAssunto->getNumPrazoIntermediario():"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$destinacao?utf8_encode($destinacao):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - $valorInput=$infoAssunto->getStrObservacao()?utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($infoAssunto->getStrObservacao()), 10000)):"NA"; - $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); - - - $contagem++; - } - - $objCabecalho->propriedadeAdicional= $arrDadosAssunto; - - }catch(Exception $e){ - - throw new InfraException($mensagem, $e); - } - - } - - public function enviarComponenteDigital($parametros) - { - try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use (&$parametros) { - return $objPenWs->enviarComponenteDigital($parametros); - }); - } catch (\Exception $e) { - $mensagem = "Falha no envio de componentes digitais"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - - /** - * Método responsável por realizar o envio da parte de um componente digital - * @param $parametros - * @return mixed - * @throws InfraException - */ - public function enviarParteDeComponenteDigital($parametros) - { - try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use (&$parametros) { - return $objPenWs->enviarParteDeComponenteDigital($parametros); - }); - } catch (\Exception $e) { - $mensagem = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e); - } - } - - /** - * Método responsável por sinalizar o término do envio das partes de um componente digital - * @param $parametros - * @return mixed - * @throws InfraException - */ - public function sinalizarTerminoDeEnvioDasPartesDoComponente($parametros) - { - try { - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->sinalizarTerminoDeEnvioDasPartesDoComponente($parametros); - }); - } catch (\Exception $e) { - $mensagem = "Falha em sinalizar o término de envio das partes do componente digital"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public function solicitarMetadados($parNumIdentificacaoTramite) - { - try { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdentificacaoTramite; - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - $objMetadadosProtocolo = $objPenWs->solicitarMetadados($parametros); - $objMetadadosProtocolo->IDT = $parametros->IDT; - return $objMetadadosProtocolo; - }); - } catch (\Exception $e) { - $mensagem = "Falha na solicitação de metadados do processo"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public static function converterDataWebService($dataHoraSEI) - { - $resultado = ''; - if(isset($dataHoraSEI)){ - $resultado = InfraData::getTimestamp($dataHoraSEI); - $resultado = date(DateTime::W3C, $resultado); - } - - return $resultado; - } - - public static function converterDataSEI($dataHoraWebService) - { - $resultado = null; - if(isset($dataHoraWebService)){ - $resultado = strtotime($dataHoraWebService); - $resultado = date('d/m/Y H:i:s', $resultado); - } - - return $resultado; - } - - public static function obterIdTarefaModulo($strIdTarefaModulo) - { - $objTarefaDTO = new TarefaDTO(); - $objTarefaDTO->retNumIdTarefa(); - $objTarefaDTO->setStrIdTarefaModulo($strIdTarefaModulo); - - $objTarefaRN = new TarefaRN(); - $objTarefaDTO = $objTarefaRN->consultar($objTarefaDTO); - - if($objTarefaDTO){ - return $objTarefaDTO->getNumIdTarefa(); - }else{ - return false; - } - } - - public function cadastrarTramiteDeProcesso($parDblIdProcedimento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parStrStaTipoTramite, $parDthRegistroTramite, $parNumIdRepositorioOrigem, - $parNumIdEstruturaOrigem, $parNumIdRepositorioDestino, $parNumIdEstruturaDestino, $parObjProtocolo, $parNumTicketComponentesDigitais = null, $parObjComponentesDigitaisSolicitados = null, $bolSinProcessamentoEmLote = false, $numIdUnidade = null) - { - if(!isset($parDblIdProcedimento) || $parDblIdProcedimento == 0) { - throw new InfraException('Parâmetro $parDblIdProcedimento não informado.'); - } - - if(!isset($parStrNumeroRegistro)) { - throw new InfraException('Parâmetro $parStrNumeroRegistro não informado.'); - } - - if(!isset($parNumIdentificacaoTramite) || $parNumIdentificacaoTramite == 0) { - throw new InfraException('Parâmetro $parStrNumeroRegistro não informado.'); - } - - if(!isset($parStrStaTipoTramite) || !in_array($parStrStaTipoTramite, array(ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO, ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO))) { - throw new InfraException('Parâmetro $parStrStaTipoTramite inválio'); - } - - if(!isset($parNumIdRepositorioOrigem) || $parNumIdRepositorioOrigem == 0) { - throw new InfraException('Parâmetro $parNumIdRepositorioOrigem não informado.'); - } - - if(!isset($parNumIdEstruturaOrigem) || $parNumIdEstruturaOrigem == 0) { - throw new InfraException('Parâmetro $parNumIdEstruturaOrigem não informado.'); - } - - if(!isset($parNumIdRepositorioDestino) || $parNumIdRepositorioDestino == 0) { - throw new InfraException('Parâmetro $parNumIdRepositorioDestino não informado.'); - } - - if(!isset($parNumIdEstruturaDestino) || $parNumIdEstruturaDestino == 0) { - throw new InfraException('Parâmetro $parNumIdEstruturaDestino não informado.'); - } - - if(!isset($parObjProtocolo)) { - throw new InfraException('Parâmetro $objProcesso não informado.'); - } - - //Monta dados do processo eletrônico - $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); - $objProcessoEletronicoDTO->setStrNumeroRegistro($parStrNumeroRegistro); - $objProcessoEletronicoDTO->setDblIdProcedimento($parDblIdProcedimento); - $objProcessoEletronicoDTO->setStrStaTipoProtocolo($parObjProtocolo->staTipoProtocolo); - - //Montar dados dos procedimentos apensados - if(isset($parObjProtocolo->processoApensado)){ - if(!is_array($parObjProtocolo->processoApensado)){ - $parObjProtocolo->processoApensado = array($parObjProtocolo->processoApensado); - } - - $arrObjRelProcessoEletronicoApensadoDTO = array(); - $objRelProcessoEletronicoApensadoDTO = null; - foreach ($parObjProtocolo->processoApensado as $objProcessoApensado) { - $objRelProcessoEletronicoApensadoDTO = new RelProcessoEletronicoApensadoDTO(); - $objRelProcessoEletronicoApensadoDTO->setStrNumeroRegistro($parStrNumeroRegistro); - $objRelProcessoEletronicoApensadoDTO->setDblIdProcedimentoApensado($objProcessoApensado->idProcedimentoSEI); - $objRelProcessoEletronicoApensadoDTO->setStrProtocolo($objProcessoApensado->protocolo); - $arrObjRelProcessoEletronicoApensadoDTO[] = $objRelProcessoEletronicoApensadoDTO; - } - - $objProcessoEletronicoDTO->setArrObjRelProcessoEletronicoApensado($arrObjRelProcessoEletronicoApensadoDTO); - } - - //Monta dados do trâmite do processo - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->setStrNumeroRegistro($parStrNumeroRegistro); - $objTramiteDTO->setNumIdTramite($parNumIdentificacaoTramite); - $objTramiteDTO->setNumTicketEnvioComponentes($parNumTicketComponentesDigitais); - $objTramiteDTO->setDthRegistro($this->converterDataSEI($parDthRegistroTramite)); - if($bolSinProcessamentoEmLote){ - $objTramiteDTO->setNumIdUnidade($numIdUnidade); - }else{ - $objTramiteDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); - } - $objTramiteDTO->setNumIdUsuario(SessaoSEI::getInstance()->getNumIdUsuario()); - $objTramiteDTO->setNumIdRepositorioOrigem($parNumIdRepositorioOrigem); - $objTramiteDTO->setNumIdEstruturaOrigem($parNumIdEstruturaOrigem); - $objTramiteDTO->setNumIdRepositorioDestino($parNumIdRepositorioDestino); - $objTramiteDTO->setNumIdEstruturaDestino($parNumIdEstruturaDestino); - $objTramiteDTO->setStrStaTipoTramite($parStrStaTipoTramite); - $objProcessoEletronicoDTO->setArrObjTramiteDTO(array($objTramiteDTO)); - - //Monta dados dos componentes digitais - $parObjProtocoloDesmembrado = ProcessoEletronicoRN::desmembrarProcessosAnexados($parObjProtocolo); - $arrObjComponenteDigitalDTO = $this->montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocoloDesmembrado, $parObjComponentesDigitaisSolicitados); - - $objTramiteDTO->setArrObjComponenteDigitalDTO($arrObjComponenteDigitalDTO); - $objProcessoEletronicoDTO = $this->cadastrarTramiteDeProcessoInterno($objProcessoEletronicoDTO); - - return $objProcessoEletronicoDTO; - } - - - - protected function cadastrarTramiteDeProcessoInternoControlado(ProcessoEletronicoDTO $parObjProcessoEletronicoDTO) - { - if(!isset($parObjProcessoEletronicoDTO)) { - throw new InfraException('Parâmetro $parObjProcessoEletronicoDTO não informado.'); - } - - $idProcedimento = $parObjProcessoEletronicoDTO->getDblIdProcedimento(); - - //Registra os dados do processo eletrônico - $objProcessoEletronicoDTOFiltro = new ProcessoEletronicoDTO(); - $objProcessoEletronicoDTOFiltro->setStrNumeroRegistro($parObjProcessoEletronicoDTO->getStrNumeroRegistro()); - $objProcessoEletronicoDTOFiltro->setDblIdProcedimento($parObjProcessoEletronicoDTO->getDblIdProcedimento()); - $objProcessoEletronicoDTOFiltro->setStrStaTipoProtocolo($parObjProcessoEletronicoDTO->getStrStaTipoProtocolo()); - $objProcessoEletronicoDTOFiltro->retStrNumeroRegistro(); - $objProcessoEletronicoDTOFiltro->retDblIdProcedimento(); - $objProcessoEletronicoDTOFiltro->retStrStaTipoProtocolo(); - - $objProcessoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco()); - $objProcessoEletronicoDTO = $objProcessoEletronicoBD->consultar($objProcessoEletronicoDTOFiltro); - - if(empty($objProcessoEletronicoDTO)) { - $objProcessoEletronicoDTO = $objProcessoEletronicoBD->cadastrar($objProcessoEletronicoDTOFiltro); - } - - //Registrar processos apensados - if($parObjProcessoEletronicoDTO->isSetArrObjRelProcessoEletronicoApensado()) { - $objRelProcessoEletronicoApensadoBD = new RelProcessoEletronicoApensadoBD($this->getObjInfraIBanco()); - foreach ($parObjProcessoEletronicoDTO->getArrObjRelProcessoEletronicoApensado() as $objRelProcessoEletronicoApensadoDTOFiltro) { - if($objRelProcessoEletronicoApensadoBD->contar($objRelProcessoEletronicoApensadoDTOFiltro) == 0){ - $objRelProcessoEletronicoApensadoBD->cadastrar($objRelProcessoEletronicoApensadoDTOFiltro); - } - } - } - - //Registrar informações sobre o trâmite do processo - $arrObjTramiteDTO = $parObjProcessoEletronicoDTO->getArrObjTramiteDTO(); - $parObjTramiteDTO = $arrObjTramiteDTO[0]; - - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->retNumIdTramite(); - $objTramiteDTO->setStrNumeroRegistro($parObjTramiteDTO->getStrNumeroRegistro()); - $objTramiteDTO->setNumIdTramite($parObjTramiteDTO->getNumIdTramite()); - - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTO); - - if(empty($objTramiteDTO)) { - $objTramiteDTO = $objTramiteBD->cadastrar($parObjTramiteDTO); - } - - $objProcessoEletronicoDTO->setArrObjTramiteDTO(array($objTramiteDTO)); - - //Registra informações sobre o componente digital do documento - $arrObjComponenteDigitalDTO = array(); - $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); - - $arrObjComponenteDigitalDTO = array(); - foreach ($parObjTramiteDTO->getArrObjComponenteDigitalDTO() as $objComponenteDigitalDTO) { - - //Verifica se o documento foi inserido pelo trâmite atual - if($objComponenteDigitalDTO->getDblIdDocumento() != null){ - $objComponenteDigitalDTO->setDblIdProcedimento($idProcedimento); - $objComponenteDigitalDTOFiltro = new ComponenteDigitalDTO(); - $objComponenteDigitalDTOFiltro->setNumIdTramite($objComponenteDigitalDTO->getNumIdTramite()); - $objComponenteDigitalDTOFiltro->setStrNumeroRegistro($objComponenteDigitalDTO->getStrNumeroRegistro()); - $objComponenteDigitalDTOFiltro->setDblIdProcedimento($objComponenteDigitalDTO->getDblIdProcedimento()); - $objComponenteDigitalDTOFiltro->setDblIdDocumento($objComponenteDigitalDTO->getDblIdDocumento()); - $objComponenteDigitalDTOFiltro->setNumOrdem($objComponenteDigitalDTO->getNumOrdem()); - $objComponenteDigitalDTOFiltro->setNumOrdemDocumento($objComponenteDigitalDTO->getNumOrdemDocumento()); - - if($objComponenteDigitalBD->contar($objComponenteDigitalDTOFiltro) == 0){ - $objComponenteDigitalDTO->setStrTarjaLegada("N"); - $objComponenteDigitalDTO = $objComponenteDigitalBD->cadastrar($objComponenteDigitalDTO); - } - else { - //Verifica se foi setado o envio - if(!$objComponenteDigitalDTO->isSetStrSinEnviar()){ - $objComponenteDigitalDTO->setStrSinEnviar('N'); - } - } - $arrObjComponenteDigitalDTO[] = $objComponenteDigitalDTO; - } - } - - $objTramiteDTO->setArrObjComponenteDigitalDTO($arrObjComponenteDigitalDTO); - return $objProcessoEletronicoDTO; - } - - /** - * Retorna o hash do objecto do solicitarMetadadosResponse - * - * @param object $objMeta tem que ser o componenteDigital->hash - * @return string - */ - public static function getHashFromMetaDados($objMeta) - { - $strHashConteudo = ''; - - if (isset($objMeta)) { - $matches = array(); - $strHashConteudo = (isset($objMeta->enc_value)) ? $objMeta->enc_value : $objMeta->_; - - if (preg_match('/^(.*)<\/hash>$/', $strHashConteudo, $matches, PREG_OFFSET_CAPTURE)) { - $strHashConteudo = $matches[1][0]; - } - } - - return $strHashConteudo; - } - - private function montarDadosMaisDeUmComponenteDigital($objDocumento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados) - { - $arrayComponentesDigitais = $objDocumento->componenteDigital; - $arrObjComponenteDigitalDTO = array(); - $arrayTeste = array(); - $contComponentes = 0; - - foreach ($arrayComponentesDigitais as $indice => $objComponenteDigital){ - $contComponentes++; - $objComponenteDigitalDTO = new ComponenteDigitalDTO(); - $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); - //TODO: Error utilizar idProcedimentoSEI devido processos apensados - $objComponenteDigitalDTO->setDblIdProcedimento($parObjProtocolo->idProcedimentoSEI); - $objComponenteDigitalDTO->setDblIdDocumento($objDocumento->idDocumentoSEI); - $objComponenteDigitalDTO->setNumOrdemDocumento($objDocumento->ordem); - $objComponenteDigitalDTO->setNumOrdem($objComponenteDigital->ordem); - $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); - $objComponenteDigitalDTO->setStrProtocolo($parObjProtocolo->protocolo); - - if(isset($objDocumento->idProcedimentoAnexadoSEI)){ - $objComponenteDigitalDTO->setDblIdProcedimentoAnexado($objDocumento->idProcedimentoAnexadoSEI); - $objComponenteDigitalDTO->setStrProtocoloProcedimentoAnexado($objDocumento->protocoloDoProcessoAnexado); - $objComponenteDigitalDTO->setNumOrdemDocumentoAnexado($objDocumento->ordemAjustada); - } - - - $objComponenteDigitalDTO->setStrNome($objComponenteDigital->nome); - $strHashConteudo = static::getHashFromMetaDados($objComponenteDigital->hash); - - $objComponenteDigitalDTO->setStrHashConteudo($strHashConteudo); - $objComponenteDigitalDTO->setStrAlgoritmoHash(self::ALGORITMO_HASH_DOCUMENTO); - $objComponenteDigitalDTO->setStrTipoConteudo($objComponenteDigital->tipoDeConteudo); - $objComponenteDigitalDTO->setStrMimeType($objComponenteDigital->mimeType); - $objComponenteDigitalDTO->setStrDadosComplementares($objComponenteDigital->dadosComplementaresDoTipoDeArquivo); - - //Registrar componente digital necessita ser enviado pelo trâmite específico //TODO: Teste $parObjComponentesDigitaisSolicitados aqui - if(isset($parObjComponentesDigitaisSolicitados)){ - $arrObjItensSolicitados = is_array($parObjComponentesDigitaisSolicitados->processo) ? $parObjComponentesDigitaisSolicitados->processo : array($parObjComponentesDigitaisSolicitados->processo); - - foreach ($arrObjItensSolicitados as $objItemSolicitado) { - if(!is_null($objItemSolicitado)){ - $objItemSolicitado->hash = is_array($objItemSolicitado->hash) ? $objItemSolicitado->hash : array($objItemSolicitado->hash); - - if($objItemSolicitado->protocolo == $objComponenteDigitalDTO->getStrProtocolo() && in_array($strHashConteudo, $objItemSolicitado->hash) && !$objDocumento->retirado) { - $objComponenteDigitalDTO->setStrSinEnviar("S"); - } - } - } - } - - //TODO: Avaliar dados do tamanho do documento em bytes salvo na base de dados - $objComponenteDigitalDTO->setNumTamanho($objComponenteDigital->tamanhoEmBytes); - $objComponenteDigitalDTO->setNumIdAnexo($objComponenteDigital->idAnexo); - - array_push($arrObjComponenteDigitalDTO, $objComponenteDigitalDTO); - } - - return $arrObjComponenteDigitalDTO; - } - - - private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados) - { - //Monta dados dos componentes digitais - $arrObjComponenteDigitalDTO = array(); - $arrObjDocumento = self::obterDocumentosProtocolo($parObjProtocolo, true); - - $arrObjComponenteDigitalDTOAux = array(); - foreach ($arrObjDocumento as $objDocumento) { - $quantidadeDeComponentesDigitais = count($objDocumento->componenteDigital); - if($quantidadeDeComponentesDigitais > 1){ - $arrObjComponenteDigitalDTOAux = self::montarDadosMaisDeUmComponenteDigital($objDocumento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados); - }else{ - $objComponenteDigitalDTO = new ComponenteDigitalDTO(); - $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); - //TODO: Error utilizar idProcedimentoSEI devido processos apensados - $objComponenteDigitalDTO->setDblIdProcedimento($parObjProtocolo->idProcedimentoSEI); - $objComponenteDigitalDTO->setDblIdDocumento($objDocumento->idDocumentoSEI); - $objComponenteDigitalDTO->setNumOrdemDocumento($objDocumento->ordem); - $objComponenteDigitalDTO->setNumOrdem(1); - $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); - $objComponenteDigitalDTO->setStrProtocolo($parObjProtocolo->protocolo); - - if(isset($objDocumento->ordemDoDocumentoReferenciado)){ - $objComponenteDigitalDTO->setNumOrdemDocumentoReferenciado(intval($objDocumento->ordemDoDocumentoReferenciado)); - } - - if(isset($objDocumento->idProcedimentoAnexadoSEI)){ - $objComponenteDigitalDTO->setDblIdProcedimentoAnexado($objDocumento->idProcedimentoAnexadoSEI); - $objComponenteDigitalDTO->setStrProtocoloProcedimentoAnexado($objDocumento->protocoloDoProcessoAnexado); - $objComponenteDigitalDTO->setNumOrdemDocumentoAnexado($objDocumento->ordemAjustada); - } - - //Por enquanto, considera que o documento possui apenas um componente digital - if(is_array($objDocumento->componenteDigital) && count($objDocumento->componenteDigital) != 1) { - throw new InfraException("Erro processando componentes digitais do processo " . $parObjProtocolo->protocolo . "\n Somente é permitido o recebimento de documentos com apenas um Componente Digital."); - } - - $objComponenteDigital = is_array($objDocumento->componenteDigital) ? $objDocumento->componenteDigital[0] : $objDocumento->componenteDigital; - $objComponenteDigitalDTO->setStrNome(utf8_decode($objComponenteDigital->nome)); - - if(isset($objDocumento->especie)){ - $objComponenteDigitalDTO->setNumCodigoEspecie(intval($objDocumento->especie->codigo)); - $objComponenteDigitalDTO->setStrNomeEspecieProdutor(utf8_decode($objDocumento->especie->nomeNoProdutor)); - } - - $strHashConteudo = static::getHashFromMetaDados($objComponenteDigital->hash); - $objComponenteDigitalDTO->setStrHashConteudo($strHashConteudo); - $objComponenteDigitalDTO->setStrAlgoritmoHash(self::ALGORITMO_HASH_DOCUMENTO); - $objComponenteDigitalDTO->setStrTipoConteudo($objComponenteDigital->tipoDeConteudo); - $objComponenteDigitalDTO->setStrMimeType($objComponenteDigital->mimeType); - $objComponenteDigitalDTO->setStrDadosComplementares($objComponenteDigital->dadosComplementaresDoTipoDeArquivo); - - //Registrar componente digital necessita ser enviado pelo trâmite específico //TODO: Teste $parObjComponentesDigitaisSolicitados aqui - if(isset($parObjComponentesDigitaisSolicitados)){ - $arrObjItensSolicitados = is_array($parObjComponentesDigitaisSolicitados->processo) ? $parObjComponentesDigitaisSolicitados->processo : array($parObjComponentesDigitaisSolicitados->processo); - foreach ($arrObjItensSolicitados as $objItemSolicitado) { - if(!is_null($objItemSolicitado)){ - $objItemSolicitado->hash = is_array($objItemSolicitado->hash) ? $objItemSolicitado->hash : array($objItemSolicitado->hash); - - if($objItemSolicitado->protocolo == $objComponenteDigitalDTO->getStrProtocolo() && in_array($strHashConteudo, $objItemSolicitado->hash) && !$objDocumento->retirado) { - $objComponenteDigitalDTO->setStrSinEnviar("S"); - } - } - } - } - - //TODO: Avaliar dados do tamanho do documento em bytes salvo na base de dados - $objComponenteDigitalDTO->setNumTamanho($objComponenteDigital->tamanhoEmBytes); - - $objComponenteDigitalDTO->setNumIdAnexo($objComponenteDigital->idAnexo); - $arrObjComponenteDigitalDTO[] = $objComponenteDigitalDTO; - } - $arrObjComponenteDigitalDTO = array_merge($arrObjComponenteDigitalDTOAux, $arrObjComponenteDigitalDTO); - } - - //Chamada recursiva sobre os documentos dos processos apensados - if(isset($parObjProtocolo->processoApensado) && count($parObjProtocolo->processoApensado)) { - foreach ($parObjProtocolo->processoApensado as $objProcessoApensado) { - $arrObj = $this->montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $objProcessoApensado, $parObjComponentesDigitaisSolicitados); - $arrObjComponenteDigitalDTO = array_merge($arrObjComponenteDigitalDTO, $arrObj); - } - } - return $arrObjComponenteDigitalDTO; - } - - public function receberComponenteDigital($parNumIdentificacaoTramite, $parStrHashComponenteDigital, $parStrProtocolo, $parObjParteComponente=null) - { - try - { - $parametros = new stdClass(); - $parametros->parametrosParaRecebimentoDeComponenteDigital = new stdClass(); - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital = new stdClass(); - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->IDT = $parNumIdentificacaoTramite; - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->protocolo = $parStrProtocolo; - $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->hashDoComponenteDigital = $parStrHashComponenteDigital; - - //Se for passado o parametro $parObjParteComponente retorna apenas parte especifica do componente digital - if(!is_null($parObjParteComponente)){ - $parametros->parametrosParaRecebimentoDeComponenteDigital->parte = $parObjParteComponente; - } - - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->receberComponenteDigital($parametros); - }); - } catch (\SoapFault $fault) { - $mensagem = $this->tratarFalhaWebService($fault); - throw new InfraException(InfraString::formatarJavaScript($mensagem), $fault); - } catch (\Exception $e) { - throw new InfraException("Error Processing Request", $e); - } - } - - public function consultarTramites($parNumIdTramite = null, $parNumeroRegistro = null, $parNumeroUnidadeRemetente = null, $parNumeroUnidadeDestino = null, $parProtocolo = null, $parNumeroRepositorioEstruturas = null) - { - try - { - $arrObjTramite = array(); - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeTramites = new stdClass(); - $parametros->filtroDeConsultaDeTramites->IDT = $parNumIdTramite; - - if(!is_null($parNumeroRegistro)){ - $parametros->filtroDeConsultaDeTramites->NRE = $parNumeroRegistro; - } - - if(!is_null($parNumeroUnidadeRemetente) && !is_null($parNumeroRepositorioEstruturas)){ - $parametros->filtroDeConsultaDeTramites->remetente = new stdClass(); - $parametros->filtroDeConsultaDeTramites->remetente->identificacaoDoRepositorioDeEstruturas = $parNumeroRepositorioEstruturas; - $parametros->filtroDeConsultaDeTramites->remetente->numeroDeIdentificacaoDaEstrutura = $parNumeroUnidadeRemetente; - } - - if(!is_null($parNumeroUnidadeDestino) && !is_null($parNumeroRepositorioEstruturas)){ - $parametros->filtroDeConsultaDeTramites->destinatario = new stdClass(); - $parametros->filtroDeConsultaDeTramites->destinatario->identificacaoDoRepositorioDeEstruturas = $parNumeroRepositorioEstruturas; - $parametros->filtroDeConsultaDeTramites->destinatario->numeroDeIdentificacaoDaEstrutura = $parNumeroUnidadeDestino; - } - - if(!is_null($parProtocolo)){ - $parametros->filtroDeConsultaDeTramites->protocolo = $parProtocolo; - } - - $objTramitesEncontrados = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarTramites($parametros); - }); - - if(isset($objTramitesEncontrados->tramitesEncontrados) && isset($objTramitesEncontrados->tramitesEncontrados->tramite)) { - $arrObjTramite = $objTramitesEncontrados->tramitesEncontrados->tramite; - if(!is_array($arrObjTramite)) { - $arrObjTramite = array($objTramitesEncontrados->tramitesEncontrados->tramite); - } - } - - return $arrObjTramite; - - } catch (\Exception $e) { - $mensagem = "Falha na consulta de trâmites de processo"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public function consultarTramitesProtocolo($parProtocoloFormatado) - { - try - { - $arrObjTramite = array(); - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeTramites = new stdClass(); - $parametros->filtroDeConsultaDeTramites->protocolo = $parProtocoloFormatado; - - $objTramitesEncontrados = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarTramites($parametros); - }); - - if(isset($objTramitesEncontrados->tramitesEncontrados)) { - - $arrObjTramite = $objTramitesEncontrados->tramitesEncontrados->tramite; - if(!is_array($arrObjTramite)) { - $arrObjTramite = array($objTramitesEncontrados->tramitesEncontrados->tramite); - } - } - - return $arrObjTramite; - } catch (\Exception $e) { - $mensagem = "Falha na consulta de trâmites de processo"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public function cienciaRecusa($parNumIdTramite) - { - try - { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdTramite; - //return $this->getObjPenWs()->cienciaRecusa($parametro); - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->cienciaRecusa($parametros); - }); - } catch (\Exception $e) { - $mensagem = "Falha no registro de ciência da recusa de trâmite"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - /** - * Retorna o estado atual do procedimento no api-pen - * - * @param integer $dblIdProcedimento - * @param integer $numIdRepositorio - * @param integer $numIdEstrutura - * @return integer - */ - public function consultarEstadoProcedimento($strProtocoloFormatado = '', $numIdRepositorio = null, $numIdEstrutura = null) - { - $objBD = new GenericoBD($this->inicializarObjInfraIBanco()); - - $objProtocoloDTO = new ProtocoloDTO(); - $objProtocoloDTO->setStrProtocoloFormatado($strProtocoloFormatado); - $objProtocoloDTO->setNumMaxRegistrosRetorno(1); - $objProtocoloDTO->retDblIdProtocolo(); - $objProtocoloDTO->retStrProtocoloFormatado(); - $objProtocoloDTO->retStrStaEstado(); - - $objProtocoloDTO = $objBD->consultar($objProtocoloDTO); - - if (empty($objProtocoloDTO)) { - throw new InfraException(utf8_encode(sprintf('Nenhum procedimento foi encontrado com o id %s', $strProtocoloFormatado))); - } - - if ($objProtocoloDTO->getStrStaEstado() != ProtocoloRn::$TE_PROCEDIMENTO_BLOQUEADO) { - throw new InfraException(utf8_encode('O processo não esta com o estado com "Em Processamento" ou "Bloqueado"')); - } - - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->retDblIdProtocolo()); - $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); - $objTramiteDTO->setNumMaxRegistrosRetorno(1); - $objTramiteDTO->retNumIdTramite(); - - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); - - if(!$arrObjTramiteDTO){ - throw new InfraException('Trâmite não encontrado'); - } - - $objTramiteDTO = $arrObjTramiteDTO[0]; - - $objFiltro = new stdClass(); - $objFiltro->filtroDeConsultaDeTramites = new stdClass(); - $objFiltro->filtroDeConsultaDeTramites->IDT = $objTramiteDTO->getNumIdTramite(); - - $objResultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($objFiltro) { - return $objPenWs->consultarTramites($objFiltro); - }); - - $objTramitesEncontrados = $objResultado->tramitesEncontrados; - - if (empty($objTramitesEncontrados) || !isset($objTramitesEncontrados->tramite)) { - throw new InfraException(utf8_encode(sprintf('Nenhum tramite foi encontrado para o procedimento %s', $strProtocoloFormatado))); - } - - if(!is_array($objTramitesEncontrados->tramite)){ - $objTramitesEncontrados->tramite = array($objTramitesEncontrados->tramite); - } - - $arrObjTramite = (array) $objTramitesEncontrados->tramite; - - $objTramite = array_pop($arrObjTramite); - - if (empty($numIdRepositorio)) { - $objPenParametroRN = new PenParametroRN(); - $numIdRepositorio = $objPenParametroRN->getParametro('PEN_ID_REPOSITORIO_ORIGEM'); - } - - if (empty($numIdEstrutura)) { - $objPenUnidadeDTO = new PenUnidadeDTO(); - $objPenUnidadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); - $objPenUnidadeDTO->retNumIdUnidadeRH(); - $objPenUnidadeDTO = $objBD->consultar($objPenUnidadeDTO); - - if (empty($objPenUnidadeDTO)) { - throw new InfraException(utf8_encode('Número da Unidade RH não foi encontrado')); - } - - $numIdEstrutura = $objPenUnidadeDTO->getNumIdUnidadeRH(); - } - - if ($objTramite->remetente->numeroDeIdentificacaoDaEstrutura != $numIdEstrutura || - $objTramite->remetente->identificacaoDoRepositorioDeEstruturas != $numIdRepositorio) { - throw new InfraException(utf8_encode('O último trâmite desse processo não pertence a esse órgão')); - } - - switch ($objTramite->situacaoAtual) { - case static::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO: - $objReceberReciboTramiteRN = new ReceberReciboTramiteRN(); - $objReceberReciboTramiteRN->receberReciboDeTramite($objTramite->IDT); - break; - - case static::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: - throw new InfraException(utf8_encode('O trâmite externo deste processo já foi concluído')); - break; - - default: - $objAtividadeDTO = new AtividadeDTO(); - $objAtividadeDTO->setDblIdProtocolo($objProtocoloDTO->getDblIdProtocolo()); - $objAtividadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); - $objAtividadeDTO->setNumIdUsuario(SessaoSEI::getInstance()->getNumIdUsuario()); - $objAtividadeDTO->setNumIdTarefa(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_ABORTADO); - $objAtividadeDTO->setArrObjAtributoAndamentoDTO(array()); - - $objAtividadeRN = new AtividadeRN(); - $objAtividadeRN->gerarInternaRN0727($objAtividadeDTO); - - $objProtocoloDTO->setStrStaEstado(ProtocoloRN::$TE_NORMAL); - $objBD->alterar($objProtocoloDTO); - - if($objTramite->situacaoAtual == static::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO && $objTramite->situacaoAtual == static::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO){ - $this->cancelarTramite($objTramite->IDT); - } - - return PenConsoleRN::format(sprintf('Processo %s foi atualizado com sucesso', $objProtocoloDTO->getStrProtocoloFormatado()), 'blue'); - } - } - - public function enviarReciboDeTramite($parNumIdTramite, $parDthRecebimento, $parStrReciboTramite) - { - try - { - $strHashAssinatura = null; - $objPrivatekey = openssl_pkey_get_private("file://".$this->strLocalCert, $this->strLocalCertPassword); - - if ($objPrivatekey === FALSE) { - throw new InfraException("Erro ao obter chave privada do certificado digital."); - } - - openssl_sign($parStrReciboTramite, $strHashAssinatura, $objPrivatekey, 'sha256'); - $strHashDaAssinaturaBase64 = base64_encode($strHashAssinatura); - - $parametros = new stdClass(); - $parametros->dadosDoReciboDeTramite = new stdClass(); - $parametros->dadosDoReciboDeTramite->IDT = $parNumIdTramite; - $parametros->dadosDoReciboDeTramite->dataDeRecebimento = $parDthRecebimento; - $parametros->dadosDoReciboDeTramite->hashDaAssinatura = $strHashDaAssinaturaBase64; - - $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->enviarReciboDeTramite($parametros); - }); - - return $strHashDaAssinaturaBase64; - - } catch (\Exception $e) { - $mensagem = "Falha no envio de recibo de trâmite de processo"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } finally { - if(isset($objPrivatekey)){ - openssl_free_key($objPrivatekey); - } - } - } - - public function receberReciboDeTramite($parNumIdTramite) - { - try { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdTramite; - //$resultado = $this->getObjPenWs()->receberReciboDeTramite($parametros); - return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->receberReciboDeTramite($parametros); - }); - - } catch (\Exception $e) { - $mensagem = "Falha no recebimento de recibo de trâmite"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - /** - * Retorna um objeto DTO do recibo de envio do processo ao barramento - * - * @param int $parNumIdTramite - * @return ReciboTramiteEnviadoDTO - */ - public function receberReciboDeEnvio($parNumIdTramite) - { - try { - $parametros = new stdClass(); - $parametros->IDT = $parNumIdTramite; - $resultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->receberReciboDeEnvio($parametros); - }); - - return $resultado->conteudoDoReciboDeEnvio; - } - catch (\Exception $e) { - $mensagem = "Falha no recebimento de recibo de trâmite"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public function converterOperacaoDTO($objOperacaoPEN) - { - if(!isset($objOperacaoPEN)) { - throw new InfraException('Parâmetro $objOperacaoPEN não informado.'); - } - - $objOperacaoDTO = new OperacaoDTO(); - $objOperacaoDTO->setStrCodigo(utf8_decode($objOperacaoPEN->codigo)); - $objOperacaoDTO->setStrComplemento(utf8_decode($objOperacaoPEN->complemento)); - $objOperacaoDTO->setDthOperacao($this->converterDataSEI($objOperacaoPEN->dataHora)); - - $strIdPessoa = ($objOperacaoPEN->pessoa->numeroDeIdentificacao) ?: null; - $objOperacaoDTO->setStrIdentificacaoPessoaOrigem(utf8_decode($strIdPessoa)); - - $strNomePessoa = ($objOperacaoPEN->pessoa->nome) ?: null; - $objOperacaoDTO->setStrNomePessoaOrigem(utf8_decode($strNomePessoa)); - - switch ($objOperacaoPEN->codigo) { - case "01": $objOperacaoDTO->setStrNome("Registro"); break; - case "02": $objOperacaoDTO->setStrNome("Envio de documento avulso/processo"); break; - case "03": $objOperacaoDTO->setStrNome("Cancelamento/exclusão ou envio de documento"); break; - case "04": $objOperacaoDTO->setStrNome("Recebimento de documento"); break; - case "05": $objOperacaoDTO->setStrNome("Autuação"); break; - case "06": $objOperacaoDTO->setStrNome("Juntada por anexação"); break; - case "07": $objOperacaoDTO->setStrNome("Juntada por apensação"); break; - case "08": $objOperacaoDTO->setStrNome("Desapensação"); break; - case "09": $objOperacaoDTO->setStrNome("Arquivamento"); break; - case "10": $objOperacaoDTO->setStrNome("Arquivamento no Arquivo Nacional"); break; - case "11": $objOperacaoDTO->setStrNome("Eliminação"); break; - case "12": $objOperacaoDTO->setStrNome("Sinistro"); break; - case "13": $objOperacaoDTO->setStrNome("Reconstituição de processo"); break; - case "14": $objOperacaoDTO->setStrNome("Desarquivamento"); break; - case "15": $objOperacaoDTO->setStrNome("Desmembramento"); break; - case "16": $objOperacaoDTO->setStrNome("Desentranhamento"); break; - case "17": $objOperacaoDTO->setStrNome("Encerramento/abertura de volume no processo"); break; - case "18": $objOperacaoDTO->setStrNome("Registro de extravio"); break; - default: $objOperacaoDTO->setStrNome("Registro"); break; - } - - return $objOperacaoDTO; - } - - public function obterCodigoOperacaoPENMapeado($numIdTarefa) - { - $strCodigoOperacao = self::$OP_OPERACAO_REGISTRO; - if(isset($numIdTarefa) && $numIdTarefa != 0) { - $objRelTarefaOperacaoDTO = new RelTarefaOperacaoDTO(); - $objRelTarefaOperacaoDTO->retStrCodigoOperacao(); - $objRelTarefaOperacaoDTO->setNumIdTarefa($numIdTarefa); - - $objRelTarefaOperacaoBD = new RelTarefaOperacaoBD(BancoSEI::getInstance()); - $objRelTarefaOperacaoDTO = $objRelTarefaOperacaoBD->consultar($objRelTarefaOperacaoDTO); - - if($objRelTarefaOperacaoDTO != null) { - $strCodigoOperacao = $objRelTarefaOperacaoDTO->getStrCodigoOperacao(); - } - } - - return $strCodigoOperacao; - } - - public function obterIdTarefaSEIMapeado($strCodigoOperacao) - { - return self::$TI_PROCESSO_ELETRONICO_PROCESSO_TRAMITE_EXTERNO; - } - - - /** - * Cancela um tramite externo de um procedimento para outra unidade, gera - * falha caso a unidade de destino já tenha começado a receber o procedimento. - * - * @param type $idTramite - * @param type $idProtocolo - * @throws Exception|InfraException - * @return null - */ - public function cancelarTramite($idTramite) - { - $parametros = new stdClass(); - $parametros->IDT = $idTramite; - - try{ - $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->cancelarEnvioDeTramite($parametros); - }); - } - catch(\Exception $e) { - $mensagem = "Falha no cancelamento de trâmite de processo"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - /** - * Método que faz a recusa de um trâmite - * - * @param integer $idTramite - * @param string $justificativa - * @param integer $motivo - * @return mixed - * @throws InfraException - */ - public function recusarTramite($idTramite, $justificativa, $motivo) - { - try { - $objProcessoEletronicoRN = new ProcessoEletronicoRN(); - $parametros = new stdClass(); - $parametros->recusaDeTramite = new stdClass(); - $parametros->recusaDeTramite->IDT = $idTramite; - $parametros->recusaDeTramite->justificativa = utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto($justificativa, 1000)); - $parametros->recusaDeTramite->motivo = $motivo; - - $resultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->recusarTramite($parametros); - }); - - } catch (Exception $e) { - $mensagem = "Falha na recusa de trâmite de processo"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public function cadastrarTramitePendente($numIdentificacaoTramite, $idAtividadeExpedicao) - { - try { - $tramitePendenteDTO = new TramitePendenteDTO(); - $tramitePendenteDTO->setNumIdTramite($numIdentificacaoTramite); - $tramitePendenteDTO->setNumIdAtividade($idAtividadeExpedicao); - $tramitePendenteBD = new TramitePendenteBD($this->getObjInfraIBanco()); - $tramitePendenteBD->cadastrar($tramitePendenteDTO); - } catch (\Exception $e) { - $mensagem = "Falha no cadastramento de trâmite pendente"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - public function isDisponivelCancelarTramite($strProtocolo = '') - { - //Obtem o id_rh que representa a unidade no barramento - $objPenParametroRN = new PenParametroRN(); - $numIdRespositorio = $objPenParametroRN->getParametro('PEN_ID_REPOSITORIO_ORIGEM'); - - //Obtem os dados da unidade - $objPenUnidadeDTO = new PenUnidadeDTO(); - $objPenUnidadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); - $objPenUnidadeDTO->retNumIdUnidadeRH(); - - $objGenericoBD = new GenericoBD($this->inicializarObjInfraIBanco()); - $objPenUnidadeDTO = $objGenericoBD->consultar($objPenUnidadeDTO); - - //Obtem os dados do último trâmite desse processo no barramento - $objProtocoloDTO = new ProtocoloDTO(); - $objProtocoloDTO->setStrProtocoloFormatado($strProtocolo); - $objProtocoloDTO->retDblIdProtocolo(); - - $objProtocoloRN = new ProtocoloRN(); - $objProtocoloDTO = $objProtocoloRN->consultarRN0186($objProtocoloDTO); - - $objTramiteDTO = new TramiteDTO(); - $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->retDblIdProtocolo()); - $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); - $objTramiteDTO->setNumMaxRegistrosRetorno(1); - $objTramiteDTO->retNumIdTramite(); - - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); - - if(!$arrObjTramiteDTO){ - return false; - } - - $objTramiteDTO = $arrObjTramiteDTO[0]; - - try { - $parametros = new stdClass(); - $parametros->filtroDeConsultaDeTramites = new stdClass(); - $parametros->filtroDeConsultaDeTramites->IDT = $objTramiteDTO->getNumIdTramite(); - $parametros->filtroDeConsultaDeTramites->remetente = new stdClass(); - $parametros->filtroDeConsultaDeTramites->remetente->identificacaoDoRepositorioDeEstruturas = $numIdRespositorio; - $parametros->filtroDeConsultaDeTramites->remetente->numeroDeIdentificacaoDaEstrutura = $objPenUnidadeDTO->getNumIdUnidadeRH(); - - $objMeta = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { - return $objPenWs->consultarTramites($parametros); - }); - - if($objMeta->tramitesEncontrados) { - $arrObjMetaTramite = !is_array($objMeta->tramitesEncontrados->tramite) ? array($objMeta->tramitesEncontrados->tramite) : $objMeta->tramitesEncontrados->tramite; - $objMetaTramite = $arrObjMetaTramite[0]; - - $strSituacoesDisponíveisCancelamento = array( - static::$STA_SITUACAO_TRAMITE_INICIADO, static::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE, - static::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO, static::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO - ); - - if(in_array($objMetaTramite->situacaoAtual, $strSituacoesDisponíveisCancelamento)){ - return true; - } - } - - return false; - } - catch(SoapFault $e) { - return false; - } - catch(Exception $e) { - return false; - } - } - - public function consultarHipotesesLegais() { - try{ - $hipoteses = $this->tentarNovamenteSobErroHTTP(function($objPenWs) { - return $objPenWs->consultarHipotesesLegais(); - }); - - if (empty($hipoteses)) { - return []; - } - return $hipoteses; - - } catch(Exception $e){ - $mensagem = "Falha na obtenção de hipóteses legais"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - protected function contarConectado(ProcessoEletronicoDTO $objProcessoEletronicoDTO) - { - try { - $objProcessoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco()); - return $objProcessoEletronicoBD->contar($objProcessoEletronicoDTO); - }catch(Exception $e){ - $mensagem = "Falha na contagem de processos eletrônicos registrados"; - $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); - throw new InfraException($mensagem, $e, $detalhes); - } - } - - private function tentarNovamenteSobErroHTTP($callback, $numTentativa=1) - { - try { - return $callback($this->getObjPenWs()); - } catch (\SoapFault $fault) { - if(in_array($fault->faultcode, array("HTTP", "WSDL")) && $this->numTentativasErro >= $numTentativa){ - sleep(self::WS_ESPERA_RECONEXAO); - return $this->tentarNovamenteSobErroHTTP($callback, ++$numTentativa); - } else { - throw $fault; - } - } - } - - public static function desbloquearProcesso($parDblIdProcedimento) - { - try{ - $objEntradaDesbloquearProcessoAPI = new EntradaDesbloquearProcessoAPI(); - $objEntradaDesbloquearProcessoAPI->setIdProcedimento($parDblIdProcedimento); - - $objSeiRN = new SeiRN(); - $objSeiRN->desbloquearProcesso($objEntradaDesbloquearProcessoAPI); - } catch (InfraException $e) { - throw new ProcessoNaoPodeSerDesbloqueadoException("Erro ao desbloquear processo", 1, $e); - } - } - - public static function comparacaoOrdemAjustadaDocumentos($parDocumento1, $parDocumento2) - { - $numOrdemDocumento1 = isset($parDocumento1->ordemAjustada) ? intval($parDocumento1->ordemAjustada) : intval($parDocumento1->ordem); - $numOrdemDocumento2 = isset($parDocumento2->ordemAjustada) ? intval($parDocumento2->ordemAjustada) : intval($parDocumento2->ordem); - return $numOrdemDocumento1 - $numOrdemDocumento2; - } - - public static function comparacaoOrdemDocumentos($parDocumento1, $parDocumento2) - { - $numOrdemDocumento1 = intval($parDocumento1->ordem); - $numOrdemDocumento2 = intval($parDocumento2->ordem); - return $numOrdemDocumento1 - $numOrdemDocumento2; - } - - public static function comparacaoOrdemComponenteDigitais($parComponenteDigital1, $parComponenteDigital2) - { - $numOrdemComponenteDigital1 = intval($parComponenteDigital1->ordem); - $numOrdemComponenteDigital2 = intval($parComponenteDigital2->ordem); - return $numOrdemComponenteDigital1 - $numOrdemComponenteDigital2; - } - - public static function obterDocumentosProtocolo($parObjProtocolo, $parBolExtrairAnexados=false) - { - $arrObjDocumento = array(); - if(isset($parObjProtocolo->documento)){ - $arrObjProtocolo = is_array($parObjProtocolo->documento) ? $parObjProtocolo->documento : array($parObjProtocolo->documento); - usort($arrObjProtocolo, array("ProcessoEletronicoRN", "comparacaoOrdemAjustadaDocumentos")); - - //Tratamento recursivo para processos anexados - foreach ($arrObjProtocolo as $objProtocolo) { - $bolEhProcessoAnexado = $objProtocolo->staTipoProtocolo == ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_PROCESSO; - if($parBolExtrairAnexados && $bolEhProcessoAnexado){ - $arrProtocolosAnexados = ProcessoEletronicoRN::obterDocumentosProtocolo($objProtocolo, $parBolExtrairAnexados); - $arrObjDocumento = array_merge($arrObjDocumento, $arrProtocolosAnexados); - } else { - if(!$bolEhProcessoAnexado){ - $objProtocolo->idProcedimentoSEI = $parObjProtocolo->idProcedimentoSEI; - } - - $objProtocolo->idProtocoloSEI = ($bolEhProcessoAnexado) ? $objProtocolo->idProcedimentoSEI : $objProtocolo->idDocumentoSEI; - $arrObjDocumento[] = $objProtocolo; - } - } - } else { - //Quando se tratar de um Documento Avulso, a ordem será sempre 1 - $parObjProtocolo->ordem = 1; - $parObjProtocolo->ordemAjustada = 1; - $parObjProtocolo->componenteDigital = self::obterComponentesDocumentos($parObjProtocolo); - return array($parObjProtocolo); - } - - if($parBolExtrairAnexados){ - usort($arrObjDocumento, array("ProcessoEletronicoRN", "comparacaoOrdemDocumentos")); - } - - $arrObjDocumentoPadronizados = ($parBolExtrairAnexados) ? $arrObjDocumento : $arrObjProtocolo; - - foreach ($arrObjDocumentoPadronizados as $objDocumento) { - $objDocumento->componenteDigital = self::obterComponentesDocumentos($objDocumento); - } - - return $arrObjDocumentoPadronizados; - } - - - public static function obterComponentesDocumentos($parObjDocumento) - { - $arrObjComponenteDigital=array(); - if(isset($parObjDocumento->componenteDigital)){ - - $arrObjComponenteDigital = is_array($parObjDocumento->componenteDigital) ? $parObjDocumento->componenteDigital : array($parObjDocumento->componenteDigital); - usort($arrObjComponenteDigital, array("ProcessoEletronicoRN", "comparacaoOrdemComponenteDigitais")); - } - - - return $arrObjComponenteDigital; - - } - - /** - * Retorna a referência para o processo ou documento avulso - * - * @param stdclass $parobjMetadadosProcedimento - * @return Mixed Protocolo representado um processo ou um documento avulso - */ - public static function obterProtocoloDosMetadados($parobjMetadadosProcedimento) - { - $objProcesso = $parobjMetadadosProcedimento->metadados->processo; - $objDocumento = $parobjMetadadosProcedimento->metadados->documento; - $objProtocolo = isset($objProcesso) ? $objProcesso : $objDocumento; - - //Caso seja processo receberá em staTipoProtocolo P e caso seja documento avulso receberá D - $objProtocolo->staTipoProtocolo = isset($objProcesso) ? ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_PROCESSO : ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_DOCUMENTO_AVULSO; - - return $objProtocolo; - } - - /** - * Busca a unidade ao qual o processo foi anteriormente expedido. - * Caso seja o primeiro trâmite, considera a unidade atual - * - * @return integer Id da unidade - */ - public static function obterUnidadeParaRegistroDocumento($parDblIdProcedimento) - { - $objAtividadeDTO = new AtividadeDTO(); - $objAtividadeDTO->setStrIdTarefaModuloTarefa(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_EXPEDIDO); - $objAtividadeDTO->setDblIdProcedimentoProtocolo($parDblIdProcedimento); - $objAtividadeDTO->setOrd('Conclusao', InfraDTO::$TIPO_ORDENACAO_DESC); - $objAtividadeDTO->setNumMaxRegistrosRetorno(1); - $objAtividadeDTO->retNumIdUnidade(); - - $objAtividadeRN = new AtividadeRN(); - $arrObjAtividadeDTO = $objAtividadeRN->listarRN0036($objAtividadeDTO); - $numIdUnidade = SessaoSEI::getInstance()->getNumIdUnidadeAtual(); - - if(!empty($arrObjAtividadeDTO)){ - $objAtividadeDTO = $arrObjAtividadeDTO[0]; - $numIdUnidade = $objAtividadeDTO->getNumIdUnidade(); - } - - return $numIdUnidade; - } - - /** - * Método responsável por obter os componentes digitais do documento - * @param $parObjDocumento - * @return array - */ - public static function obterComponentesDigitaisDocumento($parObjDocumento) - { - $arrObjComponenteDigital = array(); - if(isset($parObjDocumento->componenteDigital)){ - $arrObjComponenteDigital = is_array($parObjDocumento->componenteDigital) ? $parObjDocumento->componenteDigital : array($parObjDocumento->componenteDigital); - } - - return $arrObjComponenteDigital; - } - - - /** - * Método responsável pelo desmembramento de processos anexados - * - * Método responsável por desmembrar os metadados do processo recebido caso ele possua outros processos anexados - * O desmembramento é necessário para que o processo possa ser recriado na mesma estrutura original, ou seja, em vários - * processos diferentes, um anexado ao outro - * - * @param object $parObjProtocolo - * - * @return $objProtocolo - */ - public static function desmembrarProcessosAnexados($parObjProtocolo) - { - if(!ProcessoEletronicoRN::existeProcessoAnexado($parObjProtocolo)){ - return $parObjProtocolo; - } - - $arrObjRefProcessosAnexados = array(); - $objProcessoPrincipal = clone $parObjProtocolo; - $objProcessoPrincipal->documento = array(); - $arrObjDocumentosOrdenados = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo, true); - usort($arrObjDocumentosOrdenados, array("ProcessoEletronicoRN", "comparacaoOrdemDocumentos")); - - // Agrupamento dos documentos por processo - foreach ($arrObjDocumentosOrdenados as $objDocumento) { - $bolDocumentoAnexado = ProcessoEletronicoRN::documentoFoiAnexado($parObjProtocolo, $objDocumento); - $strProtocoloProcAnexado = ($bolDocumentoAnexado) ? $objDocumento->protocoloDoProcessoAnexado : $objProcessoPrincipal->protocolo; - - // Cria uma nova presentação para o processo anexado identico ao processo principal - // As informações do processo anexado não são consideradas pois não existem metadados no modelo do PEN, - // existe apenas o número do protocolo de referência - if($bolDocumentoAnexado && !array_key_exists($strProtocoloProcAnexado, $arrObjRefProcessosAnexados)){ - $objProcessoAnexado = clone $objProcessoPrincipal; - $objProcessoAnexado->documento = array(); - $objProcessoAnexado->protocolo = $strProtocoloProcAnexado; - $objProcessoAnexado->ordemAjustada = count($objProcessoPrincipal->documento) + 1; - $objProcessoPrincipal->documento[] = $objProcessoAnexado; - $arrObjRefProcessosAnexados[$strProtocoloProcAnexado] = $objProcessoAnexado; - } - - $objProcessoDoDocumento = ($bolDocumentoAnexado) ? $arrObjRefProcessosAnexados[$strProtocoloProcAnexado] : $objProcessoPrincipal; - $objDocumentoReposicionado = clone $objDocumento; - $objDocumentoReposicionado->ordemAjustada = count($objProcessoDoDocumento->documento) + 1; - $objProcessoDoDocumento->documento[] = $objDocumentoReposicionado; - } - - return $objProcessoPrincipal; - } - - /** - * Identifica se o protocolo recebido possui outros processos anexados - * - * @param stdClass $parObjProtocolo - * @return bool - */ - public static function existeProcessoAnexado($parObjProtocolo) - { - $arrObjDocumentos = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo, true); - - // Verifica se existe algum processo anexado, retornando a referência original do processo caso não exista - $bolExisteProcessoAnexado = array_reduce($arrObjDocumentos, function($bolExiste, $objDoc) { - return $bolExiste || ProcessoEletronicoRN::documentoFoiAnexado($parObjProtocolo, $objDoc); - }); - - return $bolExisteProcessoAnexado; - } - - /** - * Identifica se um determinado documento recebido pelo PEN originou-se de uma anexação de processos - * - * @return bool - */ - private static function documentoFoiAnexado($parObjProtocolo, $parObjDocumento) - { - return ( - isset($parObjDocumento->protocoloDoProcessoAnexado) && - !empty($parObjDocumento->protocoloDoProcessoAnexado) && - $parObjProtocolo->protocolo != $parObjDocumento->protocoloDoProcessoAnexado - ); - } - - /** - * Testa a disponibilidade do Barramento de Serviços do PEN - * - * @return bool - */ - public function validarDisponibilidade() - { - try { - $objVerificadorInstalacaoRN = new VerificadorInstalacaoRN(); - $objVerificadorInstalacaoRN->verificarConexaoBarramentoPEN(); - } catch (\Exception $e) { - throw new InfraException("Falha de comunicação com o Processo Eletrônico Nacional. Por favor, tente novamente mais tarde."); - } - } - - /** - * Recupera os dados do último trâmite de recebimento válido realizado para determinado número de processo eletrônico - * - * @param ProcessoEletronicoDTO $parObjProcessoEletronicoDTO - * @return void - */ - protected function consultarUltimoTramiteRecebidoConectado(ProcessoEletronicoDTO $parObjProcessoEletronicoDTO) - { - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - return $objTramiteBD->consultarUltimoTramite($parObjProcessoEletronicoDTO, ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO); - } - - /** - * Recupera os dados do último trâmite válido realizado para determinado número de processo eletrônico - * - * @param ProcessoEletronicoDTO $parObjProcessoEletronicoDTO - * @return void - */ - protected function consultarUltimoTramiteConectado(ProcessoEletronicoDTO $parObjProcessoEletronicoDTO) - { - $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); - return $objTramiteBD->consultarUltimoTramite($parObjProcessoEletronicoDTO); - } - - - /** - * Lista componentes digitais de determinado trâmite - * - * @param TramiteDTO $parObjTramiteDTO - * @return void - */ - protected function listarComponentesDigitaisConectado(TramiteDTO $parObjTramiteDTO, $dblIdDocumento=null) - { - $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); - return $objComponenteDigitalBD->listarComponentesDigitaisPeloTramite($parObjTramiteDTO->getNumIdTramite(), $dblIdDocumento); - } - - /** - * Verifica a existência de algum documento contendo outro referenciado no próprio processo - * - * @param TramiteDTO $parObjTramiteDTO - * @return void - */ - protected function possuiComponentesComDocumentoReferenciadoConectado(TramiteDTO $parObjTramiteDTO) - { - $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); - return $objComponenteDigitalBD->possuiComponentesComDocumentoReferenciado($parObjTramiteDTO); - } - - /** - * Aplica redução do texto de uma propriedade do modelo de dados, adicionando reticências ao final da string - * - * @param str $parStrTexto Texto a ser reduzido pela função - * @param int $parNumTamanho Tamanho do texto para redução - * @return void - */ - public function reduzirCampoTexto($parStrTexto, $parNumTamanho) - { - $strTexto = $parStrTexto; - if(!is_null($parStrTexto) && strlen($parStrTexto) > $parNumTamanho){ - $strReticencias = ' ...'; - $numTamanhoMaximoPalavra = 20; - - $strTexto = trim(substr($parStrTexto, 0, $parNumTamanho)); - $arrStrTokens = explode(' ', $strTexto); - $strUltimaPalavra = $arrStrTokens[count($arrStrTokens) - 1]; - - $numTamanhoUltimaPalavra = strlen($strUltimaPalavra) > $numTamanhoMaximoPalavra ? strlen($strReticencias) : strlen($strUltimaPalavra); - $numTamanhoUltimaPalavra = $numTamanhoUltimaPalavra < strlen($strReticencias) ? strlen($strReticencias) : $numTamanhoUltimaPalavra; - $strTexto = substr($strTexto, 0, strlen($strTexto) - $numTamanhoUltimaPalavra); - $strTexto = trim($strTexto) . $strReticencias; - } - - return $strTexto; - } - - /** - * Recupera a lista de todos os documentos do processo, principal ou anexados, mantendo a ordem correta entre eles e indicando qual - * sua atual associação com o processo - * - * @param Num $idProcedimento - * @param Num parDblIdDocumento Filtro de dados de associação de um documento específico - * @return array Lista de Ids dos documentos do processo em ordem - */ - public function listarAssociacoesDocumentos($idProcedimento) - { - if(!isset($idProcedimento)){ - throw new InfraException('Parâmetro $idProcedimento não informado.'); - } - - //Recupera toda a lista de documentos vinculados ao processo, considerando a ordenação definida pelo usuário - $arrTipoAssociacao = array( - RelProtocoloProtocoloRN::$TA_DOCUMENTO_ASSOCIADO, RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO, RelProtocoloProtocoloRN::$TA_PROCEDIMENTO_ANEXADO - ); - - $objRelProtocoloProtocoloDTO = new RelProtocoloProtocoloDTO(); - $objRelProtocoloProtocoloDTO->retDblIdRelProtocoloProtocolo(); - $objRelProtocoloProtocoloDTO->retDblIdProtocolo1(); - $objRelProtocoloProtocoloDTO->retDblIdProtocolo2(); - $objRelProtocoloProtocoloDTO->retStrStaAssociacao(); - $objRelProtocoloProtocoloDTO->setStrStaAssociacao($arrTipoAssociacao, InfraDTO::$OPER_IN); - $objRelProtocoloProtocoloDTO->setDblIdProtocolo1($idProcedimento); - $objRelProtocoloProtocoloDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); - - $objRelProtocoloProtocoloRN = new RelProtocoloProtocoloRN(); - $arrObjRelProtocoloProtocoloDTO = $objRelProtocoloProtocoloRN->listarRN0187($objRelProtocoloProtocoloDTO); - - $arrIdDocumentos = array(); - foreach($arrObjRelProtocoloProtocoloDTO as $objRelProtocoloProtocoloDTO) { - if (in_array($objRelProtocoloProtocoloDTO->getStrStaAssociacao(), [RelProtocoloProtocoloRN::$TA_DOCUMENTO_ASSOCIADO, RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO])) { - // Adiciona documentos em ordem presentes diretamente ao processo - $arrIdDocumentos[] = array("IdProtocolo" => $objRelProtocoloProtocoloDTO->getDblIdProtocolo2(), "StaAssociacao" => $objRelProtocoloProtocoloDTO->getStrStaAssociacao()); - } elseif($objRelProtocoloProtocoloDTO->getStrStaAssociacao() == RelProtocoloProtocoloRN::$TA_PROCEDIMENTO_ANEXADO) { - // Adiciona documentos presente no processo anexado, mantendo a ordem de todo o conjunto - $numIdProtocoloAnexado = $objRelProtocoloProtocoloDTO->getDblIdProtocolo2(); - $arrIdDocumentosAnexados = $this->listarAssociacoesDocumentos($numIdProtocoloAnexado); - $arrIdDocumentos = array_merge($arrIdDocumentos, $arrIdDocumentosAnexados); - } - } - return $arrIdDocumentos; - } -} + "Formato de componente digital não suportado", + "02" => "Componente digital corrompido", + "03" => "Falta de componentes digitais", + "04" => "Espécie documental não mapeada no destinatário", + "99" => "Outro" + ); + + private $objPenWs; + private $strEnderecoWebService; + private $options; + private $numTentativasErro; + private $strComumXSD; + private $strLocalCert; + private $strLocalCertPassword; + + public function __construct() + { + $objConfiguracaoModPEN = ConfiguracaoModPEN::getInstance(); + $strEnderecoWebService = $objConfiguracaoModPEN->getValor("PEN", "WebService"); + $strLocalizacaoCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "LocalizacaoCertificado"); + $strSenhaCertificadoDigital = $objConfiguracaoModPEN->getValor("PEN", "SenhaCertificado"); + $numTentativasErro = $objConfiguracaoModPEN->getValor("PEN", "NumeroTentativasErro"); + $numTentativasErro = (is_numeric($numTentativasErro)) ? intval($numTentativasErro) : self::WS_TENTATIVAS_RECONEXAO; + + + + $this->strEnderecoWebService = $strEnderecoWebService; + $this->strComumXSD = $this->strEnderecoWebService . '?xsd=comum.xsd'; + $this->strLocalCert = $strLocalizacaoCertificadoDigital; + $this->strLocalCertPassword = $strSenhaCertificadoDigital; + $this->numTentativasErro = $numTentativasErro; + + $this->options = array( + 'soap_version' => SOAP_1_1 + , 'local_cert' => $this->strLocalCert + , 'passphrase' => $this->strLocalCertPassword + , 'resolve_wsdl_remote_includes' => true + , 'connection_timeout' => self::WS_TIMEOUT_CONEXAO + , 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP + , 'encoding' => 'UTF-8' + , 'attachment_type' => BeSimple\SoapCommon\Helper::ATTACHMENTS_TYPE_MTOM + , 'ssl' => array( + 'allow_self_signed' => true, + ) + ); + } + + + protected function inicializarObjInfraIBanco() + { + return BancoSEI::getInstance(); + } + + + /** + * Construtor do objeto SoapClien utilizado para comunicação Webservice SOAP + * + * @return void + */ + private function getObjPenWs() + { + if($this->objPenWs == null) { + + if (InfraString::isBolVazia($this->strEnderecoWebService)) { + throw new InfraException('Endereço do serviço de integração do Processo Eletrônico Nacional (PEN) não informado.'); + } + + if (InfraString::isBolVazia($this->strLocalCertPassword)) { + throw new InfraException('Dados de autenticação do serviço de integração do Processo Eletrônico Nacional(PEN) não informados.'); + } + + $this->validarDisponibilidade(); + + try { + $strWSDL = $this->strEnderecoWebService . '?wsdl'; + $this->objPenWs = new BeSimple\SoapClient\SoapClient($strWSDL, $this->options); + } catch (Exception $e) { + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + $mensagem = "Falha de comunicação com o Processo Eletrônico Nacional: " . $detalhes; + throw new \SoapFault("HTTP", $mensagem); + } + } + + return $this->objPenWs; + } + + + /** + * Consulta a lista de repositório de estruturas disponíveis no Barramento de Serviços do PEN + * + * @param int $numIdentificacaoDoRepositorioDeEstruturas Código de identificação do repositório de estruturas do PEN + * @return void + */ + public function consultarRepositoriosDeEstruturas($numIdentificacaoDoRepositorioDeEstruturas) + { + $objRepositorioDTO = null; + try{ + $parametros = new stdClass(); + $parametros->filtroDeConsultaDeRepositoriosDeEstrutura = new stdClass(); + $parametros->filtroDeConsultaDeRepositoriosDeEstrutura->ativos = false; + + $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarRepositoriosDeEstruturas($parametros); + }); + + if(isset($result->repositoriosEncontrados->repositorio)){ + + if(!is_array($result->repositoriosEncontrados->repositorio)) { + $result->repositoriosEncontrados->repositorio = array($result->repositoriosEncontrados->repositorio); + } + + foreach ($result->repositoriosEncontrados->repositorio as $repositorio) { + if($repositorio->id == $numIdentificacaoDoRepositorioDeEstruturas){ + $objRepositorioDTO = new RepositorioDTO(); + $objRepositorioDTO->setNumId($repositorio->id); + $objRepositorioDTO->setStrNome(utf8_decode($repositorio->nome)); + $objRepositorioDTO->setBolAtivo($repositorio->ativo); + } + } + } + } catch(Exception $e){ + $mensagem = "Falha na obtenção dos Repositórios de Estruturas Organizacionais"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + + return $objRepositorioDTO; + } + + /** + * Lista todo os repositórios de estruturas disponíveis no Barramento de Serviços do PEN + * + * @return void + */ + public function listarRepositoriosDeEstruturas() + { + $arrObjRepositorioDTO = array(); + + try{ + $parametros = new stdClass(); + $parametros->filtroDeConsultaDeRepositoriosDeEstrutura = new stdClass(); + $parametros->filtroDeConsultaDeRepositoriosDeEstrutura->ativos = true; + + $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarRepositoriosDeEstruturas($parametros); + }); + + if(isset($result->repositoriosEncontrados->repositorio)){ + if(!is_array($result->repositoriosEncontrados->repositorio)) { + $result->repositoriosEncontrados->repositorio = array($result->repositoriosEncontrados->repositorio); + } + + foreach ($result->repositoriosEncontrados->repositorio as $repositorio) { + $item = new RepositorioDTO(); + $item->setNumId($repositorio->id); + $item->setStrNome(utf8_decode($repositorio->nome)); + $item->setBolAtivo($repositorio->ativo); + $arrObjRepositorioDTO[] = $item; + } + } + } catch(Exception $e){ + $mensagem = "Falha na obtenção dos Repositórios de Estruturas Organizacionais"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + + return $arrObjRepositorioDTO; + } + + /** + * Método responsável por consultar as estruturas das unidades externas no barramento + * @param $idRepositorioEstrutura + * @param $numeroDeIdentificacaoDaEstrutura + * @param bool $bolRetornoRaw + * @return EstruturaDTO|mixed + * @throws InfraException + */ + public function consultarEstrutura($idRepositorioEstrutura, $numeroDeIdentificacaoDaEstrutura, $bolRetornoRaw=false) + { + try { + + $parametros = new stdClass(); + $parametros->filtroDeEstruturas = new stdClass(); + $parametros->filtroDeEstruturas->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; + $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstrutura = $numeroDeIdentificacaoDaEstrutura; + $parametros->filtroDeEstruturas->apenasAtivas = false; + + $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarEstruturas($parametros); + }); + + if ($result->estruturasEncontradas->totalDeRegistros == 1) { + $arrObjEstrutura = is_array($result->estruturasEncontradas->estrutura) ? $result->estruturasEncontradas->estrutura : array($result->estruturasEncontradas->estrutura); + $objEstrutura = current($arrObjEstrutura); + + $objEstrutura->nome = utf8_decode($objEstrutura->nome); + $objEstrutura->sigla = utf8_decode($objEstrutura->sigla); + + if ($bolRetornoRaw !== false) { + if (isset($objEstrutura->hierarquia) && isset($objEstrutura->hierarquia->nivel)) { + if (!is_array($objEstrutura->hierarquia->nivel)) { + $objEstrutura->hierarquia->nivel = array($objEstrutura->hierarquia->nivel); + } + + foreach ($objEstrutura->hierarquia->nivel as &$objNivel) { + $objNivel->nome = utf8_decode($objNivel->nome); + } + } + return $objEstrutura; + } + else { + $objEstruturaDTO = new EstruturaDTO(); + $objEstruturaDTO->setNumNumeroDeIdentificacaoDaEstrutura($objEstrutura->numeroDeIdentificacaoDaEstrutura); + $objEstruturaDTO->setStrNome($objEstrutura->nome); + $objEstruturaDTO->setStrSigla($objEstrutura->sigla); + $objEstruturaDTO->setBolAtivo($objEstrutura->ativo); + $objEstruturaDTO->setBolAptoParaReceberTramites($objEstrutura->aptoParaReceberTramites); + $objEstruturaDTO->setStrCodigoNoOrgaoEntidade($objEstrutura->codigoNoOrgaoEntidade); + return $objEstruturaDTO; + } + } + } + catch (Exception $e) { + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + /** + * Método responsável por recuperar pela estutura pai a estrutura de filhos de uma unidade + * @param $idRepositorioEstrutura + * @param null $numeroDeIdentificacaoDaEstrutura + * @param bool $bolRetornoRaw + * @return array + * @throws InfraException + */ + public function consultarEstruturasPorEstruturaPai($idRepositorioEstrutura, $numeroDeIdentificacaoDaEstrutura = null, $bolRetornoRaw = false) + { + try { + $parametros = new stdClass(); + $parametros->filtroDeEstruturasPorEstruturaPai = new stdClass(); + $parametros->filtroDeEstruturasPorEstruturaPai->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; + + if(!is_null($numeroDeIdentificacaoDaEstrutura)){ + $parametros->filtroDeEstruturasPorEstruturaPai->numeroDeIdentificacaoDaEstrutura = $numeroDeIdentificacaoDaEstrutura; + } + + $parametros->filtroDeEstruturasPorEstruturaPai->apenasAtivas = true; + $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarEstruturasPorEstruturaPai($parametros); + }); + + $estruturasUnidades = is_array($result->estruturasEncontradasNoFiltroPorEstruturaPai->estrutura) ? $result->estruturasEncontradasNoFiltroPorEstruturaPai->estrutura : array($result->estruturasEncontradasNoFiltroPorEstruturaPai->estrutura); + + //Cria um array com os nomes da unidades para realizar a ordenação das mesmas + $nomesUnidades = []; + foreach ($estruturasUnidades as $estrutura) { + $nomesUnidades[] = $estrutura->nome; + } + + //Ordena as unidades pelo nome + array_multisort($nomesUnidades, SORT_ASC, $estruturasUnidades); + + return $estruturasUnidades; + } + catch (Exception $e) { + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public function listarEstruturas($idRepositorioEstrutura, $nome='', $numeroDeIdentificacaoDaEstruturaRaizDaConsulta = null, + $nomeUnidade=null, $siglaUnidade=null, $offset=null, $registrosPorPagina=null, $parBolPermiteRecebimento=null, $parBolPermiteEnvio=null) + { + $arrObjEstruturaDTO = array(); + + try{ + $idRepositorioEstrutura = filter_var($idRepositorioEstrutura, FILTER_SANITIZE_NUMBER_INT); + if(!$idRepositorioEstrutura) { + throw new InfraException("Repositório de Estruturas inválido"); + } + + $parametros = new stdClass(); + $parametros->filtroDeEstruturas = new stdClass(); + $parametros->filtroDeEstruturas->identificacaoDoRepositorioDeEstruturas = $idRepositorioEstrutura; + $parametros->filtroDeEstruturas->apenasAtivas = true; + + if(!is_null($numeroDeIdentificacaoDaEstruturaRaizDaConsulta)){ + $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstruturaRaizDaConsulta = $numeroDeIdentificacaoDaEstruturaRaizDaConsulta; + }else{ + $nome = trim($nome); + if(is_numeric($nome)) { + $parametros->filtroDeEstruturas->numeroDeIdentificacaoDaEstrutura = intval($nome); + } else { + $parametros->filtroDeEstruturas->nome = utf8_encode($nome); + } + } + + if(!is_null($siglaUnidade)){ + $parametros->filtroDeEstruturas->sigla = $siglaUnidade; + } + + if(!is_null($nomeUnidade)){ + $parametros->filtroDeEstruturas->nome = utf8_encode($nomeUnidade); + } + + if(!is_null($registrosPorPagina) && !is_null($offset)){ + $parametros->filtroDeEstruturas->paginacao = new stdClass(); + $parametros->filtroDeEstruturas->paginacao->registroInicial = $offset; + $parametros->filtroDeEstruturas->paginacao->quantidadeDeRegistros = $registrosPorPagina; + } + + if(!is_null($parBolPermiteRecebimento) && $parBolPermiteRecebimento === true){ + $parametros->filtroDeEstruturas->permiteRecebimento = true; + } + + if(!is_null($parBolPermiteEnvio) && $parBolPermiteEnvio === true){ + $parametros->filtroDeEstruturas->permiteEnvio = true; + } + + $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarEstruturas($parametros); + }); + + if($result->estruturasEncontradas->totalDeRegistros > 0) { + + if(!is_array($result->estruturasEncontradas->estrutura)) { + $result->estruturasEncontradas->estrutura = array($result->estruturasEncontradas->estrutura); + } + + foreach ($result->estruturasEncontradas->estrutura as $estrutura) { + $item = new EstruturaDTO(); + $item->setNumNumeroDeIdentificacaoDaEstrutura($estrutura->numeroDeIdentificacaoDaEstrutura); + $item->setStrNome(utf8_decode($estrutura->nome)); + $item->setStrSigla(utf8_decode($estrutura->sigla)); + $item->setBolAtivo($estrutura->ativo); + $item->setBolAptoParaReceberTramites($estrutura->aptoParaReceberTramites); + $item->setStrCodigoNoOrgaoEntidade($estrutura->codigoNoOrgaoEntidade); + $item->setNumTotalDeRegistros($result->estruturasEncontradas->totalDeRegistros); + + if(!empty($estrutura->hierarquia->nivel)) { + $array = array(); + foreach($estrutura->hierarquia->nivel as $nivel) { + $array[] = utf8_decode($nivel->sigla); + } + $item->setArrHierarquia($array); + } + + $arrObjEstruturaDTO[] = $item; + } + } + + } catch (Exception $e) { + $mensagem = "Falha na obtenção de unidades externas"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + + return $arrObjEstruturaDTO; + } + + public function consultarMotivosUrgencia() + { + $curl = curl_init($this->strComumXSD); + + try{ + curl_setopt($curl, CURLOPT_URL, $this->strComumXSD); + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + + if(!ConfiguracaoSEI::getInstance()->getValor('SEI', 'Producao')){ + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + } + curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert); + curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword); + + $output = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($curl) { + return curl_exec($curl); + }); + + $dom = new DOMDocument; + $dom->loadXML($output); + + $xpath = new DOMXPath($dom); + + $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI); + $xpath->registerNamespace('x', $rootNamespace); + $entries = $xpath->query('/x:schema/x:simpleType[@name="motivoDaUrgencia"]/x:restriction/x:enumeration'); + + $resultado = array(); + foreach ($entries as $entry) { + $valor = $entry->getAttribute('value'); + $documentationNode = $xpath->query('x:annotation/x:documentation', $entry); + $descricao = $documentationNode->item(0)->nodeValue; + $resultado[$valor] = utf8_decode($descricao); + } + } finally{ + curl_close($curl); + } + + return $resultado; + } + + + /** + * Busca as espécies documentais aceitas pelo Barramento de Serviços do PEN + * + * As espécies aceitas estão registradas no WSDL do serviço e são obtidas a partir de análise deste descritor do serviço + * + * @return array + */ + public function consultarEspeciesDocumentais() + { + $curl = curl_init($this->strComumXSD); + + try{ + curl_setopt($curl, CURLOPT_URL, $this->strComumXSD); + curl_setopt($curl, CURLOPT_HEADER, 0); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + + if(!ConfiguracaoSEI::getInstance()->getValor('SEI', 'Producao')){ + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + } + curl_setopt($curl, CURLOPT_SSLCERT, $this->strLocalCert); + curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->strLocalCertPassword); + + $output = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($curl) { + return curl_exec($curl); + }); + + $dom = new DOMDocument; + $dom->loadXML($output); + + $xpath = new DOMXPath($dom); + $rootNamespace = $dom->lookupNamespaceUri($dom->namespaceURI); + $xpath->registerNamespace('x', $rootNamespace); + $entries = $xpath->query('/x:schema/x:complexType[@name="especie"]/x:sequence/x:element[@name="codigo"]/x:simpleType/x:restriction/x:enumeration'); + + $resultado = array(); + foreach ($entries as $entry) { + $valor = $entry->getAttribute('value'); + $documentationNode = $xpath->query('x:annotation/x:documentation', $entry); + $descricao = $documentationNode->item(0)->nodeValue; + $resultado[$valor] = utf8_decode($descricao); + } + } finally{ + curl_close($curl); + } + + return $resultado; + } + + + public function enviarProcesso($parametros) + { + try { + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->enviarProcesso($parametros); + }); + + } catch (\SoapFault $e) { + $strMensagem = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript(utf8_decode($e->faultstring))); + if ($e instanceof \SoapFault && !empty($e->detail->interoperabilidadeException->codigoErro) && $e->detail->interoperabilidadeException->codigoErro == '0005') { + $strMensagem .= 'O código mapeado para a unidade ' . utf8_decode($parametros->novoTramiteDeProcesso->processo->documento[0]->produtor->unidade->nome) . ' está incorreto.'; + } + + $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + if (strpos(strtolower($strMensagem), "hash de ao menos um componente digital não confere")) { + $strMensagem = $this->validarMudancaOrdemDocumentos($parametros->dblIdProcedimento, $strMensagem, $strDetalhes); + } + throw new InfraException($strMensagem, $e, $strDetalhes); + } catch (\Exception $e) { + $mensagem = "Falha no envio externo do processo. Verifique log de erros do sistema para maiores informações."; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $params = null) + { + $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); + $objProcessoEletronicoDTO->setDblIdProcedimento($dblIdProcedimento); + + $objProcessoEletronicoRN = new ProcessoEletronicoRN(); + $objUltimoTramiteDTO = $objProcessoEletronicoRN->consultarUltimoTramite($objProcessoEletronicoDTO); + $numIdTramite = $objUltimoTramiteDTO->getNumIdTramite(); + + if (!is_null($numIdTramite) && $numIdTramite > 0) { + $objAtividadeDTO = new AtividadeDTO(); + $objAtividadeDTO->setDblIdProtocolo($dblIdProcedimento); + $objAtividadeDTO->setNumIdTarefa(TarefaRN::$TI_PROCESSO_ALTERACAO_ORDEM_ARVORE); + $objAtividadeDTO->setOrdDthAbertura(InfraDTO::$TIPO_ORDENACAO_DESC); + $objAtividadeDTO->retNumIdAtividade(); + $objAtividadeDTO->retDblIdProcedimentoProtocolo(); + + $objAtividadeRN = new AtividadeRN(); + $arrObjAtividadeDTO = $objAtividadeRN->contarRN0035($objAtividadeDTO); + + $objProtocoloDTO = new RelProtocoloProtocoloDTO(); + $objProtocoloDTO->setDblIdProtocolo1($objAtividadeDTO->getDblIdProtocolo()); + $objProtocoloDTO->setOrd('IdRelProtocoloProtocolo', InfraDTO::$TIPO_ORDENACAO_ASC); + $objProtocoloDTO->retTodos(); + $objProtocoloBD = new RelProtocoloProtocoloBD(BancoSEI::getInstance()); + $arrProtocolos = $objProtocoloBD->listar($objProtocoloDTO); + + $msg = ""; + foreach ($arrProtocolos as $index => $protocolo) { + if ($index != $protocolo->getNumSequencia()){ + $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); + $pos = $index + 1; + $sequencia = $protocolo->getNumSequencia() + 1; + $msg .= "A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; + } + } + + if ($arrObjAtividadeDTO > 0) { + $strMensagem = str_replace( + 'hash de ao menos um componente digital não confere', + ' Possivelmente a falha ocorreu devido a mundaça de ordem do documento na árvore do processo.'. $msg, + $strMensagem + ); + } + } + + return $strMensagem; + } + + public function listarPendencias($bolTodasPendencias) + { + $arrObjPendenciaDTO = array(); + + try { + $parametros = new stdClass(); + $parametros->filtroDePendencias = new stdClass(); + $parametros->filtroDePendencias->todasAsPendencias = $bolTodasPendencias; + $result = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->listarPendencias($parametros); + }); + + if(isset($result->listaDePendencias->IDT)){ + if(!is_array($result->listaDePendencias->IDT)) { + $result->listaDePendencias->IDT = array($result->listaDePendencias->IDT); + } + + foreach ($result->listaDePendencias->IDT as $idt) { + $item = new PendenciaDTO(); + $item->setNumIdentificacaoTramite($idt->_); + $item->setStrStatus($idt->status); + $arrObjPendenciaDTO[] = $item; + } + } + } catch (\Exception $e) { + $mensagem = "Falha na listagem de pendências de trâmite de processos"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + + return $arrObjPendenciaDTO; + } + + private function tratarFalhaWebService(Exception $fault) + { + $mensagem = InfraException::inspecionar($fault); + if($fault instanceof SoapFault && isset($fault->detail->interoperabilidadeException)) { + $strWsException = $fault->detail->interoperabilidadeException; + $mensagem = utf8_decode($strWsException->mensagem); + + // Fixação de mensagem de erro para quando já existe um trâmite em andamento + if($strWsException->codigoErro == "0044"){ + $mensagem = 'Processo já possui um trâmite em andamento'; + } + } + + return $mensagem; + } + + public function construirCabecalho($strNumeroRegistro, $idRepositorioOrigem, $idUnidadeOrigem, $idRepositorioDestino, + $idUnidadeDestino, $urgente = false, $motivoUrgencia = 0, $enviarTodosDocumentos = false,$dblIdProcedimento=null) + { + $cabecalho = new stdClass(); + + if(isset($strNumeroRegistro)) { + $cabecalho->NRE = $strNumeroRegistro; + } + + $cabecalho->remetente = new stdClass(); + $cabecalho->remetente->identificacaoDoRepositorioDeEstruturas = $idRepositorioOrigem; + $cabecalho->remetente->numeroDeIdentificacaoDaEstrutura = $idUnidadeOrigem; + + $cabecalho->destinatario = new stdClass(); + $cabecalho->destinatario->identificacaoDoRepositorioDeEstruturas = $idRepositorioDestino; + $cabecalho->destinatario->numeroDeIdentificacaoDaEstrutura = $idUnidadeDestino; + + $cabecalho->urgente = $urgente; + $cabecalho->motivoDaUrgencia = $motivoUrgencia; + $cabecalho->obrigarEnvioDeTodosOsComponentesDigitais = $enviarTodosDocumentos; + + $this->atribuirInformacoesAssunto($cabecalho,$dblIdProcedimento); + $this->atribuirInformacoesModulo($cabecalho); + + return $cabecalho; + } + + private function atribuirInformacoesModulo($objCabecalho) + { + + try{ + + $objInfraParametro = new InfraParametro(BancoSEI::getInstance()); + $arrPropAdicionais=$objCabecalho->propriedadeAdicional; + $arrPropAdicionais[] = new SoapVar("". $objInfraParametro->getValor('VERSAO_MODULO_PEN') . "", XSD_ANYXML); + + $objCabecalho->propriedadeAdicional= $arrPropAdicionais; + + }catch(Exception $e){ + + throw new InfraException($mensagem, $e); + } + + + } + + + private function atribuirInformacoesAssunto($objCabecalho,$dblIdProcedimento) + { + + + try{ + + + if(!isset($dblIdProcedimento)){ + throw new InfraException('Parâmetro $dblIdProcedimento não informado.'); + } + + $objRelProtocoloAssuntoDTO = new RelProtocoloAssuntoDTO(); + $objRelProtocoloAssuntoDTO->setDblIdProtocolo($dblIdProcedimento); + $objRelProtocoloAssuntoDTO->retStrDescricaoAssunto(); + $objRelProtocoloAssuntoDTO->retNumIdAssunto(); + $objRelProtocoloAssuntoDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); + + $objRelProtocoloAssuntoRN = new RelProtocoloAssuntoRN(); + $arrobjRelProtocoloAssuntoDTO = $objRelProtocoloAssuntoRN->listarRN0188($objRelProtocoloAssuntoDTO); + + $arrDadosAssunto = array(); + $contagem=1; + $objProcessoEletronicoRN = new ProcessoEletronicoRN(); + + foreach ($arrobjRelProtocoloAssuntoDTO as $objRelProtocoloAssuntoDTO) { + + $idAssunto = $objRelProtocoloAssuntoDTO->getNumIdAssunto(); + $assuntoDTO = new AssuntoDTO(); + $assuntoDTO->setNumIdAssunto($idAssunto); + $assuntoDTO->retNumPrazoCorrente(); + $assuntoDTO->retNumPrazoIntermediario(); + $assuntoDTO->retStrStaDestinacao(); + $assuntoDTO->retStrObservacao(); + $assuntoDTO->retStrCodigoEstruturado(); + + $objAssuntoRN = new AssuntoRN(); + $infoAssunto = $objAssuntoRN->consultarRN0256($assuntoDTO); + + switch ($infoAssunto->getStrStaDestinacao()) { + case AssuntoRN::$TD_ELIMINACAO: + $destinacao = "Eliminação"; + break; + + case AssuntoRN::$TD_GUARDA_PERMANENTE: + $destinacao = "Guarda Permanente"; + break; + } + + + $valorInput=$objRelProtocoloAssuntoDTO->getStrDescricaoAssunto()?utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($objRelProtocoloAssuntoDTO->getStrDescricaoAssunto()), 10000)):"NA"; + $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); + + $valorInput=$infoAssunto->getStrCodigoEstruturado()?utf8_encode($infoAssunto->getStrCodigoEstruturado()):"NA"; + $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); + + $valorInput=$infoAssunto->getNumPrazoCorrente()? (int) $infoAssunto->getNumPrazoCorrente() :"NA"; + $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); + + $valorInput=$infoAssunto->getNumPrazoIntermediario()?(int) $infoAssunto->getNumPrazoIntermediario():"NA"; + $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); + + $valorInput=$destinacao?utf8_encode($destinacao):"NA"; + $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); + + $valorInput=$infoAssunto->getStrObservacao()?utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto(htmlspecialchars($infoAssunto->getStrObservacao()), 10000)):"NA"; + $arrDadosAssunto[] = new SoapVar("" . $valorInput . "", XSD_ANYXML); + + + $contagem++; + } + + $objCabecalho->propriedadeAdicional= $arrDadosAssunto; + + }catch(Exception $e){ + + throw new InfraException($mensagem, $e); + } + + } + + public function enviarComponenteDigital($parametros) + { + try { + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use (&$parametros) { + return $objPenWs->enviarComponenteDigital($parametros); + }); + } catch (\Exception $e) { + $mensagem = "Falha no envio de componentes digitais"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + + /** + * Método responsável por realizar o envio da parte de um componente digital + * @param $parametros + * @return mixed + * @throws InfraException + */ + public function enviarParteDeComponenteDigital($parametros) + { + try { + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use (&$parametros) { + return $objPenWs->enviarParteDeComponenteDigital($parametros); + }); + } catch (\Exception $e) { + $mensagem = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e); + } + } + + /** + * Método responsável por sinalizar o término do envio das partes de um componente digital + * @param $parametros + * @return mixed + * @throws InfraException + */ + public function sinalizarTerminoDeEnvioDasPartesDoComponente($parametros) + { + try { + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->sinalizarTerminoDeEnvioDasPartesDoComponente($parametros); + }); + } catch (\Exception $e) { + $mensagem = "Falha em sinalizar o término de envio das partes do componente digital"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public function solicitarMetadados($parNumIdentificacaoTramite) + { + try { + $parametros = new stdClass(); + $parametros->IDT = $parNumIdentificacaoTramite; + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + $objMetadadosProtocolo = $objPenWs->solicitarMetadados($parametros); + $objMetadadosProtocolo->IDT = $parametros->IDT; + return $objMetadadosProtocolo; + }); + } catch (\Exception $e) { + $mensagem = "Falha na solicitação de metadados do processo"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public static function converterDataWebService($dataHoraSEI) + { + $resultado = ''; + if(isset($dataHoraSEI)){ + $resultado = InfraData::getTimestamp($dataHoraSEI); + $resultado = date(DateTime::W3C, $resultado); + } + + return $resultado; + } + + public static function converterDataSEI($dataHoraWebService) + { + $resultado = null; + if(isset($dataHoraWebService)){ + $resultado = strtotime($dataHoraWebService); + $resultado = date('d/m/Y H:i:s', $resultado); + } + + return $resultado; + } + + public static function obterIdTarefaModulo($strIdTarefaModulo) + { + $objTarefaDTO = new TarefaDTO(); + $objTarefaDTO->retNumIdTarefa(); + $objTarefaDTO->setStrIdTarefaModulo($strIdTarefaModulo); + + $objTarefaRN = new TarefaRN(); + $objTarefaDTO = $objTarefaRN->consultar($objTarefaDTO); + + if($objTarefaDTO){ + return $objTarefaDTO->getNumIdTarefa(); + }else{ + return false; + } + } + + public function cadastrarTramiteDeProcesso($parDblIdProcedimento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parStrStaTipoTramite, $parDthRegistroTramite, $parNumIdRepositorioOrigem, + $parNumIdEstruturaOrigem, $parNumIdRepositorioDestino, $parNumIdEstruturaDestino, $parObjProtocolo, $parNumTicketComponentesDigitais = null, $parObjComponentesDigitaisSolicitados = null, $bolSinProcessamentoEmLote = false, $numIdUnidade = null) + { + if(!isset($parDblIdProcedimento) || $parDblIdProcedimento == 0) { + throw new InfraException('Parâmetro $parDblIdProcedimento não informado.'); + } + + if(!isset($parStrNumeroRegistro)) { + throw new InfraException('Parâmetro $parStrNumeroRegistro não informado.'); + } + + if(!isset($parNumIdentificacaoTramite) || $parNumIdentificacaoTramite == 0) { + throw new InfraException('Parâmetro $parStrNumeroRegistro não informado.'); + } + + if(!isset($parStrStaTipoTramite) || !in_array($parStrStaTipoTramite, array(ProcessoEletronicoRN::$STA_TIPO_TRAMITE_ENVIO, ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO))) { + throw new InfraException('Parâmetro $parStrStaTipoTramite inválio'); + } + + if(!isset($parNumIdRepositorioOrigem) || $parNumIdRepositorioOrigem == 0) { + throw new InfraException('Parâmetro $parNumIdRepositorioOrigem não informado.'); + } + + if(!isset($parNumIdEstruturaOrigem) || $parNumIdEstruturaOrigem == 0) { + throw new InfraException('Parâmetro $parNumIdEstruturaOrigem não informado.'); + } + + if(!isset($parNumIdRepositorioDestino) || $parNumIdRepositorioDestino == 0) { + throw new InfraException('Parâmetro $parNumIdRepositorioDestino não informado.'); + } + + if(!isset($parNumIdEstruturaDestino) || $parNumIdEstruturaDestino == 0) { + throw new InfraException('Parâmetro $parNumIdEstruturaDestino não informado.'); + } + + if(!isset($parObjProtocolo)) { + throw new InfraException('Parâmetro $objProcesso não informado.'); + } + + //Monta dados do processo eletrônico + $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); + $objProcessoEletronicoDTO->setStrNumeroRegistro($parStrNumeroRegistro); + $objProcessoEletronicoDTO->setDblIdProcedimento($parDblIdProcedimento); + $objProcessoEletronicoDTO->setStrStaTipoProtocolo($parObjProtocolo->staTipoProtocolo); + + //Montar dados dos procedimentos apensados + if(isset($parObjProtocolo->processoApensado)){ + if(!is_array($parObjProtocolo->processoApensado)){ + $parObjProtocolo->processoApensado = array($parObjProtocolo->processoApensado); + } + + $arrObjRelProcessoEletronicoApensadoDTO = array(); + $objRelProcessoEletronicoApensadoDTO = null; + foreach ($parObjProtocolo->processoApensado as $objProcessoApensado) { + $objRelProcessoEletronicoApensadoDTO = new RelProcessoEletronicoApensadoDTO(); + $objRelProcessoEletronicoApensadoDTO->setStrNumeroRegistro($parStrNumeroRegistro); + $objRelProcessoEletronicoApensadoDTO->setDblIdProcedimentoApensado($objProcessoApensado->idProcedimentoSEI); + $objRelProcessoEletronicoApensadoDTO->setStrProtocolo($objProcessoApensado->protocolo); + $arrObjRelProcessoEletronicoApensadoDTO[] = $objRelProcessoEletronicoApensadoDTO; + } + + $objProcessoEletronicoDTO->setArrObjRelProcessoEletronicoApensado($arrObjRelProcessoEletronicoApensadoDTO); + } + + //Monta dados do trâmite do processo + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->setStrNumeroRegistro($parStrNumeroRegistro); + $objTramiteDTO->setNumIdTramite($parNumIdentificacaoTramite); + $objTramiteDTO->setNumTicketEnvioComponentes($parNumTicketComponentesDigitais); + $objTramiteDTO->setDthRegistro($this->converterDataSEI($parDthRegistroTramite)); + if($bolSinProcessamentoEmLote){ + $objTramiteDTO->setNumIdUnidade($numIdUnidade); + }else{ + $objTramiteDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); + } + $objTramiteDTO->setNumIdUsuario(SessaoSEI::getInstance()->getNumIdUsuario()); + $objTramiteDTO->setNumIdRepositorioOrigem($parNumIdRepositorioOrigem); + $objTramiteDTO->setNumIdEstruturaOrigem($parNumIdEstruturaOrigem); + $objTramiteDTO->setNumIdRepositorioDestino($parNumIdRepositorioDestino); + $objTramiteDTO->setNumIdEstruturaDestino($parNumIdEstruturaDestino); + $objTramiteDTO->setStrStaTipoTramite($parStrStaTipoTramite); + $objProcessoEletronicoDTO->setArrObjTramiteDTO(array($objTramiteDTO)); + + //Monta dados dos componentes digitais + $parObjProtocoloDesmembrado = ProcessoEletronicoRN::desmembrarProcessosAnexados($parObjProtocolo); + $arrObjComponenteDigitalDTO = $this->montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocoloDesmembrado, $parObjComponentesDigitaisSolicitados); + + $objTramiteDTO->setArrObjComponenteDigitalDTO($arrObjComponenteDigitalDTO); + $objProcessoEletronicoDTO = $this->cadastrarTramiteDeProcessoInterno($objProcessoEletronicoDTO); + + return $objProcessoEletronicoDTO; + } + + + + protected function cadastrarTramiteDeProcessoInternoControlado(ProcessoEletronicoDTO $parObjProcessoEletronicoDTO) + { + if(!isset($parObjProcessoEletronicoDTO)) { + throw new InfraException('Parâmetro $parObjProcessoEletronicoDTO não informado.'); + } + + $idProcedimento = $parObjProcessoEletronicoDTO->getDblIdProcedimento(); + + //Registra os dados do processo eletrônico + $objProcessoEletronicoDTOFiltro = new ProcessoEletronicoDTO(); + $objProcessoEletronicoDTOFiltro->setStrNumeroRegistro($parObjProcessoEletronicoDTO->getStrNumeroRegistro()); + $objProcessoEletronicoDTOFiltro->setDblIdProcedimento($parObjProcessoEletronicoDTO->getDblIdProcedimento()); + $objProcessoEletronicoDTOFiltro->setStrStaTipoProtocolo($parObjProcessoEletronicoDTO->getStrStaTipoProtocolo()); + $objProcessoEletronicoDTOFiltro->retStrNumeroRegistro(); + $objProcessoEletronicoDTOFiltro->retDblIdProcedimento(); + $objProcessoEletronicoDTOFiltro->retStrStaTipoProtocolo(); + + $objProcessoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco()); + $objProcessoEletronicoDTO = $objProcessoEletronicoBD->consultar($objProcessoEletronicoDTOFiltro); + + if(empty($objProcessoEletronicoDTO)) { + $objProcessoEletronicoDTO = $objProcessoEletronicoBD->cadastrar($objProcessoEletronicoDTOFiltro); + } + + //Registrar processos apensados + if($parObjProcessoEletronicoDTO->isSetArrObjRelProcessoEletronicoApensado()) { + $objRelProcessoEletronicoApensadoBD = new RelProcessoEletronicoApensadoBD($this->getObjInfraIBanco()); + foreach ($parObjProcessoEletronicoDTO->getArrObjRelProcessoEletronicoApensado() as $objRelProcessoEletronicoApensadoDTOFiltro) { + if($objRelProcessoEletronicoApensadoBD->contar($objRelProcessoEletronicoApensadoDTOFiltro) == 0){ + $objRelProcessoEletronicoApensadoBD->cadastrar($objRelProcessoEletronicoApensadoDTOFiltro); + } + } + } + + //Registrar informações sobre o trâmite do processo + $arrObjTramiteDTO = $parObjProcessoEletronicoDTO->getArrObjTramiteDTO(); + $parObjTramiteDTO = $arrObjTramiteDTO[0]; + + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->retNumIdTramite(); + $objTramiteDTO->setStrNumeroRegistro($parObjTramiteDTO->getStrNumeroRegistro()); + $objTramiteDTO->setNumIdTramite($parObjTramiteDTO->getNumIdTramite()); + + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTO); + + if(empty($objTramiteDTO)) { + $objTramiteDTO = $objTramiteBD->cadastrar($parObjTramiteDTO); + } + + $objProcessoEletronicoDTO->setArrObjTramiteDTO(array($objTramiteDTO)); + + //Registra informações sobre o componente digital do documento + $arrObjComponenteDigitalDTO = array(); + $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); + + $arrObjComponenteDigitalDTO = array(); + foreach ($parObjTramiteDTO->getArrObjComponenteDigitalDTO() as $objComponenteDigitalDTO) { + + //Verifica se o documento foi inserido pelo trâmite atual + if($objComponenteDigitalDTO->getDblIdDocumento() != null){ + $objComponenteDigitalDTO->setDblIdProcedimento($idProcedimento); + $objComponenteDigitalDTOFiltro = new ComponenteDigitalDTO(); + $objComponenteDigitalDTOFiltro->setNumIdTramite($objComponenteDigitalDTO->getNumIdTramite()); + $objComponenteDigitalDTOFiltro->setStrNumeroRegistro($objComponenteDigitalDTO->getStrNumeroRegistro()); + $objComponenteDigitalDTOFiltro->setDblIdProcedimento($objComponenteDigitalDTO->getDblIdProcedimento()); + $objComponenteDigitalDTOFiltro->setDblIdDocumento($objComponenteDigitalDTO->getDblIdDocumento()); + $objComponenteDigitalDTOFiltro->setNumOrdem($objComponenteDigitalDTO->getNumOrdem()); + $objComponenteDigitalDTOFiltro->setNumOrdemDocumento($objComponenteDigitalDTO->getNumOrdemDocumento()); + + if($objComponenteDigitalBD->contar($objComponenteDigitalDTOFiltro) == 0){ + $objComponenteDigitalDTO->setStrTarjaLegada("N"); + $objComponenteDigitalDTO = $objComponenteDigitalBD->cadastrar($objComponenteDigitalDTO); + } + else { + //Verifica se foi setado o envio + if(!$objComponenteDigitalDTO->isSetStrSinEnviar()){ + $objComponenteDigitalDTO->setStrSinEnviar('N'); + } + } + $arrObjComponenteDigitalDTO[] = $objComponenteDigitalDTO; + } + } + + $objTramiteDTO->setArrObjComponenteDigitalDTO($arrObjComponenteDigitalDTO); + return $objProcessoEletronicoDTO; + } + + /** + * Retorna o hash do objecto do solicitarMetadadosResponse + * + * @param object $objMeta tem que ser o componenteDigital->hash + * @return string + */ + public static function getHashFromMetaDados($objMeta) + { + $strHashConteudo = ''; + + if (isset($objMeta)) { + $matches = array(); + $strHashConteudo = (isset($objMeta->enc_value)) ? $objMeta->enc_value : $objMeta->_; + + if (preg_match('/^(.*)<\/hash>$/', $strHashConteudo, $matches, PREG_OFFSET_CAPTURE)) { + $strHashConteudo = $matches[1][0]; + } + } + + return $strHashConteudo; + } + + private function montarDadosMaisDeUmComponenteDigital($objDocumento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados) + { + $arrayComponentesDigitais = $objDocumento->componenteDigital; + $arrObjComponenteDigitalDTO = array(); + $arrayTeste = array(); + $contComponentes = 0; + + foreach ($arrayComponentesDigitais as $indice => $objComponenteDigital){ + $contComponentes++; + $objComponenteDigitalDTO = new ComponenteDigitalDTO(); + $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); + //TODO: Error utilizar idProcedimentoSEI devido processos apensados + $objComponenteDigitalDTO->setDblIdProcedimento($parObjProtocolo->idProcedimentoSEI); + $objComponenteDigitalDTO->setDblIdDocumento($objDocumento->idDocumentoSEI); + $objComponenteDigitalDTO->setNumOrdemDocumento($objDocumento->ordem); + $objComponenteDigitalDTO->setNumOrdem($objComponenteDigital->ordem); + $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); + $objComponenteDigitalDTO->setStrProtocolo($parObjProtocolo->protocolo); + + if(isset($objDocumento->idProcedimentoAnexadoSEI)){ + $objComponenteDigitalDTO->setDblIdProcedimentoAnexado($objDocumento->idProcedimentoAnexadoSEI); + $objComponenteDigitalDTO->setStrProtocoloProcedimentoAnexado($objDocumento->protocoloDoProcessoAnexado); + $objComponenteDigitalDTO->setNumOrdemDocumentoAnexado($objDocumento->ordemAjustada); + } + + + $objComponenteDigitalDTO->setStrNome($objComponenteDigital->nome); + $strHashConteudo = static::getHashFromMetaDados($objComponenteDigital->hash); + + $objComponenteDigitalDTO->setStrHashConteudo($strHashConteudo); + $objComponenteDigitalDTO->setStrAlgoritmoHash(self::ALGORITMO_HASH_DOCUMENTO); + $objComponenteDigitalDTO->setStrTipoConteudo($objComponenteDigital->tipoDeConteudo); + $objComponenteDigitalDTO->setStrMimeType($objComponenteDigital->mimeType); + $objComponenteDigitalDTO->setStrDadosComplementares($objComponenteDigital->dadosComplementaresDoTipoDeArquivo); + + //Registrar componente digital necessita ser enviado pelo trâmite específico //TODO: Teste $parObjComponentesDigitaisSolicitados aqui + if(isset($parObjComponentesDigitaisSolicitados)){ + $arrObjItensSolicitados = is_array($parObjComponentesDigitaisSolicitados->processo) ? $parObjComponentesDigitaisSolicitados->processo : array($parObjComponentesDigitaisSolicitados->processo); + + foreach ($arrObjItensSolicitados as $objItemSolicitado) { + if(!is_null($objItemSolicitado)){ + $objItemSolicitado->hash = is_array($objItemSolicitado->hash) ? $objItemSolicitado->hash : array($objItemSolicitado->hash); + + if($objItemSolicitado->protocolo == $objComponenteDigitalDTO->getStrProtocolo() && in_array($strHashConteudo, $objItemSolicitado->hash) && !$objDocumento->retirado) { + $objComponenteDigitalDTO->setStrSinEnviar("S"); + } + } + } + } + + //TODO: Avaliar dados do tamanho do documento em bytes salvo na base de dados + $objComponenteDigitalDTO->setNumTamanho($objComponenteDigital->tamanhoEmBytes); + $objComponenteDigitalDTO->setNumIdAnexo($objComponenteDigital->idAnexo); + + array_push($arrObjComponenteDigitalDTO, $objComponenteDigitalDTO); + } + + return $arrObjComponenteDigitalDTO; + } + + + private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados) + { + //Monta dados dos componentes digitais + $arrObjComponenteDigitalDTO = array(); + $arrObjDocumento = self::obterDocumentosProtocolo($parObjProtocolo, true); + + $arrObjComponenteDigitalDTOAux = array(); + foreach ($arrObjDocumento as $objDocumento) { + $quantidadeDeComponentesDigitais = count($objDocumento->componenteDigital); + if($quantidadeDeComponentesDigitais > 1){ + $arrObjComponenteDigitalDTOAux = self::montarDadosMaisDeUmComponenteDigital($objDocumento, $parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjComponentesDigitaisSolicitados); + }else{ + $objComponenteDigitalDTO = new ComponenteDigitalDTO(); + $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); + //TODO: Error utilizar idProcedimentoSEI devido processos apensados + $objComponenteDigitalDTO->setDblIdProcedimento($parObjProtocolo->idProcedimentoSEI); + $objComponenteDigitalDTO->setDblIdDocumento($objDocumento->idDocumentoSEI); + $objComponenteDigitalDTO->setNumOrdemDocumento($objDocumento->ordem); + $objComponenteDigitalDTO->setNumOrdem(1); + $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); + $objComponenteDigitalDTO->setStrProtocolo($parObjProtocolo->protocolo); + + if(isset($objDocumento->ordemDoDocumentoReferenciado)){ + $objComponenteDigitalDTO->setNumOrdemDocumentoReferenciado(intval($objDocumento->ordemDoDocumentoReferenciado)); + } + + if(isset($objDocumento->idProcedimentoAnexadoSEI)){ + $objComponenteDigitalDTO->setDblIdProcedimentoAnexado($objDocumento->idProcedimentoAnexadoSEI); + $objComponenteDigitalDTO->setStrProtocoloProcedimentoAnexado($objDocumento->protocoloDoProcessoAnexado); + $objComponenteDigitalDTO->setNumOrdemDocumentoAnexado($objDocumento->ordemAjustada); + } + + //Por enquanto, considera que o documento possui apenas um componente digital + if(is_array($objDocumento->componenteDigital) && count($objDocumento->componenteDigital) != 1) { + throw new InfraException("Erro processando componentes digitais do processo " . $parObjProtocolo->protocolo . "\n Somente é permitido o recebimento de documentos com apenas um Componente Digital."); + } + + $objComponenteDigital = is_array($objDocumento->componenteDigital) ? $objDocumento->componenteDigital[0] : $objDocumento->componenteDigital; + $objComponenteDigitalDTO->setStrNome(utf8_decode($objComponenteDigital->nome)); + + if(isset($objDocumento->especie)){ + $objComponenteDigitalDTO->setNumCodigoEspecie(intval($objDocumento->especie->codigo)); + $objComponenteDigitalDTO->setStrNomeEspecieProdutor(utf8_decode($objDocumento->especie->nomeNoProdutor)); + } + + $strHashConteudo = static::getHashFromMetaDados($objComponenteDigital->hash); + $objComponenteDigitalDTO->setStrHashConteudo($strHashConteudo); + $objComponenteDigitalDTO->setStrAlgoritmoHash(self::ALGORITMO_HASH_DOCUMENTO); + $objComponenteDigitalDTO->setStrTipoConteudo($objComponenteDigital->tipoDeConteudo); + $objComponenteDigitalDTO->setStrMimeType($objComponenteDigital->mimeType); + $objComponenteDigitalDTO->setStrDadosComplementares($objComponenteDigital->dadosComplementaresDoTipoDeArquivo); + + //Registrar componente digital necessita ser enviado pelo trâmite específico //TODO: Teste $parObjComponentesDigitaisSolicitados aqui + if(isset($parObjComponentesDigitaisSolicitados)){ + $arrObjItensSolicitados = is_array($parObjComponentesDigitaisSolicitados->processo) ? $parObjComponentesDigitaisSolicitados->processo : array($parObjComponentesDigitaisSolicitados->processo); + foreach ($arrObjItensSolicitados as $objItemSolicitado) { + if(!is_null($objItemSolicitado)){ + $objItemSolicitado->hash = is_array($objItemSolicitado->hash) ? $objItemSolicitado->hash : array($objItemSolicitado->hash); + + if($objItemSolicitado->protocolo == $objComponenteDigitalDTO->getStrProtocolo() && in_array($strHashConteudo, $objItemSolicitado->hash) && !$objDocumento->retirado) { + $objComponenteDigitalDTO->setStrSinEnviar("S"); + } + } + } + } + + //TODO: Avaliar dados do tamanho do documento em bytes salvo na base de dados + $objComponenteDigitalDTO->setNumTamanho($objComponenteDigital->tamanhoEmBytes); + + $objComponenteDigitalDTO->setNumIdAnexo($objComponenteDigital->idAnexo); + $arrObjComponenteDigitalDTO[] = $objComponenteDigitalDTO; + } + $arrObjComponenteDigitalDTO = array_merge($arrObjComponenteDigitalDTOAux, $arrObjComponenteDigitalDTO); + } + + //Chamada recursiva sobre os documentos dos processos apensados + if(isset($parObjProtocolo->processoApensado) && count($parObjProtocolo->processoApensado)) { + foreach ($parObjProtocolo->processoApensado as $objProcessoApensado) { + $arrObj = $this->montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $objProcessoApensado, $parObjComponentesDigitaisSolicitados); + $arrObjComponenteDigitalDTO = array_merge($arrObjComponenteDigitalDTO, $arrObj); + } + } + return $arrObjComponenteDigitalDTO; + } + + public function receberComponenteDigital($parNumIdentificacaoTramite, $parStrHashComponenteDigital, $parStrProtocolo, $parObjParteComponente=null) + { + try + { + $parametros = new stdClass(); + $parametros->parametrosParaRecebimentoDeComponenteDigital = new stdClass(); + $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital = new stdClass(); + $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->IDT = $parNumIdentificacaoTramite; + $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->protocolo = $parStrProtocolo; + $parametros->parametrosParaRecebimentoDeComponenteDigital->identificacaoDoComponenteDigital->hashDoComponenteDigital = $parStrHashComponenteDigital; + + //Se for passado o parametro $parObjParteComponente retorna apenas parte especifica do componente digital + if(!is_null($parObjParteComponente)){ + $parametros->parametrosParaRecebimentoDeComponenteDigital->parte = $parObjParteComponente; + } + + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->receberComponenteDigital($parametros); + }); + } catch (\SoapFault $fault) { + $mensagem = $this->tratarFalhaWebService($fault); + throw new InfraException(InfraString::formatarJavaScript($mensagem), $fault); + } catch (\Exception $e) { + throw new InfraException("Error Processing Request", $e); + } + } + + public function consultarTramites($parNumIdTramite = null, $parNumeroRegistro = null, $parNumeroUnidadeRemetente = null, $parNumeroUnidadeDestino = null, $parProtocolo = null, $parNumeroRepositorioEstruturas = null) + { + try + { + $arrObjTramite = array(); + $parametros = new stdClass(); + $parametros->filtroDeConsultaDeTramites = new stdClass(); + $parametros->filtroDeConsultaDeTramites->IDT = $parNumIdTramite; + + if(!is_null($parNumeroRegistro)){ + $parametros->filtroDeConsultaDeTramites->NRE = $parNumeroRegistro; + } + + if(!is_null($parNumeroUnidadeRemetente) && !is_null($parNumeroRepositorioEstruturas)){ + $parametros->filtroDeConsultaDeTramites->remetente = new stdClass(); + $parametros->filtroDeConsultaDeTramites->remetente->identificacaoDoRepositorioDeEstruturas = $parNumeroRepositorioEstruturas; + $parametros->filtroDeConsultaDeTramites->remetente->numeroDeIdentificacaoDaEstrutura = $parNumeroUnidadeRemetente; + } + + if(!is_null($parNumeroUnidadeDestino) && !is_null($parNumeroRepositorioEstruturas)){ + $parametros->filtroDeConsultaDeTramites->destinatario = new stdClass(); + $parametros->filtroDeConsultaDeTramites->destinatario->identificacaoDoRepositorioDeEstruturas = $parNumeroRepositorioEstruturas; + $parametros->filtroDeConsultaDeTramites->destinatario->numeroDeIdentificacaoDaEstrutura = $parNumeroUnidadeDestino; + } + + if(!is_null($parProtocolo)){ + $parametros->filtroDeConsultaDeTramites->protocolo = $parProtocolo; + } + + $objTramitesEncontrados = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarTramites($parametros); + }); + + if(isset($objTramitesEncontrados->tramitesEncontrados) && isset($objTramitesEncontrados->tramitesEncontrados->tramite)) { + $arrObjTramite = $objTramitesEncontrados->tramitesEncontrados->tramite; + if(!is_array($arrObjTramite)) { + $arrObjTramite = array($objTramitesEncontrados->tramitesEncontrados->tramite); + } + } + + return $arrObjTramite; + + } catch (\Exception $e) { + $mensagem = "Falha na consulta de trâmites de processo"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public function consultarTramitesProtocolo($parProtocoloFormatado) + { + try + { + $arrObjTramite = array(); + $parametros = new stdClass(); + $parametros->filtroDeConsultaDeTramites = new stdClass(); + $parametros->filtroDeConsultaDeTramites->protocolo = $parProtocoloFormatado; + + $objTramitesEncontrados = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarTramites($parametros); + }); + + if(isset($objTramitesEncontrados->tramitesEncontrados)) { + + $arrObjTramite = $objTramitesEncontrados->tramitesEncontrados->tramite; + if(!is_array($arrObjTramite)) { + $arrObjTramite = array($objTramitesEncontrados->tramitesEncontrados->tramite); + } + } + + return $arrObjTramite; + } catch (\Exception $e) { + $mensagem = "Falha na consulta de trâmites de processo"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public function cienciaRecusa($parNumIdTramite) + { + try + { + $parametros = new stdClass(); + $parametros->IDT = $parNumIdTramite; + //return $this->getObjPenWs()->cienciaRecusa($parametro); + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->cienciaRecusa($parametros); + }); + } catch (\Exception $e) { + $mensagem = "Falha no registro de ciência da recusa de trâmite"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + /** + * Retorna o estado atual do procedimento no api-pen + * + * @param integer $dblIdProcedimento + * @param integer $numIdRepositorio + * @param integer $numIdEstrutura + * @return integer + */ + public function consultarEstadoProcedimento($strProtocoloFormatado = '', $numIdRepositorio = null, $numIdEstrutura = null) + { + $objBD = new GenericoBD($this->inicializarObjInfraIBanco()); + + $objProtocoloDTO = new ProtocoloDTO(); + $objProtocoloDTO->setStrProtocoloFormatado($strProtocoloFormatado); + $objProtocoloDTO->setNumMaxRegistrosRetorno(1); + $objProtocoloDTO->retDblIdProtocolo(); + $objProtocoloDTO->retStrProtocoloFormatado(); + $objProtocoloDTO->retStrStaEstado(); + + $objProtocoloDTO = $objBD->consultar($objProtocoloDTO); + + if (empty($objProtocoloDTO)) { + throw new InfraException(utf8_encode(sprintf('Nenhum procedimento foi encontrado com o id %s', $strProtocoloFormatado))); + } + + if ($objProtocoloDTO->getStrStaEstado() != ProtocoloRn::$TE_PROCEDIMENTO_BLOQUEADO) { + throw new InfraException(utf8_encode('O processo não esta com o estado com "Em Processamento" ou "Bloqueado"')); + } + + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->retDblIdProtocolo()); + $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); + $objTramiteDTO->setNumMaxRegistrosRetorno(1); + $objTramiteDTO->retNumIdTramite(); + + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); + + if(!$arrObjTramiteDTO){ + throw new InfraException('Trâmite não encontrado'); + } + + $objTramiteDTO = $arrObjTramiteDTO[0]; + + $objFiltro = new stdClass(); + $objFiltro->filtroDeConsultaDeTramites = new stdClass(); + $objFiltro->filtroDeConsultaDeTramites->IDT = $objTramiteDTO->getNumIdTramite(); + + $objResultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($objFiltro) { + return $objPenWs->consultarTramites($objFiltro); + }); + + $objTramitesEncontrados = $objResultado->tramitesEncontrados; + + if (empty($objTramitesEncontrados) || !isset($objTramitesEncontrados->tramite)) { + throw new InfraException(utf8_encode(sprintf('Nenhum tramite foi encontrado para o procedimento %s', $strProtocoloFormatado))); + } + + if(!is_array($objTramitesEncontrados->tramite)){ + $objTramitesEncontrados->tramite = array($objTramitesEncontrados->tramite); + } + + $arrObjTramite = (array) $objTramitesEncontrados->tramite; + + $objTramite = array_pop($arrObjTramite); + + if (empty($numIdRepositorio)) { + $objPenParametroRN = new PenParametroRN(); + $numIdRepositorio = $objPenParametroRN->getParametro('PEN_ID_REPOSITORIO_ORIGEM'); + } + + if (empty($numIdEstrutura)) { + $objPenUnidadeDTO = new PenUnidadeDTO(); + $objPenUnidadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); + $objPenUnidadeDTO->retNumIdUnidadeRH(); + $objPenUnidadeDTO = $objBD->consultar($objPenUnidadeDTO); + + if (empty($objPenUnidadeDTO)) { + throw new InfraException(utf8_encode('Número da Unidade RH não foi encontrado')); + } + + $numIdEstrutura = $objPenUnidadeDTO->getNumIdUnidadeRH(); + } + + if ($objTramite->remetente->numeroDeIdentificacaoDaEstrutura != $numIdEstrutura || + $objTramite->remetente->identificacaoDoRepositorioDeEstruturas != $numIdRepositorio) { + throw new InfraException(utf8_encode('O último trâmite desse processo não pertence a esse órgão')); + } + + switch ($objTramite->situacaoAtual) { + case static::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO: + $objReceberReciboTramiteRN = new ReceberReciboTramiteRN(); + $objReceberReciboTramiteRN->receberReciboDeTramite($objTramite->IDT); + break; + + case static::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE: + throw new InfraException(utf8_encode('O trâmite externo deste processo já foi concluído')); + break; + + default: + $objAtividadeDTO = new AtividadeDTO(); + $objAtividadeDTO->setDblIdProtocolo($objProtocoloDTO->getDblIdProtocolo()); + $objAtividadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); + $objAtividadeDTO->setNumIdUsuario(SessaoSEI::getInstance()->getNumIdUsuario()); + $objAtividadeDTO->setNumIdTarefa(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_ABORTADO); + $objAtividadeDTO->setArrObjAtributoAndamentoDTO(array()); + + $objAtividadeRN = new AtividadeRN(); + $objAtividadeRN->gerarInternaRN0727($objAtividadeDTO); + + $objProtocoloDTO->setStrStaEstado(ProtocoloRN::$TE_NORMAL); + $objBD->alterar($objProtocoloDTO); + + if($objTramite->situacaoAtual == static::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO && $objTramite->situacaoAtual == static::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO){ + $this->cancelarTramite($objTramite->IDT); + } + + return PenConsoleRN::format(sprintf('Processo %s foi atualizado com sucesso', $objProtocoloDTO->getStrProtocoloFormatado()), 'blue'); + } + } + + public function enviarReciboDeTramite($parNumIdTramite, $parDthRecebimento, $parStrReciboTramite) + { + try + { + $strHashAssinatura = null; + $objPrivatekey = openssl_pkey_get_private("file://".$this->strLocalCert, $this->strLocalCertPassword); + + if ($objPrivatekey === FALSE) { + throw new InfraException("Erro ao obter chave privada do certificado digital."); + } + + openssl_sign($parStrReciboTramite, $strHashAssinatura, $objPrivatekey, 'sha256'); + $strHashDaAssinaturaBase64 = base64_encode($strHashAssinatura); + + $parametros = new stdClass(); + $parametros->dadosDoReciboDeTramite = new stdClass(); + $parametros->dadosDoReciboDeTramite->IDT = $parNumIdTramite; + $parametros->dadosDoReciboDeTramite->dataDeRecebimento = $parDthRecebimento; + $parametros->dadosDoReciboDeTramite->hashDaAssinatura = $strHashDaAssinaturaBase64; + + $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->enviarReciboDeTramite($parametros); + }); + + return $strHashDaAssinaturaBase64; + + } catch (\Exception $e) { + $mensagem = "Falha no envio de recibo de trâmite de processo"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } finally { + if(isset($objPrivatekey)){ + openssl_free_key($objPrivatekey); + } + } + } + + public function receberReciboDeTramite($parNumIdTramite) + { + try { + $parametros = new stdClass(); + $parametros->IDT = $parNumIdTramite; + //$resultado = $this->getObjPenWs()->receberReciboDeTramite($parametros); + return $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->receberReciboDeTramite($parametros); + }); + + } catch (\Exception $e) { + $mensagem = "Falha no recebimento de recibo de trâmite"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + /** + * Retorna um objeto DTO do recibo de envio do processo ao barramento + * + * @param int $parNumIdTramite + * @return ReciboTramiteEnviadoDTO + */ + public function receberReciboDeEnvio($parNumIdTramite) + { + try { + $parametros = new stdClass(); + $parametros->IDT = $parNumIdTramite; + $resultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->receberReciboDeEnvio($parametros); + }); + + return $resultado->conteudoDoReciboDeEnvio; + } + catch (\Exception $e) { + $mensagem = "Falha no recebimento de recibo de trâmite"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public function converterOperacaoDTO($objOperacaoPEN) + { + if(!isset($objOperacaoPEN)) { + throw new InfraException('Parâmetro $objOperacaoPEN não informado.'); + } + + $objOperacaoDTO = new OperacaoDTO(); + $objOperacaoDTO->setStrCodigo(utf8_decode($objOperacaoPEN->codigo)); + $objOperacaoDTO->setStrComplemento(utf8_decode($objOperacaoPEN->complemento)); + $objOperacaoDTO->setDthOperacao($this->converterDataSEI($objOperacaoPEN->dataHora)); + + $strIdPessoa = ($objOperacaoPEN->pessoa->numeroDeIdentificacao) ?: null; + $objOperacaoDTO->setStrIdentificacaoPessoaOrigem(utf8_decode($strIdPessoa)); + + $strNomePessoa = ($objOperacaoPEN->pessoa->nome) ?: null; + $objOperacaoDTO->setStrNomePessoaOrigem(utf8_decode($strNomePessoa)); + + switch ($objOperacaoPEN->codigo) { + case "01": $objOperacaoDTO->setStrNome("Registro"); break; + case "02": $objOperacaoDTO->setStrNome("Envio de documento avulso/processo"); break; + case "03": $objOperacaoDTO->setStrNome("Cancelamento/exclusão ou envio de documento"); break; + case "04": $objOperacaoDTO->setStrNome("Recebimento de documento"); break; + case "05": $objOperacaoDTO->setStrNome("Autuação"); break; + case "06": $objOperacaoDTO->setStrNome("Juntada por anexação"); break; + case "07": $objOperacaoDTO->setStrNome("Juntada por apensação"); break; + case "08": $objOperacaoDTO->setStrNome("Desapensação"); break; + case "09": $objOperacaoDTO->setStrNome("Arquivamento"); break; + case "10": $objOperacaoDTO->setStrNome("Arquivamento no Arquivo Nacional"); break; + case "11": $objOperacaoDTO->setStrNome("Eliminação"); break; + case "12": $objOperacaoDTO->setStrNome("Sinistro"); break; + case "13": $objOperacaoDTO->setStrNome("Reconstituição de processo"); break; + case "14": $objOperacaoDTO->setStrNome("Desarquivamento"); break; + case "15": $objOperacaoDTO->setStrNome("Desmembramento"); break; + case "16": $objOperacaoDTO->setStrNome("Desentranhamento"); break; + case "17": $objOperacaoDTO->setStrNome("Encerramento/abertura de volume no processo"); break; + case "18": $objOperacaoDTO->setStrNome("Registro de extravio"); break; + default: $objOperacaoDTO->setStrNome("Registro"); break; + } + + return $objOperacaoDTO; + } + + public function obterCodigoOperacaoPENMapeado($numIdTarefa) + { + $strCodigoOperacao = self::$OP_OPERACAO_REGISTRO; + if(isset($numIdTarefa) && $numIdTarefa != 0) { + $objRelTarefaOperacaoDTO = new RelTarefaOperacaoDTO(); + $objRelTarefaOperacaoDTO->retStrCodigoOperacao(); + $objRelTarefaOperacaoDTO->setNumIdTarefa($numIdTarefa); + + $objRelTarefaOperacaoBD = new RelTarefaOperacaoBD(BancoSEI::getInstance()); + $objRelTarefaOperacaoDTO = $objRelTarefaOperacaoBD->consultar($objRelTarefaOperacaoDTO); + + if($objRelTarefaOperacaoDTO != null) { + $strCodigoOperacao = $objRelTarefaOperacaoDTO->getStrCodigoOperacao(); + } + } + + return $strCodigoOperacao; + } + + public function obterIdTarefaSEIMapeado($strCodigoOperacao) + { + return self::$TI_PROCESSO_ELETRONICO_PROCESSO_TRAMITE_EXTERNO; + } + + + /** + * Cancela um tramite externo de um procedimento para outra unidade, gera + * falha caso a unidade de destino já tenha começado a receber o procedimento. + * + * @param type $idTramite + * @param type $idProtocolo + * @throws Exception|InfraException + * @return null + */ + public function cancelarTramite($idTramite) + { + $parametros = new stdClass(); + $parametros->IDT = $idTramite; + + try{ + $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->cancelarEnvioDeTramite($parametros); + }); + } + catch(\Exception $e) { + $mensagem = "Falha no cancelamento de trâmite de processo"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + /** + * Método que faz a recusa de um trâmite + * + * @param integer $idTramite + * @param string $justificativa + * @param integer $motivo + * @return mixed + * @throws InfraException + */ + public function recusarTramite($idTramite, $justificativa, $motivo) + { + try { + $objProcessoEletronicoRN = new ProcessoEletronicoRN(); + $parametros = new stdClass(); + $parametros->recusaDeTramite = new stdClass(); + $parametros->recusaDeTramite->IDT = $idTramite; + $parametros->recusaDeTramite->justificativa = utf8_encode($objProcessoEletronicoRN->reduzirCampoTexto($justificativa, 1000)); + $parametros->recusaDeTramite->motivo = $motivo; + + $resultado = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->recusarTramite($parametros); + }); + + } catch (Exception $e) { + $mensagem = "Falha na recusa de trâmite de processo"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public function cadastrarTramitePendente($numIdentificacaoTramite, $idAtividadeExpedicao) + { + try { + $tramitePendenteDTO = new TramitePendenteDTO(); + $tramitePendenteDTO->setNumIdTramite($numIdentificacaoTramite); + $tramitePendenteDTO->setNumIdAtividade($idAtividadeExpedicao); + $tramitePendenteBD = new TramitePendenteBD($this->getObjInfraIBanco()); + $tramitePendenteBD->cadastrar($tramitePendenteDTO); + } catch (\Exception $e) { + $mensagem = "Falha no cadastramento de trâmite pendente"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + public function isDisponivelCancelarTramite($strProtocolo = '') + { + //Obtem o id_rh que representa a unidade no barramento + $objPenParametroRN = new PenParametroRN(); + $numIdRespositorio = $objPenParametroRN->getParametro('PEN_ID_REPOSITORIO_ORIGEM'); + + //Obtem os dados da unidade + $objPenUnidadeDTO = new PenUnidadeDTO(); + $objPenUnidadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); + $objPenUnidadeDTO->retNumIdUnidadeRH(); + + $objGenericoBD = new GenericoBD($this->inicializarObjInfraIBanco()); + $objPenUnidadeDTO = $objGenericoBD->consultar($objPenUnidadeDTO); + + //Obtem os dados do último trâmite desse processo no barramento + $objProtocoloDTO = new ProtocoloDTO(); + $objProtocoloDTO->setStrProtocoloFormatado($strProtocolo); + $objProtocoloDTO->retDblIdProtocolo(); + + $objProtocoloRN = new ProtocoloRN(); + $objProtocoloDTO = $objProtocoloRN->consultarRN0186($objProtocoloDTO); + + $objTramiteDTO = new TramiteDTO(); + $objTramiteDTO->setNumIdProcedimento($objProtocoloDTO->retDblIdProtocolo()); + $objTramiteDTO->setOrd('Registro', InfraDTO::$TIPO_ORDENACAO_DESC); + $objTramiteDTO->setNumMaxRegistrosRetorno(1); + $objTramiteDTO->retNumIdTramite(); + + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $arrObjTramiteDTO = $objTramiteBD->listar($objTramiteDTO); + + if(!$arrObjTramiteDTO){ + return false; + } + + $objTramiteDTO = $arrObjTramiteDTO[0]; + + try { + $parametros = new stdClass(); + $parametros->filtroDeConsultaDeTramites = new stdClass(); + $parametros->filtroDeConsultaDeTramites->IDT = $objTramiteDTO->getNumIdTramite(); + $parametros->filtroDeConsultaDeTramites->remetente = new stdClass(); + $parametros->filtroDeConsultaDeTramites->remetente->identificacaoDoRepositorioDeEstruturas = $numIdRespositorio; + $parametros->filtroDeConsultaDeTramites->remetente->numeroDeIdentificacaoDaEstrutura = $objPenUnidadeDTO->getNumIdUnidadeRH(); + + $objMeta = $this->tentarNovamenteSobErroHTTP(function($objPenWs) use ($parametros) { + return $objPenWs->consultarTramites($parametros); + }); + + if($objMeta->tramitesEncontrados) { + $arrObjMetaTramite = !is_array($objMeta->tramitesEncontrados->tramite) ? array($objMeta->tramitesEncontrados->tramite) : $objMeta->tramitesEncontrados->tramite; + $objMetaTramite = $arrObjMetaTramite[0]; + + $strSituacoesDisponíveisCancelamento = array( + static::$STA_SITUACAO_TRAMITE_INICIADO, static::$STA_SITUACAO_TRAMITE_COMPONENTES_ENVIADOS_REMETENTE, + static::$STA_SITUACAO_TRAMITE_METADADOS_RECEBIDO_DESTINATARIO, static::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO + ); + + if(in_array($objMetaTramite->situacaoAtual, $strSituacoesDisponíveisCancelamento)){ + return true; + } + } + + return false; + } + catch(SoapFault $e) { + return false; + } + catch(Exception $e) { + return false; + } + } + + public function consultarHipotesesLegais() { + try{ + $hipoteses = $this->tentarNovamenteSobErroHTTP(function($objPenWs) { + return $objPenWs->consultarHipotesesLegais(); + }); + + if (empty($hipoteses)) { + return []; + } + return $hipoteses; + + } catch(Exception $e){ + $mensagem = "Falha na obtenção de hipóteses legais"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + protected function contarConectado(ProcessoEletronicoDTO $objProcessoEletronicoDTO) + { + try { + $objProcessoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco()); + return $objProcessoEletronicoBD->contar($objProcessoEletronicoDTO); + }catch(Exception $e){ + $mensagem = "Falha na contagem de processos eletrônicos registrados"; + $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); + throw new InfraException($mensagem, $e, $detalhes); + } + } + + private function tentarNovamenteSobErroHTTP($callback, $numTentativa=1) + { + try { + return $callback($this->getObjPenWs()); + } catch (\SoapFault $fault) { + if(in_array($fault->faultcode, array("HTTP", "WSDL")) && $this->numTentativasErro >= $numTentativa){ + sleep(self::WS_ESPERA_RECONEXAO); + return $this->tentarNovamenteSobErroHTTP($callback, ++$numTentativa); + } else { + throw $fault; + } + } + } + + public static function desbloquearProcesso($parDblIdProcedimento) + { + try{ + $objEntradaDesbloquearProcessoAPI = new EntradaDesbloquearProcessoAPI(); + $objEntradaDesbloquearProcessoAPI->setIdProcedimento($parDblIdProcedimento); + + $objSeiRN = new SeiRN(); + $objSeiRN->desbloquearProcesso($objEntradaDesbloquearProcessoAPI); + } catch (InfraException $e) { + throw new ProcessoNaoPodeSerDesbloqueadoException("Erro ao desbloquear processo", 1, $e); + } + } + + public static function comparacaoOrdemAjustadaDocumentos($parDocumento1, $parDocumento2) + { + $numOrdemDocumento1 = isset($parDocumento1->ordemAjustada) ? intval($parDocumento1->ordemAjustada) : intval($parDocumento1->ordem); + $numOrdemDocumento2 = isset($parDocumento2->ordemAjustada) ? intval($parDocumento2->ordemAjustada) : intval($parDocumento2->ordem); + return $numOrdemDocumento1 - $numOrdemDocumento2; + } + + public static function comparacaoOrdemDocumentos($parDocumento1, $parDocumento2) + { + $numOrdemDocumento1 = intval($parDocumento1->ordem); + $numOrdemDocumento2 = intval($parDocumento2->ordem); + return $numOrdemDocumento1 - $numOrdemDocumento2; + } + + public static function comparacaoOrdemComponenteDigitais($parComponenteDigital1, $parComponenteDigital2) + { + $numOrdemComponenteDigital1 = intval($parComponenteDigital1->ordem); + $numOrdemComponenteDigital2 = intval($parComponenteDigital2->ordem); + return $numOrdemComponenteDigital1 - $numOrdemComponenteDigital2; + } + + public static function obterDocumentosProtocolo($parObjProtocolo, $parBolExtrairAnexados=false) + { + $arrObjDocumento = array(); + if(isset($parObjProtocolo->documento)){ + $arrObjProtocolo = is_array($parObjProtocolo->documento) ? $parObjProtocolo->documento : array($parObjProtocolo->documento); + usort($arrObjProtocolo, array("ProcessoEletronicoRN", "comparacaoOrdemAjustadaDocumentos")); + + //Tratamento recursivo para processos anexados + foreach ($arrObjProtocolo as $objProtocolo) { + $bolEhProcessoAnexado = $objProtocolo->staTipoProtocolo == ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_PROCESSO; + if($parBolExtrairAnexados && $bolEhProcessoAnexado){ + $arrProtocolosAnexados = ProcessoEletronicoRN::obterDocumentosProtocolo($objProtocolo, $parBolExtrairAnexados); + $arrObjDocumento = array_merge($arrObjDocumento, $arrProtocolosAnexados); + } else { + if(!$bolEhProcessoAnexado){ + $objProtocolo->idProcedimentoSEI = $parObjProtocolo->idProcedimentoSEI; + } + + $objProtocolo->idProtocoloSEI = ($bolEhProcessoAnexado) ? $objProtocolo->idProcedimentoSEI : $objProtocolo->idDocumentoSEI; + $arrObjDocumento[] = $objProtocolo; + } + } + } else { + //Quando se tratar de um Documento Avulso, a ordem será sempre 1 + $parObjProtocolo->ordem = 1; + $parObjProtocolo->ordemAjustada = 1; + $parObjProtocolo->componenteDigital = self::obterComponentesDocumentos($parObjProtocolo); + return array($parObjProtocolo); + } + + if($parBolExtrairAnexados){ + usort($arrObjDocumento, array("ProcessoEletronicoRN", "comparacaoOrdemDocumentos")); + } + + $arrObjDocumentoPadronizados = ($parBolExtrairAnexados) ? $arrObjDocumento : $arrObjProtocolo; + + foreach ($arrObjDocumentoPadronizados as $objDocumento) { + $objDocumento->componenteDigital = self::obterComponentesDocumentos($objDocumento); + } + + return $arrObjDocumentoPadronizados; + } + + + public static function obterComponentesDocumentos($parObjDocumento) + { + $arrObjComponenteDigital=array(); + if(isset($parObjDocumento->componenteDigital)){ + + $arrObjComponenteDigital = is_array($parObjDocumento->componenteDigital) ? $parObjDocumento->componenteDigital : array($parObjDocumento->componenteDigital); + usort($arrObjComponenteDigital, array("ProcessoEletronicoRN", "comparacaoOrdemComponenteDigitais")); + } + + + return $arrObjComponenteDigital; + + } + + /** + * Retorna a referência para o processo ou documento avulso + * + * @param stdclass $parobjMetadadosProcedimento + * @return Mixed Protocolo representado um processo ou um documento avulso + */ + public static function obterProtocoloDosMetadados($parobjMetadadosProcedimento) + { + $objProcesso = $parobjMetadadosProcedimento->metadados->processo; + $objDocumento = $parobjMetadadosProcedimento->metadados->documento; + $objProtocolo = isset($objProcesso) ? $objProcesso : $objDocumento; + + //Caso seja processo receberá em staTipoProtocolo P e caso seja documento avulso receberá D + $objProtocolo->staTipoProtocolo = isset($objProcesso) ? ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_PROCESSO : ProcessoEletronicoRN::$STA_TIPO_PROTOCOLO_DOCUMENTO_AVULSO; + + return $objProtocolo; + } + + /** + * Busca a unidade ao qual o processo foi anteriormente expedido. + * Caso seja o primeiro trâmite, considera a unidade atual + * + * @return integer Id da unidade + */ + public static function obterUnidadeParaRegistroDocumento($parDblIdProcedimento) + { + $objAtividadeDTO = new AtividadeDTO(); + $objAtividadeDTO->setStrIdTarefaModuloTarefa(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_EXPEDIDO); + $objAtividadeDTO->setDblIdProcedimentoProtocolo($parDblIdProcedimento); + $objAtividadeDTO->setOrd('Conclusao', InfraDTO::$TIPO_ORDENACAO_DESC); + $objAtividadeDTO->setNumMaxRegistrosRetorno(1); + $objAtividadeDTO->retNumIdUnidade(); + + $objAtividadeRN = new AtividadeRN(); + $arrObjAtividadeDTO = $objAtividadeRN->listarRN0036($objAtividadeDTO); + $numIdUnidade = SessaoSEI::getInstance()->getNumIdUnidadeAtual(); + + if(!empty($arrObjAtividadeDTO)){ + $objAtividadeDTO = $arrObjAtividadeDTO[0]; + $numIdUnidade = $objAtividadeDTO->getNumIdUnidade(); + } + + return $numIdUnidade; + } + + /** + * Método responsável por obter os componentes digitais do documento + * @param $parObjDocumento + * @return array + */ + public static function obterComponentesDigitaisDocumento($parObjDocumento) + { + $arrObjComponenteDigital = array(); + if(isset($parObjDocumento->componenteDigital)){ + $arrObjComponenteDigital = is_array($parObjDocumento->componenteDigital) ? $parObjDocumento->componenteDigital : array($parObjDocumento->componenteDigital); + } + + return $arrObjComponenteDigital; + } + + + /** + * Método responsável pelo desmembramento de processos anexados + * + * Método responsável por desmembrar os metadados do processo recebido caso ele possua outros processos anexados + * O desmembramento é necessário para que o processo possa ser recriado na mesma estrutura original, ou seja, em vários + * processos diferentes, um anexado ao outro + * + * @param object $parObjProtocolo + * + * @return $objProtocolo + */ + public static function desmembrarProcessosAnexados($parObjProtocolo) + { + if(!ProcessoEletronicoRN::existeProcessoAnexado($parObjProtocolo)){ + return $parObjProtocolo; + } + + $arrObjRefProcessosAnexados = array(); + $objProcessoPrincipal = clone $parObjProtocolo; + $objProcessoPrincipal->documento = array(); + $arrObjDocumentosOrdenados = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo, true); + usort($arrObjDocumentosOrdenados, array("ProcessoEletronicoRN", "comparacaoOrdemDocumentos")); + + // Agrupamento dos documentos por processo + foreach ($arrObjDocumentosOrdenados as $objDocumento) { + $bolDocumentoAnexado = ProcessoEletronicoRN::documentoFoiAnexado($parObjProtocolo, $objDocumento); + $strProtocoloProcAnexado = ($bolDocumentoAnexado) ? $objDocumento->protocoloDoProcessoAnexado : $objProcessoPrincipal->protocolo; + + // Cria uma nova presentação para o processo anexado identico ao processo principal + // As informações do processo anexado não são consideradas pois não existem metadados no modelo do PEN, + // existe apenas o número do protocolo de referência + if($bolDocumentoAnexado && !array_key_exists($strProtocoloProcAnexado, $arrObjRefProcessosAnexados)){ + $objProcessoAnexado = clone $objProcessoPrincipal; + $objProcessoAnexado->documento = array(); + $objProcessoAnexado->protocolo = $strProtocoloProcAnexado; + $objProcessoAnexado->ordemAjustada = count($objProcessoPrincipal->documento) + 1; + $objProcessoPrincipal->documento[] = $objProcessoAnexado; + $arrObjRefProcessosAnexados[$strProtocoloProcAnexado] = $objProcessoAnexado; + } + + $objProcessoDoDocumento = ($bolDocumentoAnexado) ? $arrObjRefProcessosAnexados[$strProtocoloProcAnexado] : $objProcessoPrincipal; + $objDocumentoReposicionado = clone $objDocumento; + $objDocumentoReposicionado->ordemAjustada = count($objProcessoDoDocumento->documento) + 1; + $objProcessoDoDocumento->documento[] = $objDocumentoReposicionado; + } + + return $objProcessoPrincipal; + } + + /** + * Identifica se o protocolo recebido possui outros processos anexados + * + * @param stdClass $parObjProtocolo + * @return bool + */ + public static function existeProcessoAnexado($parObjProtocolo) + { + $arrObjDocumentos = ProcessoEletronicoRN::obterDocumentosProtocolo($parObjProtocolo, true); + + // Verifica se existe algum processo anexado, retornando a referência original do processo caso não exista + $bolExisteProcessoAnexado = array_reduce($arrObjDocumentos, function($bolExiste, $objDoc) { + return $bolExiste || ProcessoEletronicoRN::documentoFoiAnexado($parObjProtocolo, $objDoc); + }); + + return $bolExisteProcessoAnexado; + } + + /** + * Identifica se um determinado documento recebido pelo PEN originou-se de uma anexação de processos + * + * @return bool + */ + private static function documentoFoiAnexado($parObjProtocolo, $parObjDocumento) + { + return ( + isset($parObjDocumento->protocoloDoProcessoAnexado) && + !empty($parObjDocumento->protocoloDoProcessoAnexado) && + $parObjProtocolo->protocolo != $parObjDocumento->protocoloDoProcessoAnexado + ); + } + + /** + * Testa a disponibilidade do Barramento de Serviços do PEN + * + * @return bool + */ + public function validarDisponibilidade() + { + try { + $objVerificadorInstalacaoRN = new VerificadorInstalacaoRN(); + $objVerificadorInstalacaoRN->verificarConexaoBarramentoPEN(); + } catch (\Exception $e) { + throw new InfraException("Falha de comunicação com o Processo Eletrônico Nacional. Por favor, tente novamente mais tarde."); + } + } + + /** + * Recupera os dados do último trâmite de recebimento válido realizado para determinado número de processo eletrônico + * + * @param ProcessoEletronicoDTO $parObjProcessoEletronicoDTO + * @return void + */ + protected function consultarUltimoTramiteRecebidoConectado(ProcessoEletronicoDTO $parObjProcessoEletronicoDTO) + { + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + return $objTramiteBD->consultarUltimoTramite($parObjProcessoEletronicoDTO, ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO); + } + + /** + * Recupera os dados do último trâmite válido realizado para determinado número de processo eletrônico + * + * @param ProcessoEletronicoDTO $parObjProcessoEletronicoDTO + * @return void + */ + protected function consultarUltimoTramiteConectado(ProcessoEletronicoDTO $parObjProcessoEletronicoDTO) + { + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + return $objTramiteBD->consultarUltimoTramite($parObjProcessoEletronicoDTO); + } + + + /** + * Lista componentes digitais de determinado trâmite + * + * @param TramiteDTO $parObjTramiteDTO + * @return void + */ + protected function listarComponentesDigitaisConectado(TramiteDTO $parObjTramiteDTO, $dblIdDocumento=null) + { + $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); + return $objComponenteDigitalBD->listarComponentesDigitaisPeloTramite($parObjTramiteDTO->getNumIdTramite(), $dblIdDocumento); + } + + /** + * Verifica a existência de algum documento contendo outro referenciado no próprio processo + * + * @param TramiteDTO $parObjTramiteDTO + * @return void + */ + protected function possuiComponentesComDocumentoReferenciadoConectado(TramiteDTO $parObjTramiteDTO) + { + $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); + return $objComponenteDigitalBD->possuiComponentesComDocumentoReferenciado($parObjTramiteDTO); + } + + /** + * Aplica redução do texto de uma propriedade do modelo de dados, adicionando reticências ao final da string + * + * @param str $parStrTexto Texto a ser reduzido pela função + * @param int $parNumTamanho Tamanho do texto para redução + * @return void + */ + public function reduzirCampoTexto($parStrTexto, $parNumTamanho) + { + $strTexto = $parStrTexto; + if(!is_null($parStrTexto) && strlen($parStrTexto) > $parNumTamanho){ + $strReticencias = ' ...'; + $numTamanhoMaximoPalavra = 20; + + $strTexto = trim(substr($parStrTexto, 0, $parNumTamanho)); + $arrStrTokens = explode(' ', $strTexto); + $strUltimaPalavra = $arrStrTokens[count($arrStrTokens) - 1]; + + $numTamanhoUltimaPalavra = strlen($strUltimaPalavra) > $numTamanhoMaximoPalavra ? strlen($strReticencias) : strlen($strUltimaPalavra); + $numTamanhoUltimaPalavra = $numTamanhoUltimaPalavra < strlen($strReticencias) ? strlen($strReticencias) : $numTamanhoUltimaPalavra; + $strTexto = substr($strTexto, 0, strlen($strTexto) - $numTamanhoUltimaPalavra); + $strTexto = trim($strTexto) . $strReticencias; + } + + return $strTexto; + } + + /** + * Recupera a lista de todos os documentos do processo, principal ou anexados, mantendo a ordem correta entre eles e indicando qual + * sua atual associação com o processo + * + * @param Num $idProcedimento + * @param Num parDblIdDocumento Filtro de dados de associação de um documento específico + * @return array Lista de Ids dos documentos do processo em ordem + */ + public function listarAssociacoesDocumentos($idProcedimento) + { + if(!isset($idProcedimento)){ + throw new InfraException('Parâmetro $idProcedimento não informado.'); + } + + //Recupera toda a lista de documentos vinculados ao processo, considerando a ordenação definida pelo usuário + $arrTipoAssociacao = array( + RelProtocoloProtocoloRN::$TA_DOCUMENTO_ASSOCIADO, RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO, RelProtocoloProtocoloRN::$TA_PROCEDIMENTO_ANEXADO + ); + + $objRelProtocoloProtocoloDTO = new RelProtocoloProtocoloDTO(); + $objRelProtocoloProtocoloDTO->retDblIdRelProtocoloProtocolo(); + $objRelProtocoloProtocoloDTO->retDblIdProtocolo1(); + $objRelProtocoloProtocoloDTO->retDblIdProtocolo2(); + $objRelProtocoloProtocoloDTO->retStrStaAssociacao(); + $objRelProtocoloProtocoloDTO->setStrStaAssociacao($arrTipoAssociacao, InfraDTO::$OPER_IN); + $objRelProtocoloProtocoloDTO->setDblIdProtocolo1($idProcedimento); + $objRelProtocoloProtocoloDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); + + $objRelProtocoloProtocoloRN = new RelProtocoloProtocoloRN(); + $arrObjRelProtocoloProtocoloDTO = $objRelProtocoloProtocoloRN->listarRN0187($objRelProtocoloProtocoloDTO); + + $arrIdDocumentos = array(); + foreach($arrObjRelProtocoloProtocoloDTO as $objRelProtocoloProtocoloDTO) { + if (in_array($objRelProtocoloProtocoloDTO->getStrStaAssociacao(), [RelProtocoloProtocoloRN::$TA_DOCUMENTO_ASSOCIADO, RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO])) { + // Adiciona documentos em ordem presentes diretamente ao processo + $arrIdDocumentos[] = array("IdProtocolo" => $objRelProtocoloProtocoloDTO->getDblIdProtocolo2(), "StaAssociacao" => $objRelProtocoloProtocoloDTO->getStrStaAssociacao()); + } elseif($objRelProtocoloProtocoloDTO->getStrStaAssociacao() == RelProtocoloProtocoloRN::$TA_PROCEDIMENTO_ANEXADO) { + // Adiciona documentos presente no processo anexado, mantendo a ordem de todo o conjunto + $numIdProtocoloAnexado = $objRelProtocoloProtocoloDTO->getDblIdProtocolo2(); + $arrIdDocumentosAnexados = $this->listarAssociacoesDocumentos($numIdProtocoloAnexado); + $arrIdDocumentos = array_merge($arrIdDocumentos, $arrIdDocumentosAnexados); + } + } + return $arrIdDocumentos; + } +} From cf7075232fd8ceb516be56b37eea5c30e13e5371 Mon Sep 17 00:00:00 2001 From: Michael Oliveira Ferreira Date: Wed, 26 Apr 2023 09:29:44 -0300 Subject: [PATCH 07/19] fix: quebra de linhas na mensagem --- src/rn/ProcessoEletronicoRN.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 1d88d5de2..540c44ef4 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -594,13 +594,13 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $objProtocoloBD = new RelProtocoloProtocoloBD(BancoSEI::getInstance()); $arrProtocolos = $objProtocoloBD->listar($objProtocoloDTO); - $msg = ""; + $msg = "

"; foreach ($arrProtocolos as $index => $protocolo) { if ($index != $protocolo->getNumSequencia()){ $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); $pos = $index + 1; $sequencia = $protocolo->getNumSequencia() + 1; - $msg .= "A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; + $msg .= "A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia.
"; } } From eebdd963d2886287368f267da036d97f937fb368 Mon Sep 17 00:00:00 2001 From: Michael Oliveira Ferreira Date: Thu, 27 Apr 2023 08:57:31 -0300 Subject: [PATCH 08/19] fix: quebra de linhas na mensagem --- src/rn/ProcessoEletronicoRN.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 540c44ef4..c47360a50 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -594,22 +594,23 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $objProtocoloBD = new RelProtocoloProtocoloBD(BancoSEI::getInstance()); $arrProtocolos = $objProtocoloBD->listar($objProtocoloDTO); - $msg = "

"; + $msg = ""; foreach ($arrProtocolos as $index => $protocolo) { if ($index != $protocolo->getNumSequencia()){ $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); $pos = $index + 1; $sequencia = $protocolo->getNumSequencia() + 1; - $msg .= "A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia.
"; + $msg .= "
A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; } } if ($arrObjAtividadeDTO > 0) { $strMensagem = str_replace( 'hash de ao menos um componente digital não confere', - ' Possivelmente a falha ocorreu devido a mundaça de ordem do documento na árvore do processo.'. $msg, + ' Possivelmente a falha ocorreu devido a mundaça de ordem do documento na árvore do processo.', $strMensagem ); + $strMensagem.=$msg; } } From 5152d9a103d96110a25fc9041dc7e0513c674691 Mon Sep 17 00:00:00 2001 From: Michael Oliveira Ferreira Date: Thu, 4 May 2023 09:20:40 -0300 Subject: [PATCH 09/19] mensagem atualizada --- src/rn/ProcessoEletronicoRN.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index c47360a50..d2e67eac7 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -557,7 +557,7 @@ public function enviarProcesso($parametros) $strDetalhes = str_replace(array("\n", "\r"), ' ', InfraString::formatarJavaScript($this->tratarFalhaWebService($e))); $detalhes = InfraString::formatarJavaScript($this->tratarFalhaWebService($e)); if (strpos(strtolower($strMensagem), "hash de ao menos um componente digital não confere")) { - $strMensagem = $this->validarMudancaOrdemDocumentos($parametros->dblIdProcedimento, $strMensagem, $strDetalhes); + $strMensagem = $this->validarMudancaOrdemDocumentos($parametros->dblIdProcedimento, $strMensagem, $parametros); } throw new InfraException($strMensagem, $e, $strDetalhes); } catch (\Exception $e) { @@ -594,23 +594,32 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $objProtocoloBD = new RelProtocoloProtocoloBD(BancoSEI::getInstance()); $arrProtocolos = $objProtocoloBD->listar($objProtocoloDTO); - $msg = ""; + # PROTOCOLO + $objProtocoloDTO = new ProtocoloDTO(); + $objProtocoloDTO->setDblIdProtocolo($objAtividadeDTO->getDblIdProtocolo()); + $objProtocoloDTO->setOrd('IdProtocolo', InfraDTO::$TIPO_ORDENACAO_ASC); + $objProtocoloDTO->retTodos(); + $objProtocoloBD = new ProtocoloBD(BancoSEI::getInstance()); + $protocolos = $objProtocoloBD->listar($objProtocoloDTO)[0]; + + + $msg = "Não foi possível enviar o processo por meio '".$protocolos->getStrProtocoloFormatado()."' do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; foreach ($arrProtocolos as $index => $protocolo) { if ($index != $protocolo->getNumSequencia()){ $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); $pos = $index + 1; $sequencia = $protocolo->getNumSequencia() + 1; - $msg .= "
A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; + $msg .= " A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; } } + $msg .= "Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; if ($arrObjAtividadeDTO > 0) { $strMensagem = str_replace( 'hash de ao menos um componente digital não confere', - ' Possivelmente a falha ocorreu devido a mundaça de ordem do documento na árvore do processo.', + $msg, $strMensagem ); - $strMensagem.=$msg; } } From 4ded98003edd093759b51cf265c4f11e1221d8e6 Mon Sep 17 00:00:00 2001 From: Michael Oliveira Ferreira Date: Fri, 12 May 2023 09:04:02 -0300 Subject: [PATCH 10/19] chore: correcao texto --- src/rn/ProcessoEletronicoRN.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index d2e67eac7..38d5428f1 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -603,7 +603,7 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $protocolos = $objProtocoloBD->listar($objProtocoloDTO)[0]; - $msg = "Não foi possível enviar o processo por meio '".$protocolos->getStrProtocoloFormatado()."' do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; + $msg = "Não foi possível enviar o processo '".$protocolos->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; foreach ($arrProtocolos as $index => $protocolo) { if ($index != $protocolo->getNumSequencia()){ $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); From 8a15df0579912108fd1e5c7bc3489a57086a4eed Mon Sep 17 00:00:00 2001 From: Michael Oliveira Ferreira Date: Fri, 12 May 2023 09:10:22 -0300 Subject: [PATCH 11/19] chore: correcao texto --- src/rn/ProcessoEletronicoRN.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 38d5428f1..438bd8224 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -612,7 +612,7 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $msg .= " A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; } } - $msg .= "Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; + $msg .= " Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; if ($arrObjAtividadeDTO > 0) { $strMensagem = str_replace( From 0ca53accb3c00e1a1700d3d039046cf1d9452115 Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Wed, 14 Jun 2023 01:21:42 -0300 Subject: [PATCH 12/19] chore: correcao da mensagem de documento alterado --- src/rn/ProcessoEletronicoRN.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 5ed0d5ad4..5b9eeecc2 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -603,13 +603,8 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $msg = "Não foi possível enviar o processo '".$protocolos->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; - foreach ($arrProtocolos as $index => $protocolo) { - if ($index != $protocolo->getNumSequencia()){ - $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); - $pos = $index + 1; - $sequencia = $protocolo->getNumSequencia() + 1; - $msg .= " A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; - } + if (count($arrProtocolos) > 0) { + $msg .= " Ex.: A ordem do documento ".$arrProtocolos[0]->getDblIdProtocolo2()." foi modificada na árvore do processo, mudando da posição 1 para a posição ".($arrProtocolos[0]->getDblIdProtocolo2() + 1)."."; } $msg .= " Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; From fa95cc502d559c1fe9793358313b56cca738dff8 Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Wed, 14 Jun 2023 10:32:54 -0300 Subject: [PATCH 13/19] chore: correcao da mensagem de documento alterado --- src/rn/ProcessoEletronicoRN.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 5b9eeecc2..01653d633 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -604,7 +604,7 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $msg = "Não foi possível enviar o processo '".$protocolos->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; if (count($arrProtocolos) > 0) { - $msg .= " Ex.: A ordem do documento ".$arrProtocolos[0]->getDblIdProtocolo2()." foi modificada na árvore do processo, mudando da posição 1 para a posição ".($arrProtocolos[0]->getDblIdProtocolo2() + 1)."."; + $msg .= " Ex.: A ordem do documento ".str_pad($arrProtocolos[0]->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT)." foi modificada na árvore do processo, mudando da posição 1 para a posição ".($arrProtocolos[0]->getNumSequencia() + 1)."."; } $msg .= " Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; From 9152cf3ac8d557d105223e62685fbd653d1bdce3 Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Wed, 14 Jun 2023 10:35:51 -0300 Subject: [PATCH 14/19] chore: correcao da mensagem de documento alterado --- src/rn/ProcessoEletronicoRN.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 01653d633..3be340885 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -603,8 +603,13 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $msg = "Não foi possível enviar o processo '".$protocolos->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; - if (count($arrProtocolos) > 0) { - $msg .= " Ex.: A ordem do documento ".str_pad($arrProtocolos[0]->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT)." foi modificada na árvore do processo, mudando da posição 1 para a posição ".($arrProtocolos[0]->getNumSequencia() + 1)."."; + foreach ($arrProtocolos as $index => $protocolo) { + if ($index != $protocolo->getNumSequencia() && $index == 0){ + $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); + $pos = $index + 1; + $sequencia = $protocolo->getNumSequencia() + 1; + $msg .= " A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; + } } $msg .= " Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; From 0014f0837a6ede36fd3cf16aad13a9c407968bac Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Thu, 22 Jun 2023 09:35:59 -0300 Subject: [PATCH 15/19] fix: correcao pr --- src/rn/ProcessoEletronicoRN.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 3be340885..3b920299f 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -589,7 +589,8 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $objProtocoloDTO = new RelProtocoloProtocoloDTO(); $objProtocoloDTO->setDblIdProtocolo1($objAtividadeDTO->getDblIdProtocolo()); $objProtocoloDTO->setOrd('IdRelProtocoloProtocolo', InfraDTO::$TIPO_ORDENACAO_ASC); - $objProtocoloDTO->retTodos(); + $objProtocoloDTO->retNumSequencia(); + $objProtocoloDTO->retDblIdProtocolo2(); $objProtocoloBD = new RelProtocoloProtocoloBD(BancoSEI::getInstance()); $arrProtocolos = $objProtocoloBD->listar($objProtocoloDTO); @@ -597,12 +598,13 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $objProtocoloDTO = new ProtocoloDTO(); $objProtocoloDTO->setDblIdProtocolo($objAtividadeDTO->getDblIdProtocolo()); $objProtocoloDTO->setOrd('IdProtocolo', InfraDTO::$TIPO_ORDENACAO_ASC); - $objProtocoloDTO->retTodos(); + $objProtocoloDTO->retDblIdProtocolo(); + $objProtocoloDTO->retStrProtocoloFormatado(); $objProtocoloBD = new ProtocoloBD(BancoSEI::getInstance()); - $protocolos = $objProtocoloBD->listar($objProtocoloDTO)[0]; + $protocolo = $objProtocoloBD->consultar($objProtocoloDTO); - $msg = "Não foi possível enviar o processo '".$protocolos->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; + $msg = "Não foi possível enviar o processo '".$protocolo->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; foreach ($arrProtocolos as $index => $protocolo) { if ($index != $protocolo->getNumSequencia() && $index == 0){ $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); From 5732ec3ad79b82e248e0e52e1dc81b97177a64d6 Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Thu, 29 Jun 2023 00:43:45 -0300 Subject: [PATCH 16/19] fix: correcao exibicao mensagem de alteracao de ordem de documento do processo --- src/rn/ProcessoEletronicoRN.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index 3b920299f..c15a11c18 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -606,11 +606,12 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $msg = "Não foi possível enviar o processo '".$protocolo->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; foreach ($arrProtocolos as $index => $protocolo) { - if ($index != $protocolo->getNumSequencia() && $index == 0){ + if ($index != $protocolo->getNumSequencia()){ $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); $pos = $index + 1; $sequencia = $protocolo->getNumSequencia() + 1; $msg .= " A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; + break; } } $msg .= " Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; From e81ff05fe2c8fee63c5e3f5df469d980528c0973 Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Mon, 17 Jul 2023 01:53:37 -0300 Subject: [PATCH 17/19] feat: mensagem excecao ao mudar ordem processo --- src/rn/ProcessoEletronicoRN.php | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/rn/ProcessoEletronicoRN.php b/src/rn/ProcessoEletronicoRN.php index c15a11c18..5e9c214ec 100755 --- a/src/rn/ProcessoEletronicoRN.php +++ b/src/rn/ProcessoEletronicoRN.php @@ -586,35 +586,9 @@ private function validarMudancaOrdemDocumentos($dblIdProcedimento, $strMensagem, $objAtividadeRN = new AtividadeRN(); $arrObjAtividadeDTO = $objAtividadeRN->contarRN0035($objAtividadeDTO); - $objProtocoloDTO = new RelProtocoloProtocoloDTO(); - $objProtocoloDTO->setDblIdProtocolo1($objAtividadeDTO->getDblIdProtocolo()); - $objProtocoloDTO->setOrd('IdRelProtocoloProtocolo', InfraDTO::$TIPO_ORDENACAO_ASC); - $objProtocoloDTO->retNumSequencia(); - $objProtocoloDTO->retDblIdProtocolo2(); - $objProtocoloBD = new RelProtocoloProtocoloBD(BancoSEI::getInstance()); - $arrProtocolos = $objProtocoloBD->listar($objProtocoloDTO); - - # PROTOCOLO - $objProtocoloDTO = new ProtocoloDTO(); - $objProtocoloDTO->setDblIdProtocolo($objAtividadeDTO->getDblIdProtocolo()); - $objProtocoloDTO->setOrd('IdProtocolo', InfraDTO::$TIPO_ORDENACAO_ASC); - $objProtocoloDTO->retDblIdProtocolo(); - $objProtocoloDTO->retStrProtocoloFormatado(); - $objProtocoloBD = new ProtocoloBD(BancoSEI::getInstance()); - $protocolo = $objProtocoloBD->consultar($objProtocoloDTO); - - - $msg = "Não foi possível enviar o processo '".$protocolo->getStrProtocoloFormatado()."' por meio do Tramita.GOV.BR, em decorrência de alteração da ordem de um ou mais documentos na árvore do processo. A seguir, a lista dos documentos com ordem alterada:"; - foreach ($arrProtocolos as $index => $protocolo) { - if ($index != $protocolo->getNumSequencia()){ - $documento = str_pad($protocolo->getDblIdProtocolo2(), 6, '0', STR_PAD_LEFT); - $pos = $index + 1; - $sequencia = $protocolo->getNumSequencia() + 1; - $msg .= " A ordem do documento $documento foi modificada na árvore do processo, mudando da posição $pos para a posição $sequencia."; - break; - } - } - $msg .= " Sugere-se desfazer as alterações acima listadas antes de realizar nova tentativa de trâmite. Mantenha sempre a ordem original dos documentos de processos recebidos pelo Tramita.GOV.BR, uma vez que sua instrução foi realizada por outro órgão. Tenha em mente que qualquer alteração nessa ordem pode impedir um novo trâmite do processo."; + $msg = "Houve uma alteração na ordem dos documentos no processo, o que impede o reenvio de um processo que já foi tramitado pela plataforma. ". + "Portanto, é recomendado reordenar os documentos de acordo com a ordem original. ". + "Caso você seja um usuário sem permissão para reordenar o processo, é necessário entrar em contato internamente para identificar quem possui essa permissão."; if ($arrObjAtividadeDTO > 0) { $strMensagem = str_replace( From 2157dd8b1c1b2e5c5375ca52414f7badd394e458 Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Fri, 4 Aug 2023 09:06:06 -0300 Subject: [PATCH 18/19] chore: descricao do teste --- .../src/paginas/PaginaReordenarProcesso.php | 17 +++++ .../funcional/tests/CenarioBaseTestCase.php | 2 + .../funcional/tests/ReordernarProcesso.php | 73 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 tests_super/funcional/src/paginas/PaginaReordenarProcesso.php create mode 100644 tests_super/funcional/tests/ReordernarProcesso.php diff --git a/tests_super/funcional/src/paginas/PaginaReordenarProcesso.php b/tests_super/funcional/src/paginas/PaginaReordenarProcesso.php new file mode 100644 index 000000000..960b58523 --- /dev/null +++ b/tests_super/funcional/src/paginas/PaginaReordenarProcesso.php @@ -0,0 +1,17 @@ +test->frame(null); + $this->test->frame("ifrVisualizacao"); + $this->test->byXPath(utf8_encode("//img[@alt='Ordenar Árvore do Processo']"))->click(); + } + + public function clicarReordenar() + { + $this->test->byId('imgRelProtocoloProtocoloReordenar')->click(); + } + +} \ No newline at end of file diff --git a/tests_super/funcional/tests/CenarioBaseTestCase.php b/tests_super/funcional/tests/CenarioBaseTestCase.php index 82cf70203..dc6efd164 100755 --- a/tests_super/funcional/tests/CenarioBaseTestCase.php +++ b/tests_super/funcional/tests/CenarioBaseTestCase.php @@ -38,6 +38,7 @@ class CenarioBaseTestCase extends Selenium2TestCase protected $paginaAnexarProcesso = null; protected $paginaCancelarDocumento = null; protected $paginaTramitarProcessoEmLote = null; + protected $paginaReordenarProcesso = null; public function setUpPage(): void { @@ -56,6 +57,7 @@ public function setUpPage(): void $this->paginaCancelarDocumento = new PaginaCancelarDocumento($this); $this->paginaMoverDocumento = new PaginaMoverDocumento($this); $this->paginaTramitarProcessoEmLote = new PaginaTramitarProcessoEmLote($this); + $this->paginaReordenarProcesso = new PaginaReordenarProcesso($this); $this->currentWindow()->maximize(); } diff --git a/tests_super/funcional/tests/ReordernarProcesso.php b/tests_super/funcional/tests/ReordernarProcesso.php new file mode 100644 index 000000000..6b922714b --- /dev/null +++ b/tests_super/funcional/tests/ReordernarProcesso.php @@ -0,0 +1,73 @@ +setSeleniumServerRequestsTimeout(6000); + + // Configuração do dados para teste do cenário + self::$remetente = $this->definirContextoTeste(CONTEXTO_ORGAO_A); + self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_B); + self::$processoTeste = $this->gerarDadosProcessoTeste(self::$remetente); + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + + + $this->assinarDocumentosInterno(self::$processoTeste, self::$documentosTeste, self::$remetente, self::$destinatario); + $this->abrirProcesso(self::$processoTeste["PROTOCOLO"]); + sleep(3); + $this->paginaReordenarProcesso->irParaPaginaMudarOrdem(); + $this->paginaReordenarProcesso->clicarReordenar(); + sleep(3); + $this->acceptAlert(); + $this->assertTrue(true); + } + + public function assinarDocumentosInterno(&$processoTeste, $documentosTeste, $remetente, $destinatario) + { + $orgaosDiferentes = $remetente['URL'] != $destinatario['URL']; + + // 1 - Acessar sistema do REMETENTE do processo + $this->acessarSistema($remetente['URL'], $remetente['SIGLA_UNIDADE'], $remetente['LOGIN'], $remetente['SENHA']); + + // 2 - Cadastrar novo processo de teste + if (isset($processoTeste['PROTOCOLO'])) { + $strProtocoloTeste = $processoTeste['PROTOCOLO']; + $this->abrirProcesso($strProtocoloTeste); + } else { + $strProtocoloTeste = $this->cadastrarProcesso($processoTeste); + $processoTeste['PROTOCOLO'] = $strProtocoloTeste; + } + + // 3 - Incluir Documentos no Processo + $documentosTeste = array_key_exists('TIPO', $documentosTeste) ? array($documentosTeste) : $documentosTeste; + foreach ($documentosTeste as $doc) { + $this->cadastrarDocumentoInterno($doc); + $this->assinarDocumento($remetente['ORGAO'], $remetente['CARGO_ASSINATURA'], $remetente['SENHA']); + } + } +} From 880005ea67fdccc7abe254857af1aa3e073e0ece Mon Sep 17 00:00:00 2001 From: Michael de Oliveira Ferreira Date: Thu, 28 Sep 2023 02:35:58 -0300 Subject: [PATCH 19/19] fix: test funcional --- .../funcional/tests/ReordernarProcesso.php | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests_super/funcional/tests/ReordernarProcesso.php b/tests_super/funcional/tests/ReordernarProcesso.php index 6b922714b..a22846082 100644 --- a/tests_super/funcional/tests/ReordernarProcesso.php +++ b/tests_super/funcional/tests/ReordernarProcesso.php @@ -70,4 +70,46 @@ public function assinarDocumentosInterno(&$processoTeste, $documentosTeste, $rem $this->assinarDocumento($remetente['ORGAO'], $remetente['CARGO_ASSINATURA'], $remetente['SENHA']); } } + + public function test_reordenar_processo_com_adicao_de_documento() + { + //Aumenta o tempo de timeout devido à quantidade de arquivos + $this->setSeleniumServerRequestsTimeout(6000); + + // Configuração do dados para teste do cenário + self::$remetente = $this->definirContextoTeste(CONTEXTO_ORGAO_A); + self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_B); + self::$processoTeste = $this->gerarDadosProcessoTeste(self::$remetente); + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + + + $this->assinarDocumentosInterno(self::$processoTeste, self::$documentosTeste, self::$remetente, self::$destinatario); + $this->abrirProcesso(self::$processoTeste["PROTOCOLO"]); + sleep(3); + $this->paginaReordenarProcesso->irParaPaginaMudarOrdem(); + $this->paginaReordenarProcesso->clicarReordenar(); + sleep(3); + $this->realizarTramiteExternoComValidacaoNoRemetente(self::$protocoloTeste, self::$documentosTeste, self::$remetente, self::$destinatario); + self::$protocoloTeste = self::$processoTeste["PROTOCOLO"]; + $this->sairSistema(); + + // Configuração do dados para teste do cenário + self::$remetente = $this->definirContextoTeste(CONTEXTO_ORGAO_B); + self::$destinatario = $this->definirContextoTeste(CONTEXTO_ORGAO_A); + self::$documentosTeste = []; + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + self::$documentosTeste[] = $this->gerarDadosDocumentoInternoTeste(self::$remetente); + $this->assinarDocumentosInterno(self::$processoTeste, self::$documentosTeste, self::$remetente, self::$destinatario); + + $this->abrirProcesso(self::$processoTeste["PROTOCOLO"]); + self::$processoTeste = self::$protocoloTeste["PROTOCOLO"]; + + sleep(3); + $this->paginaReordenarProcesso->irParaPaginaMudarOrdem(); + + + $this->assertTrue(true); + } }