From f55d89579e1fc8e36269d454c3a3b8b7ff8264d5 Mon Sep 17 00:00:00 2001 From: Guilherme Andrade Del Cantoni Date: Mon, 29 Apr 2019 20:02:49 -0300 Subject: [PATCH] [Fixed #97] Correção de problema na reutilização de NRE em cancelamentos --- dto/ComponenteDigitalDTO.php | 3 +++ rn/ExpedirProcedimentoRN.php | 46 ++++++++++++++++++++++++++++++---------------- rn/ProcessoEletronicoRN.php | 10 ++++------ rn/ReceberComponenteDigitalRN.php | 1 - rn/ReceberProcedimentoRN.php | 313 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------- verificar-servicos.sh | 43 ------------------------------------------- 6 files changed, 209 insertions(+), 207 deletions(-) delete mode 100644 verificar-servicos.sh diff --git a/dto/ComponenteDigitalDTO.php b/dto/ComponenteDigitalDTO.php index 1210268..534f1d4 100644 --- a/dto/ComponenteDigitalDTO.php +++ b/dto/ComponenteDigitalDTO.php @@ -28,11 +28,14 @@ class ComponenteDigitalDTO extends InfraDTO { $this->adicionarAtributoTabela(InfraDTO::$PREFIXO_NUM, 'Ordem', 'ordem'); $this->adicionarAtributoTabela(InfraDTO::$PREFIXO_STR, 'SinEnviar', 'sin_enviar'); + $this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_STR, 'StaTipoTramite', 'sta_tipo_tramite', 'md_pen_tramite'); $this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_NUM, 'TicketEnvioComponentes', 'ticket_envio_componentes', 'md_pen_tramite'); $this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_STR, 'ConteudoAssinaturaDocumento', 'conteudo_assinatura', 'documento_conteudo'); $this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_STR, 'ProtocoloDocumentoFormatado', 'protocolo_formatado', 'protocolo'); + $this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_STR, 'StaProtocolo', 'sta_protocolo', 'protocolo'); $this->adicionarAtributoTabelaRelacionada(InfraDTO::$PREFIXO_STR, 'StaEstadoProtocolo', 'sta_estado', 'protocolo'); + $this->configurarPK('NumeroRegistro', InfraDTO::$TIPO_PK_INFORMADO); $this->configurarPK('IdDocumento', InfraDTO::$TIPO_PK_INFORMADO); diff --git a/rn/ExpedirProcedimentoRN.php b/rn/ExpedirProcedimentoRN.php index a1f3ebc..d8fcf2f 100644 --- a/rn/ExpedirProcedimentoRN.php +++ b/rn/ExpedirProcedimentoRN.php @@ -365,31 +365,45 @@ class ExpedirProcedimentoRN extends InfraRN { //Obtenção do número de registro eletrônico do processo $strNumeroRegistro = null; - $objProcessoEletronicoBD = new ProcessoEletronicoBD($this->getObjInfraIBanco()); - $objProcessoEletronicoDTO = new ProcessoEletronicoDTO(); - $objProcessoEletronicoDTO->setDblIdProcedimento($objExpedirProcedimentoDTO->getDblIdProcedimento()); - //TODO: Tratar situao de quando localizado dois registros para o mesmo processo - $objProcessoEletronicoDTO->setNumMaxRegistrosRetorno(1); - $objProcessoEletronicoDTO->setOrd('IdProcedimento', InfraDTO::$TIPO_ORDENACAO_DESC); - $objProcessoEletronicoDTO->retStrNumeroRegistro(); - $objProcessoEletronicoDTO = $objProcessoEletronicoBD->consultar($objProcessoEletronicoDTO); - if(isset($objProcessoEletronicoDTO)) { - $strNumeroRegistro = $objProcessoEletronicoDTO->getStrNumeroRegistro(); + $objTramiteBD = new TramiteBD($this->getObjInfraIBanco()); + $objTramiteDTOFiltro = new TramiteDTO(); + $objTramiteDTOFiltro->retStrNumeroRegistro(); + $objTramiteDTOFiltro->setNumIdProcedimento($objExpedirProcedimentoDTO->getDblIdProcedimento()); + $objTramiteDTOFiltro->setOrdNumIdTramite(InfraDTO::$TIPO_ORDENACAO_DESC); + $objTramiteDTOFiltro->setNumMaxRegistrosRetorno(1); + + $objTramiteDTO = $objTramiteBD->consultar($objTramiteDTOFiltro); + if(isset($objTramiteDTO)) { + $strNumeroRegistro = $objTramiteDTO->getStrNumeroRegistro(); } // Consultar se processo eletrônico existe no PEN algum trâmite CANCELADO, caso // sim deve ser gerada uma nova NRE, pois a atual ser recusada pelo PEN quando // for enviado - /* if(!InfraString::isBolVazia($strNumeroRegistro)) { + if(!InfraString::isBolVazia($strNumeroRegistro)) { $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites(null, $strNumeroRegistro); - if(!empty($arrObjTramite) && is_array($arrObjTramite) && count($arrObjTramite) === 1) { - $objTramite = current($arrObjTramite); - if($objTramite->situacaoAtual == ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_CANCELADO || $objTramite->situacaoAtual == ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO){ + if(!empty($arrObjTramite) && is_array($arrObjTramite)) { + + $arrNumSituacoesTramiteEfetivado = array( + ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_ENVIADO_DESTINATARIO, + ProcessoeletronicoRN::$STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE, + ); + + $bolExisteTramiteConcluido = false; + foreach ($arrObjTramite as $objTramite) { + //Caso exista algum trâmite realizado com sucesso para outro destinatário, número do NRE precisa ser reutilizado + if(in_array($objTramite->situacaoAtual, $arrNumSituacoesTramiteEfetivado)){ + $bolExisteTramiteConcluido = true; + break; + } + } + + if(!$bolExisteTramiteConcluido){ $strNumeroRegistro = null; } } - } */ + } return $this->objProcessoEletronicoRN->construirCabecalho( $strNumeroRegistro, @@ -2241,7 +2255,7 @@ class ExpedirProcedimentoRN extends InfraRN { $tramite = $tramites ? $tramites[0] : null; if (!$tramite) { - throw new InfraException('Trâmite não encontrado para esse processo. '); + throw new InfraException("Trâmite não encontrado para esse processo. ({$objDtoProtocolo->getDblIdProtocolo()})"); } //Verifica se o trâmite est com o status de iniciado diff --git a/rn/ProcessoEletronicoRN.php b/rn/ProcessoEletronicoRN.php index 5312f03..cc707a0 100644 --- a/rn/ProcessoEletronicoRN.php +++ b/rn/ProcessoEletronicoRN.php @@ -918,9 +918,7 @@ class ProcessoEletronicoRN extends InfraRN { } $objTramitesEncontrados = $this->getObjPenWs()->consultarTramites($parametro); - if(isset($objTramitesEncontrados->tramitesEncontrados)) { - $arrObjTramite = $objTramitesEncontrados->tramitesEncontrados->tramite; if(!is_array($arrObjTramite)) { $arrObjTramite = array($objTramitesEncontrados->tramitesEncontrados->tramite); @@ -1455,10 +1453,10 @@ class ProcessoEletronicoRN extends InfraRN { $arrObjAtividadeDTO = $objAtividadeRN->listarRN0036($objAtividadeDTO); $numIdUnidade = SessaoSEI::getInstance()->getNumIdUnidadeAtual(); - //if(!empty($arrObjAtividadeDTO)){ - // $objAtividadeDTO = $arrObjAtividadeDTO[0]; - // $numIdUnidade = $objAtividadeDTO->getNumIdUnidade(); - //} + if(!empty($arrObjAtividadeDTO)){ + $objAtividadeDTO = $arrObjAtividadeDTO[0]; + $numIdUnidade = $objAtividadeDTO->getNumIdUnidade(); + } return $numIdUnidade; } diff --git a/rn/ReceberComponenteDigitalRN.php b/rn/ReceberComponenteDigitalRN.php index 27cb89c..87011f1 100644 --- a/rn/ReceberComponenteDigitalRN.php +++ b/rn/ReceberComponenteDigitalRN.php @@ -143,7 +143,6 @@ class ReceberComponenteDigitalRN extends InfraRN $objDocumentoDTO->setObjProtocoloDTO($objProtocoloDTO); $objProtocoloDTO->setArrObjAnexoDTO(array($parObjAnexoDTO)); - $objDocumentoDTO->setStrSinBloqueado('S'); $objDocumentoDTO = $objDocumentoRN->alterarRN0004($objDocumentoDTO); } } diff --git a/rn/ReceberProcedimentoRN.php b/rn/ReceberProcedimentoRN.php index 034c87a..dc1a181 100644 --- a/rn/ReceberProcedimentoRN.php +++ b/rn/ReceberProcedimentoRN.php @@ -94,7 +94,6 @@ class ReceberProcedimentoRN extends InfraRN $this->gravarLogDebug("Obtendo metadados dos componentes digitais do processo", 4); $arrAnexosComponentes = array(); $arrayHash = array(); - $arrayHashPendentes = array(); // Lista todos os componentes digitais presente no protocolo // Esta verificação é necessária pois existem situações em que a lista de componentes digitais @@ -111,30 +110,21 @@ class ReceberProcedimentoRN extends InfraRN $numOrdemComponente = $key + 1; if(!is_null($componentePendente)){ - - //Verifica se o componente já foi recebido - $bolComponenteDigitalRegistrado = $this->documentoJaRegistrado($strNumeroRegistro, $parNumIdentificacaoTramite, $componentePendente); - if(!$bolComponenteDigitalRegistrado){ - $arrayHashPendentes[] = $componentePendente; - } - + //TODO: Necessário otimizar trecho abaixo para evitar download desnecessário de documentos //TODO: Download do componente digital é realizado, mesmo já existindo na base de dados, devido a comportamento obrigatório do Barramento para mudança de status //Ajuste deverá ser feito em versões futuas $arrayHash[] = $componentePendente; - if(!$bolComponenteDigitalRegistrado || in_array($componentePendente, $arrHashPendentesDownload)) { - //Obter os dados do componente digital - $this->gravarLogDebug("Baixando componente digital $numOrdemComponente", 6); - $objComponenteDigital = $this->objProcessoEletronicoRN->receberComponenteDigital($parNumIdentificacaoTramite, $componentePendente, $objTramite->protocolo); - $arrAnexosComponentes[$key][$componentePendente] = $this->objReceberComponenteDigitalRN->copiarComponenteDigitalPastaTemporaria($objComponenteDigital); - $arrAnexosComponentes[$key]['recebido'] = false; - - //Valida a integridade do hash - $this->gravarLogDebug("Validando integridade de componente digital $numOrdemComponente", 6); - $this->objReceberComponenteDigitalRN->validarIntegridadeDoComponenteDigital($arrAnexosComponentes[$key][$componentePendente], $componentePendente, $parNumIdentificacaoTramite); - } else { - $this->gravarLogDebug("Componente digital $numOrdemComponente desconsiderado por já fazer parte do processo", 6); - } + //Obter os dados do componente digital + $this->gravarLogDebug("Baixando componente digital $numOrdemComponente", 6); + $objComponenteDigital = $this->objProcessoEletronicoRN->receberComponenteDigital($parNumIdentificacaoTramite, $componentePendente, $objTramite->protocolo); + $arrAnexosComponentes[$key][$componentePendente] = $this->objReceberComponenteDigitalRN->copiarComponenteDigitalPastaTemporaria($objComponenteDigital); + $arrAnexosComponentes[$key]['recebido'] = false; + + //Valida a integridade do hash + $this->gravarLogDebug("Validando integridade de componente digital $numOrdemComponente", 6); + $this->objReceberComponenteDigitalRN->validarIntegridadeDoComponenteDigital($arrAnexosComponentes[$key][$componentePendente], + $componentePendente, $parNumIdentificacaoTramite); } } @@ -154,13 +144,11 @@ class ReceberProcedimentoRN extends InfraRN } $this->gravarLogDebug("Persistindo/atualizando dados do processo com NRE " . $strNumeroRegistro, 4); - $objProcedimentoDTO = $this->registrarProcesso( + list($objProcedimentoDTO, $bolProcedimentoExistente) = $this->registrarProcesso( $strNumeroRegistro, $parNumIdentificacaoTramite, $objProcesso, - $objMetadadosProcedimento, - $arrayHash, - $arrayHashPendentes); + $objMetadadosProcedimento); // @join_tec US008.08 (#23092) $this->objProcedimentoAndamentoRN->setOpts($strNumeroRegistro, $parNumIdentificacaoTramite, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_RECEBIDO), $objProcedimentoDTO->getDblIdProcedimento()); @@ -194,7 +182,9 @@ class ReceberProcedimentoRN extends InfraRN $this->atribuirComponentesDigitaisAosDocumentos($objProcedimentoDTO, $strNumeroRegistro, $parNumIdentificacaoTramite, $arrayHash, $arrayHashPendentes); //Finalizar o envio do documento para a respectiva unidade - $this->enviarProcedimentoUnidade($objProcedimentoDTO); + $this->enviarProcedimentoUnidade($objProcedimentoDTO, null, $bolProcedimentoExistente); + + $this->validarPosCondicoesTramite($objMetadadosProcedimento->metadados, $objProcedimentoDTO); $this->gravarLogDebug("Enviando recibo de conclusão do trâmite $parNumIdentificacaoTramite", 6); $objEnviarReciboTramiteRN = new EnviarReciboTramiteRN(); @@ -215,14 +205,12 @@ class ReceberProcedimentoRN extends InfraRN /** * Método responsável por atribuir a lista de componentes digitais baixados do PEN aos seus respectivos documentos no SEI * - * @param ProcedimentoDTO $parObjProcedimentoDTO Protocolo que está sendo recebido pelo SEI - * @param Array $parArrHashComponentesPendentes Lista de componentes pendentes para vinculação aos documentos * @return [type] [description] */ private function atribuirComponentesDigitaisAosDocumentos(ProcedimentoDTO $parObjProcedimentoDTO, $parStrNumeroRegistro, $parNumIdentificacaoTramite, - $parArrHashComponentes, $parArrHashComponentesPendentes) + $parArrHashComponentes) { - if(count($parArrHashComponentesPendentes) > 0){ + if(count($parArrHashComponentes) > 0){ //Obter dados dos componetes digitais $this->gravarLogDebug("Iniciando o recebimento dos componentes digitais pendentes", 4); $objComponenteDigitalDTO = new ComponenteDigitalDTO(); @@ -230,6 +218,7 @@ class ReceberProcedimentoRN extends InfraRN $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); $objComponenteDigitalDTO->setStrHashConteudo($parArrHashComponentes, InfraDTO::$OPER_IN); $objComponenteDigitalDTO->setOrdNumOrdem(InfraDTO::$TIPO_ORDENACAO_ASC); + $objComponenteDigitalDTO->retDblIdProcedimento(); $objComponenteDigitalDTO->retDblIdDocumento(); $objComponenteDigitalDTO->retNumTicketEnvioComponentes(); $objComponenteDigitalDTO->retStrProtocoloDocumentoFormatado(); @@ -243,33 +232,27 @@ class ReceberProcedimentoRN extends InfraRN $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); $arrObjComponentesDigitaisDTO = $objComponenteDigitalBD->listar($objComponenteDigitalDTO); - if ($objComponenteDigitalBD->contar($objComponenteDigitalDTO) > 0) { - //Esta unidade deverá ser considerada para posterior desbloqueio do processo e reabertura - $numIdUnidade = ProcessoEletronicoRN::obterUnidadeParaRegistroDocumento($parObjProcedimentoDTO->getDblIdProcedimento()); - SessaoSEI::getInstance()->setNumIdUnidadeAtual($numIdUnidade); + if(!empty($arrObjComponentesDigitaisDTO)){ - try{ - $arrStrNomeDocumento = $this->listarMetaDadosComponentesDigitais($objProcesso); - foreach($arrObjComponentesDigitaisDTO as $objComponenteDigitalDTOEnviado) { - if($objComponenteDigitalDTOEnviado->getStrStaEstadoProtocolo() != ProtocoloRN::$TE_DOCUMENTO_CANCELADO){ - $strHash = $objComponenteDigitalDTOEnviado->getStrHashConteudo(); - $strNomeDocumento = array_key_exists($strHash, $arrStrNomeDocumento) ? $arrStrNomeDocumento[$strHash]['especieNome'] : '[Desconhecido]'; + $arrStrNomeDocumento = $this->listarMetaDadosComponentesDigitais($objProcesso); + foreach($arrObjComponentesDigitaisDTO as $objComponenteDigitalDTOEnviado) { + if($objComponenteDigitalDTOEnviado->getStrStaEstadoProtocolo() != ProtocoloRN::$TE_DOCUMENTO_CANCELADO){ - //Todo: Parei aqui: Verificar se documento já foi recebido anteriormente para poder registrar - //Alterar somente de documentos não bloqueados + $dblIdProcedimento = $objComponenteDigitalDTOEnviado->getDblIdProcedimento(); + $dblIdDocumento = $objComponenteDigitalDTOEnviado->getDblIdDocumento(); + $strHash = $objComponenteDigitalDTOEnviado->getStrHashConteudo(); + + //Verificar se documento já foi recebido anteriormente para poder registrar + if($this->documentosPendenteRegistro($dblIdProcedimento, $dblIdDocumento, $strHash)){ + $strNomeDocumento = array_key_exists($strHash, $arrStrNomeDocumento) ? $arrStrNomeDocumento[$strHash]['especieNome'] : '[Desconhecido]'; $this->objReceberComponenteDigitalRN->receberComponenteDigital($objComponenteDigitalDTOEnviado); $strMensagemRecebimento = sprintf('Recebendo %s %s', $strNomeDocumento, $objComponenteDigitalDTOEnviado->getStrProtocoloDocumentoFormatado()); $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento($strMensagemRecebimento, 'S')); $this->gravarLogDebug($strMensagemRecebimento, 6); } } - } finally { - $objPenParametroRN = new PenParametroRN(); - $numUnidadeReceptora = $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'); - SessaoSEI::getInstance()->setNumIdUnidadeAtual($numUnidadeReceptora); } - // @join_tec US008.10 (#23092) $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Todos os componentes digitais foram recebidos', 'S')); }else{ $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Nenhum componente digital para receber', 'S')); @@ -438,8 +421,7 @@ class ReceberProcedimentoRN extends InfraRN } - private function registrarProcesso($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProcesso, $parObjMetadadosProcedimento, - $parArrHashComponentes, $parArrHashComponentesPendentes) + private function registrarProcesso($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProcesso, $parObjMetadadosProcedimento) { // Validação dos dados do processo recebido $objInfraException = new InfraException(); @@ -453,17 +435,15 @@ class ReceberProcedimentoRN extends InfraRN //Verificar se procedimento já existia na base de dados do sistema $dblIdProcedimento = $this->consultarProcedimentoExistente($parStrNumeroRegistro, $parObjProcesso->protocolo); + $bolProcedimentoExistente = isset($dblIdProcedimento); - if(isset($dblIdProcedimento)){ - $objProcedimentoDTO = $this->atualizarProcedimento($dblIdProcedimento, $parObjMetadadosProcedimento, $parObjProcesso, $parNumIdentificacaoTramite, $parArrHashComponentes, $parArrHashComponentesPendentes); + if($bolProcedimentoExistente){ + $objProcedimentoDTO = $this->atualizarProcedimento($dblIdProcedimento, $parObjMetadadosProcedimento, $parObjProcesso, $parNumIdentificacaoTramite); } else { - $objProcedimentoDTO = $this->gerarProcedimento($parObjMetadadosProcedimento, $parObjProcesso, $parNumIdentificacaoTramite, $parArrHashComponentes, $parArrHashComponentesPendentes); + $objProcedimentoDTO = $this->gerarProcedimento($parObjMetadadosProcedimento, $parObjProcesso, $parNumIdentificacaoTramite); } - //TODO: Fazer o envio de cada um dos procedimentos apensados (Processo principal e seus apensados, caso exista) - //... - //Chamada recursiva para registro dos processos apensados if(isset($objProcesso->processoApensado)) { if(!is_array($objProcesso->processoApensado)) { @@ -475,7 +455,7 @@ class ReceberProcedimentoRN extends InfraRN } } - return $objProcedimentoDTO; + return array($objProcedimentoDTO, $bolProcedimentoExistente); } private function tramiteRecebimentoRegistrado($parStrNumeroRegistro, $parNumIdentificacaoTramite) @@ -489,18 +469,6 @@ class ReceberProcedimentoRN extends InfraRN } - private function documentoJaRegistrado($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parStrHashComponenteDigital) - { - //Verifica se componente digital já está registrado para o documento - $objComponenteDigitalDTO = new ComponenteDigitalDTO(); - $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); - $objComponenteDigitalDTO->setStrHashConteudo($parStrHashComponenteDigital); - $objComponenteDigitalDTO->setNumIdAnexo(null, InfraDTO::$OPER_DIFERENTE); - - $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); - return $objComponenteDigitalBD->contar($objComponenteDigitalDTO) > 0; - } - private function consultarProcedimentoExistente($parStrNumeroRegistro, $parStrProtocolo = null) { @@ -520,7 +488,7 @@ class ReceberProcedimentoRN extends InfraRN return $dblIdProcedimento; } - private function atualizarProcedimento($parDblIdProcedimento, $objMetadadosProcedimento, $objProcesso, $parNumIdTramite, $parArrHashComponentes, $parArrHashComponentesPendentes) + private function atualizarProcedimento($parDblIdProcedimento, $objMetadadosProcedimento, $objProcesso, $parNumIdTramite) { if(!isset($parDblIdProcedimento)){ throw new InfraException('Parâmetro $parDblIdProcedimento não informado.'); @@ -530,7 +498,6 @@ class ReceberProcedimentoRN extends InfraRN throw new InfraException('Parâmetro $objMetadadosProcedimento não informado.'); } - if ($this->destinatarioReal) { $objDestinatario = $this->destinatarioReal; } else { @@ -542,6 +509,8 @@ class ReceberProcedimentoRN extends InfraRN $numIdUnidade = ProcessoEletronicoRN::obterUnidadeParaRegistroDocumento($parDblIdProcedimento); SessaoSEI::getInstance()->setNumIdUnidadeAtual($numIdUnidade); + $objPenParametroRN = new PenParametroRN(); + try { $objSeiRN = new SeiRN(); $objAtividadeDTO = new AtividadeDTO(); @@ -567,49 +536,49 @@ class ReceberProcedimentoRN extends InfraRN $objProcedimentoRN = new ProcedimentoRN(); $objProcedimentoDTO = $objProcedimentoRN->consultarRN0201($objProcedimentoDTO); - $this->registrarAndamentoRecebimentoProcesso($objProcedimentoDTO, $objMetadadosProcedimento); - if($flgReabrir){ $objEntradaReabrirProcessoAPI = new EntradaReabrirProcessoAPI(); $objEntradaReabrirProcessoAPI->setIdProcedimento($parDblIdProcedimento); $objSeiRN->reabrirProcesso($objEntradaReabrirProcessoAPI); } - //Cadastro das atividades para quando o destinatário é desviado pelo receptor (!3!) - if ($this->destinatarioReal->numeroDeIdentificacaoDaEstrutura) { - $this->gerarAndamentoUnidadeReceptora($parDblIdProcedimento); - } - ProcessoEletronicoRN::desbloquearProcesso($parDblIdProcedimento); - //TODO: Obter código da unidade através de mapeamento entre SEI e Barramento - $objUnidadeDTO = $this->atribuirDadosUnidade($objProcedimentoDTO, $objDestinatario); + $numUnidadeReceptora = $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'); + $this->enviarProcedimentoUnidade($objProcedimentoDTO, $numUnidadeReceptora); + + } finally { + $numUnidadeReceptora = $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'); + SessaoSEI::getInstance()->setNumIdUnidadeAtual($numUnidadeReceptora); + } - $this->atribuirDocumentos($objProcedimentoDTO, $objProcesso, $objUnidadeDTO, $objMetadadosProcedimento); + $this->registrarAndamentoRecebimentoProcesso($objProcedimentoDTO, $objMetadadosProcedimento); - $this->registrarProcedimentoNaoVisualizado($objProcedimentoDTO); + //Cadastro das atividades para quando o destinatário é desviado pelo receptor (!3!) + if ($this->destinatarioReal->numeroDeIdentificacaoDaEstrutura) { + $this->gerarAndamentoUnidadeReceptora($parDblIdProcedimento); + } - //TODO: Avaliar necessidade de restringir referência circular entre processos - //TODO: Registrar que o processo foi recebido com outros apensados. Necessário para posterior reenvio - $this->atribuirProcessosApensados($objProcedimentoDTO, $objProcesso->processoApensado); + //TODO: Obter código da unidade através de mapeamento entre SEI e Barramento + $objUnidadeDTO = $this->atribuirDadosUnidade($objProcedimentoDTO, $objDestinatario); - //Realiza a alteração dos metadados do processo - //TODO: Implementar alteração de todos os metadados - $this->alterarMetadadosProcedimento($objProcedimentoDTO->getDblIdProcedimento(), $objProcesso); + $this->atribuirDocumentos($objProcedimentoDTO, $objProcesso, $objUnidadeDTO, $objMetadadosProcedimento); - //Finaliza o envio do documento para a respectiva unidade - //$this->enviarProcedimentoUnidade($objProcedimentoDTO, true); + $this->registrarProcedimentoNaoVisualizado($objProcedimentoDTO); - return $objProcedimentoDTO; + //TODO: Avaliar necessidade de restringir referência circular entre processos + //TODO: Registrar que o processo foi recebido com outros apensados. Necessário para posterior reenvio + $this->atribuirProcessosApensados($objProcedimentoDTO, $objProcesso->processoApensado); - } finally { - $objPenParametroRN = new PenParametroRN(); - $numUnidadeReceptora = $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'); - SessaoSEI::getInstance()->setNumIdUnidadeAtual($numUnidadeReceptora); - } - } + //Realiza a alteração dos metadados do processo + //TODO: Implementar alteração de todos os metadados + $this->alterarMetadadosProcedimento($objProcedimentoDTO->getDblIdProcedimento(), $objProcesso); + //Finaliza o envio do documento para a respectiva unidade + //$this->enviarProcedimentoUnidade($objProcedimentoDTO, true); + return $objProcedimentoDTO; + } private function gerarAndamentoUnidadeReceptora($parNumIdProcedimento) @@ -643,7 +612,7 @@ class ReceberProcedimentoRN extends InfraRN $objAtividadeRN->gerarInternaRN0727($objAtividadeDTO); } - private function gerarProcedimento($objMetadadosProcedimento, $objProcesso, $parNumIdTramite, $parArrHashComponentes, $parArrHashComponentesPendentes) + private function gerarProcedimento($objMetadadosProcedimento, $objProcesso, $parNumIdTramite) { if(!isset($objMetadadosProcedimento)){ throw new InfraException('Parâmetro $objMetadadosProcedimento não informado.'); @@ -791,18 +760,8 @@ class ReceberProcedimentoRN extends InfraRN $objProtocoloDTO->setNumIdHipoteseLegal($this->obterHipoteseLegalSEI($parObjMetadadoProcedimento->hipoteseLegal->identificacao)); } - //Esta unidade deverá ser considerada para posterior desbloqueio do processo e reabertura - $numIdUnidade = ProcessoEletronicoRN::obterUnidadeParaRegistroDocumento($parNumIdProcedimento); - SessaoSEI::getInstance()->setNumIdUnidadeAtual($numIdUnidade); - - try{ - $objProtocoloRN = new ProtocoloRN(); - $objProtocoloRN->alterarRN0203($objProtocoloDTO); - } finally { - $objPenParametroRN = new PenParametroRN(); - $numUnidadeReceptora = $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'); - SessaoSEI::getInstance()->setNumIdUnidadeAtual($numUnidadeReceptora); - } + $objProtocoloRN = new ProtocoloRN(); + $objProtocoloRN->alterarRN0203($objProtocoloDTO); } private function alterarMetadadosDocumento($parNumIdProcedimento, $parNumIdDocumento, $parObjMetadadoDocumento) @@ -816,18 +775,8 @@ class ReceberProcedimentoRN extends InfraRN $objProtocoloDTO->setNumIdHipoteseLegal($this->obterHipoteseLegalSEI($parObjMetadadoDocumento->hipoteseLegal->identificacao)); } - //Esta unidade deverá ser considerada para posterior desbloqueio do processo e reabertura - $numIdUnidade = ProcessoEletronicoRN::obterUnidadeParaRegistroDocumento($parNumIdProcedimento); - SessaoSEI::getInstance()->setNumIdUnidadeAtual($numIdUnidade); - - try{ - $objProtocoloRN = new ProtocoloRN(); - $objProtocoloRN->alterarRN0203($objProtocoloDTO); - } finally { - $objPenParametroRN = new PenParametroRN(); - $numUnidadeReceptora = $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO'); - SessaoSEI::getInstance()->setNumIdUnidadeAtual($numUnidadeReceptora); - } + $objProtocoloRN = new ProtocoloRN(); + $objProtocoloRN->alterarRN0203($objProtocoloDTO); } @@ -1203,16 +1152,17 @@ class ReceberProcedimentoRN extends InfraRN $objAtividadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); //TODO: Possivelmente, essa regra é desnecessária já que o processo pode ser enviado para outra unidade do órgão através da expedição - $objAtividadeRN = new AtividadeRN(); - if ($objAtividadeRN->contarRN0035($objAtividadeDTO) == 0) { - throw new InfraException('Unidade '.$objUnidadeDTO->getStrSigla().' não possui acesso ao Procedimento '.$objProcedimentoDTO->getStrProtocoloProcedimentoFormatado().'.'); - } + //$objAtividadeRN = new AtividadeRN(); + //if ($objAtividadeRN->contarRN0035($objAtividadeDTO) == 0) { + // throw new InfraException('Unidade '.$objUnidadeDTO->getStrSigla().' não possui acesso ao Procedimento '.$objProcedimentoDTO->getStrProtocoloProcedimentoFormatado().'.'); + //} $objAtividadeDTO = new AtividadeDTO(); $objAtividadeDTO->setDblIdProtocolo($objDocumentoDTO->getDblIdProcedimento()); $objAtividadeDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); $objAtividadeDTO->setDthConclusao(null); + $objAtividadeRN = new AtividadeRN(); if ($objAtividadeRN->contarRN0035($objAtividadeDTO) == 0) { $objReabrirProcessoDTO = new ReabrirProcessoDTO(); $objReabrirProcessoDTO->setDblIdProcedimento($objDocumentoDTO->getDblIdProcedimento()); @@ -1555,23 +1505,34 @@ class ReceberProcedimentoRN extends InfraRN $objAtividadeRN->atualizarVisualizacao($objAtividadeDTOVisualizacao); } - private function enviarProcedimentoUnidade(ProcedimentoDTO $parObjProcedimentoDTO, $retransmissao = false) + private function enviarProcedimentoUnidade(ProcedimentoDTO $parObjProcedimentoDTO, $parUnidadeDestino=null, $retransmissao=false) { $objAtividadeRN = new PenAtividadeRN(); + $objPenParametroRN = new PenParametroRN(); $objInfraException = new InfraException(); - if(!$parObjProcedimentoDTO->isSetArrObjUnidadeDTO() || count($parObjProcedimentoDTO->getArrObjUnidadeDTO()) == 0) { - $objInfraException->lancarValidacao('Unidade de destino do processo não informada.'); - } + $strEnviaEmailNotificacao = 'N'; + $numIdUnidade = $parUnidadeDestino; - $arrObjUnidadeDTO = $parObjProcedimentoDTO->getArrObjUnidadeDTO(); + //Caso a unidade de destino não tenha sido informada, considerar as unidades atribuídas ao processo + if(is_null($numIdUnidade)){ + if(!$parObjProcedimentoDTO->isSetArrObjUnidadeDTO() || count($parObjProcedimentoDTO->getArrObjUnidadeDTO()) == 0) { + $objInfraException->lancarValidacao('Unidade de destino do processo não informada.'); + } - if(count($parObjProcedimentoDTO->getArrObjUnidadeDTO()) > 1) { - $objInfraException->lancarValidacao('Não permitido a indicação de múltiplas unidades de destino para um processo recebido externamente.'); + $arrObjUnidadeDTO = $parObjProcedimentoDTO->getArrObjUnidadeDTO(); + if(count($parObjProcedimentoDTO->getArrObjUnidadeDTO()) > 1) { + $objInfraException->lancarValidacao('Não permitido a indicação de múltiplas unidades de destino para um processo recebido externamente.'); + } + + $arrObjUnidadeDTO = array_values($parObjProcedimentoDTO->getArrObjUnidadeDTO()); + $objUnidadeDTO = $arrObjUnidadeDTO[0]; + $numIdUnidade = $objUnidadeDTO->getNumIdUnidade(); + + //Somente considera regra de envio de e-mail para unidades vinculadas ao processo + $strEnviaEmailNotificacao = $objPenParametroRN->getParametro('PEN_ENVIA_EMAIL_NOTIFICACAO_RECEBIMENTO'); } - $arrObjUnidadeDTO = array_values($parObjProcedimentoDTO->getArrObjUnidadeDTO()); - $objUnidadeDTO = $arrObjUnidadeDTO[0]; $objProcedimentoDTO = new ProcedimentoDTO(); $objProcedimentoDTO->retDblIdProcedimento(); @@ -1580,7 +1541,8 @@ class ReceberProcedimentoRN extends InfraRN $objProcedimentoDTO->retNumIdTipoProcedimento(); $objProcedimentoDTO->retStrNomeTipoProcedimento(); $objProcedimentoDTO->retStrStaNivelAcessoGlobalProtocolo(); - $objProcedimentoDTO->setStrProtocoloProcedimentoFormatado($parObjProcedimentoDTO->getStrProtocoloProcedimentoFormatado()); + $objProcedimentoDTO->setDblIdProcedimento($parObjProcedimentoDTO->getDblIdProcedimento()); + $objProcedimentoRN = new ProcedimentoRN(); $objProcedimentoDTO = $objProcedimentoRN->consultarRN0201($objProcedimentoDTO); @@ -1592,7 +1554,7 @@ class ReceberProcedimentoRN extends InfraRN if ($objProcedimentoDTO->getStrStaNivelAcessoGlobalProtocolo()==ProtocoloRN::$NA_RESTRITO) { $objAcessoDTO = new AcessoDTO(); $objAcessoDTO->setDblIdProtocolo($objProcedimentoDTO->getDblIdProcedimento()); - $objAcessoDTO->setNumIdUnidade($objUnidadeDTO->getNumIdUnidade()); + $objAcessoDTO->setNumIdUnidade($numIdUnidade); $objAcessoRN = new AcessoRN(); if ($objAcessoRN->contar($objAcessoDTO)==0) { @@ -1628,7 +1590,6 @@ class ReceberProcedimentoRN extends InfraRN $objInfraException->lancarValidacoes(); - $objEnviarProcessoDTO = new EnviarProcessoDTO(); $objEnviarProcessoDTO->setArrAtividadesOrigem($arrObjProcedimentoDTO[0]->getArrObjAtividadeDTO()); @@ -1636,14 +1597,11 @@ class ReceberProcedimentoRN extends InfraRN $objAtividadeDTO->setDblIdProtocolo($objProcedimentoDTO->getDblIdProcedimento()); $objAtividadeDTO->setNumIdUsuario(null); $objAtividadeDTO->setNumIdUsuarioOrigem(SessaoSEI::getInstance()->getNumIdUsuario()); - $objAtividadeDTO->setNumIdUnidade($objUnidadeDTO->getNumIdUnidade()); + $objAtividadeDTO->setNumIdUnidade($numIdUnidade); $objAtividadeDTO->setNumIdUnidadeOrigem(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); $objEnviarProcessoDTO->setArrAtividades(array($objAtividadeDTO)); - $objPenParametroRN = new PenParametroRN(); - $objEnviarProcessoDTO->setStrSinManterAberto('N'); - $strEnviaEmailNotificacao = $objPenParametroRN->getParametro('PEN_ENVIA_EMAIL_NOTIFICACAO_RECEBIMENTO'); $objEnviarProcessoDTO->setStrSinEnviarEmailNotificacao($strEnviaEmailNotificacao); $objEnviarProcessoDTO->setStrSinRemoverAnotacoes('S'); $objEnviarProcessoDTO->setDtaPrazo(null); @@ -1894,4 +1852,77 @@ class ReceberProcedimentoRN extends InfraRN InfraDebug::getInstance()->gravar($strLog); } + + /** + * Verifica se existe documentos com pendência de download de seus componentes digitais + * @param [type] $parNumIdProcedimento Identificador do processo + * @param [type] $parNumIdDocumento Identificador do documento + * @param [type] $parStrHashComponenteDigital Hash do componente digital + * @return [type] Indicação se existe pendência ou não + */ + private function documentosPendenteRegistro($parNumIdProcedimento, $parNumIdDocumento=null, $parStrHashComponenteDigital=null) + { + //Valida se algum documento ficou sem seus respectivos componentes digitais + $sql = "select doc.id_documento as id_documento, comp.hash_conteudo as hash_conteudo + from procedimento proc join documento doc on (doc.id_procedimento = proc.id_procedimento) + join protocolo prot_doc on (doc.id_documento = prot_doc.id_protocolo) + left join md_pen_componente_digital comp on (comp.id_documento = doc.id_documento) + where proc.id_procedimento = $parNumIdProcedimento and prot_doc.sta_protocolo = 'R' and + not exists (select 1 from anexo where anexo.id_protocolo = prot_doc.id_protocolo) "; + + //Adiciona filtro adicional para verificar pelo identificador do documento, caso parâmetro tenha sido informado + if(!is_null($parNumIdDocumento)){ + $sql .= " and doc.id_documento = $parNumIdDocumento"; + } + + $recordset = $this->getObjInfraIBanco()->consultarSql($sql); + + $bolDocumentoPendente = !empty($recordset); + + //Verifica especificamente um determinado hash através da verificação do hash do componente, caso parâmetro tenha sido informado + if($bolDocumentoPendente && !is_null($parStrHashComponenteDigital)) { + foreach ($recordset as $item) { + if(!is_null($item['hash_conteudo']) && $item['hash_conteudo'] === $parStrHashComponenteDigital){ + $bolDocumentoPendente = true; + return $bolDocumentoPendente; + } + } + + $bolDocumentoPendente = false; + } + + return $bolDocumentoPendente; + } + + /** + * Validação de pós condições para garantir que nenhuma inconsistência foi identificada no recebimento do processo + * + * @param [type] $parObjMetadadosProcedimento Metadados do Protocolo + * @param [type] $parObjProcedimentoDTO Dados do Processo gerado no recebimento + */ + private function validarPosCondicoesTramite($parObjMetadadosProcedimento, $parObjProcedimentoDTO) + { + $strMensagemPadrao = "Inconsistência identificada no recebimento de processo: \n"; + $strMensagemErro = ""; + + //Valida se metadados do trâmite e do protocolo foram identificado + if(is_null($parObjMetadadosProcedimento)){ + $strMensagemErro = "- Metadados do trâmite não identificado. \n"; + } + + //Valida se metadados do trâmite e do protocolo foram identificado + if(is_null($parObjProcedimentoDTO)){ + $strMensagemErro = "- Dados do processo não identificados \n"; + } + + //Valida se algum documento ficou sem seus respectivos componentes digitais + if($this->documentosPendenteRegistro($parObjProcedimentoDTO->getDblIdProcedimento())){ + $strProtocoloFormatado = $parObjProcedimentoDTO->getStrProtocoloProcedimentoFormatado(); + $strMensagemErro = "- Componente digital de pelo menos um dos documentos do processo [$strProtocoloFormatado] não pode ser recebido. \n"; + } + + if(!InfraString::isBolVazia($strMensagemErro)){ + throw new InfraException($strMensagemPadrao . $strMensagemErro); + } + } } diff --git a/verificar-servicos.sh b/verificar-servicos.sh deleted file mode 100644 index ad9893c..0000000 --- a/verificar-servicos.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -PATH=/usr/bin:/sbin:/bin:/usr/sbin -export PATH - -GEARMAN=$(ls /etc/init.d | grep -owih gearman.*) -if [[ -z $GEARMAN ]]; then - echo "ERROR: Instalação do Gearman não pode ser localizada." - exit 1 -else - ps cax | grep -ih gearman.* > /dev/null - if [ $? -ne 0 ]; then - echo "Gearman: Iniciando serviço de gerenciamento de fila de tarefas..." - /etc/init.d/$GEARMAN start; - fi -fi - -SUPERVISOR=$(ls /etc/init.d | grep -owih supervisor.*) -if [[ -z $SUPERVISOR ]]; then - echo "ERROR: Instalação do Supervisor não pode ser localizada." - exit 1 -else - ps cax | grep -ih supervisor.* > /dev/null - if [ $? -ne 0 ]; then - echo "Supervisor: Iniciando serviço de monitoramento dos processos de integração..." - /etc/init.d/$SUPERVISOR start; - else - - COMMAND=$(ps -C php -f | grep -o "PendenciasTramiteRN.php"); - if [ -z "$COMMAND" ]; then - echo "Supervisor: Reiniciando serviço de monitoramento dos processos de integração..." - /etc/init.d/$SUPERVISOR stop; - /etc/init.d/$SUPERVISOR start; - fi - - COMMAND=$(ps -C php -f | grep -o "ProcessarPendenciasRN.php"); - if [ -z "$COMMAND" ]; then - echo "Supervisor: Reiniciando serviço de monitoramento dos processos de integração..." - /etc/init.d/$SUPERVISOR stop; - /etc/init.d/$SUPERVISOR start; - fi - fi -fi -- libgit2 0.21.2