From b7e118b8376d9bc43fefbbbb7747dc375263e123 Mon Sep 17 00:00:00 2001 From: Guilherme Cantoni Date: Wed, 17 Apr 2019 21:04:07 -0300 Subject: [PATCH] [Fixed #93] Erro no envio de recibo durante reprocessamento de status 3 --- PENIntegracao.php | 2 +- rn/ProcessarPendenciasRN.php | 4 ++-- rn/ProcessoEletronicoRN.php | 11 ++++++----- rn/ReceberProcedimentoRN.php | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 60 insertions(+), 19 deletions(-) diff --git a/PENIntegracao.php b/PENIntegracao.php index 07994bf..11f2a81 100644 --- a/PENIntegracao.php +++ b/PENIntegracao.php @@ -11,7 +11,7 @@ class PENIntegracao extends SeiIntegracao { } public function getVersao() { - return '1.2.0'; + return '1.2.2'; } public function getInstituicao() { diff --git a/rn/ProcessarPendenciasRN.php b/rn/ProcessarPendenciasRN.php index f710341..62dba08 100644 --- a/rn/ProcessarPendenciasRN.php +++ b/rn/ProcessarPendenciasRN.php @@ -33,9 +33,9 @@ class ProcessarPendenciasRN extends InfraAgendamentoTarefa ini_set('max_execution_time','0'); ini_set('memory_limit','-1'); - InfraDebug::getInstance()->setBolLigado(false); + InfraDebug::getInstance()->setBolLigado(true); InfraDebug::getInstance()->setBolDebugInfra(false); - InfraDebug::getInstance()->setBolEcho(false); + InfraDebug::getInstance()->setBolEcho(true); InfraDebug::getInstance()->limpar(); PENIntegracao::validarCompatibilidadeModulo(); diff --git a/rn/ProcessoEletronicoRN.php b/rn/ProcessoEletronicoRN.php index d40f684..7a6f5f1 100644 --- a/rn/ProcessoEletronicoRN.php +++ b/rn/ProcessoEletronicoRN.php @@ -28,7 +28,8 @@ class ProcessoEletronicoRN extends InfraRN { public static $STA_SITUACAO_TRAMITE_RECIBO_RECEBIDO_REMETENTE = 6; // Recibo de conclusão do trâmite recebido pelo remetente do processo public static $STA_SITUACAO_TRAMITE_CANCELADO = 7; // Trâmite do processo ou documento cancelado pelo usuário (Qualquer situação diferente de 5 e 6) public static $STA_SITUACAO_TRAMITE_RECUSADO = 8; // Trâmite do processo recusado pelo destinatário (Situações 2, 3, 4) - public static $STA_SITUACAO_TRAMITE_CIENCIA_RECUSA = 9; // Remetente ciente da recusa do trâmite + public static $STA_SITUACAO_TRAMITE_CIENCIA_RECUSA = 9; // Remetente ciente da recusa do trâmite + public static $STA_SITUACAO_TRAMITE_CANCELADO_AUTOMATICAMENTE = 10; /* TIPO DE TRÂMITE EXTERNO DE PROCESSO */ public static $STA_TIPO_TRAMITE_ENVIO = 'E'; // Trâmite de ENVIO de processo externo @@ -1254,10 +1255,10 @@ class ProcessoEletronicoRN extends InfraRN { //@TODOJOIN: Adicionar a seguinte linha abaixo dessa : $parametros->filtroDeConsultaDeTramites = new stdClass() //Faz a consulta do tramite - $paramConsultaTramite = new stdClass(); - $paramConsultaTramite->filtroDeConsultaDeTramites = new stdClass(); - $paramConsultaTramite->filtroDeConsultaDeTramites->IDT = $idTramite; - $dadosTramite = $this->getObjPenWs()->consultarTramites($paramConsultaTramite); + //$paramConsultaTramite = new stdClass(); + //$paramConsultaTramite->filtroDeConsultaDeTramites = new stdClass(); + //$paramConsultaTramite->filtroDeConsultaDeTramites->IDT = $idTramite; + //$dadosTramite = $this->getObjPenWs()->consultarTramites($paramConsultaTramite); //Requisita o cancelamento $parametros = new stdClass(); diff --git a/rn/ReceberProcedimentoRN.php b/rn/ReceberProcedimentoRN.php index 8cd00a9..894b581 100644 --- a/rn/ReceberProcedimentoRN.php +++ b/rn/ReceberProcedimentoRN.php @@ -103,12 +103,20 @@ class ReceberProcedimentoRN extends InfraRN $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 + // pendentes de recebimento informado pelo PEN não está de acordo com a lista atual de arquivos + // mantida pela aplicação. + $arrHashComponentesProtocolo = $this->listarHashDosComponentesMetadado($objProcesso); + //Percorre os componentes que precisam ser recebidos - foreach($objTramite->componenteDigitalPendenteDeRecebimento as $key => $componentePendente){ + foreach($arrHashComponentesProtocolo as $key => $componentePendente){ + $numOrdemComponente = $key + 1; if(!is_null($componentePendente)){ - if(!$this->documentoJaRegistrado($strNumeroRegistro, $parNumIdentificacaoTramite, $componentePendente)){ + $bolComponenteDigitalRegistrado = $this->documentoJaRegistrado($strNumeroRegistro, $parNumIdentificacaoTramite, $componentePendente); + if(!$bolComponenteDigitalRegistrado){ $arrayHashPendentes[] = $componentePendente; } @@ -116,15 +124,19 @@ class ReceberProcedimentoRN extends InfraRN //Ajuste deverá ser feito em versões futuas $arrayHash[] = $componentePendente; - //Obter os dados do componente digital - $this->gravarLogDebug("Baixando componente digital $key", 6); - $objComponenteDigital = $this->objProcessoEletronicoRN->receberComponenteDigital($parNumIdentificacaoTramite, $componentePendente, $objTramite->protocolo); - $arrAnexosComponentes[$key][$componentePendente] = $receberComponenteDigitalRN->copiarComponenteDigitalPastaTemporaria($objComponenteDigital); - $arrAnexosComponentes[$key]['recebido'] = false; - - //Valida a integridade do hash - $this->gravarLogDebug("Validando integridade de componente digital $key", 6); - $receberComponenteDigitalRN->validarIntegridadeDoComponenteDigital($arrAnexosComponentes[$key][$componentePendente], $componentePendente, $parNumIdentificacaoTramite); + if(!$bolComponenteDigitalRegistrado) { + //Obter os dados do componente digital + $this->gravarLogDebug("Baixando componente digital $numOrdemComponente", 6); + $objComponenteDigital = $this->objProcessoEletronicoRN->receberComponenteDigital($parNumIdentificacaoTramite, $componentePendente, $objTramite->protocolo); + $arrAnexosComponentes[$key][$componentePendente] = $receberComponenteDigitalRN->copiarComponenteDigitalPastaTemporaria($objComponenteDigital); + $arrAnexosComponentes[$key]['recebido'] = false; + + //Valida a integridade do hash + $this->gravarLogDebug("Validando integridade de componente digital $numOrdemComponente", 6); + $receberComponenteDigitalRN->validarIntegridadeDoComponenteDigital($arrAnexosComponentes[$key][$componentePendente], $componentePendente, $parNumIdentificacaoTramite); + } else { + $this->gravarLogDebug("Componente digital desconsiderado por já fazer parte do processo", 6); + } } } @@ -234,6 +246,33 @@ class ReceberProcedimentoRN extends InfraRN } } + /** + * Método para recuperar a lista de todos os hashs dos componentes digitais presentes no protocolo recebido + * + * @return Array Lista de hashs dos componentes digitais + */ + private function listarHashDosComponentesMetadado($parObjProtocolo) + { + if(!isset($parObjProtocolo->documento)){ + throw new InfraException("Metadados do componente digital do documento de ordem {$objDocumento->ordem} não informado."); + } + + $arrHashsComponentesDigitais = array(); + $arrObjDocumento = is_array($parObjProtocolo->documento) ? $parObjProtocolo->documento : array($parObjProtocolo->documento); + foreach($arrObjDocumento as $objDocumento){ + if(!isset($objDocumento->componenteDigital)){ + throw new InfraException("Metadados do componente digital do documento de ordem {$objDocumento->ordem} não informado."); + } + + $arrObjComponentesDigitais = is_array($objDocumento->componenteDigital) ? $objDocumento->componenteDigital : array($objDocumento->componenteDigital); + foreach ($arrObjComponentesDigitais as $objComponenteDigital) { + $arrHashsComponentesDigitais[] = ProcessoEletronicoRN::getHashFromMetaDados($objComponenteDigital->hash); + } + } + + return $arrHashsComponentesDigitais; + } + public function fecharProcedimentoEmOutraUnidades(ProcedimentoDTO $objProcedimentoDTO, $parObjMetadadosProcedimento){ $objPenUnidadeDTO = new PenUnidadeDTO(); @@ -421,6 +460,7 @@ class ReceberProcedimentoRN extends InfraRN $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); $objComponenteDigitalDTO->setStrHashConteudo($parStrHashComponenteDigital); + $objComponenteDigitalDTO->setNumIdAnexo(null, InfraDTO::$OPER_DIFERENTE); $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); return $objComponenteDigitalBD->contar($objComponenteDigitalDTO) > 0; -- libgit2 0.21.2