From 6a36ffe7b9aa51f99530e540cabf122fc13804eb Mon Sep 17 00:00:00 2001 From: Josinaldo Junior Date: Wed, 13 Mar 2019 09:41:16 -0300 Subject: [PATCH] Implementação parcial do recebimento de mais de um componente digital --- rn/ProcessoEletronicoRN.php | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------- rn/ReceberProcedimentoRN.php | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------- 2 files changed, 116 insertions(+), 89 deletions(-) diff --git a/rn/ProcessoEletronicoRN.php b/rn/ProcessoEletronicoRN.php index 30c36d5..aa95d24 100644 --- a/rn/ProcessoEletronicoRN.php +++ b/rn/ProcessoEletronicoRN.php @@ -782,72 +782,77 @@ class ProcessoEletronicoRN extends InfraRN { return $strHashConteudo; } - private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProcesso, $parObjComponentesDigitaisSolicitados) - { - //Monta dados dos componentes digitais - $arrObjComponenteDigitalDTO = array(); - if(!is_array($parObjProcesso->documento)) { - $parObjProcesso->documento = array($parObjProcesso->documento); - } - - foreach ($parObjProcesso->documento as $objDocumento) { - $objComponenteDigitalDTO = new ComponenteDigitalDTO(); - $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); - $objComponenteDigitalDTO->setDblIdProcedimento($parObjProcesso->idProcedimentoSEI); //TODO: Error utilizar idProcedimentoSEI devido processos apensados - $objComponenteDigitalDTO->setDblIdDocumento($objDocumento->idDocumentoSEI); - $objComponenteDigitalDTO->setNumOrdem($objDocumento->ordem); - $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); - $objComponenteDigitalDTO->setStrProtocolo($parObjProcesso->protocolo); - - //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 " . $parObjProcesso->protocolo . "\n Somente é permitido o recebimento de documentos com apenas um Componente Digital."); - } - - $objComponenteDigital = $objDocumento->componenteDigital; - $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); + private function montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProcesso, $parObjComponentesDigitaisSolicitados) + { + //Monta dados dos componentes digitais + $arrObjComponenteDigitalDTO = array(); + if(!is_array($parObjProcesso->documento)) { + $parObjProcesso->documento = array($parObjProcesso->documento); + } - //Registrar componente digital necessita ser enviado pelo trâmite espefífico //TODO: Teste $parObjComponentesDigitaisSolicitados aqui - if(isset($parObjComponentesDigitaisSolicitados)){ - $arrObjItensSolicitados = is_array($parObjComponentesDigitaisSolicitados->processo) ? $parObjComponentesDigitaisSolicitados->processo : array($parObjComponentesDigitaisSolicitados->processo); + foreach ($parObjProcesso->documento as $objDocumento) + { + $objComponenteDigitalDTO = new ComponenteDigitalDTO(); + $objComponenteDigitalDTO->setStrNumeroRegistro($parStrNumeroRegistro); + $objComponenteDigitalDTO->setDblIdProcedimento($parObjProcesso->idProcedimentoSEI); //TODO: Error utilizar idProcedimentoSEI devido processos apensados + $objComponenteDigitalDTO->setDblIdDocumento($objDocumento->idDocumentoSEI); + $objComponenteDigitalDTO->setNumOrdem($objDocumento->ordem); + $objComponenteDigitalDTO->setNumIdTramite($parNumIdentificacaoTramite); + $objComponenteDigitalDTO->setStrProtocolo($parObjProcesso->protocolo); + + //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 " . $parObjProcesso->protocolo . "\n Somente é permitido o recebimento de documentos com apenas um Componente Digital."); + // } + + $arrObjComponenteDigital = is_array($objDocumento->componenteDigital) ? $objDocumento->componenteDigital : array($objDocumento->componenteDigital); + + foreach ($arrObjComponenteDigital as $objComponenteDigital) + { + $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 espefí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"); + } + } + } + } - foreach ($arrObjItensSolicitados as $objItemSolicitado) { - if(!is_null($objItemSolicitado)){ - $objItemSolicitado->hash = is_array($objItemSolicitado->hash) ? $objItemSolicitado->hash : array($objItemSolicitado->hash); + //TODO: Avaliar dados do tamanho do documento em bytes salvo na base de dados + $objComponenteDigitalDTO->setNumTamanho($objComponenteDigital->tamanhoEmBytes); - if($objItemSolicitado->protocolo == $objComponenteDigitalDTO->getStrProtocolo() && in_array($strHashConteudo, $objItemSolicitado->hash) && !$objDocumento->retirado) { - $objComponenteDigitalDTO->setStrSinEnviar("S"); - } + $objComponenteDigitalDTO->setNumIdAnexo($objComponenteDigital->idAnexo); + $arrObjComponenteDigitalDTO[] = $objComponenteDigitalDTO; } } - } - - //TODO: Avaliar dados do tamanho do documento em bytes salvo na base de dados - $objComponenteDigitalDTO->setNumTamanho($objComponenteDigital->tamanhoEmBytes); - $objComponenteDigitalDTO->setNumIdAnexo($objComponenteDigital->idAnexo); - $arrObjComponenteDigitalDTO[] = $objComponenteDigitalDTO; - } + //Chamada recursiva sobre os documentos dos processos apensados + if(isset($parObjProcesso->processoApensado) && count($parObjProcesso->processoApensado)) { + foreach ($parObjProcesso->processoApensado as $objProcessoApensado) { + $arrObj = $this->montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $objProcessoApensado, $parObjComponentesDigitaisSolicitados); + $arrObjComponenteDigitalDTO = array_merge($arrObjComponenteDigitalDTO, $arrObj); + } + } - //Chamada recursiva sobre os documentos dos processos apensados - if(isset($parObjProcesso->processoApensado) && count($parObjProcesso->processoApensado)) { - foreach ($parObjProcesso->processoApensado as $objProcessoApensado) { - $arrObj = $this->montarDadosComponenteDigital($parStrNumeroRegistro, $parNumIdentificacaoTramite, $objProcessoApensado, $parObjComponentesDigitaisSolicitados); - $arrObjComponenteDigitalDTO = array_merge($arrObjComponenteDigitalDTO, $arrObj); - } + return $arrObjComponenteDigitalDTO; } - return $arrObjComponenteDigitalDTO; - } - public function receberComponenteDigital($parNumIdentificacaoTramite, $parStrHashComponenteDigital, $parStrProtocolo) { diff --git a/rn/ReceberProcedimentoRN.php b/rn/ReceberProcedimentoRN.php index c6465df..e4cd26a 100644 --- a/rn/ReceberProcedimentoRN.php +++ b/rn/ReceberProcedimentoRN.php @@ -87,9 +87,11 @@ class ReceberProcedimentoRN extends InfraRN #############################INICIA O RECEBIMENTO DOS COMPONENTES DIGITAIS US010################################################ - //Obtém lista de componentes digitais que precisam ser obtidos + //Realiza as validações nos componentes digitais dos documentos $this->validarComponentesDigitais($objProtocolo, $parNumIdentificacaoTramite); $this->validarExtensaoComponentesDigitais($parNumIdentificacaoTramite, $objProtocolo); + + //Verifica a permissão de escrita nos diretórios de arquivos externos $this->verificarPermissoesDiretorios($parNumIdentificacaoTramite); $this->gravarLogDebug("Obtém lista de componentes digitais que precisam ser obtidos", 4); @@ -120,7 +122,9 @@ class ReceberProcedimentoRN extends InfraRN //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; @@ -177,6 +181,7 @@ class ReceberProcedimentoRN extends InfraRN } if(count($arrComponentesPendentesRecebimento) > 0){ + //Obter dados dos componetes digitais $this->gravarLogDebug("Iniciando o recebimento dos componentes digitais pendentes", 4); $objComponenteDigitalDTO = new ComponenteDigitalDTO(); @@ -329,7 +334,7 @@ class ReceberProcedimentoRN extends InfraRN } /** - * Valida cada componente digital, se não algum não for aceito recusa o tramite + * Valida cada componente digital, se algum não for aceito recusa o tramite * do procedimento para esta unidade */ private function validarComponentesDigitais($parObjProtocolo, $parNumIdentificacaoTramite) @@ -356,18 +361,24 @@ class ReceberProcedimentoRN extends InfraRN $objPenParametroRN = new PenParametroRN(); $numTamDocExterno = $objPenParametroRN->getParametro('PEN_TAMANHO_MAXIMO_DOCUMENTO_EXPEDIDO'); - foreach($arrObjDocumentos as $objDocument) { - - //Não valida informações do componente digital caso o documento esteja cancelado - if(isset($objDocumento->retirado) && $objDocumento->retirado === true){ - if (is_null($objDocument->componenteDigital->tamanhoEmBytes) || $objDocument->componenteDigital->tamanhoEmBytes == 0){ - throw new InfraException('Tamanho de componente digital não informado.', null, 'RECUSA: '.ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_OUTROU); - } + foreach($arrObjDocumentos as $objDocumento) + { + $arrObjComponenteDigital = $this->obterComponentesDigitaisDocumento($objDocumento); + + //Valida o tamnho dos compoenentes digitais + foreach ($arrObjComponenteDigital as $objComponenteDigital) + { + //Não valida informações do componente digital caso o documento esteja cancelado + if(isset($objDocumento->retirado) && $objDocumento->retirado === true){ + if (is_null($objComponenteDigital->tamanhoEmBytes) || $objComponenteDigital->tamanhoEmBytes == 0){ + throw new InfraException('Tamanho de componente digital não informado.', null, 'RECUSA: '.ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_OUTROU); + } - if($objDocument->componenteDigital->tamanhoEmBytes > ($numTamDocExterno * 1024 * 1024)){ - $numTamanhoMb = $objDocument->componenteDigital->tamanhoEmBytes / ( 1024 * 1024); - $this->objProcessoEletronicoRN->recusarTramite($parNumIdentificacaoTramite, 'Componente digital não pode ultrapassar '.round($numTamDocExterno, 2).'MBs, o tamanho do anexo é '.round($numTamanhoMb, 2).'MBs .', ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_OUTROU); - throw new InfraException('Componente digital não pode ultrapassar '.round($numTamDocExterno, 2).'MBs, o tamanho do anexo é '.round($numTamanhoMb).'MBs'); + if($objComponenteDigital->tamanhoEmBytes > ($numTamDocExterno * 1024 * 1024)){ + $numTamanhoMb = $objComponenteDigital->tamanhoEmBytes / ( 1024 * 1024); + $this->objProcessoEletronicoRN->recusarTramite($parNumIdentificacaoTramite, 'Componente digital não pode ultrapassar '.round($numTamDocExterno, 2).'MBs, o tamanho do anexo é '.round($numTamanhoMb, 2).'MBs .', ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_OUTROU); + throw new InfraException('Componente digital não pode ultrapassar '.round($numTamDocExterno, 2).'MBs, o tamanho do anexo é '.round($numTamanhoMb).'MBs'); + } } } } @@ -385,6 +396,11 @@ class ReceberProcedimentoRN extends InfraRN return $arrObjDocumento; } + private function obterComponentesDigitaisDocumento($parObjDocumento) + { + return $arrObjComponenteDigital = is_array($parObjDocumento->componenteDigital) ? $parObjDocumento->componenteDigital : array($parObjDocumento->componenteDigital); + } + private function registrarProcesso($parStrNumeroRegistro, $parNumIdentificacaoTramite, $parObjProtocolo, $parObjMetadadosProcedimento) { // Validação dos dados do processo recebido @@ -1790,25 +1806,31 @@ class ReceberProcedimentoRN extends InfraRN //Instancia o bd do arquivoExtensão $arquivoExtensaoBD = new ArquivoExtensaoBD($this->getObjInfraIBanco()); - //Percorre os documentos - foreach($arrDocumentos as $documento){ - - //Busca o nome do documento - $nomeDocumento = $documento->componenteDigital->nome; - - //Busca pela extensão do documento - $arrNomeDocumento = explode('.', $nomeDocumento); - $extDocumento = $arrNomeDocumento[count($arrNomeDocumento) - 1]; - - //Verifica se a extensão do arquivo está cadastrada e ativa - $arquivoExtensaoDTO = new ArquivoExtensaoDTO(); - $arquivoExtensaoDTO->setStrSinAtivo('S'); - $arquivoExtensaoDTO->setStrExtensao($extDocumento); - $arquivoExtensaoDTO->retStrExtensao(); - - if($arquivoExtensaoBD->contar($arquivoExtensaoDTO) == 0){ - $this->objProcessoEletronicoRN->recusarTramite($parIdTramite, 'Componentes digitais com formato inválido no destinatário. ', ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_FORMATO); - throw new InfraException("Processo recusado devido a existência de documento em formato {$extDocumento} não permitido pelo sistema. "); + //Percorre os documentos para validar a extensão dos componentes digitais + foreach($arrDocumentos as $documento) + { + $arrObjComponenteDigital = $this->obterComponentesDigitaisDocumento($documento); + + //Valida a extensão dos componentes digitais + foreach ($arrObjComponenteDigital as $objComponenteDigital) + { + //Busca o nome do documento + $nomeDocumento = $objComponenteDigital->nome; + + //Busca pela extensão do documento + $arrNomeDocumento = explode('.', $nomeDocumento); + $extDocumento = $arrNomeDocumento[count($arrNomeDocumento) - 1]; + + //Verifica se a extensão do arquivo está cadastrada e ativa + $arquivoExtensaoDTO = new ArquivoExtensaoDTO(); + $arquivoExtensaoDTO->setStrSinAtivo('S'); + $arquivoExtensaoDTO->setStrExtensao($extDocumento); + $arquivoExtensaoDTO->retStrExtensao(); + + if ($arquivoExtensaoBD->contar($arquivoExtensaoDTO) == 0) { + $this->objProcessoEletronicoRN->recusarTramite($parIdTramite, 'Componentes digitais com formato inválido no destinatário. ', ProcessoEletronicoRN::MTV_RCSR_TRAM_CD_FORMATO); + throw new InfraException("Processo recusado devido a existência de documento em formato {$extDocumento} não permitido pelo sistema. "); + } } } } -- libgit2 0.21.2