From e86975eb5c51afdac3a5988abe8f5018c21a0f6e Mon Sep 17 00:00:00 2001 From: Hemerson Morais Date: Tue, 11 Jun 2019 16:04:49 -0300 Subject: [PATCH] [UPD] - Sprint 05 - [Historia] US079 - Tratamento de envio de processos anexados. --- rn/ExpedirProcedimentoRN.php | 266 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 263 insertions(+), 3 deletions(-) diff --git a/rn/ExpedirProcedimentoRN.php b/rn/ExpedirProcedimentoRN.php index 9622a8f..121cb3d 100644 --- a/rn/ExpedirProcedimentoRN.php +++ b/rn/ExpedirProcedimentoRN.php @@ -91,7 +91,7 @@ class ExpedirProcedimentoRN extends InfraRN { $this->objSerieRN = new SerieRN(); $this->objAnexoRN = new AnexoRN(); $this->objProcedimentoAndamentoRN = new ProcedimentoAndamentoRN(); - + $this->ordemDocumento = 1; $this->barraProgresso = new InfraBarraProgresso(); $this->barraProgresso->setNumMin(0); $this->barraProgresso->setNumMax(ProcessoEletronicoINT::NEE_EXPEDICAO_ETAPA_CONCLUSAO); @@ -142,7 +142,7 @@ class ExpedirProcedimentoRN extends InfraRN { //Construção do processo para envio $objProcesso = $this->construirProcesso($dblIdProcedimento, $objExpedirProcedimentoDTO->getArrIdProcessoApensado(), $objMetadadosProcessoTramiteAnterior); - + // var_dump($objProcesso->documento);exit; $param = new stdClass(); $param->novoTramiteDeProcesso = new stdClass(); $param->novoTramiteDeProcesso->cabecalho = $objCabecalho; @@ -440,7 +440,8 @@ class ExpedirProcedimentoRN extends InfraRN { $this->atribuirProdutorProcesso($objProcesso, $objProcedimentoDTO->getNumIdUsuarioGeradorProtocolo(), $objProcedimentoDTO->getNumIdUnidadeGeradoraProtocolo()); $this->atribuirDataHoraDeRegistro($objProcesso, $objProcedimentoDTO->getDblIdProcedimento()); - $this->atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior); + $this->atribuirProtocolos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior); + //$this->atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior); $this->atribuirDadosInteressados($objProcesso, $dblIdProcedimento); $this->adicionarProcessosApensados($objProcesso, $arrIdProcessoApensado); @@ -723,6 +724,64 @@ class ExpedirProcedimentoRN extends InfraRN { } } + public function atribuirProtocolos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior) + { + // 1 - Recupera a lista de protocolos na ordem correta em que aparece no processo + list($arrIdDocumentosIndexados, $arrIdProcAnexadosIndexados) = $this->listarProtocolos($dblIdProcedimento); + $arrAuxiliar = (array_keys($arrIdDocumentosIndexados)); + + // 2 - Constrói todos os metadados de documentos relacionados ao processo principal + $arrObjDocumentos = array(); + + foreach ($arrAuxiliar as $k){ + $arrObjDocumentos[$k] = $this->atribuirDocumentosAux($objProcesso, $arrIdDocumentosIndexados[$k], $parObjMetadadosTramiteAnterior); + } + + // 3 - Percorre a lista de protocolos, posicionando-os na ordem correta, seja documento ou procedimento + $numQuantProtocolos = count($arrIdDocumentosIndexados) + count($arrIdProcAnexadosIndexados); + + for($i =0 ; $i<$numQuantProtocolos ; $i++){ + if($arrIdDocumentosIndexados[$i]){ + $arrProtocolosIndexados[$i] = $arrIdDocumentosIndexados[$i]; + }else if($arrIdProcAnexadosIndexados[$i]){ + $arrProtocolosIndexados[$i] = $arrIdProcAnexadosIndexados[$i]; + } + } + + + if ($numQuantProtocolos != count($arrProtocolosIndexados)){ + throw new InfraException("Inconsistência identificada na atribuição dos documentos e processos anexados"); + } + + // 4 - Ordena sequência de protocolos do processo + $arrNumSequenciaProtocolo = (array_keys($arrProtocolosIndexados)); + + + $objProcesso->documento = array(); + + foreach ($arrNumSequenciaProtocolo as $numSequencia){ + if(array_key_exists($numSequencia, $arrIdDocumentosIndexados)){ + + $dblIdDocumento = $arrIdDocumentosIndexados[$numSequencia]; + +// if(!array_key_exists($dblIdDocumento, $arrObjDocumentos)) +// throw new InfraException("Documento $dblIdDocumento não pode ser localizado na montagem do processo"); + $arrObjDocumentos[$numSequencia]->ordem = $numSequencia+1; + $objProcesso->documento[] = $arrObjDocumentos[$numSequencia]; + + } + elseif (array_key_exists($numSequencia, $arrIdProcAnexadosIndexados)){ + + $objProcessoConstruido = $this->construirProcesso($arrIdProcAnexadosIndexados[$numSequencia]); + $objProcesso->documento[] = $objProcessoConstruido; + + } else { + throw new InfraException("Inconsistência identificada na atribuição dos documentos e processos anexados"); + } + } + + + } private function atribuirDataHoraDeRegistro($objContexto, $dblIdProcedimento, $dblIdDocumento = null) { //Validar parâmetro $objContexto @@ -801,6 +860,41 @@ class ExpedirProcedimentoRN extends InfraRN { } } + public function listarProtocolos($idProcedimento){ + + //Recupera toda a lista de protocolos vinculados ao processo + $arrTipoAssociacao = array(RelProtocoloProtocoloRN::$TA_DOCUMENTO_ASSOCIADO, RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO,RelProtocoloProtocoloRN::$TA_PROCEDIMENTO_ANEXADO); + $objRelProtocoloProtocoloDTO = new RelProtocoloProtocoloDTO(); + $objRelProtocoloProtocoloDTO->retDblIdRelProtocoloProtocolo(); + $objRelProtocoloProtocoloDTO->retDblIdProtocolo1(); + $objRelProtocoloProtocoloDTO->retDblIdProtocolo2(); + $objRelProtocoloProtocoloDTO->retNumSequencia(); + $objRelProtocoloProtocoloDTO->retStrStaAssociacao(); + $objRelProtocoloProtocoloDTO->setStrStaAssociacao($arrTipoAssociacao, InfraDTO::$OPER_IN); + $objRelProtocoloProtocoloDTO->setDblIdProtocolo1($idProcedimento); + $objRelProtocoloProtocoloDTO->setOrdNumSequencia(InfraDTO::$TIPO_ORDENACAO_ASC); + + $objRelProtocoloProtocoloRN = new RelProtocoloProtocoloRN(); + $arrObjRelProtocoloProtocoloDTO = $objRelProtocoloProtocoloRN->listarRN0187($objRelProtocoloProtocoloDTO); + + $arrIdDocumentos = array(); + $arrIdProcedimentos = array(); + + foreach($arrObjRelProtocoloProtocoloDTO as $objRelProtocoloProtocoloDTO) { + + if ($objRelProtocoloProtocoloDTO->getStrStaAssociacao()==RelProtocoloProtocoloRN::$TA_DOCUMENTO_ASSOCIADO || + $objRelProtocoloProtocoloDTO->getStrStaAssociacao()==RelProtocoloProtocoloRN::$TA_DOCUMENTO_MOVIDO) { + + $arrIdDocumentos[$objRelProtocoloProtocoloDTO->getNumSequencia()] = $objRelProtocoloProtocoloDTO->getDblIdProtocolo2(); + } elseif ($objRelProtocoloProtocoloDTO->getStrStaAssociacao()==RelProtocoloProtocoloRN::$TA_PROCEDIMENTO_ANEXADO){ + $arrIdProcedimentos[$objRelProtocoloProtocoloDTO->getNumSequencia()] = $objRelProtocoloProtocoloDTO->getDblIdProtocolo2(); + } + } + return array($arrIdDocumentos, $arrIdProcedimentos); + + } + + private function atribuirDocumentos($objProcesso, $dblIdProcedimento, $parObjMetadadosTramiteAnterior) { if(!isset($objProcesso)) { @@ -927,8 +1021,137 @@ class ExpedirProcedimentoRN extends InfraRN { $documento->idDocumentoSEI = $documentoDTO->getDblIdDocumento(); $objProcesso->documento[] = $documento; } + } + //mudar o nome antes do commit + private function atribuirDocumentosAux($objProcesso, $dblIdDocumento, $parObjMetadadosTramiteAnterior) + { + if(!isset($objProcesso)) { + throw new InfraException('Parâmetro $objProcesso não informado.'); + } + + //TODO: Passar dados do ProcedimentoDTO via parâmetro j carregado anteriormente + $arrDocumentosDTO = $this->listarDocumentosAux($dblIdDocumento); + + if(!isset($arrDocumentosDTO)) { + throw new InfraException('Documentos não encontrados.'); + } + + + $objDocumentos = array(); + foreach ($arrDocumentosDTO as $documentoDTO) { + + //$protocoloDocumentoDTO = $this->consultarProtocoloDocumento($documeto->getDblIdProcedimento()); + $documento = new stdClass(); + $objPenRelHipoteseLegalRN = new PenRelHipoteseLegalEnvioRN(); + //TODO: Atribuir das informações abaixo ao documento + //123 + //456 + //Retirado + //Considera o nmero/nome do documento externo para descrio do documento + if($documentoDTO->getStrStaProtocoloProtocolo() == ProtocoloRN::$TP_DOCUMENTO_RECEBIDO && $documentoDTO->getStrNumero() != null) { + $strDescricaoDocumento = $documentoDTO->getStrNumero(); + }else{ + $strDescricaoDocumento = "***"; + } + + // Não é um documento externo + /*elseif($documentoDTO->isSetNumIdTipoConferencia()){ + + $objTipoProcedimentoDTO = new PenTipoProcedimentoDTO(true); + $objTipoProcedimentoDTO->retStrNome(); + $objTipoProcedimentoDTO->setBolExclusaoLogica(false); + $objTipoProcedimentoDTO->setDblIdProcedimento($dblIdProcedimento); + $objTipoProcedimentoBD = new TipoProcedimentoBD(BancoSEI::getInstance()); + $objTipoProcedimentoDTO = $objTipoProcedimentoBD->consultar($objTipoProcedimentoDTO); + $strDescricaoDocumento = $objTipoProcedimentoDTO->getStrNome(); + }*/ + $documento->retirado = ($documentoDTO->getStrStaEstadoProtocolo() == ProtocoloRN::$TE_DOCUMENTO_CANCELADO) ? true : false; + $documento->ordem = $this->ordemDocumento++; + $documento->descricao = utf8_encode($strDescricaoDocumento); + $documento->nivelDeSigilo = $this->obterNivelSigiloPEN($documentoDTO->getStrStaNivelAcessoLocalProtocolo()); + if($documentoDTO->getStrStaNivelAcessoLocalProtocolo() == ProtocoloRN::$NA_RESTRITO){ + $documento->hipoteseLegal = new stdClass(); + $documento->hipoteseLegal->identificacao = $objPenRelHipoteseLegalRN->getIdHipoteseLegalPEN($documentoDTO->getNumIdHipoteseLegalProtocolo()); + //TODO: Adicionar nome da hipótese legal atribuida ao documento + } + $documento->dataHoraDeProducao = $this->objProcessoEletronicoRN->converterDataWebService($documentoDTO->getDtaGeracaoProtocolo()); + $documento->produtor = new stdClass(); + $usuarioDTO = $this->consultarUsuario($documentoDTO->getNumIdUsuarioGeradorProtocolo()); + if(isset($usuarioDTO)) { + $documento->produtor->nome = utf8_encode($usuarioDTO->getStrNome()); + $documento->produtor->numeroDeIdentificacao = $usuarioDTO->getDblCpfContato(); + //TODO: Obter tipo de pessoa fsica dos contextos/contatos do SEI + $documento->produtor->tipo = self::STA_TIPO_PESSOA_FISICA;; + } + + $unidadeDTO = $this->consultarUnidade($documentoDTO->getNumIdUnidadeResponsavel()); + if(isset($unidadeDTO)) { + $documento->produtor->unidade = new stdClass(); + $documento->produtor->unidade->nome = utf8_encode($unidadeDTO->getStrDescricao()); + $documento->produtor->unidade->tipo = self::STA_TIPO_PESSOA_ORGAOPUBLICO; + //TODO: Informar dados da estrutura organizacional (estruturaOrganizacional) + } + + $documento->produtor->numeroDeIdentificacao = $documentoDTO->getStrProtocoloDocumentoFormatado(); //TODO: Avaliar se informação está correta + + $this->atribuirDataHoraDeRegistro($documento, $documentoDTO->getDblIdProcedimento(), $documentoDTO->getDblIdDocumento()); + $this->atribuirEspecieDocumental($documento, $documentoDTO, $parObjMetadadosTramiteAnterior); + + //TODO: Tratar campos adicionais do documento + //Identificao do documento + $this->atribuirNumeracaoDocumento($documento, $documentoDTO); + if($documento->retirado === true){ + + $penComponenteDigitalDTO = new ComponenteDigitalDTO(); + $penComponenteDigitalDTO->retTodos(); + $penComponenteDigitalDTO->setDblIdDocumento($documentoDTO->getDblIdDocumento()); + + $penComponenteDigitalBD = new ComponenteDigitalBD($this->getObjInfraIBanco()); + + if($penComponenteDigitalBD->contar($penComponenteDigitalDTO) > 0){ + + $arrPenComponenteDigitalDTO = $penComponenteDigitalBD->listar($penComponenteDigitalDTO); + $componenteDigital = $arrPenComponenteDigitalDTO[0]; + + $documento->componenteDigital = new stdClass(); + $documento->componenteDigital->ordem = 1; + $documento->componenteDigital->nome = utf8_encode($componenteDigital->getStrNome()); + $documento->componenteDigital->hash = new SoapVar("{$componenteDigital->getStrHashConteudo()}", XSD_ANYXML); + $documento->componenteDigital->tamanhoEmBytes = $componenteDigital->getNumTamanho(); + $documento->componenteDigital->mimeType = $componenteDigital->getStrMimeType(); + $documento->componenteDigital->tipoDeConteudo = $componenteDigital->getStrTipoConteudo(); + $documento->componenteDigital->idAnexo = $componenteDigital->getNumIdAnexo(); + + + // -------------------------- INICIO DA TAREFA US074 -------------------------------// + $documento = $this->atribuirDadosAssinaturaDigital($documentoDTO, $documento, $componenteDigital->getStrHashConteudo()); + // -------------------------- FIM TAREFA US074 -------------------------------// + + + if($componenteDigital->getStrMimeType() == 'outro'){ + $documento->componenteDigital->dadosComplementaresDoTipoDeArquivo = 'outro'; + } + + }else{ + $this->atribuirComponentesDigitais($documento, $documentoDTO); + } + }else{ + $this->atribuirComponentesDigitais($documento, $documentoDTO); + } + + //TODO: Necessrio tratar informações abaixo + //protocoloDoDocumentoAnexado + //protocoloDoProcessoAnexado + //retirado + //protocoloAnterior + //historico + $documento->idDocumentoSEI = $documentoDTO->getDblIdDocumento(); + //$objProcesso->documento[] = $documento; + } + return $documento; + } public function atribuirComponentesDigitaisRetirados($documentoDTO){ } @@ -1554,6 +1777,7 @@ class ExpedirProcedimentoRN extends InfraRN { return $this->objUsuarioRN->consultarRN0489($objUsuarioDTO); } + public function listarDocumentos($idProcedimento) { if(!isset($idProcedimento)){ @@ -1619,6 +1843,42 @@ class ExpedirProcedimentoRN extends InfraRN { return $arrObjDocumentoDTO; } + //mudar o nome antes do commit + public function listarDocumentosAux($idDocumento) + { + if(!isset($idDocumento)){ + throw new InfraException('Parâmetro $idProcedimento não informado.'); + } + + + $objDocumentoDTO = new DocumentoDTO(); + $objDocumentoDTO->retStrDescricaoUnidadeGeradoraProtocolo(); + $objDocumentoDTO->retNumIdOrgaoUnidadeGeradoraProtocolo(); + $objDocumentoDTO->retStrSiglaUnidadeGeradoraProtocolo(); + $objDocumentoDTO->retStrStaNivelAcessoLocalProtocolo(); + $objDocumentoDTO->retStrProtocoloDocumentoFormatado(); + $objDocumentoDTO->retStrStaEstadoProtocolo(); + $objDocumentoDTO->retNumIdUsuarioGeradorProtocolo(); + $objDocumentoDTO->retStrStaProtocoloProtocolo(); + $objDocumentoDTO->retNumIdUnidadeResponsavel(); + $objDocumentoDTO->retStrDescricaoProtocolo(); + $objDocumentoDTO->retDtaGeracaoProtocolo(); + $objDocumentoDTO->retDblIdProcedimento(); + $objDocumentoDTO->retDblIdDocumento(); + $objDocumentoDTO->retStrNomeSerie(); + $objDocumentoDTO->retNumIdSerie(); + $objDocumentoDTO->retStrConteudoAssinatura(); + $objDocumentoDTO->retStrNumero(); + $objDocumentoDTO->retNumIdTipoConferencia(); + $objDocumentoDTO->retStrStaDocumento(); + $objDocumentoDTO->retNumIdHipoteseLegalProtocolo(); + $objDocumentoDTO->setDblIdDocumento($idDocumento, InfraDTO::$OPER_IGUAL); + + $arrObjDocumentoDTOBanco = $this->objDocumentoRN->listarRN0008($objDocumentoDTO); + $arrObjDocumentoDTOIndexado = InfraArray::indexarArrInfraDTO($arrObjDocumentoDTOBanco, 'IdDocumento'); + + return $arrObjDocumentoDTOIndexado; + } /** * Retorna o nome do documento no PEN -- libgit2 0.21.2