/** * * @param ArtefatoEntity $entArtefato * @return boolean * @throws \Exception */ private function _migraDocumento(ArtefatoEntity $entArtefato) { //fecha a conexão com banco $this->_closeConnection(); // tb_documentos_imagem.flg_publico = [0=>confidencial, 1=publico, 2=>excluido] // tb_documentos_imagem.img_type = [7=>TIF, 8=>PNG, 9=>PDF] // todos o PNG esta excluido (2) $sqArtefato = $entArtefato->getSqArtefato(); $this->_nuDigital = $entArtefato->getNuDigital()->getNuEtiqueta(); $this->_txDigital = str_pad($this->_nuDigital, 7, '0', STR_PAD_LEFT); $arrImagem = $this->_getRepository('app:VwImagemSgdocFisico')->findBy(array('sqArtefato' => $sqArtefato), array('dtInclusao' => 'ASC', 'nuOrdem' => 'ASC')); if (!$arrImagem) { self::_debug('Sem imagem para processar'); throw new \Exception("Nenhuma imagem encontrada para a digital {$this->_txDigital}", self::CODE_IMG_NOT_FOUND); } $this->_setImagePathIn($entArtefato)->_setImagePathOut(); $this->_arrPdf = array(); $arrTif = array(); $sigiloso = false; $arrFileNotFound = array(); self::_debug('Iniciando conversão das imagems caso necessário'); foreach ($arrImagem as $imagem) { $typeFile = $imagem->getInTipoArquivo(); $filename = $imagem->getTxNomeArquivo() . $this->_extension[$typeFile]; $fullFilename = $this->_imagePathOut . $filename; $stPublico = $imagem->getStPublico(); $this->_pageCount += $imagem->getInQtdePagina(); //verifica se alguma imagem é confidencial para setar o grau acesso do artefato if ($stPublico === self::ACESSO_CONFIDENCIAL && false === $sigiloso) { $sigiloso = true; } //se o arquivo da imagem não existir no file system registra o nome do arquivo if (!file_exists($fullFilename)) { $arrFileNotFound[] = $filename; continue; } //adicion tif na stack de conversão if ($typeFile == self::ARQUIVO_TIF) { $arrTif[] = $fullFilename; if (!filesize($fullFilename)) { self::_debug("Digital {$this->_txDigital} com imagem corrompida"); throw new \Exception("A digital {$this->_txDigital} possui uma ou mais imagens corrompidas", self::CODE_IMG_CORRUPTED); } } if ($typeFile == self::ARQUIVO_PDF) { //se for pdf e possui tif na stack //processa os tifs para transformar em pdf //antes de adicionar a proxima imagem pdf na stack if ($arrTif) { $this->_convertTifToPdf($arrTif, $this->_arrPdf); //limpa a fila de tif após a conversão $arrTif = array(); } $this->_arrPdf[] = $fullFilename; } } if ($arrFileNotFound) { self::_debug("O(s) arquivo(s) " . implode(', ', $arrFileNotFound) . " não foi(ram) localizado(s) no diretório de origem ({$this->_imagePathOut}) para digital {$this->_txDigital}"); //para o processo do artefato da vez $this->_unlinkTmpFile(); throw new \Exception("O(s) arquivo(s) " . implode(', ', $arrFileNotFound) . " não foi(ram) localizado(s) no diretório de origem ({$this->_imagePathOut}) para digital {$this->_txDigital}"); } //por fim se sobrou tif na stack processa novamente if ($arrTif) { $this->_convertTifToPdf($arrTif); //limpa a fila de tif $arrTif = array(); } //setar grau de acesso para o artefato $sqGrauAcesso = \Core_Configuration::getSgdoceGrauAcessoPublico(); if ($sigiloso) { $sqGrauAcesso = \Core_Configuration::getSgdoceGrauAcessoSigiloso(); } self::_debug('Conversões finalizadas'); $this->_processMergePdf($entArtefato)->_grauAcesso($entArtefato, $sqGrauAcesso)->_unlinkTmpFile(); }
/** * @param integer $sqArtefato * @return boolean */ public function forbiddenAccess($sqArtefato, $sqPessoa) { $artefatoImagemEntity = $this->_getArtefatoImageEntity($sqArtefato); $artefatoEntity = $artefatoImagemEntity->getSqArtefato(); if ($artefatoEntity instanceof ArtefatoEntity) { $grauAcessoArtefatoEntity = $artefatoEntity->getSqGrauAcessoArtefato(); if ($grauAcessoArtefatoEntity instanceof GrauAcessoArtefatoEntity) { $grauAcessoEntity = $grauAcessoArtefatoEntity->getSqGrauAcesso(); if ($grauAcessoEntity instanceof GrauAcessoEntity) { $forbiddenList = array(\Core_Configuration::getSgdoceGrauAcessoSigiloso()); //se o grau for controlado verifica se o usuario pode ver o artefato if (in_array($grauAcessoEntity->getSqGrauAcesso(), $forbiddenList)) { //se usuario pode ver inverte o boleano para manter a semantica do retorno //do deste metodo (forbiddenAccess) return !$this->_canViewSigiloso($sqArtefato, $sqPessoa); } return false; } } } return false; }
/** * Verifica se um artefato é sigiloso * * @param \Core_Dto_Search $dto * @return \Artefato\Service\TramiteArtefato * @throws \Core_Exception_ServiceLayer */ private function _checkArtefatoSigiloso(\Core_Dto_Search $dto) { $entityGAA = $this->getServiceLocator()->getService('GrauAcessoArtefato')->getGrauAcessoArtefato($dto); $entityTipoArtefato = $entityGAA->getSqArtefato()->getSqTipoArtefatoAssunto()->getSqTipoArtefato(); $sqTipoArtefato = $entityTipoArtefato->getSqTipoArtefato(); $artefatoError = null; if ($entityGAA->getSqGrauAcesso()->getSqGrauAcesso() == \Core_Configuration::getSgdoceGrauAcessoSigiloso()) { if ($sqTipoArtefato == \Core_Configuration::getSgdoceTipoArtefatoProcesso()) { $artefatoError = $this->_formatProcessNumber($entityGAA->getSqArtefato()); } else { $artefatoError = $entityGAA->getSqArtefato()->getNuDigital()->getNuEtiqueta(); } $msg = "O %s <b>'%s'</b> é sigiloso e não pode ser tramitado externamente."; throw new \Core_Exception_ServiceLayer(sprintf($msg, $entityTipoArtefato->getNoTipoArtefato(), $artefatoError)); } return $this; }