From 0c1930b6230645d05433f4176dcd6be413af0d4d Mon Sep 17 00:00:00 2001 From: Guilherme Andrade Del Cantoni Date: Tue, 26 Feb 2019 12:29:25 -0300 Subject: [PATCH] Refatoração de método de recebimento de processos/documentos --- rn/PendenciasTramiteRN.php | 4 ++-- rn/ProcessarPendenciasRN.php | 4 ++-- rn/ProcessoEletronicoRN.php | 2 +- rn/ReceberComponenteDigitalRN.php | 14 ++------------ rn/ReceberProcedimentoRN.php | 348 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------- 5 files changed, 201 insertions(+), 171 deletions(-) diff --git a/rn/PendenciasTramiteRN.php b/rn/PendenciasTramiteRN.php index c2908e6..4458737 100644 --- a/rn/PendenciasTramiteRN.php +++ b/rn/PendenciasTramiteRN.php @@ -51,9 +51,9 @@ class PendenciasTramiteRN extends InfraRN { 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/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 948845f..30c36d5 100644 --- a/rn/ProcessoEletronicoRN.php +++ b/rn/ProcessoEletronicoRN.php @@ -60,7 +60,7 @@ class ProcessoEletronicoRN extends InfraRN { /** * Espécie documentoal não mapeada */ - const MTV_RCSR_TRAM_CD_ESPECIE_NAO_MAPEADA = '03'; + const MTV_RCSR_TRAM_CD_ESPECIE_NAO_MAPEADA = '04'; /** * Motivo para recusar de tramite de componente digital diff --git a/rn/ReceberComponenteDigitalRN.php b/rn/ReceberComponenteDigitalRN.php index f2f1478..74d2576 100644 --- a/rn/ReceberComponenteDigitalRN.php +++ b/rn/ReceberComponenteDigitalRN.php @@ -28,9 +28,8 @@ class ReceberComponenteDigitalRN extends InfraRN return BancoSEI::getInstance(); } - protected function receberComponenteDigitalConectado(ComponenteDigitalDTO $parObjComponenteDigitalDTO) + protected function receberComponenteDigitalControlado(ComponenteDigitalDTO $parObjComponenteDigitalDTO) { - if(!isset($parObjComponenteDigitalDTO) || !isset($parObjComponenteDigitalDTO)) { throw new InfraException('Parâmetro $parObjComponenteDigitalDTO não informado.'); } @@ -48,9 +47,6 @@ class ReceberComponenteDigitalRN extends InfraRN throw new InfraException('Anexo '.$parObjComponenteDigitalDTO->getStrHashConteudo().' não encontrado '.var_export($this->arrAnexos, true)); } - //Validar o hash do documento recebido com os dados informados pelo remetente - //$this->validarIntegridadeDoComponenteDigital($objAnexoDTO, $parObjComponenteDigitalDTO); - //Transferir documentos validados para o repositório final de arquivos $this->cadastrarComponenteDigital($parObjComponenteDigitalDTO, $objAnexoDTO); @@ -99,13 +95,7 @@ class ReceberComponenteDigitalRN extends InfraRN $strCaminhoAnexo = DIR_SEI_TEMP.'/'.$objAnexoDTO->getNumIdAnexo(); $strHashDoArquivo = hash_file("sha256", $strCaminhoAnexo, true); - if(strcmp($strHashInformado, $strHashDoArquivo) != 0) { - - $this->objProcessoEletronicoRN->recusarTramite($parNumIdentificacaoTramite, "Hash do componente digital não confere com o valor informado pelo remetente.", ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_CORROMPIDO); - - // Adiciono nos detalhes o nome do método para poder manipular o cache - throw new InfraException("Hash do componente digital não confere com o valor informado pelo remetente.", null, __METHOD__); - } + return strcmp($strHashInformado, $strHashDoArquivo) == 0; } public function cadastrarComponenteDigital(ComponenteDigitalDTO $parObjComponenteDigitalDTO, AnexoDTO $parObjAnexoDTO) diff --git a/rn/ReceberProcedimentoRN.php b/rn/ReceberProcedimentoRN.php index 6c6de51..8f142d3 100644 --- a/rn/ReceberProcedimentoRN.php +++ b/rn/ReceberProcedimentoRN.php @@ -35,188 +35,150 @@ class ReceberProcedimentoRN extends InfraRN } + //TODO: Renomear para receberProtocoloControlado protected function receberProcedimentoControlado($parNumIdentificacaoTramite) { try { - $objPenParametroRN = new PenParametroRN(); - SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO')); - - $objSeiRN = new SeiRN(); - if (!isset($parNumIdentificacaoTramite)) { throw new InfraException('Parâmetro $parNumIdentificacaoTramite não informado.'); } - //TODO: Urgente: Verificar o status do trâmite e verificar se ele já foi salvo na base de dados - $this->gravarLogDebug("Solicitando metadados do trâmite " . $parNumIdentificacaoTramite, 4); - $objMetadadosProcedimento = $this->objProcessoEletronicoRN->solicitarMetadados($parNumIdentificacaoTramite); - - if (isset($objMetadadosProcedimento)) { - $strNumeroRegistro = $objMetadadosProcedimento->metadados->NRE; - $objProcesso = $objMetadadosProcedimento->metadados->processo; - - $this->objProcedimentoAndamentoRN->setOpts($strNumeroRegistro, $parNumIdentificacaoTramite, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_RECEBIDO)); - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Iniciando recebimento de processo externo', 'S')); - - //Tratamento para evitar o recebimento simultâneo do mesmo procedimento em serviços/processos concorrentes - $this->sincronizarRecebimentoProcessos($strNumeroRegistro, $parNumIdentificacaoTramite); - - //Verifica se processo já foi registrado para esse trâmite - if($this->tramiteRecebimentoRegistrado($strNumeroRegistro, $parNumIdentificacaoTramite)) { - $this->gravarLogDebug("Trâmite de recebimento $parNumIdentificacaoTramite já registrado para o processo " . $objProcesso->protocolo, 4); - return; - } + $objSeiRN = new SeiRN(); + $objPenParametroRN = new PenParametroRN(); - //Substituir a unidade destinatária para a receptora - if (isset($objMetadadosProcedimento->metadados->unidadeReceptora)) { - $unidadeReceptora = $objMetadadosProcedimento->metadados->unidadeReceptora; - $this->destinatarioReal = $objMetadadosProcedimento->metadados->destinatario; - $objMetadadosProcedimento->metadados->destinatario->identificacaoDoRepositorioDeEstruturas = $unidadeReceptora->identificacaoDoRepositorioDeEstruturas; - $objMetadadosProcedimento->metadados->destinatario->numeroDeIdentificacaoDaEstrutura = $unidadeReceptora->numeroDeIdentificacaoDaEstrutura; - $numUnidadeReceptora = $unidadeReceptora->numeroDeIdentificacaoDaEstrutura; - $this->gravarLogDebug("Atribuindo unidade receptora $numUnidadeReceptora para o trâmite $parNumIdentificacaoTramite", 4); - } + // O recebimento do processo deve ser realizado na unidade definida em [UNIDADE_GERADORA_DOCUMENTO_RECEBIDO] que não deverá possuir usuários + // habilitados, funcionando como uma área dedicada unicamente para o recebimento de processos e documentos. + // Isto é necessário para que o processo recebido não seja criado diretamente dentro da unidade de destino, o que permitiria a alteração de + // todos os metadados do processo, comportamento não permitido pelas regras de negócio do PEN. + SessaoSEI::getInstance(false)->simularLogin('SEI', null, null, $objPenParametroRN->getParametro('PEN_UNIDADE_GERADORA_DOCUMENTO_RECEBIDO')); - // Validação dos dados do processo recebido - $objInfraException = new InfraException(); - $this->validarDadosDestinatario($objInfraException, $objMetadadosProcedimento); - $objInfraException->lancarValidacoes(); + $this->gravarLogDebug("Solicitando metadados do trâmite " . $parNumIdentificacaoTramite, 4); + $objMetadadosProcedimento = $this->objProcessoEletronicoRN->solicitarMetadados($parNumIdentificacaoTramite); - #############################INICIA O RECEBIMENTO DOS COMPONENTES DIGITAIS US010################################################ - $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdentificacaoTramite); - $objTramite = $arrObjTramite[0]; + $objInfraException = new InfraException(); + $this->validarMetadados($objInfraException, $objMetadadosProcedimento); - //Obtém lista de componentes digitais que precisam ser obtidos - $this->gravarLogDebug("Obtém lista de componentes digitais que precisam ser obtidos", 4); - if(!is_array($objTramite->componenteDigitalPendenteDeRecebimento)){ - $objTramite->componenteDigitalPendenteDeRecebimento = array($objTramite->componenteDigitalPendenteDeRecebimento); - } + $strNumeroRegistro = $objMetadadosProcedimento->metadados->NRE; + $objProcesso = $objMetadadosProcedimento->metadados->processo; + $objDocumento = $objMetadadosProcedimento->metadados->documento; - $this->validarComponentesDigitais($objProcesso, $parNumIdentificacaoTramite); - $this->validarExtensaoComponentesDigitais($parNumIdentificacaoTramite, $objProcesso); - $this->verificarPermissoesDiretorios($parNumIdentificacaoTramite); + $this->objProcedimentoAndamentoRN->setOpts($strNumeroRegistro, $parNumIdentificacaoTramite, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_RECEBIDO)); + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Iniciando recebimento de processo externo', 'S')); - $this->gravarLogDebug("Obtendo metadados dos componentes digitais do processo", 4); - $arrStrNomeDocumento = $this->listarMetaDadosComponentesDigitais($objProcesso); - $receberComponenteDigitalRN = new ReceberComponenteDigitalRN(); - $arrAnexosComponentes = array(); - $arrayHash = array(); - $arrayHashPendentes = array(); + //Tratamento para evitar o recebimento simultâneo do mesmo procedimento em serviços/processos concorrentes + $this->sincronizarRecebimentoProcessos($strNumeroRegistro, $parNumIdentificacaoTramite); - //Percorre os componentes que precisam ser recebidos - foreach($objTramite->componenteDigitalPendenteDeRecebimento as $key => $componentePendente){ + //Verifica se processo já foi registrado para esse trâmite + if($this->tramiteRecebimentoRegistrado($strNumeroRegistro, $parNumIdentificacaoTramite)) { + $this->gravarLogDebug("Trâmite de recebimento $parNumIdentificacaoTramite já registrado para o processo " . $objProcesso->protocolo, 4); + return; + } - if(!is_null($componentePendente)){ + $this->substituirDestinoParaUnidadeReceptora($objMetadadosProcedimento); - if(!$this->documentoJaRegistrado($strNumeroRegistro, $parNumIdentificacaoTramite, $componentePendente)){ - $arrayHashPendentes[] = $componentePendente; - } + $this->validarDadosDestinatario($objInfraException, $objMetadadosProcedimento); + $objInfraException->lancarValidacoes(); - //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; + #############################INICIA O RECEBIMENTO DOS COMPONENTES DIGITAIS US010################################################ + $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdentificacaoTramite); + $objTramite = $arrObjTramite[0]; - //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; + $this->gravarLogDebug("Obtendo metadados dos componentes digitais do processo", 4); + $arrStrNomeDocumento = $this->listarMetaDadosComponentesDigitais($objProcesso); - //Valida a integridade do hash - $this->gravarLogDebug("Validando integridade de componente digital $key", 6); - $receberComponenteDigitalRN->validarIntegridadeDoComponenteDigital($arrAnexosComponentes[$key][$componentePendente], $componentePendente, $parNumIdentificacaoTramite); - } - } + //Antes de iniciar o recebimento e criação dos dados do processo, os componentes digitais são baixados para validação de integridade + //Este procedimento é realizado antes pois o download pode demorar consideravelmente e travar transações no banco de forma desnecessária + $arrAnexosComponentes = $this->fazerDownloadComponentesDigitais($objTramite, $objProcesso); - if(count($arrAnexosComponentes) > 0){ - $receberComponenteDigitalRN->setArrAnexos($arrAnexosComponentes); - } + if(count($arrAnexosComponentes) > 0){ + $receberComponenteDigitalRN->setArrAnexos($arrAnexosComponentes); + } - #############################TERMINA O RECEBIMENTO DOS COMPONENTES DIGITAIS US010################################################ + #############################TERMINA O RECEBIMENTO DOS COMPONENTES DIGITAIS US010################################################ - $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdentificacaoTramite); - $objTramite = $arrObjTramite[0]; + $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdentificacaoTramite); + $objTramite = $arrObjTramite[0]; - //Verifica se o trâmite está recusado - if($objTramite->situacaoAtual == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO) { - $this->gravarLogDebug("Trâmite $parNumIdentificacaoTramite já se encontra recusado. Cancelando o recebimento do processo", 4); - return; - } + //Verifica se o trâmite está recusado + if($objTramite->situacaoAtual == ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_RECUSADO) { + $this->gravarLogDebug("Trâmite $parNumIdentificacaoTramite já se encontra recusado. Cancelando o recebimento do processo", 4); + return; + } - $this->gravarLogDebug("Persistindo/atualizando dados do processo com NRE " . $strNumeroRegistro, 4); - $objProcedimentoDTO = $this->registrarProcesso($strNumeroRegistro, $parNumIdentificacaoTramite, $objProcesso, $objMetadadosProcedimento); - - // @join_tec US008.08 (#23092) - $this->objProcedimentoAndamentoRN->setOpts($strNumeroRegistro, $parNumIdentificacaoTramite, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_RECEBIDO), $objProcedimentoDTO->getDblIdProcedimento()); - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Obtendo metadados do processo', 'S')); - - $this->gravarLogDebug("Registrando trâmite externo do processo", 4); - $objProcessoEletronicoDTO = $this->objProcessoEletronicoRN->cadastrarTramiteDeProcesso( - $objProcedimentoDTO->getDblIdProcedimento(), - $strNumeroRegistro, - $parNumIdentificacaoTramite, - ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO, - null, - $objMetadadosProcedimento->metadados->remetente->identificacaoDoRepositorioDeEstruturas, - $objMetadadosProcedimento->metadados->remetente->numeroDeIdentificacaoDaEstrutura, - $objMetadadosProcedimento->metadados->destinatario->identificacaoDoRepositorioDeEstruturas, - $objMetadadosProcedimento->metadados->destinatario->numeroDeIdentificacaoDaEstrutura, - $objProcesso); - - //Verifica se o tramite se encontra na situação correta - $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdentificacaoTramite); - if(!isset($arrObjTramite) || count($arrObjTramite) != 1) { - throw new InfraException("Trâmite não pode ser localizado pelo identificado $parNumIdentificacaoTramite."); - } + $this->gravarLogDebug("Persistindo/atualizando dados do processo com NRE " . $strNumeroRegistro, 4); + $objProcedimentoDTO = $this->registrarProcesso($strNumeroRegistro, $parNumIdentificacaoTramite, $objProcesso, $objMetadadosProcedimento); + + // @join_tec US008.08 (#23092) + $this->objProcedimentoAndamentoRN->setOpts($strNumeroRegistro, $parNumIdentificacaoTramite, ProcessoEletronicoRN::obterIdTarefaModulo(ProcessoEletronicoRN::$TI_PROCESSO_ELETRONICO_PROCESSO_RECEBIDO), $objProcedimentoDTO->getDblIdProcedimento()); + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento('Obtendo metadados do processo', 'S')); + + $this->gravarLogDebug("Registrando trâmite externo do processo", 4); + $objProcessoEletronicoDTO = $this->objProcessoEletronicoRN->cadastrarTramiteDeProcesso( + $objProcedimentoDTO->getDblIdProcedimento(), + $strNumeroRegistro, + $parNumIdentificacaoTramite, + ProcessoEletronicoRN::$STA_TIPO_TRAMITE_RECEBIMENTO, + null, + $objMetadadosProcedimento->metadados->remetente->identificacaoDoRepositorioDeEstruturas, + $objMetadadosProcedimento->metadados->remetente->numeroDeIdentificacaoDaEstrutura, + $objMetadadosProcedimento->metadados->destinatario->identificacaoDoRepositorioDeEstruturas, + $objMetadadosProcedimento->metadados->destinatario->numeroDeIdentificacaoDaEstrutura, + $objProcesso); + + //Verifica se o tramite se encontra na situação correta + $arrObjTramite = $this->objProcessoEletronicoRN->consultarTramites($parNumIdentificacaoTramite); + if(!isset($arrObjTramite) || count($arrObjTramite) != 1) { + throw new InfraException("Trâmite não pode ser localizado pelo identificado $parNumIdentificacaoTramite."); + } - $objTramite = $arrObjTramite[0]; - if($objTramite->situacaoAtual != ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO) { - $this->gravarLogDebug("Desconsiderando recebimento do processo devido a situação de trâmite inconsistente: " . $objTramite->situacaoAtual, 4); - return; - } + $objTramite = $arrObjTramite[0]; + if($objTramite->situacaoAtual != ProcessoEletronicoRN::$STA_SITUACAO_TRAMITE_COMPONENTES_RECEBIDOS_DESTINATARIO) { + $this->gravarLogDebug("Desconsiderando recebimento do processo devido a situação de trâmite inconsistente: " . $objTramite->situacaoAtual, 4); + return; + } - if(count($arrayHashPendentes) > 0){ - //Obter dados dos componetes digitais - $this->gravarLogDebug("Iniciando o recebimento dos componentes digitais pendentes", 4); - $objComponenteDigitalDTO = new ComponenteDigitalDTO(); - $objComponenteDigitalDTO->setStrNumeroRegistro($strNumeroRegistro); - $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); - $objComponenteDigitalDTO->setStrHashConteudo($arrayHash, InfraDTO::$OPER_IN); - $objComponenteDigitalDTO->setOrdNumOrdem(InfraDTO::$TIPO_ORDENACAO_ASC); - $objComponenteDigitalDTO->retDblIdDocumento(); - $objComponenteDigitalDTO->retNumTicketEnvioComponentes(); - $objComponenteDigitalDTO->retStrProtocoloDocumentoFormatado(); - $objComponenteDigitalDTO->retStrHashConteudo(); - $objComponenteDigitalDTO->retStrProtocolo(); - $objComponenteDigitalDTO->retStrNumeroRegistro(); - $objComponenteDigitalDTO->retNumIdTramite(); - $objComponenteDigitalDTO->retStrNome(); - $objComponenteDigitalDTO->retStrStaEstadoProtocolo(); - - $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); - $arrObjComponentesDigitaisDTO = $objComponenteDigitalBD->listar($objComponenteDigitalDTO); - - if ($objComponenteDigitalBD->contar($objComponenteDigitalDTO) > 0) { - $objReceberComponenteDigitalRN = $receberComponenteDigitalRN; - foreach($arrObjComponentesDigitaisDTO as $objComponenteDigitalDTOEnviado) { - if($objComponenteDigitalDTOEnviado->getStrStaEstadoProtocolo() != ProtocoloRN::$TE_DOCUMENTO_CANCELADO){ - $strHash = $objComponenteDigitalDTOEnviado->getStrHashConteudo(); - $strNomeDocumento = (array_key_exists($strHash, $arrStrNomeDocumento)) ? $arrStrNomeDocumento[$strHash]['especieNome'] : '[Desconhecido]'; - $objReceberComponenteDigitalRN->receberComponenteDigital($objComponenteDigitalDTOEnviado); - - // @join_tec US008.09 (#23092) - $strMensagemRecebimento = sprintf('Recebendo %s %s', $strNomeDocumento, $objComponenteDigitalDTOEnviado->getStrProtocoloDocumentoFormatado()); - $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento($strMensagemRecebimento, 'S')); - $this->gravarLogDebug($strMensagemRecebimento, 6); - } + if(count($arrComponentesPendentesRecebimento) > 0){ + //Obter dados dos componetes digitais + $this->gravarLogDebug("Iniciando o recebimento dos componentes digitais pendentes", 4); + $objComponenteDigitalDTO = new ComponenteDigitalDTO(); + $objComponenteDigitalDTO->setStrNumeroRegistro($strNumeroRegistro); + $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); + $objComponenteDigitalDTO->setStrHashConteudo($arrayHash, InfraDTO::$OPER_IN); + $objComponenteDigitalDTO->setOrdNumOrdem(InfraDTO::$TIPO_ORDENACAO_ASC); + $objComponenteDigitalDTO->retDblIdDocumento(); + $objComponenteDigitalDTO->retNumTicketEnvioComponentes(); + $objComponenteDigitalDTO->retStrProtocoloDocumentoFormatado(); + $objComponenteDigitalDTO->retStrHashConteudo(); + $objComponenteDigitalDTO->retStrProtocolo(); + $objComponenteDigitalDTO->retStrNumeroRegistro(); + $objComponenteDigitalDTO->retNumIdTramite(); + $objComponenteDigitalDTO->retStrNome(); + $objComponenteDigitalDTO->retStrStaEstadoProtocolo(); + + $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); + $arrObjComponentesDigitaisDTO = $objComponenteDigitalBD->listar($objComponenteDigitalDTO); + + if (count($arrObjComponentesDigitaisDTO) > 0) { + $objReceberComponenteDigitalRN = $receberComponenteDigitalRN; + foreach($arrObjComponentesDigitaisDTO as $objComponenteDigitalDTOEnviado) { + if($objComponenteDigitalDTOEnviado->getStrStaEstadoProtocolo() != ProtocoloRN::$TE_DOCUMENTO_CANCELADO){ + $strHash = $objComponenteDigitalDTOEnviado->getStrHashConteudo(); + $strNomeDocumento = (array_key_exists($strHash, $arrStrNomeDocumento)) ? $arrStrNomeDocumento[$strHash]['especieNome'] : '[Desconhecido]'; + $objReceberComponenteDigitalRN->receberComponenteDigital($objComponenteDigitalDTOEnviado); + + // @join_tec US008.09 (#23092) + $strMensagemRecebimento = sprintf('Recebendo %s %s', $strNomeDocumento, $objComponenteDigitalDTOEnviado->getStrProtocoloDocumentoFormatado()); + $this->objProcedimentoAndamentoRN->cadastrar(ProcedimentoAndamentoDTO::criarAndamento($strMensagemRecebimento, 'S')); + $this->gravarLogDebug($strMensagemRecebimento, 6); } - // @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')); } + // @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')); } } + //$this->fecharProcedimentoEmOutraUnidades($objProcedimentoDTO, $objMetadadosProcedimento); $this->gravarLogDebug("Enviando recibo de conclusão do trâmite $parNumIdentificacaoTramite", 6); $objEnviarReciboTramiteRN = new EnviarReciboTramiteRN(); @@ -234,6 +196,84 @@ class ReceberProcedimentoRN extends InfraRN } } + + private function validarMetadados($parObjInfraException, $parObjMetadadosTramite) + { + if (!isset($parObjMetadadosTramite)) { + $parObjInfraException->adicionarValidacao("Metadados do trâmite %s não pode ser obtido dos serviços do PEN."); + } + } + + private function substituirDestinoParaUnidadeReceptora($parObjMetadadosTramite) + { + if (isset($parObjMetadadosTramite->metadados->unidadeReceptora)) { + $unidadeReceptora = $parObjMetadadosTramite->metadados->unidadeReceptora; + $this->destinatarioReal = $parObjMetadadosTramite->metadados->destinatario; + $parObjMetadadosTramite->metadados->destinatario->identificacaoDoRepositorioDeEstruturas = $unidadeReceptora->identificacaoDoRepositorioDeEstruturas; + $parObjMetadadosTramite->metadados->destinatario->numeroDeIdentificacaoDaEstrutura = $unidadeReceptora->numeroDeIdentificacaoDaEstrutura; + $numUnidadeReceptora = $unidadeReceptora->numeroDeIdentificacaoDaEstrutura; + $this->gravarLogDebug("Atribuindo unidade receptora $numUnidadeReceptora para o trâmite $parNumIdentificacaoTramite", 4); + } + } + + + private function fazerDownloadComponentesDigitais($parObjTramite, $parObjProcesso) + { + if(!is_array($objTramite->componenteDigitalPendenteDeRecebimento)){ + $parObjTramite->componenteDigitalPendenteDeRecebimento = array($parObjTramite->componenteDigitalPendenteDeRecebimento); + } + + $numIdentificacaoTramite = $parObjTramite->IDT; + $arrComponentesDigitaisPendentes = $parObjTramite->componenteDigitalPendenteDeRecebimento; + + //Obtém lista de componentes digitais que precisam ser obtidos + $this->gravarLogDebug("Obtém lista de componentes digitais que precisam ser obtidos", 4); + //if(!is_array($objTramite->componenteDigitalPendenteDeRecebimento)){ + // $objTramite->componenteDigitalPendenteDeRecebimento = array($objTramite->componenteDigitalPendenteDeRecebimento); + //} + + $this->validarComponentesDigitais($parObjProcesso, $numIdentificacaoTramite); + $this->validarExtensaoComponentesDigitais($parObjProcesso, $numIdentificacaoTramite); + $this->verificarPermissoesDiretorios($numIdentificacaoTramite); + + $arrayHash = array(); + $arrAnexosComponentes = array(); + $arrComponentesPendentesRecebimento = array(); + $receberComponenteDigitalRN = new ReceberComponenteDigitalRN(); + + //Percorre os componentes que precisam ser recebidos + foreach($arrComponentesDigitaisPendentes as $numOrdem => $componentePendente){ + + if(!is_null($componentePendente)) { + + if(!$this->verificarSeDocumentoJaRegistrado($strNumeroRegistro, $numIdentificacaoTramite, $componentePendente)){ + $arrComponentesPendentesRecebimento[] = $componentePendente; + } + + //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 no Barramento em versões futuras + $arrayHash[] = $componentePendente; + + //Obter os dados do componente digital + $this->gravarLogDebug("Baixando componente digital $numOrdem", 6); + $objComponenteDigital = $this->objProcessoEletronicoRN->receberComponenteDigital($numIdentificacaoTramite, $componentePendente, $objTramite->protocolo); + $arrAnexosComponentes[$numOrdem][$componentePendente] = $receberComponenteDigitalRN->copiarComponenteDigitalPastaTemporaria($objComponenteDigital); + $arrAnexosComponentes[$numOrdem]['recebido'] = false; + + //Valida a integridade do hash + $this->gravarLogDebug("Validando integridade de componente digital $numOrdem", 6); + $bolEhValido = $receberComponenteDigitalRN->validarIntegridadeDoComponenteDigital($arrAnexosComponentes[$numOrdem][$componentePendente], $componentePendente); + + if(!$bolEhValido) { + $this->objProcessoEletronicoRN->recusarTramite($numIdentificacaoTramite, "Hash do componente digital não confere com o valor informado pelo remetente.", ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_CORROMPIDO); + throw new InfraException("Hash do componente digital não confere com o valor informado pelo remetente.", null, __METHOD__); + } + } + } + + return $arrAnexosComponentes; + } + public function fecharProcedimentoEmOutraUnidades(ProcedimentoDTO $objProcedimentoDTO, $parObjMetadadosProcedimento){ $objPenUnidadeDTO = new PenUnidadeDTO(); @@ -414,7 +454,7 @@ class ReceberProcedimentoRN extends InfraRN } - private function documentoJaRegistrado($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parStrHashComponenteDigital) + private function verificarSeDocumentoJaRegistrado($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parStrHashComponenteDigital) { //Verifica se componente digital já está registrado para o documento $objComponenteDigitalDTO = new ComponenteDigitalDTO(); @@ -1785,7 +1825,7 @@ protected function receberTramiteRecusadoInternoControlado(ReceberTramiteRecusad * @param object $parObjProcesso * @throws InfraException */ - public function validarExtensaoComponentesDigitais($parIdTramite, $parObjProcesso){ + public function validarExtensaoComponentesDigitais($parObjProcesso, $parIdTramite){ //Armazena o array de documentos $arrDocumentos = is_array($parObjProcesso->documento) ? $parObjProcesso->documento : array($parObjProcesso->documento) ; -- libgit2 0.21.2