objInfraParametro = new InfraParametro(BancoSEI::getInstance()); $this->objProcessoEletronicoRN = new ProcessoEletronicoRN(); } public function setArrAnexos($arrAnexos){ $this->arrAnexos = $arrAnexos; } public function getArrAnexos(){ return $this->arrAnexos; } protected function inicializarObjInfraIBanco() { return BancoSEI::getInstance(); } //TODO: Implementar o recebimento fracionado dos componentes digitais protected function receberComponenteDigitalConectado(ComponenteDigitalDTO $parObjComponenteDigitalDTO) { if(!isset($parObjComponenteDigitalDTO) || !isset($parObjComponenteDigitalDTO)) { throw new InfraException('Parâmetro $parObjComponenteDigitalDTO não informado.'); } //Obter os dados do componente digital // $objComponenteDigital = $this->objProcessoEletronicoRN->receberComponenteDigital( // $parObjComponenteDigitalDTO->getNumIdTramite(), // $parObjComponenteDigitalDTO->getStrHashConteudo(), // $parObjComponenteDigitalDTO->getStrProtocolo()); // if(!isset($objComponenteDigital) || InfraString::isBolVazia($objComponenteDigital->conteudoDoComponenteDigital)) { // throw new InfraException("Não foi possível obter informações do componente digital identificado (".$parObjComponenteDigitalDTO->getStrHashConteudo().")"); // } //Copiar dados dos componentes digitais para o diretório de upload // $objAnexoDTO = $this->copiarComponenteDigitalPastaTemporaria($objComponenteDigital); $objAnexoDTO = null; foreach($this->arrAnexos as $key => $objAnexo){ if(array_key_exists($parObjComponenteDigitalDTO->getStrHashConteudo(), $objAnexo) && $objAnexo['recebido'] == false){ $objAnexoDTO = $objAnexo[$parObjComponenteDigitalDTO->getStrHashConteudo()]; $this->arrAnexos[$key]['recebido'] = true; break; } } if(is_null($objAnexoDTO)){ 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); //Transaferir documentos validados para o repositório final de arquivos $this->cadastrarComponenteDigital($parObjComponenteDigitalDTO, $objAnexoDTO); //Registrar anexo relacionado com o componente digital $this->registrarAnexoDoComponenteDigital($parObjComponenteDigitalDTO, $objAnexoDTO); } private function registrarAnexoDoComponenteDigital($parObjComponenteDigitalDTO, $parObjAnexoDTO) { $objComponenteDigitalDTO = new ComponenteDigitalDTO(); $objComponenteDigitalDTO->setNumIdTramite($parObjComponenteDigitalDTO->getNumIdTramite()); $objComponenteDigitalDTO->setStrNumeroRegistro($parObjComponenteDigitalDTO->getStrNumeroRegistro()); $objComponenteDigitalDTO->setDblIdDocumento($parObjComponenteDigitalDTO->getDblIdDocumento()); $objComponenteDigitalDTO->setNumIdAnexo($parObjAnexoDTO->getNumIdAnexo()); $objComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); $objComponenteDigitalDTO = $objComponenteDigitalBD->alterar($objComponenteDigitalDTO); } public function copiarComponenteDigitalPastaTemporaria($objComponenteDigital) { $objAnexoRN = new AnexoRN(); $strNomeArquivoUpload = $objAnexoRN->gerarNomeArquivoTemporario(); $strConteudoCodificado = $objComponenteDigital->conteudoDoComponenteDigital; $strNome = $objComponenteDigital->nome; $fp = fopen(DIR_SEI_TEMP.'/'.$strNomeArquivoUpload,'w'); fwrite($fp,$strConteudoCodificado); fclose($fp); //Atribui informações do arquivo anexo $objAnexoDTO = new AnexoDTO(); $objAnexoDTO->setNumIdAnexo($strNomeArquivoUpload); $objAnexoDTO->setDthInclusao(InfraData::getStrDataHoraAtual()); $objAnexoDTO->setNumTamanho(filesize(DIR_SEI_TEMP.'/'.$strNomeArquivoUpload)); $objAnexoDTO->setNumIdUsuario(SessaoSEI::getInstance()->getNumIdUsuario()); return $objAnexoDTO; } public function validarIntegridadeDoComponenteDigital(AnexoDTO $objAnexoDTO, $strHashConteudo, $parNumIdentificacaoTramite) { $strHashInformado = $strHashConteudo; $strHashInformado = base64_decode($strHashInformado); $objAnexoRN = new AnexoRN(); $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__); } } public function cadastrarComponenteDigital(ComponenteDigitalDTO $parObjComponenteDigitalDTO, AnexoDTO $parObjAnexoDTO) { //Obter dados do documento $objDocumentoDTO = new DocumentoDTO(); $objDocumentoDTO->retDblIdDocumento(); $objDocumentoDTO->retDblIdProcedimento(); $objDocumentoDTO->setDblIdDocumento($parObjComponenteDigitalDTO->getDblIdDocumento()); $objDocumentoRN = new DocumentoRN(); $objDocumentoDTO = $objDocumentoRN->consultarRN0005($objDocumentoDTO); if ($objDocumentoDTO==null){ throw new InfraException("Registro não encontrado."); } $objProtocoloDTO = new ProtocoloDTO(); $objProtocoloDTO->retDblIdProtocolo(); $objProtocoloDTO->retStrProtocoloFormatado(); $objProtocoloDTO->setDblIdProtocolo($objDocumentoDTO->getDblIdDocumento()); $objProtocoloRN = new ProtocoloRN(); $objProtocoloDTO = $objProtocoloRN->consultarRN0186($objProtocoloDTO); //Complementa informações do componente digital $parObjAnexoDTO->setStrNome($parObjComponenteDigitalDTO->getStrNome()); $arrStrNome = explode('.',$parObjComponenteDigitalDTO->getStrNome()); $strProtocoloFormatado = current($arrStrNome); $objDocumentoDTO->setObjProtocoloDTO($objProtocoloDTO); $objProtocoloDTO->setArrObjAnexoDTO(array($parObjAnexoDTO)); $objDocumentoDTO = $objDocumentoRN->alterarRN0004($objDocumentoDTO); // @join_tec US029 (#3790) /*$objObservacaoDTO = new ObservacaoDTO(); $objObservacaoDTO->setDblIdProtocolo($objProtocoloDTO->getDblIdProtocolo()); $objObservacaoDTO->setStrDescricao(sprintf('Número SEI do Documento na Origem: %s', $strProtocoloFormatado)); $objObservacaoDTO->setNumIdUnidade(SessaoSEI::getInstance()->getNumIdUnidadeAtual()); $objObservacaoBD = new ObservacaoRN(); $objObservacaoBD->cadastrarRN0222($objObservacaoDTO);*/ } }